
Kubernetes Horizontal Pod Autoscaler (HPA) là một thành phần cơ bản để quản lý khả năng co giãn của ứng dụng. Mặc dù việc điều chỉnh quy mô dựa trên mức sử dụng CPU và bộ nhớ là một điểm khởi đầu phổ biến, nhưng nó thường không thể nắm bắt được tải thực tế và đặc điểm hiệu suất của các ứng dụng hiện đại. Tự động điều chỉnh quy mô hiệu quả đòi hỏi các số liệu tương quan trực tiếp với nhu cầu của ứng dụng, chẳng hạn như tốc độ yêu cầu HTTP, độ sâu hàng đợi tin nhắn hoặc số phiên người dùng hoạt động.
Bài viết này cung cấp một hướng dẫn thực tế, nhiều mã để cấu hình Kubernetes HPA v2 với các số liệu tùy chỉnh và bên ngoài bằng cách sử dụng Prometheus Adapter. Chúng tôi sẽ trình bày cách điều chỉnh quy mô triển khai dựa trên các số liệu ứng dụng thực tế, vượt ra ngoài việc sử dụng tài nguyên chung.
Generate Deployments, Services, ConfigMaps & Ingress
Convert multi-service Docker Compose v2/v3 YAML into production-grade Kubernetes manifests with custom replicas, health probes, resource limits, and PVC storage.
Horizontal Pod Autoscaler tự động điều chỉnh số lượng pod trong một triển khai, stateful set hoặc replica set dựa trên các số liệu được quan sát.
Số liệu tài nguyên:
Số liệu tùy chỉnh:
/metrics ở định dạng Prometheus. Các số liệu này được liên kết trực tiếp với một đối tượng Kubernetes (ví dụ: Deployment, Service hoặc Pod).http_requests_total trên mỗi pod.Số liệu bên ngoài:
Bộ điều khiển HPA liên tục truy vấn Kubernetes Metrics API (đối với số liệu tài nguyên) hoặc Custom/External Metrics APIs (đối với số liệu tùy chỉnh/bên ngoài). Dựa trên các giá trị mục tiêu đã cấu hình và các quan sát số liệu hiện tại, nó tính toán số lượng bản sao mong muốn và cập nhật khối lượng công việc mục tiêu (Deployment, ReplicaSet, v.v.).
Công thức cho số lượng bản sao mong muốn thường là:
desiredReplicas = ceil[currentReplicas * (currentMetricValue / targetMetricValue)]
Để cho phép HPA tiêu thụ các số liệu tùy chỉnh và bên ngoài từ Prometheus, hệ sinh thái Kubernetes cung cấp Prometheus Adapter.
Luồng hoạt động như sau:
http_requests_total, queue_messages_total) thông qua một endpoint HTTP (/metrics).custom.metrics.k8s.io và external.metrics.k8s.io.Phần này giả định bạn có một cụm Kubernetes đang hoạt động và kubectl đã được cấu hình.
Chúng ta sẽ sử dụng biểu đồ Helm kube-prometheus-stack, bao gồm Prometheus, Grafana và Prometheus Operator.
# Add the Prometheus community Helm repository
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Create a namespace for monitoring components
kubectl create namespace monitoring
# Install kube-prometheus-stack
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false
Các cờ serviceMonitorSelectorNilUsesHelmValues và podMonitorSelectorNilUsesHelmValues rất quan trọng. Chúng đảm bảo rằng Prometheus tự động phát hiện ServiceMonitors và PodMonitors được triển khai trong cùng một namespace với Prometheus, hoặc những cái được gắn nhãn rõ ràng để được phát hiện.
Prometheus Adapter được cài đặt thông qua biểu đồ Helm chuyên dụng của nó. Phần quan trọng là cấu hình config.yaml của nó để xác định cách các số liệu Prometheus ánh xạ tới các số liệu tùy chỉnh và bên ngoài của Kubernetes.
# Add the Prometheus Adapter Helm repository
helm repo add k8s-at-home https://k8s-at-home.com/charts/
helm repo update
# Install Prometheus Adapter with custom rules
# We'll define the rules in a values.yaml file
Tạo một tệp prometheus-adapter-values.yaml:
# prometheus-adapter-values.yaml
prometheus:
url: http://prometheus-kube-prometheus-stack-prometheus.monitoring.svc
port: 9090
# Configuration for custom and external metrics rules
config: |
rules:
- seriesQuery: '{__name__=~"^http_requests_total$"}'
resources:
overrides:
kubernetes_namespace: {resource: "namespace"}
kubernetes_pod_name: {resource: "pod"}
name:
matches: "^(.*)_total$"
as: "${1}_per_second"
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)`
- seriesQuery: '{__name__="queue_messages_total",kubernetes_namespace!="",kubernetes_pod_name!=""}'
resources:
overrides:
kubernetes_namespace: {resource: "namespace"}
kubernetes_pod_name: {resource: "pod"}
name:
matches: "^(.*)_total$"
as: "${1}_depth"
metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)`
# External metrics example for a global queue depth
- seriesQuery: '{__name__="external_queue_messages_total",queue_name!=""}'
name:
matches: "^external_(.*)_total$"
as: "${1}_depth_external"
metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (queue_name)`
external: true
Bây giờ, hãy cài đặt Prometheus Adapter bằng tệp giá trị này:
helm install prometheus-adapter k8s-at-home/prometheus-adapter \
--namespace monitoring \
-f prometheus-adapter-values.yaml
Giải thích các quy tắc config.yaml:
seriesQuery: Một bộ chọn nhãn Prometheus xác định chuỗi số liệu sẽ được xử lý bởi quy tắc này.resources.overrides: Ánh xạ các nhãn Prometheus (ví dụ: kubernetes_namespace, kubernetes_pod_name) tới tên tài nguyên Kubernetes, cho phép HPA nhắm mục tiêu các đối tượng cụ thể.name.matches / name.as: Xác định cách tên số liệu Prometheus được chuyển đổi thành tên số liệu tùy chỉnh của Kubernetes. Đối với http_requests_total, nó trở thành http_requests_per_second. Đối với queue_messages_total, nó trở thành queue_messages_depth.metricsQuery: Truy vấn PromQL thực tế được thực thi bởi bộ điều hợp.
sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>): Tính toán tốc độ trung bình 5 phút của http_requests_total (một bộ đếm) trên mỗi pod. <<.Series>>, <<.LabelMatchers>> và <<.GroupBy>> là các biến mẫu được thay thế bởi bộ điều hợp dựa trên yêu cầu HPA.sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>): Tính tổng của queue_messages_total (một đồng hồ đo) trên mỗi pod.Một microservice quan trọng xử lý các giao dịch tài chính theo thời gian thực. Mức sử dụng CPU của nó luôn thấp, nhưng độ trễ tăng đột biến trong thời gian cao điểm giao dịch do cạn kiệt connection pool của database. Loại metric HPA nào sẽ hiệu quả nhất để tự động scale service này nhằm ngăn chặn các vấn đề về độ trễ, và tại sao?
Làm sạch log AI CLI, tạo biểu thức cron, giải mã JWT và tính quyền chmod offline.

Hướng dẫn toàn diện về OpenTelemetry Collector & eBPF trong môi trường production: tracing, metrics & prometheus pipelines không cần code với kiến trúc cấp độ production và các ví dụ code.
Đọc tiếp
Thiết kế cảnh báo Prometheus và Grafana cho môi trường sản xuất bằng cách sử dụng các quy tắc PromQL multi-window multi-burn-rate cho mục tiêu mức dịch vụ (SLO) và ngân sách lỗi.
Đọc tiếp
Hướng dẫn toàn diện về eBPF & Cilium trong Kubernetes: định tuyến thông lượng cao, chính sách mạng & khả năng quan sát Hubble với kiến trúc cấp độ sản xuất và các ví dụ mã.
Đọc tiếp