Hướng dẫn cài đặt và sử dụng KEDA Cron Scaler
KEDA (Kubernetes Event-Driven Autoscaling) là một công cụ mạnh mẽ cho phép tự động scale các workload trong Kubernetes dựa trên các sự kiện bên ngoài. KEDA Cron Scaler đặc biệt hữu ích cho việc scale ứng dụng theo lịch thời gian được định nghĩa trước, giúp tối ưu hóa tài nguyên và chi phí vận hành. Với khả năng hỗ trợ múi giờ và nhiều trigger cron cùng lúc, KEDA cung cấp giải pháp linh hoạt cho việc quản lý tải theo thời gian.
Kiến trúc và cách thức hoạt động
KEDA hoạt động như một layer bổ sung cho Kubernetes Horizontal Pod Autoscaler (HPA), mở rộng khả năng scaling dựa trên các metrics tùy chỉnh và sự kiện bên ngoài. Khi được cài đặt, KEDA tạo ra các custom resources như ScaledObject để định nghĩa cách thức scaling. KEDA operator sẽ theo dõi các triggers được định nghĩa và tự động tạo ra HPA để thực hiện việc scaling.
Sơ đồ kiến trúc KEDA và cách thức hoạt động với cron scaler
Cron scaler của KEDA cho phép định nghĩa các khung thời gian cụ thể để scale ứng dụng lên/xuống. Khi thời gian bắt đầu (start time) được kích hoạt, KEDA sẽ scale từ số pod tối thiểu lên số pod mong muốn. Sau khi kết thúc (end time), ứng dụng sẽ được scale về mức tối thiểu sau khoảng thời gian cooldown.
Điều kiện tiên quyết
Trước khi triển khai KEDA, bạn cần đảm bảo các điều kiện sau:
- Kubernetes cluster đang hoạt động (phiên bản 1.16 trở lên)
- kubectl đã được cài đặt và cấu hình
- Helm 3.x đã được cài đặt
- Quyền admin trên Kubernetes cluster
- Metrics server đã được cài đặt trong cluster
Cài đặt KEDA
Cài đặt bằng Helm
Phương pháp được khuyến nghị nhất để cài đặt KEDA là sử dụng Helm chart:
# Thêm KEDA Helm repository
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
# Tạo namespace cho KEDA
kubectl create namespace keda
# Cài đặt KEDA
helm install keda kedacore/keda --namespace keda --create-namespace
Kiểm tra cài đặt
Sau khi cài đặt thành công, bạn có thể kiểm tra trạng thái các pod KEDA:
# Kiểm tra pods KEDA
kubectl get pods -n keda
# Kiểm tra version KEDA
kubectl get deployment keda-operator -n keda -o jsonpath='{.spec.template.spec.containers[^1_0].image}'
Kết quả mong đợi sẽ hiển thị 3 pod chính: keda-operator, keda-operator-metrics-apiserver, và keda-admission-webhooks trong trạng thái Running.
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
labels:
app: demo-app
spec:
replicas: 1
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
---
apiVersion: v1
kind: Service
metadata:
name: demo-app-service
spec:
selector:
app: demo-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Triển khai ứng dụng demo
Tạo deployment mẫu
Để thực hành với KEDA Cron Scaler, chúng ta sẽ tạo một ứng dụng Nginx đơn giản:
Áp dụng deployment
kubectl apply -f demo-app-deployment.yaml
Kiểm tra deployment
kubectl get deployments
kubectl get pods -l app=demo-app
kubectl get services
Deployment sẽ tạo ra một pod nginx với resource limits được định nghĩa sẵn, phù hợp cho việc demo scaling.
Cấu hình KEDA Cron Scaler
Tạo ScaledObject với multiple triggers
Dựa trên yêu cầu của bạn, chúng ta sẽ tạo ScaledObject với ba trigger cron khác nhau:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: demo-app-scaler
namespace: default
spec:
scaleTargetRef:
name: demo-app
pollingInterval: 30
cooldownPeriod: 300
idleReplicaCount: 0
minReplicaCount: 1
maxReplicaCount: 20
triggers:
# Trigger 1: Scaling trong giờ làm việc (9h-18h, thứ 2-6)
- type: cron
metadata:
timezone: Asia/Ho_Chi_Minh
start: 0 9 * * 1-5 # 9:00 AM, thứ 2-6
end: 0 18 * * 1-5 # 6:00 PM, thứ 2-6
desiredReplicas: "8"
# Trigger 2: Scaling cuối tuần (10h-16h, thứ 7-CN)
- type: cron
metadata:
timezone: Asia/Ho_Chi_Minh
start: 0 10 * * 6-0 # 10:00 AM, thứ 7-CN
end: 0 16 * * 6-0 # 4:00 PM, thứ 7-CN
desiredReplicas: "3"
# Trigger 3: Scaling cho giờ cao điểm (12h-14h, thứ 2-6)
- type: cron
metadata:
timezone: Asia/Ho_Chi_Minh
start: 0 12 * * 1-5 # 12:00 PM, thứ 2-6
end: 0 14 * * 1-5 # 2:00 PM, thứ 2-6
desiredReplicas: "15
Giải thích cấu hình
Tham số cơ bản của ScaledObject:
scaleTargetRef
: Tham chiếu đến Deployment cần scalepollingInterval
: Khoảng thời gian kiểm tra triggers (mặc định 30 giây)cooldownPeriod
: Thời gian chờ sau khi scale down (mặc định 300 giây)minReplicaCount
: Số pod tối thiểumaxReplicaCount
: Số pod tối đa
Cấu hình Cron Trigger:
timezone
: Múi giờ theo IANA Time Zone Databasestart
: Cron expression thời gian bắt đầu scalingend
: Cron expression thời gian kết thúc scalingdesiredReplicas
: Số pod mong muốn trong khung thời gian
Format Cron Expression
KEDA sử dụng định dạng cron Linux 5 trường:
* * * * *
│ │ │ │ │
│ │ │ │ └─── Ngày trong tuần (0-7, 0 và 7 = Chủ nhật)
│ │ │ └───── Tháng (1-12)
│ │ └─────── Ngày trong tháng (1-31)
│ └───────── Giờ (0-23)
└─────────── Phút (0-59)
Áp dụng cấu hình
kubectl apply -f demo-app-scaledobject.yaml
Mô hình scaling theo thời gian
Với cấu hình demo trên, ứng dụng sẽ được scale theo mô hình thời gian như sau:
Biểu đồ minh họa pod scaling với KEDA cron scaler theo thời gian
Biểu đồ cho thấy ba kịch bản scaling khác nhau:
- Giờ làm việc (9h-18h, thứ 2-6): Scale lên 8 pods để đáp ứng tải công việc thông thường
- Cuối tuần (10h-16h, thứ 7-CN): Scale lên 3 pods cho tải thấp hơn
- Giờ cao điểm (12h-14h, thứ 2-6): Scale lên 15 pods cho thời gian nghỉ trưa
Giám sát và kiểm tra
Kiểm tra ScaledObject
# Xem danh sách ScaledObjects
kubectl get scaledobjects
# Xem chi tiết ScaledObject
kubectl describe scaledobject demo-app-scaler
Kiểm tra HPA được tạo tự động
KEDA tự động tạo HPA để thực hiện việc scaling:
# Kiểm tra HPA
kubectl get hpa
# Xem chi tiết HPA
kubectl describe hpa keda-hpa-demo-app-scaler
Theo dõi scaling events
# Theo dõi thay đổi số lượng pod
kubectl get pods -l app=demo-app -w
# Xem lịch sử scaling
kubectl get events --sort-by='.lastTimestamp'
# Xem log KEDA operator
kubectl logs -l app=keda-operator -n keda -f
Troubleshooting
Lỗi thường gặp
ScaledObject không được nhận diện: Một số phiên bản kubectl có thể gặp vấn đề hiển thị ScaledObject. Sử dụng lệnh sau để kiểm tra:
kubectl get scaledobject.keda.sh/demo-app-scaler -o yaml
Timezone không hợp lệ: Đảm bảo sử dụng timezone từ IANA Time Zone Database. Kiểm tra cấu hình:
kubectl describe scaledobject demo-app-scaler
Multiple triggers không hoạt động đồng thời: KEDA sẽ sử dụng giá trị cao nhất từ các trigger active. Điều này là bình thường khi có multiple triggers.
Debug commands
# Xem trạng thái chi tiết ScaledObject
kubectl get scaledobject demo-app-scaler -o yaml
# Kiểm tra external metrics
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1
# Kiểm tra events liên quan
kubectl get events --field-selector involvedObject.name=demo-app-scaler
Best Practices
Thiết kế Cron Schedule
- Tránh overlap: Đảm bảo các trigger không chồng lấn thời gian.
- Cooldown period: Sử dụng cooldownPeriod phù hợp để tránh scaling quá nhanh.
- Test trước production: Luôn test cấu hình trong môi trường development.
Resource Management
- Resource limits: Đặt resource requests và limits phù hợp cho containers.
- Node capacity: Đảm bảo cluster có đủ tài nguyên cho peak scaling.
- Monitoring: Thiết lập monitoring cho việc scaling và resource usage.
Security và Performance
- RBAC: Cấu hình Role-Based Access Control phù hợp.
- Network policies: Áp dụng network policies nếu cần thiết.
- Cost optimization: Sử dụng scale-to-zero để tiết kiệm chi phí.
Dọn dẹp
Xóa demo resources
kubectl delete scaledobject demo-app-scaler
kubectl delete -f demo-app-deployment.yaml
Gỡ cài đặt KEDA
helm uninstall keda -n keda
kubectl delete namespace keda
Kết luận
KEDA Cron Scaler cung cấp một giải pháp mạnh mẽ và linh hoạt cho việc tự động scaling ứng dụng Kubernetes theo thời gian. Với khả năng hỗ trợ multiple triggers, scale-to-zero, và timezone support, KEDA giúp tối ưu hóa tài nguyên và giảm chi phí vận hành. Việc kết hợp với HPA native của Kubernetes tạo ra một hệ thống scaling toàn diện và đáng tin cậy.