Auto-scaling là một tính năng quan trọng trong Kubernetes, đây là cách thức tự động tăng/giảm tài nguyên máy tính cung cấp cho ứng dụng tùy vào lượng truy cập của ứng dụng đó. Điều này giúp tạo ra những hệ thống trên cloud có khả năng mở rộng 24/24 nhằm đáp ứng nhu cầu sử dụng và tối ưu tài nguyên máy tính.

Trong Kubernetes cung cấp hai giải pháp hỗ trợ việc này là HPAVPA.

  • VPA (Vertical Pod AutoScaler) – scale theo chiều sâu, hiểu đơn giản là tăng thêm/giảm bớt CPU và RAM cho các Pods hiện có.
  • HPA (Horizontal Pod AutoScaler) – scale theo chiều ngang, hiểu đơn giản là tăng thêm/giảm bớt các Pods hiện có.

Ở bài này mình sẽ hướng dẫn sử dụng HPA (Horizontal Pod AutoScaler).

Yêu cầu trước khi thực hiện:

  • Đã biết sử dụng các loại tài nguyên trong Kubernetes như: Pod, Deployment, ReplicaSet.
  • Đã cài đặt Kubernetes
  • Đã cài đặt Metrics Server – đây là công cụ giám sát về tài nguyên sử dụng trên cluster, cung cấp các API để các thành phần khác truy vấn đến biết được và mức độ sử dụng tài nguyên (CPU, Memory) của Pod, Node … Cần có Metric Server để HPA hoạt động chính xác.

Thực hiện HPA:

  • Bước 1: Triển khai một deployment

Tệp cấu hình nginx.yaml để tạo một deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx         # Tên deployment
  namespace: default  
spec:
  replicas: 1         # Số pod khởi tạo ban đầu
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx         # Tên container
        image: nginx:1.7.9  # Tên images - images này được pull từ Docker Hub
        ports:
        - containerPort: 80  # Cổng của container ánh xạ ra bên ngoài
        resources:
          requests:
            # Đảm bảo rằng CPU được phân bổ cho Pod là 100m (khi hệ thống dư thừa
            # tài nguyên thì có thể chạy vượt quá 100m) - căn cứ vào đây để scale
            cpu: 100m

Tệp cấu hình nginx-service.yaml để tạo service truy cập dịch vụ nginx từ bên ngoài

kind: Service 
apiVersion: v1
metadata: 
  name: nginx-service # Tên của service k8s
spec: 
  selector: 
    app: nginx
  ports: 
  - protocol: TCP 
    port: 80            # Cổng của service (IP trong Cluster)
    targetPort: 80      # Cổng của container
    nodePort: 31080     # Cổng ánh xạ ra máy host
  type: NodePort 

Tệp cấu hình nginx-hpa.yaml để tạo HPA áp dụng cho deployment vừa tạo

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment     # Áp dụng HPA cho Deployment
    name: nginx
  minReplicas: 1   # Số pod scale nhỏ nhất
  maxReplicas: 10  # Số pod scale lớn nhất

  # thực hiện scale khi CPU hoạt động ở mức 10%
  # so với CPU mà pod được xác định
  # (ở trên mình để cpu của pod là 100m)

  targetCPUUtilizationPercentage: 10 

Bây giờ, apply các tệp yaml này để tạo Deployment và HPA

kubectl apply -f nginx.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-hpa.yaml

Sau khi tạo xong, ta tiến hành tạo tải cho Pods bằng lệnh

kubectl run --generator=run-pod/v1 -it --rm load-generator --image=busybox /bin/sh

Sau khi chạy lệnh này, sẽ thấy dấu nhắc lệnh, chúng ta chạy tiếp lệnh

while true; do wget -q -O- http://172.16.10.100:31080; done

Ở đây địa chỉ server của mình là 172.16.10.100, các bạn thay địa chỉ server cài kubernetes của các bạn vào, còn cổng 31080 thì mình đã định nghĩa ở file nginx-service.yaml nên các bạn giữ nguyên.

Mở tiếp một terminal mới, chạy lệnh sau để kiểm tra số pods đã được tự động scale

kubectl get hpa
kubectl get pods