Kubernetes自动伸缩的核心机制
Kubernetes容器编排体系中,Pod的自动伸缩由三个控制器协同完成:HPA(Horizontal Pod Autoscaler)负责水平扩缩容,VPA(Vertical Pod Autoscaler)负责垂直调整资源配额,Cluster Autoscaler负责底层节点扩缩。在AI推理负载场景下,请求流量波动大、冷启动延迟高,单一伸缩策略无法覆盖所有情况,需要根据业务特征组合使用。
SRE稳定性工程和DevOps实践中,弹性伸缩配置是保障服务可用性与资源成本平衡的关键环节。配置不当的自动伸缩不仅无法应对流量洪峰,还可能因频繁扩缩容导致请求抖动甚至服务雪崩。
HPA水平自动伸缩配置详解
HPA根据监控指标动态调整Deployment的Pod副本数。Kubernetes 1.27+默认启用HPA V2,支持多指标组合伸缩:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-inference-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-inference
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: "100"
- type: External
external:
metric:
name: queue_depth
selector:
matchLabels:
app: ai-inference
target:
type: AverageValue
averageValue: "10"
behavior:
scaleUp:
stabilizationWindowSeconds: 30
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 100
periodSeconds: 60
selectPolicy: Max
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 1
periodSeconds: 120
selectPolicy: Min
behavior配置是生产环境必须关注的参数。默认HPA扩容过快、缩容过急,导致Pod频繁抖动。stabilizationWindowSeconds设置伸缩决策的冷却窗口,缩容冷却建议设为5分钟以上,避免流量短暂下降后立即缩容引发冷启动延迟。
自定义指标驱动HPA伸缩
CPU利用率指标对AI推理负载的代表性有限——GPU利用率、请求队列深度、推理延迟才是更直接的伸缩信号。通过Prometheus Adapter将自定义指标注册到Kubernetes API,HPA可以基于这些指标伸缩:
# Prometheus Adapter部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-adapter
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-adapter
template:
spec:
containers:
- name: adapter
image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.0
args:
- --cert-dir=/certs
- --prometheus-url=http://prometheus:9090
- --metrics-relist-interval=30s
- --v=4
ports:
- containerPort: 443
volumeMounts:
- name: config
mountPath: /adapter
- name: certs
mountPath: /certs
volumes:
- name: config
configMap:
name: adapter-config
- name: certs
secret:
secretName: adapter-certs
关键配置在ConfigMap中定义PromQL查询到Kubernetes自定义指标的映射规则:
apiVersion: v1
kind: ConfigMap
metadata:
name: adapter-config
namespace: monitoring
data:
config.yaml: |
rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelSelectors>>}[2m])) by (<<.GroupBy>>)'
- seriesQuery: 'inference_queue_depth{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
metricsQuery: 'avg(<<.Series>>{<<.LabelSelectors>>}) by (<<.GroupBy>>)'
部署后验证自定义指标是否注册成功:
# 查询已注册的自定义指标
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .
# 查询特定指标
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/production/pods/*/http_requests_per_second"
AI推理负载的冷启动问题与应对
AI推理Pod冷启动包含镜像拉取、模型加载、预热推理三个阶段,完整流程可能耗时2-5分钟。HPA在流量突增时触发扩容,新Pod冷启动期间已有Pod承受全部压力,容易触发级联超时。
应对策略一:预热池(Warm Pool)
使用KEDA的ScaledObject配合Deployment的minReplicas维持一定数量的预热Pod:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: ai-inference-scaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-inference
minReplicaCount: 3
maxReplicaCount: 20
cooldownPeriod: 300
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus:9090
metricName: inference_queue_depth
threshold: "10"
query: avg(inference_queue_depth{app="ai-inference"})
应对策略二:使用Knative Serverless的scale-to-zero-pod-retention-period保留缩容后的Pod在待命状态而非直接销毁:
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: ai-inference
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/scale-to-zero-pod-retention-period: "10m"
autoscaling.knative.dev/target: "50"
autoscaling.knative.dev/minScale: "2"
spec:
containerConcurrency: 10
containers:
- image: ai-inference:latest
resources:
requests:
nvidia.com/gpu: 1
混沌工程验证弹性伸缩可靠性
自动伸缩配置完成后,需要通过混沌工程验证其在异常场景下的行为是否符合预期。Chaos Mesh是Kubernetes生态中常用的混沌实验工具:
# 注入Pod故障,验证HPA扩容响应
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: inference-pod-kill
namespace: chaos-testing
spec:
action: pod-kill
mode: one
selector:
namespaces:
- production
labelSelectors:
app: ai-inference
scheduler:
cron: "@every 5m"
# 注入网络延迟,验证延迟指标驱动的伸缩
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: inference-network-delay
namespace: chaos-testing
spec:
action: delay
mode: all
selector:
namespaces:
- production
labelSelectors:
app: ai-inference
delay:
latency: "500ms"
jitter: "100ms"
duration: "5m"
混沌实验的核心检查项:
1. Pod被Kill后,HPA是否在预期时间内触发扩容
2. 网络延迟注入后,基于延迟指标的HPA是否正确响应
3. 扩容速度是否满足业务SLA(P99延迟不超过阈值)
4. 缩容冷却期是否阻止了过快的缩容操作
5. 节点资源不足时Cluster Autoscaler是否及时扩容
监控告警体系配置
自动伸缩的运维监控需要覆盖伸缩决策本身的状态,而非仅仅监控Pod资源利用率:
# HPA伸缩事件监控
- alert: HpaScalingTooFrequent
expr: rate(kube_hpa_status_desired_replicas_changes[10m]) > 0.5
for: 10m
labels:
severity: warning
annotations:
summary: "HPA {{ $labels.hpa }} 伸缩频率过高"
description: "过去10分钟内HPA平均每分钟伸缩{{ .Value }}次,检查指标配置"
# 扩容达到上限
- alert: HpaReachedMaxReplicas
expr: kube_hpa_status_desired_replicas == kube_hpa_spec_max_replicas
for: 5m
labels:
severity: critical
annotations:
summary: "HPA {{ $labels.hpa }} 已达最大副本数"
description: "当前副本数已达配置上限,但仍需扩容,需调整maxReplicas"
# Pod冷启动超时
- alert: InferencePodStartupTooSlow
expr: time() - kube_pod_start_time{pod=~"ai-inference.*"} > 180 AND kube_pod_container_status_ready{pod=~"ai-inference.*"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "AI推理Pod启动超过3分钟仍未就绪"
弹性伸缩不是”配完就忘”的功能,需要持续观察伸缩行为是否与流量模式匹配,定期调整指标阈值和behavior参数。对于AI推理这类冷启动成本高的负载,宁可多保留几个冗余Pod,也不要过度缩容导致流量突增时来不及扩容。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshpa-tan-xing-shen-suo-pei-zhi-ai-tui-li-fu-zai/