HPA基础:CPU与内存指标的局限性
Kubernetes原生HPA(Horizontal Pod Autoscaler)支持基于CPU和内存使用率自动扩缩容。但实际生产环境中,CPU利用率不能准确反映业务负载。例如消息队列积压量、HTTP请求QPS、自定义业务指标才是扩缩容的合理依据。Kubernetes容器编排体系为此提供了自定义指标扩缩容方案。
原生HPA基于CPU的配置:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
方案对比:Prometheus Adapter vs KEDA
两种主流的自定义指标扩缩容方案各有特点。Prometheus Adapter将Prometheus指标转换为Kubernetes Custom Metrics API,HPA通过该API获取指标。KEDA(Kubernetes Event-Driven Autoscaling)是CNCF项目,支持从Prometheus、Kafka、RabbitMQ等60+数据源触发扩缩容,配置更声明式,且支持缩容到零。
对于已有Prometheus监控告警体系的团队,Prometheus Adapter集成成本更低。对于事件驱动的应用(如消息队列消费者),KEDA更合适。
KEDA安装与ScaledObject配置
安装KEDA:
# 添加KEDA Helm仓库
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
# 安装KEDA
helm install keda kedacore/keda --namespace keda-system --create-namespace
# 验证安装
kubectl get pods -n keda-system
创建基于Prometheus指标的ScaledObject:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: web-app-scaledobject
namespace: default
spec:
scaleTargetRef:
name: web-app
minReplicaCount: 2
maxReplicaCount: 20
pollingInterval: 30
cooldownPeriod: 300
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus-server.monitoring:9090
metricName: http_requests_per_second
threshold: "1000"
query: |
sum(rate(http_requests_total{app="web-app"}[1m]))
authenticationRef:
name: prometheus-trigger-auth
关键参数说明:pollingInterval控制指标轮询间隔(秒),默认30;cooldownPeriod是缩容冷却时间,防止扩缩容抖动;threshold是触发扩容的指标阈值,当query返回值超过该值时增加副本。
触发器认证配置
如果Prometheus需要认证,配置TriggerAuthentication:
apiVersion: v1
kind: Secret
metadata:
name: prometheus-secret
type: Opaque
data:
token: <base64-encoded-token>
---
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: prometheus-trigger-auth
spec:
secretTargetRef:
- parameter: bearerToken
name: prometheus-secret
key: token
CI/CD流水线集成扩缩容配置
在DevOps实践中,ScaledObject应纳入GitOps管理。使用Argo CD或Flux CD将ScaledObject YAML与Deployment同步部署,确保环境一致性。CI/CD流水线中增加HPA/ScaledObject配置校验步骤:
# CI流水线中校验YAML
kubectl apply --dry-run=client -f keda-scaledobject.yaml
# 使用kubeconform校验
kubeconform -summary keda-scaledobject.yaml
混沌工程场景下,可以通过注入延迟故障验证扩缩容策略的有效性。在故障应急响应流程中,KEDA的状态检查应纳入标准巡检项目。
扩缩容不生效排查
Q: KEDA ScaledObject状态为Unknown
# 查看ScaledObject状态
kubectl describe scaledobject web-app-scaledobject
# 查看KEDA operator日志
kubectl logs -n keda-system -l app=keda-operator --tail=50
常见原因:Prometheus serverAddress不可达、query语法错误、指标无数据返回。检查query在Prometheus UI中能否正常执行。
Q: 副本数在阈值附近频繁波动
调大cooldownPeriod到300秒以上,或使用KEDA的behavior配置stabilizationWindow:
spec:
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
Q: minReplicaCount为0但Pod不缩容到零
检查是否有其他HPA或Deployment指定了replicas数量,优先级冲突会导致KEDA无法缩容到零。Docker自动化部署中如果使用了Deployment的replicas字段,需要移除该字段,由KEDA接管副本数控制。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshpa-zi-ding-yi-zhi-biao-kuo-suo-rong-keda-yu/