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à HPA và VPA.
- 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