Cấu hình thời gian chờ (Cool-down) để tránh Scaling liên tục
Hiện tượng scaling liên tục (thrashing) xảy ra khi Cluster Autoscaler hoặc HPA phản ứng quá nhanh với các biến động nhỏ về tải, dẫn đến việc khởi tạo và giải phóng node không cần thiết, gây tốn chi phí và giảm hiệu năng.
Bạn cần điều chỉnh tham số scale-up cooldown trong config của Cluster Autoscaler để đặt thời gian chờ tối thiểu trước khi tiến hành scale-up tiếp theo.
Sửa file cấu hình ConfigMap của Cluster Autoscaler đã triển khai ở Phần 5. File này thường nằm trong namespace kube-system.
kubectl edit configmap cluster-autoscaler -n kube-system
Sau khi file mở ra, tìm phần data và thêm hoặc sửa các dòng sau để đặt thời gian chờ là 10 phút (600 giây) cho scale-up và 10 phút cho scale-down.
data:
cluster-autoscaler-node-group: |
- name: proxmox-node-group
min: 2
max: 10
cooldown: 600
cluster-autoscaler-scale-down-delay: 10m
cluster-autoscaler-scale-up-delay: 10m
Lưu lại và thoát editor. Kubernetes sẽ tự động reload cấu hình nếu Cluster Autoscaler được cấu hình theo dõi ConfigMap này, hoặc bạn cần restart deployment nếu chạy theo mode tĩnh.
kubectl rollout restart deployment cluster-autoscaler -n kube-system
Kiểm tra lại các flag khởi động của pod Cluster Autoscaler để xác nhận thông số đã được áp dụng.
kubectl describe pod -n kube-system -l app=cluster-autoscaler | grep -E "scale-up-delay|scale-down-delay|cooldown"
Kết quả mong đợi: Bạn thấy các giá trị --scale-up-delay=10m và --cooldown=600 trong phần Command hoặc Flags của pod.
Sử dụng Taints và Tolerations để phân tách Workload
Để tối ưu chi phí, bạn cần ngăn các workload quan trọng hoặc có yêu cầu tài nguyên đặc biệt chạy trên các node tự động scale (spot/preemptible) hoặc ngược lại, đảm bảo các node mới được tạo chỉ chạy các workload phù hợp.
Áp dụng Taint lên các node Proxmox mới được tạo để đánh dấu chúng là "chỉ dành cho batch job" hoặc "tạm thời".
Đầu tiên, xác định node nào cần được đánh dấu. Giả sử bạn có một node tên là worker-node-02 muốn chỉ chạy các job tính toán nặng.
kubectl taint nodes worker-node-02 batch=true:NoSchedule
Khi áp dụng taint này, bất kỳ Pod nào không có Toleration tương ứng sẽ bị từ chối (schedule) lên node này. Kubernetes sẽ giữ Pod đó ở trạng thái Pending.
Để cho phép ứng dụng của bạn chạy trên node có taint này, bạn cần thêm Toleration vào spec của Deployment hoặc Job.
cat > /tmp/deployment-with-toleration.yaml
Triển khai file cấu hình này để kiểm tra việc phân tách workload.
kubectl apply -f /tmp/deployment-with-toleration.yaml
Verify bằng cách kiểm tra trạng thái của Pod và xem nó đang chạy trên node nào. Pod này chỉ có thể chạy trên worker-node-02 hoặc các node khác có cùng taint.
kubectl get pods -l app=batch-processor -o wide
Kết quả mong đợi: Pod batch-processor đang ở trạng thái Running và cột NODE hiển thị tên worker-node-02. Nếu bạn tạo một Deployment khác không có Toleration, nó sẽ không bao giờ chạy trên node này.
Cấu hình Node Affinity để cân bằng tải trên các Node
Taints/Tolerations là cơ chế "cấm", còn Node Affinity là cơ chế "hướng dẫn" để cân bằng tải một cách thông minh hơn, đảm bảo các Pod được phân bổ đều hoặc tập trung vào các node có nhãn (label) cụ thể.
Bạn cần gắn nhãn (label) cho các node Proxmox dựa trên loại phần cứng hoặc vị trí để Cluster Autoscaler và Scheduler biết cách phân bổ.
Gán nhãn disk-type=ssd cho các node có ổ cứng NVMe tốc độ cao, và disk-type=hdd cho các node lưu trữ giá rẻ.
kubectl label nodes worker-node-01 disk-type=ssd
kubectl label nodes worker-node-02 disk-type=hdd
Tạo một Deployment yêu cầu bắt buộc (Required) phải chạy trên các node có SSD để đảm bảo hiệu năng I/O cao nhất cho ứng dụng Database.
cat > /tmp/deployment-ssd-affinity.yaml
Triển khai Deployment yêu cầu SSD.
kubectl apply -f /tmp/deployment-ssd-affinity.yaml
Kiểm tra xem Pod có được đặt đúng node có label ssd hay không.
kubectl get pods -l app=database -o wide
Kết quả mong đợi: Tất cả 3 Pod của Deployment db-optimized đều nằm trên worker-node-01 (node có label ssd). Nếu node này đầy, Pod sẽ treo ở trạng thái Pending thay vì chạy trên node HDD, đảm bảo hiệu năng không bị giảm.
Bây giờ, hãy thử cấu hình Preferred affinity để cân bằng tải nhẹ nhàng hơn cho các ứng dụng web không yêu cầu khắt khe, giúp phân bổ đều trên tất cả các node có SSD nếu có.
cat > /tmp/deployment-web-preferred.yaml
Triển khai Deployment web với preferred affinity.
kubectl apply -f /tmp/deployment-web-preferred.yaml
Verify bằng cách liệt kê tất cả các Pod và quan sát sự phân bổ trên các node.
kubectl get pods -l app=web -o wide
Kết quả mong đợi: Kubernetes sẽ ưu tiên đặt Pod lên node worker-node-01 (SSD) vì trọng số (weight) cao. Khi node SSD đã đầy hoặc không đủ tài nguyên, nó sẽ tự động "rơi xuống" (fallback) và chạy trên node HDD (worker-node-02), đảm bảo tính sẵn sàng cao mà vẫn ưu tiên hiệu năng.
Điều hướng series:
Mục lục: Series: Xây dựng hạ tầng Kubernetes tự động (Auto-Scaling) với K3s và Helm trên Proxmox
« Phần 7: Tích hợp Proxmox API để mở rộng node tự động
Phần 9: Troubleshooting và xử lý sự cố Auto-Scaling »