0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Tự Động Mở Rộng Kubernetes với Custom Scaler: Phần 2

Đăng vào 2 ngày trước

• 5 phút đọc

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

Copy
┌───────────────────────┐
│     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 Copy
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ú

  • thresholdtheo hàng đợi.
  • min_podsmax_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

  1. KEDA rất tốt cho mở rộng hàng đợi đơn giản.
  2. Đố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.
  3. 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.
  4. 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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào