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