Tự Động Mở Rộng Kubernetes với Custom Scaler: Phần 2
Trong Phần 1, chúng ta đã khám phá KEDA và cách nó mở rộng các consumer dựa trên độ sâu hàng đợi. Nhưng nếu bạn có:
- N hàng đợi → M consumer
- Mỗi hàng đợi có ngưỡng, số lượng replica tối thiểu và tối đa khác nhau
- Mỗi consumer có luồng công việc / endpoint khác nhau
KEDA một mình không thể xử lý điều này. Đó là lúc một custom autoscaler phát huy tác dụng.
Phân Tích Vấn Đề
Tình Huống Ví Dụ:
| Hàng Đợi | Triển Khai Consumer | Ngưỡng | Min Pods | Max Pods |
|---|---|---|---|---|
| x-queue-1 | consumer-x-1 | 100 | 1 | 5 |
| x-queue-2 | consumer-x-2 | 50 | 2 | 6 |
| y-queue | consumer-y | 200 | 1 | 10 |
- Mỗi hàng đợi có logic xử lý riêng.
- Quyết định mở rộng phải độc lập.
- Số lượng replica tối thiểu/tối đa có thể được định nghĩa động trong cơ sở dữ liệu để linh hoạt hơn.
Tổng Quan Kiến Trúc
┌───────────────────────┐
│ Producers │
│ (Apps đẩy tin nhắn │
│ vào hàng đợi) │
└─────────┬─────────────┘
│
▼
┌─────────────────┐
│ Message Broker │
│ (Kafka/Rabbit) │
└─────────┬────────┘
│
┌──────────┴──────────┐
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ Python Exporter │ │ Prometheus Metrics │
│ - Đọc độ sâu hàng đợi│◄─────►│ lưu trữ │
│ - Đọc min/max từ DB │
│ - Áp dụng logic mở rộng│
│ cho từng hàng đợi │
│ - Gọi API Kubernetes │
│ để mở rộng │
└─────────┬───────────┘
│
▼
┌─────────────────────────────┐
│ Triển Khai Consumer │
│ - pod-deployment-1 │
│ - pod-deployment-2 │
│ - pod-deployment-y │
└─────────────────────────────┘
Ví Dụ Python: Mở Rộng Tùy Chỉnh với Min/Max từ Cơ Sở Dữ Liệu
python
from kubernetes import client, config
import requests
import sqlite3 # Cơ sở dữ liệu ví dụ; thay thế bằng cơ sở dữ liệu thực của bạn
# Tải cấu hình trong cụm
config.load_incluster_config()
apps_v1 = client.AppsV1Api()
# Kết nối đến cơ sở dữ liệu chứa min/max cho từng consumer
conn = sqlite3.connect('consumer_scaling.db')
cursor = conn.cursor()
# Đọc cấu hình mở rộng cho tất cả các consumer
cursor.execute("SELECT consumer_name, queue_name, threshold, min_pods, max_pods FROM scaling_config")
scaling_rules = cursor.fetchall()
# Điểm cuối Prometheus
prometheus_url = "http://prometheus:9090/api/v1/query"
for consumer_name, queue_name, threshold, min_pods, max_pods in scaling_rules:
# Truy vấn độ sâu hàng đợi hiện tại
query = f'sum(queue_depth{{queue="{queue_name}"}})'
resp = requests.get(prometheus_url, params={"query": query}).json()
queue_depth = float(resp["data"]["result"][0]["value"][1])
# Tính toán số lượng replica mong muốn theo logic tùy chỉnh
desired_replicas = max(min_pods, min(max_pods, int(queue_depth / threshold)))
# Mở rộng Triển Khai
scale = client.V1Scale(spec=client.V1ScaleSpec(replicas=desired_replicas))
apps_v1.replace_namespaced_deployment_scale(
name=consumer_name,
namespace="default",
body=scale
)
print(f"{consumer_name}: hàng đợi={queue_depth}, ngưỡng={threshold}, mở rộng thành {desired_replicas} pods")
Ghi Chú
thresholdlà theo hàng đợi.min_podsvàmax_podsđược đọc từ cơ sở dữ liệu, làm cho nó động.- Bạn có thể mở rộng logic để bao gồm mở rộng có trọng số, nhiều chỉ số, hoặc thời gian làm mát.
Lợi Ích của Custom Autoscaler
- Mở rộng độc lập cho từng hàng đợi
- Min/max replicas động từ cơ sở dữ liệu — không mã cứng
- Quyết định nhiều chỉ số (độ sâu hàng đợi, CPU, độ trễ DB, v.v.)
- Logic nâng cao (thời gian làm mát, mở rộng có trọng số, ưu tiên)
- Có thể xử lý linh hoạt N hàng đợi → M consumer
Nhược Điểm
| Tính Năng | KEDA | Custom Autoscaler |
|---|---|---|
| Thiết lập dễ dàng | ✅ | ❌ (Python + DB + K8s API) |
| Mở rộng độc lập theo hàng đợi | ❌ | ✅ |
| Logic nhiều chỉ số | Hạn chế | ✅ |
| Min/max từ DB | ❌ | ✅ |
| Độ tin cậy | ✅ Được kiểm chứng | ⚠️ Quản lý bởi bạn |
✅ Kết Luận
- KEDA rất tốt cho mở rộng hàng đợi đơn giản.
- Đối với microservices phức tạp với nhiều hàng đợi, custom autoscaler mang lại hoàn toàn quyền kiểm soát.
- Sử dụng cơ sở dữ liệu cho min/max replicas cho phép chính sách mở rộng linh hoạt, sẵn sàng cho sản xuất.
- Custom autoscaler của bạn có thể phát triển thành một HPA/KEDA tùy chỉnh phù hợp với kiến trúc của bạn.
💡 Mẹo Chuyên Nghiệp:
Bắt đầu với KEDA cho các trường hợp đơn giản. Chuyển sang custom autoscaler với min/max được xác định từ cơ sở dữ liệu cho microservices nhiều hàng đợi với luồng công việc phức tạp.