Bài 14: Tối Ưu Hóa Pod Với HPA (Horizontal Pod Autoscaler)

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í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 unknown do thiếu Metrics Server hoặc requests.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ấy conditions.
  • 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

  1. Bật metrics-server:

    minikube addons enable metrics-server
  2. Triển khai Deployment:

    kubectl apply -f php-apache.yaml
  3. Tạo HPA YAML hoặc bằng lệnh autoscale.
  4. 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"
  5. Theo dõi scale:

    watch kubectl get hpa php-apache
  6. 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.yamlfrontend-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.

Điều hướng chuỗi bài viết<< Bài 13: Sử Dụng Liveness Và Readiness Probes>> Bài 15: Cấu Hình Service (ClusterIP, NodePort)

Thông tin nổi bật

Báo cáo quan trọng

Sự kiện đang hiện hành

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận