2023. 1. 19. 22:53ㆍKubernetes
Kind
Kind 설치 및 포트포워딩 방법
Environment
· Host PC : ubuntu 22.04
· Virtual Machine : virtualbox
· OS : ubuntu 20.04 server
Requirements
· Docker
https://docs.docker.com/engine/install/ubuntu/
· Kubectl
https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/
install on Linux
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
https://kind.sigs.k8s.io/docs/user/quick-start/
Kind install & Version 확인
kim@kind:~$ which kind
/usr/local/bin/kind
kim@kind:~$ kind version
kind v0.17.0 go1.19.2 linux/amd64
Create Cluster (Default)
kim@kind:~$ kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.25.3) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a nice day! 👋
kind로 Master Node 와 Worker Node의 수를 지정할 수 있지만,
kind create cluster 명령어만 사용할 경우 Default 로 Control-plane 1개만 생성된다.
Create Multi-node clusters
kim@kind:~$ sudo vi multi-cluster.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
Master & Worker Node의 개수를 커스터마이징할 수 있다.
kim@kind:~$ kind create cluster --config multi-cluster.yaml --name dongsoon
Creating cluster "dongsoon" ...
✓ Ensuring node image (kindest/node:v1.25.3) 🖼
✓ Preparing nodes 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-dongsoon"
You can now use your cluster with:
kubectl cluster-info --context kind-dongsoon
노드의 이름 지정
기본적으로 Kind 를 통해 Cluster를 구축하면 이름은 Kind로 시작한다. Cluster의 이름을 지정하고자 하면,
--name 옵션을 통해 지정한다. 여기서 나의 클러스터 이름은 dongsoon 으로 시작한다.
커스터마이징된 파일을 통해 클러스터 구성
--config 옵션을 통해 본인이 Yaml파일을 통해 클러스터를 구축하게 된다. 해당 Yaml파일의 경로를 지정해주자.
Create Control-Plane HA
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
다음과 같이 HA 구성도 가능하다. 이렇게 구성하면 Haproxy도 자동으로 생성되고, 각각의 Control-Plane으로 로드밸런싱도 해준다.
Cluster 조회
kim@kind:~$ kind get clusters
donghyun # HA Cluster
dongsoon # Multi Cluster
kind # default Cluster
kind get clusters로 조회한다.
Cluster 삭제
kim@kind:~$ kind delete cluster --name donghyun
Deleting cluster "donghyun" ...
node 확인
kim@kind:~$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
dongsoon-control-plane Ready control-plane 80m v1.25.3 172.18.0.5 <none> Ubuntu 22.04.1 LTS 5.4.0-125-generic containerd://1.6.9
dongsoon-worker Ready <none> 79m v1.25.3 172.18.0.4 <none> Ubuntu 22.04.1 LTS 5.4.0-125-generic containerd://1.6.9
dongsoon-worker2 Ready <none> 79m v1.25.3 172.18.0.3 <none> Ubuntu 22.04.1 LTS 5.4.0-125-generic containerd://1.6.9
docker container 확인
kim@kind:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5d7872431c6 kindest/node:v1.25.3 "/usr/local/bin/entr…" 2 hours ago Up 2 hours 127.0.0.1:45667->6443/tcp kind-control-plane
node가 docker container로 구성된 것을 확인할 수 있다.
127.0.0.1:45667->6443/tcp 를 통해 Local과 Container의 6443 포트가 Mapping 된 것을 확인할 수 있다.
kubeconfig 파일 확인
kim@kind:~$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1URXdNekF6TlRnd05sb1hEVE15TVRBek1UQXpOVGd3Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGlXCkxlaHRoZzIxQUoxZC83V0p1TE1nZGFEM1ppTHI2NGNOTmVlY0JIRVc3V0FTV3hiWWUxTXUrMEhWNUMyZTZoK2cKN0dEUEVGMWJzSDAxVUYrUHJpc2NwYjI1SGt6RWh5ekY2UDIrQ2lENlFKK3B6WkhQRThHNytXOGZiSThZWVVxUgpSb0RWeldkaUVYamxYWjFxVWhaWVhzdHZDRmFpMTNLdFpqN0RxcThXRUsvZkF1cXN2QVRBYldUWlF6MUxsbC9aCk0rS3VDV1lxL2pLRG1nNFU3YXNIeWJDSUpFRE1tYkZhQlBob1VwQWNNdXVOZUFnRlRDQk5PSEp3WUpJQk5jWEcKNmFnV1dnVTdTUDRlaVA3TGt0NVo2VG5xTktKcTZIRElkc0FxRit4Wm93OXlaK0JYRUFBNVgyNnhieTBIWDVBWApVdTR2WklaS2t6M0tZK0xiYzE4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZIWUxrbmpDUk54ek9YT3FyUHhQZXJPVGJrdk5NQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSDRHbXIzcjZxT2JNUUFkSmFjbQozWVlOSHRmSkd2VW5oaWc5SnFCRGFwZzRSL3JYRmNYTnNudXRpWlVTMWVFdmZyak11QWdwd1hsdlNXWGcvZzNCCmU5Mk5jNGFHNmI2VDRaOGdhU0dLcHlFYkRzUUVJKzBzekExbnBIVU91RkdwSHRwUDBzKzlTYzdmcjBzYkVYR3QKVGNNK01lV1hPdWF3bnNuYTVCeDZJVXU0Z0JWZzVlbGdOWGNBMDlpT212OEdOTktLOVFvQk1PaDAwazhFa1lUMAo5R25xSTRpamg2ZmgrdXBVUDFDVmxkS0pvamRncXlZVm9zZWZCTEVoVE5BY0Q0dkc4cS9UVDEwS1B4aEFvT21SCnA0R1lxSUg4dnlYamc2YUpSRUNUcEJXZzBEQWw5MWRtZE5SbjBhZm02YmlrR1U3TnBaS2hVTmVYVllWK3M2UmsKNitNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://127.0.0.1:35031
name: kind-kind
contexts:
- context:
cluster: kind-kind
user: kind-kind
name: kind-kind
current-context: kind-kind
kind: Config
preferences: {}
users:
- name: kind-kind
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJZHRNN3lndkZEbzB3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpFeE1ETXdNelU0TURaYUZ3MHlNekV4TURNd016VTRNRGRhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW1vNmY3TFR4dWkvTUZhRngKNlNtelZEMnRNTG5GMHhnMlBOaXluQWNSS0VTUjR3bXJ4WFNDSkZxSjlQK3ZxQ3RvbEJ4Qm82MFl4WGNTUmNJSwpmMFJjME1mRFFtUVRuMk1IdkE3cm1PWC8wblo2T1F0TTA0Q0ZnbGQzYW1saWlaOUpwQjIrQ0JmNjNHR2pOaUZ3CjZ6OUEyVHdhNUpxcTMzbThmS0hCR3JzOTBpVFpHVENHQzJSOHBBY0pzd3NxaktFN3VMd0lqSk5kVnVjNXYvRGEKNkZMcUhBUXNYQ1h6M0tqd2ZYTjNDcEozc0krVFdLaCtjZHpYYTVQSnBYbVQraWZxcjhCZFZGaXhBMjg4RUY1WQo3VmJFaXRtbGJleWsvMlFaWkJIdGV0T1czQzk1T3lNaGNwaG15aUFjQThHaStvQzJISSs0d3dCOThFVXE5SFJXCm9ZeC9sd0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JSMkM1SjR3a1RjY3psenFxejhUM3F6azI1TAp6VEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBVEo5bDU0MldOYUlJWWVFYUV4alR2bzZkK3dKeVB5ZlhZVDBWCmFSbW4zcHJ4QXhWd2Yvc3FvNTZZcUw5ajZaajMraTQ3NnJ0bE9ueG5MTWpuWmFqUFd1ZnN0U09MRkh1WURwNDMKd3FlV3pPN091ZDBPdXorcjJqZ0EwbU5TZmtVc1duZmpSYU9xNFRDZDNpSVJPT1U5a3VNMVpnWUtwanZkeUxqOQpodzY5eUk4QmhGcE5DSjEyWm1KWWRZMkl3RW9QM3E2eTVMaThieUhxM2pyZy9rRVpYTUhNcWVaVFI1amlBeFRTClNRTzZBbnVvbHFzY01nZVRJNDRpR2tLRXJyMWE4M3pCSkg4dit5dHp0S1FGYjhSUVFFZFVOTUx2c0xTUTBqckYKanpFVHo3NHZKYytZdHhnbkpTTEZPRFpIVEZiQ1lteFdxQ29Mb1FXMU5CWXNzVUNmalE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBbW82ZjdMVHh1aS9NRmFGeDZTbXpWRDJ0TUxuRjB4ZzJQTml5bkFjUktFU1I0d21yCnhYU0NKRnFKOVArdnFDdG9sQnhCbzYwWXhYY1NSY0lLZjBSYzBNZkRRbVFUbjJNSHZBN3JtT1gvMG5aNk9RdE0KMDRDRmdsZDNhbWxpaVo5SnBCMitDQmY2M0dHak5pRnc2ejlBMlR3YTVKcXEzM204ZktIQkdyczkwaVRaR1RDRwpDMlI4cEFjSnN3c3FqS0U3dUx3SWpKTmRWdWM1di9EYTZGTHFIQVFzWENYejNLandmWE4zQ3BKM3NJK1RXS2grCmNkelhhNVBKcFhtVCtpZnFyOEJkVkZpeEEyODhFRjVZN1ZiRWl0bWxiZXlrLzJRWlpCSHRldE9XM0M5NU95TWgKY3BobXlpQWNBOEdpK29DMkhJKzR3d0I5OEVVcTlIUldvWXgvbHdJREFRQUJBb0lCQURaVjdlTkp1Ykc3SEFSKwp2WTA3RzlDQjNtRkM3a2xJT2NrcVphQjAyNU5NaC8xSmFSb0IyNzdzRlpRTVQ3VFBqZlNEK28rUVN5VWd0MHZPCjYrSFNKczgvYTJYcnlQby8xbmhHeG96NlR2V3VzVWxjcjZXcmlVUkplN0h0V3JjSFNOeHBtR1ZBQ1BGeFllK2wKMGd6aUwrb3ZOMFVuR3V0MTRNM3dEL05WNEdZQUFtaExyczFVOHlvOWx0a0RXSXoyYm9xQy9RU1FnWHFpWWxNOQpLVTg2UWF0UERYU0ZPRFFCMkt2MFp4OUhlbk51WjJrM2pXUVE3YlB6Zk1ucWtCZkF4T1ZzUkw1akU4UWFTb21RCkdZcVlkbU5kS0o3Ui9hRmFjbnpDMXVJam8vVkx4VnYzeTd1SjdvQjQ1M0V2UGI5RGxtTkluNUFOL1VkYXlhV04KVXZTVlVBRUNnWUVBd1dpc0JsNE93bXFnUjVPeUVpS0FOUmNhN0pKSGZWdFB3T1ZEMTJJaitzVnNSUzdkNlBSVwo4SGNYSERubE1Fc29KM0luYzgxWGd6S3R0clhIM1hVcE4zeWNJZWNSQmJSeTluUmZ5NytxWHVPL3VPNFBDb0grCjlXL0tXNE1oWkpKRFRkRUlKOEY1WG5hNnJGL1Jodk1aKzFhQUFWNFZCaTRQSWF2WDJvcmVISFVDZ1lFQXpKTTAKbVAvSU5mZHYvWnJLVW90aWY0S0FVSVFhQjY1a3FWTTNBZmJhMWdndmN6bmZ1VFI1cm5NRDl3cDRYdXRabkxSaAoyMmNIUTgvL0llWURNNlk2MDN5TkFoQmtuMzdVU1hwR3Nkd05HT1lzUjVEOS81dTBrSDhRbUtyMCtSOXZ5TmJ2CjNobHA4WFJoYitKRGY4ZGk3dmJJa3RwMVJuUnV2SHJZVFNKU21sc0NnWUFzdG5VbWw3SVQwakN4dTN4c1l0dCsKNnBPSDQ1MXhacDIrZTRJK2xlcTVlOUMzQWNtOXBGZEJDbGNtYUdBSzFTVTRVVlM3bWRwRWMzL2pnSXp2THJuVApvUlE3Wmo3eU1iQnVONk01NkZxTHkxMDBkSnkza2l3T004VDFlUkJNUHVBZWFsZlhVUXd0QVlmUWQrcHBwMlAzClRoMFRzOXRxYlZXRU5FVVh1Z2oxVFFLQmdBL3hETEU3aFd1SEs2ZjBqdjJkdFFCQXVDVU9Ga1V3OXRFbkZldEcKUkVsWGUvTWJ1RzVqUTNRdnJFaHMvWEpRSHJ5U1plbkYvby92UG05eTBCOFBQaGhLNVdZYXh1eVM0cElUUUQwTgo2OHRiN0dsclNBL0tIMmovTGRqbndZMUVRTjdDdVJCeXBJblhTdHlBSWtocnppN1c5a3hUVDc0OHhvQlRobFdFCmJqRnZBb0dCQUk1QXB2VDZKeDVWa29UNDNPM3Z6ZG1KUTlwOHgvcEptbUp1NEF2VnU2Z29kaHYxWlVLemxlalAKQTFoaFJwZklqR1pxT2x4NzVESXp2N2lJc1ZSdWN4a3RkZDJMckxhQ2c5V1ZFQTNFTlZpZSsvV3RrMjBTQWk3Lwp5bzRZdXZXWkNOMHVDek1lT0tTbDhCM01la3RWVlE5UWpZV3h3MEdYbktwS0g2Mm9XWjJDCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg
kind로 구성한 해당 클러스터의 kubeconfig 파일은 /.kube/config 위치에서 확인할 수 있다.
Kind로 구성한 Cluster로 진입
kim@kind:~$ docker exec -it kind-control-plane bash
root@kind-control-plane:/#
root@kind-control-plane:/# crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
8068eb308c210 5185b96f0becf 2 minutes ago Running coredns 0 f04839c2276b9 coredns-565d847f94-pvt64
1989334a99531 5185b96f0becf 2 minutes ago Running coredns 0 028e8ec401de9 coredns-565d847f94-qfw6c
20b9638c65596 4c1e997385b8f 2 minutes ago Running local-path-provisioner 0 2f9f4e557535e local-path-provisioner-684f458cdd-pljbb
c42cb63d5b6be d6e3e26021b60 2 minutes ago Running kindnet-cni 0 36ccc96ac90a8 kindnet-4gznw
6b33e06bdb70f 86063cd68dfc9 2 minutes ago Running kube-proxy 0 b76be225e3df2 kube-proxy-fx5mj
0fd0a5a91b9e2 a8a176a5d5d69 3 minutes ago Running etcd 0 bb51776166cf8 etcd-kind-control-plane
d79932af8c8f2 4bc1b1e750e34 3 minutes ago Running kube-apiserver 0 d81595edc823a kube-apiserver-kind-control-plane
fbf35ca2b3c46 580dca99efc3b 3 minutes ago Running kube-controller-manager 0 4098b48551ed7 kube-controller-manager-kind-control-plane
d92b0274b0c1c 5225724a11400 3 minutes ago Running kube-scheduler 0 8b9f46346e287 kube-scheduler-kind-control-plane
docker exec -it 명령어를 통해, 마스터 노드에 접근할 수 있다.
포트포워딩을 통한 웹 서비스 노출
예시로 간단하게 nginx deployment를 한 개 배포합니다.
kim@kind:~/yaml$ k create deploy --image=nginx nginx
deployment.apps/nginx created
deployment를 service에 노출시킵니다.
kim@kind:~/yaml$ k expose deploy nginx --port 80 --type LoadBalancer
service/nginx exposed
port-forward합니다.
kim@kind:~/yaml$ kubectl port-forward svc/nginx 31507:80
Forwarding from 127.0.0.1:31507 -> 80
Forwarding from [::1]:31507 -> 80
Handling connection for 31507
curl 을 통해 확인합니다.
kim@kind:~$ curl 127.0.0.1:31507
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
위에까지는 localhost로 Mapping을 시켜서 실제 컴퓨터에는 접속이 안됩니다. localhost는 VM 내부적으로만 인지하는 특수한 IP이기 때문에, 포트포워딩을 할 때 --address 옵션을 통해서 VM의 IP를 기입해줍니다.
VM을 설정할 때, 네트워크 인터페이스에 “브릿지”를 설정했습니다. 브릿지를 설정하면 Host 와 VM의 네트워크를 공유하게 됩니다 .따라서 브릿지 네트워크를 통해 실제 컴퓨터에서도 VM의 IP를 통해 접근할 수 있게 됩니다.
kim@kind:~$ kubectl port-forward svc/nginx --address 192.168.0.73 31500:80
Forwarding from 192.168.0.73:31500 -> 80
Handling connection for 31500
address 에는 VM의 IP를 기입해줍니다.
최종적으로 다음과 같이 컴퓨터에서 kind를 통해 구축한 웹서버에 접근할 수 있게 됩니다.
내가 느낀 장단점
장점
매우 설치가 빠르다.
클러스터 구축이 매우 용이하다.
간단한 웹서비스 노출 및 검증을 할 때 용이하다.
경량화된 쿠버네티스 구축 도구이기에 본인의 컴퓨터 Resource가 충분하지 않을 때 사용하면 좋다.
단점
도커로 노드들이 생성되기에 포트포워딩이 필연적이다.
간단한 웹서비스 노출 및 검증을 하기엔 용이하나 서비스가 여러 개로 증가한다면 포트포워딩을 동시에 여러 번 해야 하는데 적합하지 않은 것 같다.
인그레스를 설정하는 것이 까다롭다.
'Kubernetes' 카테고리의 다른 글
Rolling Update (0) | 2023.01.19 |
---|---|
바닐라 쿠버네티스(kubeadm) (0) | 2023.01.19 |
RKE2 (0) | 2023.01.19 |
Canary (0) | 2023.01.19 |
Bluegreen (0) | 2023.01.19 |