ติดตั้ง Kubernetes บน local ด้วย Minikube
Minikube คือเครื่องมือที่ใช้ในการจำลอง Kubernetes Cluster บน local(เครื่องของ developer) ใช้สำหรับการทดสอบ application บนเครื่องของเราเองก่อนที่จะ deploy ขึ้นไปยัง server จริง
ข้อดีของ Minikube
ข้อดีของการใช้งาน Kubernetes บน Minikube นั้นมีดังนี้
- การติดตั้งและใช้งานค่อนข้างง่าย
- สามารถเลือก Virtualization ได้หลายรูปแบบเช่น จำลอง cluster โดยใช้ VMWare หรือจะใช้ Docker ในการจำลองการทำงานก็ได้
- เราสามารถใช้งาน Kubernetes Dashboard ได้เลยไม่ต้อง deploy เพิ่ม
- มาพร้อมกับ Add-ons หลายตัว สามารถ Enable ขึ้นมาใช้งานได้เลยโดยที่ไม่ต้องติดตั้งเครื่องมืออื่นๆเพิ่มเติม
- สามารถติดตั้ง Kubernetes หลายๆ version ในเครื่องเดียวกันได้
ข้อเสียของ Minikube
ข้อเสียของ Minikube นั้นมีอยู่ข้อเดียวเลยคือ Minikube จะเพิ่ม Worker ไม่ได้ ดังนั้นเราจะไม่สามารถทดสอบการกระจายตัวของ pods ได้
ซึ่งส่วนใหญ่ Developer ทดสอบบน Minikube ซึ่งจะไม่ได้สนใจเรื่องของการกระจายตัวของ Pods จึงทำให้เวลาไป deploy จริงเกิดการกระจุุกตัวของ pods(pods ที่ทำงานหนักๆไปอยู่ด้วยกัน)
และด้วยปัญหานี้จึงทำให้ทีมที่พัฒนา Minikube ไปพัฒนา project ใหม่เพื่อตอบโจทย์นี้ นั่นก็คือ Kind นั่นเอง
Minikube Architecture
การจำลองการทำงานของ Minikube จะเป็นแบบในรูปนี้
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 ได้ตามนี้
- Docker - container-based (preferred)
- KVM2 - VM-based (preferred)
- VirtualBox - VM
- QEMU - VM
- None - bare-metal
- Podman - container-based (experimental)
- SSH - remote ssh
Windows
บน Windows เราสามารถเลือก driver ได้ตามนี้
- Hyper-V - VM (preferred)
- Docker - VM + Container (preferred)
- VirtualBox - VM
- VMware Workstation - VM
- QEMU - VM (experimental)
- Podman - VM + Container (experimental)
- SSH - remote ssh
MacOS
บน MacOS เราสามารถเลือก driver ได้ตามนี้
- Docker - VM + Container (preferred)
- Hyperkit - VM
- VirtualBox - VM
- Parallels - VM
- VMware Fusion - VM
- QEMU - VM
- Podman - VM + Container (experimental)
- SSH - remote ssh
ถ้าเราติดตั้งทั้ง 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 จะลบ
- kubernetes cluster ทุกๆ profile(ถ้าสั่ง minikube stop จะลบทีละ profile)
- virtual machine ที่ได้ download มาตอนเราสั่ง minikube start
- tracing และ log ต่างๆที่ minikube สร้างขึ้นมา
ดังนั้นจะเห็นได้ว่า 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