kind ของดีที่ทำให้เรามี K8S Cluster ใช้งานแบบไม่ยุ่งยาก บน Ubuntu 20.04 LTS
Published: 2021-02-04 02:04:47

>ตอนนี้เขียนจากส่วนประกอบต่าง ๆ ดังนี้
- Ubuntu 20.04.2 LTS 
- Docker version 19.03.8
- kubectl ติดตั้งเรียบร้อย
- สร้าง Kubernetes Cluster ชื่อว่า d8k ประกอบด้วย 1 Control Plane และ 2 Node

kind - Kubernetes IN Docker เป็นเครื่องมือที่จะทำให้มี Kubernetes Cluster ใช้งานโดยใช้ Docker Container เป็น node ดังนั้นถ้าระบบปฎิบัติการใดที่มี kind ให้ใช้งานได้ และติดตั้ง Docker ได้ก็จะทำได้ เท่าที่อ่านดูก็เป็นการจับคู่ที่หลากหลาย อย่างใน macOS ก็จะเป็น kind สำหรับ macOS และ Docker Desktop  หรือว่า kind สำหรับ Windows 10 และ WSL2 - Windods Subsystem for Linux 2 ส่วนใน Linux ไม่น่าจะต้องห่วง น่าจะใช้งาน kind ได้อยู่แล้ว

ตรวจสอบสถานะการทำงานของ Docker
```
root@docker:~# docker version
Client:
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.13.8
 Git commit:        afacb8b7f0
 Built:             Fri Dec 18 12:15:19 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.8
  Git commit:       afacb8b7f0
  Built:            Fri Dec  4 23:02:49 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.3-0ubuntu2.2
  GitCommit:
 runc:
  Version:          spec: 1.0.1-dev
  GitCommit:
 docker-init:
  Version:          0.18.0
  GitCommit:
```
ติดตั้ง kind
```
root@docker:~#  curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.10.0/kind-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 7277k  100 7277k    0     0  4453k      0  0:00:01  0:00:01 --:--:-- 12.6M

root@docker:~# chmod +x kind

root@docker:~# ./kind version
kind v0.10.0 go1.15.7 linux/amd64
```
สร้าง Configuration File สำหรับ kind เพื่อสร้าง 1 Control Plane และ 2 Node
```
❯ cat > lab.yaml <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
```
สร้าง Kubernetes Cluster ชื่อว่า d8k จาก lab.yaml
```
root@docker:~# ./kind create cluster --config lab.yaml --name d8k
Creating cluster "d8k" ...
 ✓ Ensuring node image (kindest/node:v1.20.2) 🖼
 ✓ Preparing nodes 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-d8k"
You can now use your cluster with:

kubectl cluster-info --context kind-d8k

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/
```
>- การติดตั้งใช้เวลานานพอสมควรเนื่อจาก Container Image ของ kind node (v1.20.2) มีขนาด 1.17 GB 
- หลังจากติดตั้งเสร็จ kind จะเพิ่มข้อมูลลงใน .kube/config เพื่อให้พร้อมใช้งาน

​ตรวจสอบความเรียบร้อย และความพร้อมของ Kubenetes Cluster
```
root@docker:~# ./kind get clusters
d8k
root@docker:~# kubectl config get-contexts
CURRENT   NAME       CLUSTER    AUTHINFO   NAMESPACE
*         kind-d8k   kind-d8k   kind-d8k
root@docker:~# kubectl get nodes
NAME                STATUS   ROLES                  AGE     VERSION
d8k-control-plane   Ready    control-plane,master   6m11s   v1.20.2
d8k-worker          Ready    <none>                 5m35s   v1.20.2
d8k-worker2         Ready    <none>                 5m39s   v1.20.2
root@docker:~# kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:39737
KubeDNS is running at https://127.0.0.1:39737/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```
หากไม่ต้องการใช้งาน Kubernetes Cluster แล้วสามารถลบด้วยคำสั่ง kind
```
root@docker:~# ./kind delete clusters d8k
Deleted clusters: ["d8k"]
```
หากต้องการระบุ version ของ Kubernetes สามารถทำได้โดยการระบุ version ได้ โดยข้อมูลของ image ในแต่ละ version หาได้จาก [kind release](https://github.com/kubernetes-sigs/kind/releases) เช่นต้องการติดตั้ง Kubernetes Cluster version 1.19.7
```
root@docker:~# cat > lab.yaml <<EOF
> kind: Cluster
> apiVersion: kind.x-k8s.io/v1alpha4
> nodes:
> - role: control-plane
>   image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca
> - role: worker
>   image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca
> - role: worker
>   image: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca
> EOF

root@docker:~# ./kind create cluster --config lab.yaml --name d8k
Creating cluster "d8k" ...
 ✓ Ensuring node image (kindest/node:v1.19.7) 🖼
 ✓ Preparing nodes 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-d8k"
You can now use your cluster with:

kubectl cluster-info --context kind-d8k

Thanks for using kind! 😊

root@docker:~# kubectl get nodes
NAME                STATUS     ROLES    AGE   VERSION
d8k-control-plane   Ready      master   78s   v1.19.7
d8k-worker          NotReady   <none>   46s   v1.19.7
d8k-worker2         NotReady   <none>   46s   v1.19.7
```
สร้าง pod แรกใน Kubernetes ที่สร้างโดย kind
```
root@docker:~# kubectl run myfiristpod --image damrongsak/hello:8080
pod/myfiristpod created
root@docker:~# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
myfiristpod   1/1     Running   0          26s
```

####มูลค่าความสุข