Kind

2023. 1. 19. 22:53Kubernetes

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