Kind를 이용한 쿠버네티스 클러스터 만들기

Posted by Just Do It ! 행동하지 않으면 성공도 실패도 없다 on Sunday, April 26, 2020

Kubernetes 개발환경

Vagrant vs Minikube vs Kind

Local 환경에서 K8s를 사용하기 위해서 다양한 방법을 사용 할 수 있다.

Vagrant

Vagrant는 HashCorp에서 만든 프로비저닝 툴로, VagrantFile에 기본 이미지와 생성된 VM에 필요한 설정을 미리 Code화 해서 제공하는 툴이다.

# vagrant cli 가 설치 되어야 한다.
vagrant version

# git cli 가 설치 되면 좋다.
git version

# 기본 가상화 솔루션으로 VirtualBox를 사용하기 때문에, VirtualBox가 미리 설치가 되어 있어야 한다. Hyper-V나 다른 가상화 툴을 사용할 수 있다.
vagrant up

Minikube

Local 환경에 쿠버네티스를 사용하고 테스트하는데 가장 많이 사용하는 툴이지 않을까 한다.

# CLI를 다운로드 받아 설치하고, 간단하게 minikube start를 하면 기본 가상화 툴인 virutlabox 에 Single Node Kubernetes Cluster가 기동된다.
minikube start

Kind

https://kind.sigs.k8s.io/

Local 쿠버네티스 클러스터를 기동하기 위해 Docker를 사용한다. 다른 가상화 솔루션 없이, Docker Daemon만 있다면 쿠버네티스 클러스터를 생성할 수 있다.

Single Node Cluster

$ time kind create cluster --name dev --image kindest/node:v1.18.0
Creating cluster "dev" ...
 ✓ Ensuring node image (kindest/node:v1.18.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-dev"
You can now use your cluster with:

kubectl cluster-info --context kind-dev

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂
kind create cluster --name dev --image kindest/node:v1.18.0  1.49s user 0.97s system 3% cpu 1:15.15 total

클러스터가 제대로 만들어 졌는지 확인 할 수 있다.

$ kind get clusters
dev

DockerHub에서 kindes/node:v1.1.8.0 을 다운로드 받아서 실행한다.

$ docker ps -a
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS                    PORTS                       NAMES
db3bf5361131        kindest/node:v1.18.0   "/usr/local/bin/entr…"   About a minute ago   Up About a minute         127.0.0.1:32770->6443/tcp   dev-control-plane

Local 쿠버네티스 컨텍스트를 확인해 보면 kind-dev라는 이름의 쿠버네티스 컨텍스트를 확인 할 수 있다.

$ k config get-contexts
CURRENT   NAME              CLUSTER    AUTHINFO                               NAMESPACE
          k8s               k8s        1f998a63-7764-4bc3-8b71-7f96268b4dda
*         kind-dev          kind-dev   kind-dev
          mgmt-admin@mgmt   mgmt       mgmt-admin
          minikube          minikube   minikube

Multi Node Cluster

kind 로 쿠버네티스 클러스터를 생성할 때, 설정을 통해서 다양한 설정을 정할 수 있는데, 그중에 하나가 노드의 수를 지정할 수 있다.

  • multi-node-cluster-config.yaml
# a cluster with 3 control-plane nodes and 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

생성된 config 파일로 쿠버네티스 클러스터를 생성한다.

$ kind create cluster --name k8s --config kind-example-config-3-3nodes.yaml --image kindest/node:v1.18.0
Creating cluster "k8s" ...
 ✓ Ensuring node image (kindest/node:v1.18.0) 🖼
 ✓ Preparing nodes 📦 📦 📦 📦 📦 📦
 ✓ Configuring the external load balancer ⚖️
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining more control-plane nodes 🎮
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-k8s"
You can now use your cluster with:

kubectl cluster-info --context kind-k8s

Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/

생성된 클러스터 정보를 확인

$ kubectl cluster-info --context kind-k8s
Kubernetes master is running at https://127.0.0.1:32771
KubeDNS is running at https://127.0.0.1:32771/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

이전에 생성된 dev 쿠버네티스 클러스터를 확인해보면 로컬호스트의 다른 포트로 API Server가 기동중인것을 확인 할 수 있다.

$ kubectl --context kind-dev cluster-info
Kubernetes master is running at https://127.0.0.1:32770
KubeDNS is running at https://127.0.0.1:32770/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

기동중인 도커 데몬을 확인한다.

docker ps -a
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                    PORTS                       NAMES
24ef23d204f1        kindest/haproxy:2.1.1-alpine   "/docker-entrypoint.…"   10 minutes ago      Up 10 minutes             127.0.0.1:32771->6443/tcp   k8s-external-load-balancer
5723989c3bc8        kindest/node:v1.18.0           "/usr/local/bin/entr…"   10 minutes ago      Up 10 minutes                                         k8s-worker
4780a3feefe3        kindest/node:v1.18.0           "/usr/local/bin/entr…"   10 minutes ago      Up 10 minutes             127.0.0.1:32773->6443/tcp   k8s-control-plane3
1c843d4e2ece        kindest/node:v1.18.0           "/usr/local/bin/entr…"   10 minutes ago      Up 10 minutes                                         k8s-worker2
e791a8b75097        kindest/node:v1.18.0           "/usr/local/bin/entr…"   10 minutes ago      Up 10 minutes                                         k8s-worker3
5cbde9e8ec86        kindest/node:v1.18.0           "/usr/local/bin/entr…"   10 minutes ago      Up 10 minutes             127.0.0.1:32774->6443/tcp   k8s-control-plane
e73995f61160        kindest/node:v1.18.0           "/usr/local/bin/entr…"   10 minutes ago      Up 10 minutes             127.0.0.1:32772->6443/tcp   k8s-control-plane2
db3bf5361131        kindest/node:v1.18.0           "/usr/local/bin/entr…"   23 minutes ago      Up 23 minutes             127.0.0.1:32770->6443/tcp   dev-control-plane