1. Cài đặt Cluster Autoscaler qua Helm
Trước khi triển khai, chúng ta cần thêm repository chính thức của Kubernetes Autoscaler vào Helm để truy cập chart mới nhất.
Thao tác này giúp Helm biết nguồn gốc của package cần cài đặt, đảm bảo tính tương thích với phiên bản K3s hiện tại.
Kết quả mong đợi: Repository "kubernetes-autoscaler" được thêm vào danh sách và cập nhật thành công.
helm repo add kubernetes-autoscaler https://kubernetes.github.io/autoscaler
helm repo update
Chuẩn bị file cấu hình values.yaml
Tạo file cấu hình tùy chỉnh để xác định các tham số quan trọng như namespace, phiên bản, và các flag đặc thù cho K3s.
Việc tách biệt cấu hình ra file riêng giúp quản lý version control dễ dàng và tái sử dụng cho các cluster khác.
Kết quả mong đợi: File /root/autoscaler-values.yaml được tạo với nội dung hoàn chỉnh.
cat > /root/autoscaler-values.yaml
Triển khai Cluster Autoscaler
Sử dụng Helm để deploy cluster-autoscaler vào namespace kube-system dựa trên file values.yaml vừa tạo.
Autoscaler cần chạy trong namespace kube-system để có quyền truy cập vào API server và các node của cluster.
Kết quả mong đợi: Release "cluster-autoscaler" được tạo thành công và pod đang ở trạng thái Running.
helm install cluster-autoscaler kubernetes-autoscaler/cluster-autoscaler -n kube-system -f /root/autoscaler-values.yaml
Verify kết quả cài đặt
Kiểm tra trạng thái của pod cluster-autoscaler để đảm bảo nó đã khởi động và không bị lỗi (CrashLoopBackOff).
Pod cần có trạng thái "Running" và số lần restart bằng 0 hoặc thấp.
kubectl get pods -n kube-system | grep cluster-autoscaler
Kiểm tra log để xác nhận Autoscaler đã kết nối thành công với API server và nhận diện cloud provider.
Log sẽ hiển thị thông báo "Watching nodes..." và "Starting Cluster Autoscaler...".
kubectl logs -n kube-system -l app=cluster-autoscaler --tail=50
2. Cấu hình tham số Autoscaler cho K3s
Thiết lập nhãn (Labels) cho Node hiện tại
Áp dụng label "node.kubernetes.io/exclude-from-external-load-balancers" và các label tùy chỉnh để Autoscaler nhận diện node nào có thể scale up/down.
Cluster Autoscaler chỉ thao tác trên các node có label "cluster-autoscaler.kubernetes.io/enable-scale-down" hoặc "cluster-autoscaler.kubernetes.io/enable-scale-up".
Kết quả mong đợi: Label được gán thành công cho tất cả các worker node hiện có.
kubectl label nodes --all cluster-autoscaler.kubernetes.io/enable-scale-down=true cluster-autoscaler.kubernetes.io/enable-scale-up=true
kubectl label nodes --all cluster-autoscaler.kubernetes.io/safe-to-evict=true
Thiết lập giới hạn Min/Max cho Node Pool
Trong môi trường K3s trên Proxmox, chúng ta giả định một "Node Group" ảo. Cấu hình này xác định số lượng node tối thiểu và tối đa trong cluster.
Autoscaler sẽ đảm bảo số lượng node không bao giờ giảm xuống dưới min (để duy trì SLA) và không vượt quá max (để kiểm soát chi phí).
Kết quả mong đợi: File cấu hình node pool được tạo để sử dụng trong bước tích hợp Proxmox API sau này.
cat > /root/nodepool-config.yaml
kubectl apply -f /root/nodepool-config.yaml
Verify cấu hình Node Pool
Kiểm tra xem ConfigMap đã được tạo thành công trong namespace kube-system chưa.
Dữ liệu bên trong ConfigMap phải khớp với file chúng ta vừa tạo.
kubectl get configmap autoscaler-nodepools -n kube-system -o yaml
Quan sát log của Autoscaler để xem nó có nhận diện được cấu hình node pool mới không.
Log sẽ hiển thị thông báo "Node group k3s-proxmox-pool added with min 2 max 10".
kubectl logs -n kube-system -l app=cluster-autoscaler | grep -i "node group"
3. Tạo Template Máy ảo Proxmox cho Autoscaler
Chuẩn bị VM Template cơ sở
Tạo một máy ảo mới trên Proxmox, cài đặt OS (Debian/Ubuntu), cấu hình K3s agent, và thực hiện các bước chuẩn bị để đóng gói thành template.
VM này sẽ đóng vai trò là "bản mẫu" (template) mà Proxmox sẽ clone nhanh chóng khi Autoscaler yêu cầu scale up.
Kết quả mong đợi: Một VM sạch sẽ, đã cài K3s agent và sẵn sàng để đóng gói.
qm create 100 --name k3s-worker-base --ostype l26 --net0 virtio,link=vmbr0 --net1 virtio,link=vmbr1 --memory 8192 --cores 4 --scsihw virtio-scsi-pci --scsi0 local-lvm:40 --boot c --bootdisk scsi0 --serial0 socket --vga serial0
qm set 100 --agent 1 --vmgenid 1
Cài đặt và cấu hình K3s trên VM Template
Truy cập vào VM vừa tạo, cài đặt K3s ở chế độ agent và join vào cluster chính.
Đảm bảo VM có thể liên lạc với K3s server và nhận token join hợp lệ.
curl -sfL https://get.k3s.io | sh -s - server --token YOUR_K3S_TOKEN --server https://K3S_SERVER_IP:6443
Cấu hình file /etc/k3s/config.yaml để đảm bảo VM nhận đúng label và taints khi khởi động.
cat > /etc/k3s/config.yaml
Chuẩn bị và đóng gói Template (Cloud-init)
Cài đặt cloud-init trên VM để nó có thể nhận dữ liệu khởi tạo (hostname, IP, token) từ Proxmox khi clone.
Cloud-init là cầu nối quan trọng giữa Proxmox API và Kubernetes, giúp mỗi VM clone có cấu hình duy nhất.
apt update && apt install -y cloud-init && cloud-init clean --logs
Tắt máy ảo, xóa các file tạm, và chuyển đổi thành Template trên Proxmox.
VM sẽ không còn thể boot trực tiếp nữa mà chỉ dùng để clone.
qm stop 100
qm set 100 --cloudinit cdrom
qm template 100
Cấu hình Proxmox để hỗ trợ Autoscaler
Tạo một script shell trên Proxmox (thường đặt tại /usr/local/bin/proxmox-autoscaler.sh) để xử lý yêu cầu tạo VM từ Template.
Script này sẽ nhận input từ Cluster Autoscaler (thông qua webhook hoặc API) và thực thi lệnh clone.
cat > /usr/local/bin/proxmox-autoscaler.sh
chmod +x /usr/local/bin/proxmox-autoscaler.sh
Verify Template và Script
Kiểm tra xem template đã được tạo thành công trong danh sách VM của Proxmox.
Template sẽ có trạng thái "stopped" và không thể start trực tiếp.
qm list | grep k3s-worker-base
Chạy thử script với các tham số mẫu để đảm bảo VM được tạo và join vào cluster.
VM mới sẽ xuất hiện trong danh sách node của K3s sau vài phút.
/usr/local/bin/proxmox-autoscaler.sh 101 100 4 8192 40
kubectl get nodes
Đ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 4: Triển khai Metric Server để theo dõi tài nguyên
Phần 6: Thiết lập Horizontal Pod Autoscaler (HPA) cho ứng dụng »