Coding Gun

ติดตั้ง Kubernetes บน local ด้วย Minikube

Minikube คือเครื่องมือที่ใช้ในการจำลอง Kubernetes Cluster บน local(เครื่องของ developer) ใช้สำหรับการทดสอบ application บนเครื่องของเราเองก่อนที่จะ deploy ขึ้นไปยัง server จริง

ข้อดีของ Minikube

ข้อดีของการใช้งาน Kubernetes บน Minikube นั้นมีดังนี้

ข้อเสียของ Minikube

ข้อเสียของ Minikube นั้นมีอยู่ข้อเดียวเลยคือ Minikube จะเพิ่ม Worker ไม่ได้ ดังนั้นเราจะไม่สามารถทดสอบการกระจายตัวของ pods ได้

ซึ่งส่วนใหญ่ Developer ทดสอบบน Minikube ซึ่งจะไม่ได้สนใจเรื่องของการกระจายตัวของ Pods จึงทำให้เวลาไป deploy จริงเกิดการกระจุุกตัวของ pods(pods ที่ทำงานหนักๆไปอยู่ด้วยกัน)

และด้วยปัญหานี้จึงทำให้ทีมที่พัฒนา Minikube ไปพัฒนา project ใหม่เพื่อตอบโจทย์นี้ นั่นก็คือ Kind นั่นเอง

Minikube Architecture

การจำลองการทำงานของ Minikube จะเป็นแบบในรูปนี้

Minikube Architecture

Minikube จะสร้าง VM หรือ container ขึ้นมาเพื่อจำลอง environment(kubernetes cluster) โดยที่เราจะมี kubernetes cluster ทั้ง cluster อยู่ใน VM หรือ container ตัวเดียวกัน ซึ่งข้อเสียของ Minikube คือเพิ่ม Worker เข้าไปไม่ได้ แต่ด้วยความที่เป็นทั้ง cluster อยู่ใน VM หรือ container ตัวเดียวกัน ทำให้เราสามารถเพิ่มหรือลบ environment ได้ง่ายมาก

เริ่มต้นใช้งาน Minikube

เราจะเริ่มต้นสร้าง Kubernetes Cluster ขึ่้นมาด้วยคำสั่ง

$ minikube start

ผลลัพธ์ที่ได้จะออกมาเป็น

Starting local Kubernetes v1.28.0 cluster...
Starting VM...
Downloading Minikube ISO
 39.75 MB / 97.80 MB [==================>--------------------------]  40.65% 25s

Moving files into cluster...
Setting up certs...
Starting cluster components...
Connecting to cluster...
Setting up kubeconfig...
Kubectl is now configured to use the cluster.

ในขั้นตอนนี้ minikube จะไป download ISO ไฟล์ หรือ container image(linux ที่ติดตั้ง kubernetes ไว้แล้ว) ลงมาในเครื่องแล้วทำการสร้าง Kubernetes Cluster ขึ้นมา

ระบุ Driver สำหรับสร้าง Kubernetes Cluster

ถ้าเราสั่ง minikube start เหมือนในตัวอย่างก่อนหน้า Minikube จะตรวจสอบในเครื่องเราว่ามี VM ตัวไหนที่ install อยู่บ้าง และใช้เครื่องมือนั้นในการสร้าง cluster ซึ่งอาจผิดจากที่เราคิดก็ได้ ดังนัั้นถ้าต้องการความแน่นอนให้ระบุ –driver เข้าไปเลย ซึ่งเราสามารถเลือก driver ได้ตาม OS ที่เราใช้ ดังนี้

Linux

บน Linux เราสามารถเลือก driver ได้ตามนี้

Windows

บน Windows เราสามารถเลือก driver ได้ตามนี้

MacOS

บน MacOS เราสามารถเลือก driver ได้ตามนี้

ถ้าเราติดตั้งทั้ง docker และ VM minikube จะเลือก docker ก่อน VM

ตัวอย่าง ผมอยากให้สร้าง minikube บน Virtualbox(ใช้ได้ทั้ง Linux, Windows และ MacOS) จะต้องใส่ driver เข้าไปแบบนี้

$ minikube start --driver virtualbox

ตรวจสอบสถานะของ Kubernetes Cluster

หลังจากเรา start Kubernetes Cluster ขึ้นมาแล้วให้ลองตรวจสอบดูว่า Kubernetes ที่สร้างขึ้นมาสมบูรณ์หรือไม่ด้วยคำสั่ง

$ minikube status

ผลลัพธ์จะออกมาเป็นข้อความแบบนี้

minikube: Running
localkube: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

$kubectl get nodes

NAME       STATUS    AGE       VERSION
minikube   Ready     2m        v1.28.0

สั่งเกตุว่า kubectl จะชี้ไปที่ minikube-vm ซึ่งจะอยุ่ที่ IP 192.168.99.100

เมื่อเราทดสอบแล้วว่า minikube ทำงานเรียบร้อยดี เราก็ไปตรวจสอบว่า kubectl ของเราชี้ไปถูกที่แล้วรึยัง ด้วยคำสั่ง

$ kubectl cluster-info

ซึ่งผลลัพธ์จะออกมาเป็น

Kubernetes control plane is running at https://192.268.99.100:6443
CoreDNS is running at https://192.168.99.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

ในกรณีที่ kubectl มีปัญหาเรื่อง version ไม่ตรงกับที่จำลองไว้ เช่น เราอยากจะทดสอบ Kubernetes Cluster version 1.18.0 แต่ kubectl ของเราเป็น 1.28.0 แล้ว บางคำสั่งของเราอาจไม่ตรงกัน เราจึงต้องเปลี่ยนจาก

$ kubectl get po

ไปเป็น

$ minikube kubectl -- get po

และนอกจากนี้เรายังสามาารถเรียกใช้งาน Kubernetes Dashboard ขึ้นมาใช้งานได้อย่างง่ายดายด้วยคำสั่ง

$ minikube dashboard

หลังจาก run คำสั่งนี้ minikube จะทำการ enable Kubernetes Dashboard ขึ้นมาใช้งานโดยอัตโนมติ

ถ้า Dashboard แสดงผลขึ้นมาปกติก็ถือว่าเรา start minikube ขึ้นมาพร้อมสำหรับการ deploy application ลงไปแล้ว

สร้าง Kubernetes Cluster ได้หลาย Cluster

ข้อดีของการใช้งาน Minikube คือสามารถสร้างได้หลาย Cluster ดังนั้นเราสามารถสร้าง environment มากกว่า 1 environment ได้ เช่น แยกตาม project หรือ แยกตาม version ของ kubernetes ในกรณีที่เราต้องการมากกว่า 1 cluster เราจะใช้ –profile ในการระบุชื่อ

$ minikube start --profile demo

ถ้าเราไม่ได้ระบุ profile minikube จะใช้ชื่อ profile ว่า minikube

และ list kubernetes cluster ที่อยู่ในเครื่องทั้งหมดออกมาด้วยคำสั่ง

$ minikube profile list

ผลลัพธ์จะออกมาเป็นแบบนี้

|----------|-----------|---------|--------------|------|---------|---------|-------|
| Profile  | VM Driver | Runtime |      IP      | Port | Version | Status  | Nodes |
|----------|-----------|---------|--------------|------|---------|---------|-------|
| demo     | docker    | docker  | 192.168.49.2 | 8443 | v1.22.1 | Running |     1 |
|----------|-----------|---------|--------------|------|---------|---------|-------|

ระบุ Version ของ Kubernetes

ในบางกรณีเราต้องการทดสอบ Kubernetes Cluster ของเราในหลายๆ version ซึ่งเราสามารถจำลอง Kubernetes ในแต่ละ version ด้วยการกำหนด parameter –kubernetes-version แบบนี้

$ minikube start --kubernetes-version=v1.28.0

นี่ก็เป็นอีก 1 ข้อดีของการใช้งาน minikube ที่ดีมากๆ เพราะเมื่อเรามี cluster บน production หลายๆ version เราก็ต้องการทดสอบบน local ในหลายๆ version เช่นเดียวกัน

ทดสอบ Deploy Application ลงบน Cluster

ในขั้นตอนนี้เราจะใช้ kubectl ในการ deploy nginx ลงบน cluster ซึ่ง kubectl เป็นเครื่องมือสำหรับการจัดการ kubernetes cluster ไม่ใช่เครื่องมือของ minikube

kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
kubectl expose deployment hello-minikube --type=NodePort --port=8080

หลังจากนั้นเราจะทำการเข้าถึงหน้า Web ที่เราได้ deploy ลงไปด้วยคำสั่ง kubectl run ด้วยตำสั่ง

minikube service hello-minikube

หลังจากนั้นเราจะได้หน้าผลลัพธ์ออกมาเป็นข้อความแบบนี้

Request served by hello-minikube-76967b7665-rhk6s

HTTP/1.1 GET /

Host: 127.0.0.1:53303
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15

ถ้าขึ้นข้อความนี้บน browser แสดงว่าการ deploy application ของเราลงไปใน minikube เสร็จสมบูรณ์แล้ว

หยุดการทำงานชั่วคราว

เราสามารถหยุกการทำงานของ Kubernetes ไว้ชั่วคราวได้ด้วยคำสั่ง

$ minikube pause

และถ้าต้องการให้ Kubernetes นั้นกลับมาใช้งานได้เหมือนเดิมให้ใช้คำสั่ง

$ minikube unpause

ลบ Kubernetes ที่ไม่ต้องการออก

เราจะลบ Kubernetes Cluster ที่ไม่ได้ใช้แล้วออกด้วยคำสั่ง

$ minikube stop

หรือถ้าเราตั้ง profile ให้เราระบุ profile เข้าไปแบบนี้

$ minikube stop --profile demo

และถ้าเราต้องการลบ kubernetes ออกทั้งหมด ให้ใช้คำสั่ง minikube delete ซึ่งการใช้ minikube delete จะลบ

ดังนั้นจะเห็นได้ว่า minikube delete นั้นลบทุกอย่างออกแบบหมดจดจริงๆ

$ minikube delete --all

จัดการกับ Add-ons

เราสามารถเลือก Add-ons ที่มีอยู่ทั้งหมดออกมาดูได้ด้วยคำสั่ง

minikube addons list

ผลลัพธ์จะออกมาเป็นแบบนี้

|-----------------------------|----------|--------------|-----------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |      MAINTAINER       |
|-----------------------------|----------|--------------|-----------------------|
| ambassador                  | minikube | disabled     | unknown (third-party) |
| auto-pause                  | minikube | disabled     | google                |
| csi-hostpath-driver         | minikube | disabled     | kubernetes            |
| dashboard                   | minikube | disabled     | kubernetes            |
| default-storageclass        | minikube | enabled ✅   | kubernetes            |
| efk                         | minikube | disabled     | unknown (third-party) |
| freshpod                    | minikube | disabled     | google                |
| gcp-auth                    | minikube | disabled     | google                |
| gvisor                      | minikube | disabled     | google                |
| helm-tiller                 | minikube | disabled     | unknown (third-party) |
| ingress                     | minikube | disabled     | unknown (third-party) |
| ingress-dns                 | minikube | disabled     | unknown (third-party) |
| istio                       | minikube | disabled     | unknown (third-party) |
| istio-provisioner           | minikube | disabled     | unknown (third-party) |
| kubevirt                    | minikube | disabled     | unknown (third-party) |
| logviewer                   | minikube | disabled     | google                |
| metallb                     | minikube | disabled     | unknown (third-party) |
| metrics-server              | minikube | disabled     | kubernetes            |
| nvidia-driver-installer     | minikube | disabled     | google                |
| nvidia-gpu-device-plugin    | minikube | disabled     | unknown (third-party) |
| olm                         | minikube | disabled     | unknown (third-party) |
| pod-security-policy         | minikube | disabled     | unknown (third-party) |
| portainer                   | minikube | disabled     | portainer.io          |
| registry                    | minikube | disabled     | google                |
| registry-aliases            | minikube | disabled     | unknown (third-party) |
| registry-creds              | minikube | disabled     | unknown (third-party) |
| storage-provisioner         | minikube | enabled ✅   | kubernetes            |
| storage-provisioner-gluster | minikube | disabled     | unknown (third-party) |
| volumesnapshots             | minikube | disabled     | kubernetes            |
|-----------------------------|----------|--------------|-----------------------|

นี่คือรายการของ Add-ons ที่เราสามารถเลือก enable ขึ้นมาใช้งานได้ด้วยคำสั่ง

minikube addons enable portainer

ในตัวอย่างนี้เป็นการเปิด portainer(เครื่องมือที่ใช้จัดการ container ผ่านหน้า web) ขึ้นมาใช้งาน

และเมื่อไหร่ที่เราไม่ต้องการ Add-ons นั้นๆ แล้วก็สามารถ disable ออกได้ด้วยคำสั่ง

minikube addons disable portainer
Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security