name: k8s-autoscaling
description: 使用 HPA、VPA 和 KEDA 配置 Kubernetes 自动扩缩容。适用于水平/垂直 Pod 自动扩缩、事件驱动扩缩和容量管理。
使用 HPA、VPA、KEDA 及 kubectl-mcp-server 工具实现全面的自动扩缩容。
基于 CPU 的基础扩缩配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
应用并验证:
apply_manifest(hpa_yaml, namespace)
get_hpa(namespace)
优化资源请求配置:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
keda_detect_tool()
keda_scaledobjects_list_tool(namespace)
keda_scaledobject_get_tool(name, namespace)
keda_scaledjobs_list_tool(namespace)
keda_triggerauths_list_tool(namespace)
keda_triggerauth_get_tool(name, namespace)
keda_hpa_list_tool(namespace)
触发器配置详见 KEDA-TRIGGERS.md。
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: sqs-scaler
spec:
scaleTargetRef:
name: queue-processor
minReplicaCount: 0 # 可缩容至零!
maxReplicaCount: 100
triggers:
- type: aws-sqs-queue
metadata:
queueURL: https://sqs.region.amazonaws.com/...
queueLength: "5"
triggers:
- type: cron
metadata:
timezone: America/New_York
start: 0 8 * * 1-5 # 工作日 8 AM
end: 0 18 * * 1-5 # 工作日 6 PM
desiredReplicas: "10"
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus:9090
metricName: http_requests_total
query: sum(rate(http_requests_total{app="myapp"}[2m]))
threshold: "100"
| 策略 | 工具 | 适用场景 |
|---|---|---|
| CPU/内存 | HPA | 流量模式稳定 |
| 自定义指标 | HPA v2 | 业务指标 |
| 事件驱动 | KEDA | 队列处理、定时任务 |
| 垂直扩缩 | VPA | 优化资源请求 |
| 缩容至零 | KEDA | 节省成本,空闲工作负载 |
降低空闲工作负载的成本:
keda_scaledobjects_list_tool(namespace)
# 设置 minReplicaCount: 0 的 ScaledObjects 可缩容至零
获取并应用资源建议:
get_resource_recommendations(namespace)
# 应用 VPA 建议
对已知流量模式使用定时触发器:
# 在流量高峰前扩容
triggers:
- type: cron
metadata:
start: 0 7 * * * # 7 AM
end: 0 9 * * * # 9 AM
desiredReplicas: "20"
跨集群配置 KEDA:
keda_scaledobjects_list_tool(namespace, context="production")
keda_scaledobjects_list_tool(namespace, context="staging")
get_hpa(namespace)
get_pod_metrics(name, namespace) # 指标是否可用?
describe_pod(name, namespace) # 资源请求是否设置?
keda_scaledobject_get_tool(name, namespace) # 检查状态
get_events(namespace) # 检查事件
| 现象 | 检查项 | 解决方案 |
|---|---|---|
| HPA 状态未知 | 指标服务器 | 安装 metrics-server |
| KEDA 未扩缩 | 触发器认证 | 检查 TriggerAuthentication |
| VPA 未更新 | 更新模式 | 设置 updateMode: Auto |
| 缩容缓慢 | 稳定窗口 | 调整 stabilizationWindowSeconds |
始终设置资源请求
- HPA 需要资源请求来计算利用率
使用多指标
- 结合 CPU 和自定义指标以提高准确性
稳定窗口
- 使用 scaleDown 稳定窗口防止抖动
谨慎缩容至零
- 考虑冷启动时间
- 使用激活阈值