Tạo API Token trên Proxmox cho Cluster Autoscaler
Để Cluster Autoscaler có thể tạo và xóa máy ảo trên Proxmox, bạn cần tạo một API Token với quyền hạn cụ thể cho một user mới.
Truy cập vào giao diện web của Proxmox, chọn Permissions trong menu bên trái của cluster, sau đó click Add.
Tạo một user mới (ví dụ: autoscaler@pve) và cấp quyền Cluster với vai trò Administrator hoặc một vai trò tùy chỉnh có quyền VM.Audit, VM.Allocate, VM.Monitor, VM.PowerMgmt và VM.Clone.
Sau khi có user, click vào tên user vừa tạo, chọn tab API Tokens, click Add.
Điền thông tin token:
- Token ID:
autoscaler-token
- Privilege Separation: Bỏ chọn (giữ nguyên)
- Enable: Đánh dấu chọn
- Expiration Date: Để trống (vô thời hạn)
Click Add. Hệ thống sẽ hiển thị nội dung token. Copy toàn bộ nội dung này (dạng user-id!token-id:secret-hash) để dùng ở bước sau.
Kết quả mong đợi: Bạn có một chuỗi token dài, ví dụ: root@pam!autoscaler-token:8f3a9b2c-1d4e-5f6g-7h8i-9j0k1l2m3n4o.
Tạo API Token thông qua dòng lệnh (CLI)
Nếu bạn đang làm việc trên terminal Proxmox, hãy chạy lệnh sau để tạo user và token nhanh chóng:
pveum user add autoscaler@pve comment="User for K3s Autoscaler"
pveum aclmod / -role Administrator -user autoscaler@pve
pveum token add autoscaler@pve autoscaler-token -privsep 0
Kết quả mong đợi: Lệnh cuối cùng sẽ in ra nội dung token. Copy giá trị privsep (secret) và phần ID để ghép thành chuỗi đầy đủ.
Cấu hình Secret trong Kubernetes để lưu thông tin Proxmox
Cluster Autoscaler cần thông tin kết nối đến Proxmox API. Chúng ta sẽ lưu API Token và URL Proxmox vào một Kubernetes Secret để bảo mật.
Tạo file cấu hình secret với nội dung sau. Thay thế <YOUR_PROXMOX_API_TOKEN> bằng chuỗi token bạn đã copy ở phần trước và <PROXMOX_HOST> bằng IP hoặc hostname của Proxmox (không cần http/https).
File: /tmp/proxmox-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: proxmox-secret
namespace: kube-system
type: Opaque
data:
# Base64 encoded Proxmox API Token (user!token-id:secret)
token: <YOUR_BASE64_TOKEN_HERE>
# Base64 encoded Proxmox Host URL
host: <YOUR_BASE64_HOST_HERE>
Để tạo secret này, trước hết bạn cần encode token và host bằng base64. Chạy lệnh:
echo -n "root@pam!autoscaler-token:8f3a9b2c-1d4e-5f6g-7h8i-9j0k1l2m3n4o" | base64
echo -n "192.168.1.10" | base64
Sau đó điền giá trị base64 vào file yaml ở trên và áp dụng:
kubectl apply -f /tmp/proxmox-secret.yaml
Kết quả mong đợi: Secret được tạo thành công trong namespace kube-system. Verify bằng lệnh:
kubectl get secret proxmox-secret -n kube-system
Cấu hình Cluster Autoscaler sử dụng Proxmox Provider
Cluster Autoscaler cho K3s thường sử dụng Kubernetes provider mặc định, nhưng để tích hợp Proxmox, chúng ta cần cấu hình nó sử dụng logic custom hoặc một provider wrapper. Trong môi trường K3s, cách phổ biến nhất là sử dụng kubernetes-autoscaler với cấu hình --nodes và --node-group-auto-discovery kết hợp với script custom hoặc Helm chart hỗ trợ Proxmox.
Tuy nhiên, K3s không có Proxmox provider native trong Helm chart chính thức. Chúng ta sẽ cấu hình Cluster Autoscaler để phát hiện các node dựa trên label và sử dụng một script shell đơn giản để gọi Proxmox API khi cần scale up.
Bước 1: Cập nhật giá trị cho Helm Chart Cluster Autoscaler. Tạo file autoscaler-values.yaml.
replicas: 1
rbac:
create: true
podLabels: {}
extraArgs:
- --nodes=1:10:proxmox-node-group
- --node-group-auto-discovery=generic:label=node.kubernetes.io/role=worker
- --proxmox-url=https://192.168.1.10:8006
- --proxmox-token=autoscaler@pam!autoscaler-token:8f3a9b2c-1d4e-5f6g-7h8i-9j0k1l2m3n4o
- --skip-nodes-with-local-storage=false
- --expander=least-waste
- --balance-node-groups=false
- --proxmox-vm-template=ubuntu2204-k3s
- --proxmox-storage=default-local
- --proxmox-cpu=2
- --proxmox-ram=4096
- --proxmox-disk=40
image:
repository: k8s.gcr.io/cluster-proportional-autoscaler
tag: "1.8.5"
pullPolicy: IfNotPresent
Chú ý: Các tham số --proxmox-* là custom parameters. Để chúng hoạt động, bạn cần sử dụng một image cluster autoscaler đã được build sẵn với support Proxmox hoặc chạy một sidecar container để xử lý logic gọi API Proxmox. Nếu bạn đang dùng K3s thuần, cách an toàn nhất là cấu hình extraArgs để chỉ định node group và sử dụng NodeGroup logic trong Kubernetes.
Tuy nhiên, vì K3s không hỗ trợ native Proxmox provider, chúng ta sẽ sử dụng cách tiếp cận Custom Node Group bằng cách đánh label và sử dụng cluster-api hoặc k3s-upgrade logic. Để đơn giản hóa cho bài này, chúng ta giả định bạn đã có một custom image hoặc script gọi API Proxmox.
Áp dụng cấu hình Helm:
helm upgrade --install cluster-autoscaler cluster-autoscaler/cluster-autoscaler -f autoscaler-values.yaml -n kube-system
Kết quả mong đợi: Pod cluster-autoscaler được deploy lại với các argument mới. Kiểm tra logs để xem nó có nhận diện node group Proxmox không.
kubectl logs -f -n kube-system -l app=cluster-autoscaler
Bạn sẽ thấy log: Proxmox node group 'proxmox-node-group' discovered hoặc tương tự nếu image hỗ trợ.
Verify kết quả tích hợp
Để kiểm tra Cluster Autoscaler đã sẵn sàng scale up node Proxmox, hãy tạo một workload yêu cầu nhiều tài nguyên hơn hiện có.
Tạo một Deployment đơn giản với 10 replicas, mỗi replica yêu cầu 1 CPU và 1Gi RAM (giả sử hiện tại cụm không đủ tài nguyên).
kubectl run stress-test --image=nginx --replicas=10 --requests=cpu=1,memory=1Gi
Quan sát logs của Cluster Autoscaler:
kubectl logs -f -n kube-system -l app=cluster-autoscaler | grep "scale"
Kết quả mong đợi: Bạn thấy log Scale up: need to create 1 nodes for node group proxmox-node-group. Nếu cấu hình đúng, Proxmox sẽ nhận lệnh tạo VM mới, và Kubernetes sẽ tự động join node mới vào cụm.
Verify node mới đã xuất hiện:
kubectl get nodes -o wide
Bạn sẽ thấy một node mới với status Ready sau khi Proxmox tạo xong VM và K3s agent chạy.
Đ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 6: Thiết lập Horizontal Pod Autoscaler (HPA) cho ứng dụng
Phần 8: Tối ưu hóa hiệu năng và chi phí cho cụm Auto-Scaling »