Docker Desktop ช่วยเปิดคลัสเตอร์ Kubernetes สำหรับพัฒนาและทดลอง แต่คำสั่ง kubectl top ต้องมีผู้ให้บริการ Resource Metrics API ก่อน บทความนี้ติดตั้ง Metrics Server ซึ่งดึงข้อมูล CPU และหน่วยความจำจาก kubelet แล้วเปิดข้อมูลผ่าน metrics.k8s.io ให้ kubectl top และ Horizontal Pod Autoscaler (HPA) ใช้งาน [1][2]

flowchart LR
    A["Pod และ Node"] --> B["kubelet"]
    B --> C["Metrics Server"]
    C --> D["Kubernetes API"]
    D --> E["kubectl top"]
    D --> F["HPA"]

Metrics Server เน้นข้อมูลทรัพยากรสำหรับการปรับจำนวน Pod อัตโนมัติ ไม่ใช่ระบบเก็บประวัติหรือแดชบอร์ดติดตามระยะยาว หากต้องการวิเคราะห์ย้อนหลังหรือแจ้งเตือนให้เลือกเครื่องมือมอนิเตอร์ที่เหมาะสม [2]

#1. เปิด Kubernetes และตรวจสอบคลัสเตอร์

เปิด Docker Desktop แล้วไปที่ Settings → Kubernetes เพื่อเปิดใช้งาน Kubernetes รอให้สถานะพร้อมใช้งาน จากนั้นเปิด Terminal หรือ PowerShell และตรวจสอบ context ก่อนติดตั้ง เพื่อไม่ให้คำสั่งไปทำงานบนคลัสเตอร์อื่น [3]

kubectl config current-context
kubectl config use-context docker-desktop
kubectl get nodes
kubectl version

คำสั่ง kubectl get nodes ควรแสดง Node สถานะ Ready ให้ดูรุ่น Server Version จาก kubectl version เพื่อเลือก Metrics Server ให้ตรงรุ่น Kubernetes

#2. เลือกรุ่นและติดตั้ง Metrics Server

ตารางนี้อ้างอิง compatibility matrix ของโครงการ Metrics Server [2] ตัวอย่างคำสั่งใช้ไฟล์ manifest จาก release ที่ระบุรุ่นชัดเจน

Kubernetes Server Version Metrics Server คำสั่งติดตั้ง
1.34 ขึ้นไป 0.9.x kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.9.0/components.yaml
1.31–1.33 0.8.x kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.8.1/components.yaml
1.27–1.30 0.7.x kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.2/components.yaml

เลือก เพียงหนึ่งคำสั่ง ตามรุ่น Server Version ของเครื่อง ตัวอย่างสำหรับ Kubernetes 1.34 ขึ้นไป:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.9.0/components.yaml
kubectl -n kube-system rollout status deployment/metrics-server --timeout=120s
kubectl -n kube-system get deployment metrics-server
kubectl get apiservice v1beta1.metrics.k8s.io

หาก rollout status สำเร็จแต่ APIService ยังไม่พร้อม ให้ตรวจสอบสถานะและ log ในหัวข้อแก้ปัญหา การดึง image และการเก็บข้อมูลรอบแรกอาจใช้เวลาเพิ่มเติม

#3. ดู CPU และหน่วยความจำ

kubectl top nodes
kubectl top pods -A
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes

ตัวอย่างรูปแบบผลลัพธ์ (ตัวเลขขึ้นอยู่กับเครื่อง):

NAME             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
docker-desktop   180m         2%     1550Mi          20%

m คือ millicore เช่น 180m เท่ากับ 0.18 CPU core ส่วน Mi คือ mebibyte ข้อมูล kubectl top เป็นค่าการใช้ทรัพยากรที่เก็บเป็นรอบ จึงอาจยังไม่ปรากฏทันทีหลังสร้าง Pod [4]

#4. ตัวอย่าง HPA สำหรับห้องทดลอง

HPA ที่ใช้ CPU ต้องมีค่า resources.requests.cpu ของ container เพื่อคำนวณสัดส่วนการใช้ CPU ตัวอย่างนี้สร้าง Deployment และ HPA ใน namespace แยกต่างหาก ไม่รับประกันว่าจะเห็นการเพิ่ม replica เพราะต้องมีโหลดเพียงพอ [5]

kubectl create namespace metrics-demo
kubectl -n metrics-demo create deployment web --image=nginx:stable --replicas=1
kubectl -n metrics-demo set resources deployment/web --requests=cpu=100m,memory=64Mi --limits=cpu=500m,memory=128Mi
kubectl -n metrics-demo autoscale deployment web --cpu-percent=50 --min=1 --max=3
kubectl -n metrics-demo get hpa
kubectl -n metrics-demo top pods

เมื่อทดลองเสร็จ:

kubectl delete namespace metrics-demo

#แก้ปัญหาที่พบบ่อย

#Metrics API not available หรือ kubectl top ยังไม่มีข้อมูล

kubectl -n kube-system get pods -l k8s-app=metrics-server
kubectl -n kube-system logs deployment/metrics-server --tail=100
kubectl describe apiservice v1beta1.metrics.k8s.io

ตรวจว่า Pod ทำงาน, APIService มีสถานะ Available=True และรอสักครู่ให้มีการเก็บข้อมูลรอบแรก หาก image ดึงไม่ได้ให้ตรวจเครือข่ายหรือ proxy ของ Docker Desktop

#Log พบ x509: certificate signed by unknown authority

เฉพาะคลัสเตอร์ Docker Desktop เพื่อการทดลอง และเฉพาะเมื่อ log ยืนยันว่า Metrics Server ตรวจสอบใบรับรองของ kubelet ไม่ผ่าน ให้เพิ่ม flag ต่อไปนี้:

kubectl -n kube-system patch deployment metrics-server --type=json -p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'
kubectl -n kube-system rollout status deployment/metrics-server --timeout=120s
kubectl top nodes

Flag นี้ ปิดการตรวจสอบใบรับรอง TLS ของ kubelet เท่านั้น ไม่ได้แก้การเชื่อมต่อหรือใบรับรองฝั่ง APIService ผู้ดูแลโครงการระบุให้ใช้เพื่อการทดสอบ และแนะนำให้ตรวจสอบใบรับรองผ่าน CA ในระบบจริง [2][6] อย่าเพิ่ม flag ซ้ำ หากเคย patch แล้ว หากต้องการคืนค่าบนเครื่องทดลอง สามารถติดตั้ง manifest รุ่นเดิมอีกครั้งและตรวจสอบ args ของ Deployment

#Pod ทำงาน แต่ APIService ไม่พร้อม

ดูเหตุผลจาก kubectl describe apiservice ... และ log ของ Metrics Server ตรวจเครือข่ายจาก control plane ไปยัง Metrics Server และจาก Metrics Server ไปยัง kubelet ตามข้อกำหนดของโครงการ [2] ปัญหากลุ่มนี้ต่างจากข้อผิดพลาด x509 ของ kubelet จึงไม่ควรใส่ --kubelet-insecure-tls โดยไม่มีหลักฐานใน log

#สรุป

ขั้นตอนหลักคือเปิด Kubernetes ใน Docker Desktop, ตรวจรุ่น Kubernetes, ติดตั้ง Metrics Server รุ่นที่รองรับ แล้วใช้ kubectl top nodes และ kubectl top pods -A ตรวจผล หากมีปัญหาให้ไล่ดู Pod, APIService และ log ก่อนปรับค่า TLS

#แหล่งอ้างอิง

  1. Kubernetes: Resource metrics pipeline
  2. Metrics Server: README, installation, compatibility and requirements
  3. Docker Desktop: Explore the Kubernetes view
  4. Kubernetes: kubectl top node
  5. Kubernetes: Horizontal Pod Autoscaling
  6. Metrics Server: FAQ, security configuration