Danh sách bài viết trong series Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Lộ Trình Học Kubernetes Từ Cơ Bản Đến Chứng Chỉ CKAD
- Bài 1: Giới Thiệu Kubernetes Và Khái Niệm Cluster Cho CKAD
- Bài 2: Cài Đặt Minikube Và sử dụng kubectl Cơ Bản
- Bài 3: Quản Lý Pod Cơ Bản (Create, Delete, Describe)
- Bài 4: Sử Dụng ConfigMap Và Secret Trong YAML
- Bài 5: Quản Lý Environment Variables Và Command/Args
- Bài 6: Cấu Hình Deployment Và Replica Set
- Bài 7: Thiết Kế Pod Với Nhiều Container
- Bài 8: Sử Dụng Sidecar Và Init Container
- Bài 9: Chia Sẻ Tài Nguyên Giữa Các Container
- Bài 10: Giám Sát Log Và Events Với kubectl logs
- Bài 11: Debug Pod Với kubectl describe Và exec
- Bài 12: Tối Ưu Pod Với Resource Limits Và Requests
- Bài 13: Sử Dụng Liveness Và Readiness Probes
- Bài 14: Tối Ưu Hóa Pod Với HPA (Horizontal Pod Autoscaler)
- Bài 15: Cấu Hình Service (ClusterIP, NodePort)
- Bài 16: Sử Dụng Ingress Và Network Policy
- Bài 17: Quản Lý DNS Và Load Balancing Trong Kubernetes
- Bài 18: Sử Dụng Volume (emptyDir, hostPath)
- Bài 19: Cấu Hình Persistent Volume Và Persistent Volume Claim
- Bài 20: Tổng Kết, Mẹo Thi CKAD, Bài Tập Thực Hành Cuối
Sau khi đã học sử dụng Liveness và Readiness Probes ở Bài 13, chúng ta đang ở giai đoạn Observability và tối ưu, và bài này thuộc Domain: Pod Design (18% trọng số kỳ thi CKAD) một trong những phần rất hay ra đề và được chấm điểm cao nếu bạn làm đúng.
HPA cho phép Kubernetes tự động điều chỉnh số lượng Pod trong một Deployment, ReplicaSet hoặc StatefulSet dựa trên metrics như CPU, memory hoặc custom metrics. Nhờ đó, ứng dụng có thể đáp ứng tốt khi traffic tăng cao và tiết kiệm tài nguyên khi nhu cầu giảm một yếu tố quan trọng để tối ưu chi phí và hiệu năng.
Trong kỳ thi CKAD, bạn có thể gặp task yêu cầu tạo hoặc chỉnh sửa HPA để scale ứng dụng dựa trên CPU hoặc memory usage, kiểm tra HPA status qua kubectl get hpa, hoặc debug tình huống HPA không hoạt động do thiếu metrics server.
HPA Là Gì? Tại Sao Cần Nó?
HPA (Horizontal Pod Autoscaler) tự động tăng/giảm số lượng Pod trong một Deployment, ReplicaSet hoặc StatefulSet dựa trên tài nguyên sử dụng (CPU, memory) hoặc custom metrics.
So Sánh Vertical vs Horizontal Scaling
| Loại | Mô tả | Ví dụ |
|---|---|---|
| Vertical | Tăng tài nguyên cho Pod (CPU/RAM) | Từ 500m => 2 CPU |
| Horizontal | Tăng số lượng Pod | Từ 3 => 10 Pod |
HPA = Horizontal Pod Autoscaler => Chỉ scale số lượng Pod, không thay đổi tài nguyên mỗi Pod.
Điều Kiện Để HPA Hoạt Động
| Yêu cầu | Bắt buộc? | Ghi chú |
|---|---|---|
| Metrics Server | Yes | Thu thập CPU/memory từ Pod |
| Resource requests | Yes | Bắt buộc có requests.cpu hoặc requests.memory |
| Deployment/ReplicaSet | Yes | HPA không scale Pod lẻ |
| Kubernetes ≥ 1.23 | Yes | HPA v2 là default |
Cảnh báo thi CKAD: Nếu Pod không có requests.cpu => HPA sẽ không hoạt động => Mất điểm.
Cài Đặt Metrics Server (Trên Minikube)
Trong môi trường thi CKAD, Metrics Server đã được cài sẵn. Nhưng nếu bạn thực hành trên minikube, cần cài thủ công:
minikube addons enable metrics-server
Kiểm tra:
kubectl get pods -n kube-system | grep metrics-server
Chờ khoảng 1 phút để sẵn sàng.
Mẹo thi: Dùng kubectl top pod để kiểm tra CPU/memory. Nếu lỗi => Metrics Server chưa chạy.
Cấu Hình Deployment Có Resource Requests
Tạo file php-apache.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
replicas: 2
selector:
matchLabels:
app: php-apache
template:
metadata:
labels:
app: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
requests:
cpu: 200m # BẮT BUỘC cho HPA
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
Áp dụng:
kubectl apply -f php-apache.yaml
Tạo Service để expose:
apiVersion: v1
kind: Service
metadata:
name: php-apache
spec:
selector:
app: php-apache
ports:
- port: 80
targetPort: 80
type: ClusterIP
Tạo HPA Bằng Lệnh Imperative (Nhanh Dùng Trong Thi)
kubectl autoscale deployment php-apache \
--cpu-percent=50 \
--min=2 \
--max=10
Giải thích:
--cpu-percent=50: Khi CPU trung bình > 50% => scale up--min=2,--max=10: Giới hạn số Pod
Xem HPA:
kubectl get hpa
kubectl describe hpa php-apache
Tạo HPA Bằng YAML (Cách Thi CKAD Yêu Cầu)
Tạo file hpa.yaml:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60 # >60% CPU => scale
Áp dụng:
kubectl apply -f hpa.yaml
CKAD Tip: Dùng autoscaling/v2 (v1 hoặc v2beta bị deprecated).
Tạo Load Để Kích Hoạt HPA
Mở terminal mới, tạo Pod tạo tải:
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://php-apache; done"
Theo dõi scale:
watch kubectl get hpa php-apache
watch kubectl get pods -l app=php-apache
Sau 2–3 phút, bạn sẽ thấy Pod tăng từ 2 => 3 => 4…
HPA Với Memory (Ít Dùng Nhưng Có Thể Ra Đề)
metrics:
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 500Mi
Dùng averageValue (tổng memory / số Pod), không dùng phần trăm.
HPA Với Custom Metrics (Bonus)
Ví dụ: Scale theo QPS (queries per second) từ Prometheus:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 100
Không nằm trong đề CKAD, nhưng hữu ích khi phỏng vấn thực tế.
Debug HPA Không Scale? (Rất Hay Gặp Trong Thi)
| Triệu chứng | Nguyên nhân | Cách fix |
|---|---|---|
Unable to get metrics |
Metrics Server chưa chạy | Kiểm tra kubectl top pod |
| `cpu: | ||
| Thiếurequests.cpu` |
Thêm vào container spec | |
| Scale không lên | Đạt maxReplicas |
Tăng giá trị --max |
| Scale không xuống | minReplicas quá cao |
Giảm giá trị --min |
Debug nhanh:
kubectl describe hpa php-apache
kubectl get hpa php-apache -o yaml
Liên Hệ Với Chứng Chỉ CKAD
Domain Pod Design (18%) thường có task về HPA, ví dụ:
- Tạo HPA scale dựa trên CPU.
- Debug lỗi
unknowndo thiếu Metrics Server hoặcrequests.cpu. - Giải thích khác biệt giữa autoscale YAML và lệnh imperative.
Mẹo thi:
- Luôn dùng
autoscaling/v2. - Không quên
requests.cpu. - Kiểm tra
kubectl get hpa -o yamlđể thấyconditions. - Thời gian làm: ~7–9 phút.
- Luyện tập:
kubectl explain hpa.spec.metrics.
Thực Hành Thực Tế Trên Minikube
-
Bật metrics-server:
minikube addons enable metrics-server -
Triển khai Deployment:
kubectl apply -f php-apache.yaml - Tạo HPA YAML hoặc bằng lệnh autoscale.
-
Sinh tải:
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://php-apache; done" -
Theo dõi scale:
watch kubectl get hpa php-apache -
Cleanup:
kubectl delete deployment,svc php-apache
Bài Tập CKAD (Làm Trong 7 Phút)
Đề bài (giống thi thật):
Tạo một Deployment frontend:
- Image:
nginx - 3 replicas
requests.cpu: 100m,limits.cpu: 200m-
Tạo HPA:
- minReplicas: 3, maxReplicas: 15
- Scale khi CPU > 70%
Yêu cầu nộp:
2 file YAML: frontend-deployment.yaml và frontend-hpa.yaml
Đáp án
frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: nginx
image: nginx:alpine
resources:
requests:
cpu: 100m
limits:
cpu: 200m
ports:
- containerPort: 80
frontend-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: frontend-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: frontend
minReplicas: 3
maxReplicas: 15
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Áp dụng và kiểm tra:
kubectl apply -f frontend-deployment.yaml
kubectl apply -f frontend-hpa.yaml
kubectl get hpa frontend-hpa
Tóm Tắt Kiến Thức HPA Cho CKAD
| Khái niệm | Giá trị cần nhớ |
|---|---|
| API Version | autoscaling/v2 |
| Target | Deployment, ReplicaSet |
| Metric phổ biến | cpu, memory |
| Target type | Utilization (%) hoặc AverageValue |
| Lệnh nhanh | kubectl autoscale deployment X --cpu-percent=Y --min=A --max=B |
Kết Luận
Bài này mình đã hướng dẫn chi tiết về Horizontal Pod Autoscaler (HPA) cách cấu hình, điều kiện hoạt động, và debug khi HPA không scale đúng. Bạn giờ có thể tự tin triển khai autoscaling cho ứng dụng, kết hợp với resource limits và probes để đảm bảo hệ thống vừa ổn định vừa tối ưu chi phí. Tiếp theo, ở Bài 15: Cấu hình service (ClusterIP, NodePort), chúng ta sẽ bắt đầu bước sang domain Services & Networking (20%) để học cách kết nối và expose ứng dụng trong Kubernetes.




