kind เป็น tool ตัวหนึ่งที่น่าสนใจสำหรับ run Kubernetes อยู่ที่เครื่องเราเองโดยใช้ Docker container เป็น nodes ของ Kubernetes ข้อดีคือจัดการง่ายและทำงานได้เร็ว ถ้าต้องใช้ script เพื่อสร้าง cluster เพื่อทำ integration test แล้ว tool ตัวนี้ตอบโจทย์ได้ดีทีเดียว ติดตั้งเพื่อใช้งานทำได้ตาม quick start
ตัวอย่าง command ต่าง ๆ สำหรับใช้งาน kind
สร้าง cluster ที่มี Master และ Worker จำนวน 1 node
kind create cluster --name test1
สร้าง cluster ที่มี Master และ Work อย่างละ Node จาก configuration file
kind create cluster --name=test2 --config kind-2node.yaml
# ข้อมูลใน File kind-2node.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
สร้าง cluster ที่มี Master จำนวน 3 nodes และ Worker จำนวน 2 nodes
kind create cluster --name=test3 --config kind-5node.yaml
# ข้อมูลของ file kind-5node.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
ในกรณีที่ใช้ docker-machine เพื่อสร้าง docker engine จำเป็นต้องระบุ ip ของ docker engine ใน file config ด้วย กรณีต้องการ config ค่าอื่นๆ ดูได้จาก kind document
# หา ip ของ docker engine ด้วย
❯ docker-machine ip
192.168.99.102
# จากนั้นสร้าง config file ดังนี้
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
apiServerAddress: "192.168.99.102"
apiServerPort: 6443
nodes:
- role: control-plane
- role: worker
การ access เข้าไปที่ node
docker ps
# test1-control-plane เป็นชื่อ Master node จากผลลัพธ์ docker ps
docker exec -it test1-control-plane bash
การ access container ที่ run ที่เครื่อง test1-control-plan ซึ้ง container runtime ใน node จะเป็น containerd นะครับ
root@test-control-plane:/# crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
fd7b628af2359 296a6d5035e2d 20 minutes ago Running coredns 0 f068e76bb133e
67db85b7b5293 296a6d5035e2d 20 minutes ago Running coredns 0 1d773ed216c4e
1e94aff11ee8e e422121c9c5f9 20 minutes ago Running local-path-provisioner 0 6c9467c5cdb84
9599b04fdad77 6de166512aa22 20 minutes ago Running kindnet-cni 0 1a9a398e62418
f55a566a3f556 0e124fb3c695b 20 minutes ago Running kube-proxy 0 c075e7b86e928
6927ff1f38141 0369cf4303ffd 20 minutes ago Running etcd 0 92b0750af4e4c
6eaab86c31d42 94ffe308aeff9 20 minutes ago Running kube-apiserver 0 34bbfc2183651
5a861837a686e 96a295389d472 20 minutes ago Running kube-controller-manager 0 571c1b03041e7
7f5d355589866 1248d2d503d37 20 minutes ago Running kube-scheduler 0 9d92fc037f002
สร้าง Kubernetes pod
kubectl run nginx --image=nginx
สร้าง Kubernetes service
❯ kubectl expose pod nginx --port=80 --target-port=80 --name=nginx-http --type=NodePort
# ทดสอบเรียก service
root@test-control-plane:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
test-control-plane Ready control-plane,master 18m v1.21.1 172.18.0.3 <none> Ubuntu 21.04 4.19.130-boot2docker containerd://1.5.2
test-worker Ready <none> 18m v1.21.1 172.18.0.2 <none> Ubuntu 21.04 4.19.130-boot2docker containerd://1.5.2
root@test-control-plane:~# curl http://172.18.0.2:30108
<!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>
root@test-control-plane:~# exit
สร้าง kube config ที่ master
cp /etc/kubernetes/admin.conf ~/.kube/config
แสดง log ของ cluster จาก kind cli
kind export logs --name=test2
ลบ cluster
kind delete cluster --name test1
Restart docker, ในกรณีที่ restart เครื่อง ต้อง start docker image ของ Master และ Worker nodes
docker start <name>-control-plane
docker start <name>-worker
export KUBECONFIG="$(kind get kubeconfig-path --name="<name>")"
