本文共 2428 字,大约阅读时间需要 8 分钟。
Horizontal Pod Autoscaler 是 Kubernetes 自动缩放机制的一部分,用于根据资源使用情况自动调整Pod数量。它监控指定指标(如CPU使用率),并根据目标值自动扩展或缩减副本数量。
HPA 的控制循环周期由 --horizontal-pod-autoscaler-sync-period 参数决定,默认为15秒。每个周期内,Controller Manager会查询资源指标API或自定义指标API,获取Pod的资源使用情况。
对于Pod资源指标(如CPU),HPA会从资源指标API获取数据。如果设置了目标利用率值,HPA会将其转换为资源请求百分比;如果设置了目标原始值,则直接使用原始指标值。HPA计算所有目标Pod的平均值,并根据比率调整副本数量。
需要注意的是,如果某些Pod的容器未设置资源请求,HPA不会考虑其CPU使用率。
HPA的算法基于以下公式计算期望副本数量:
desiredReplicas = ceil[currentReplicas * (currentMetricValue / desiredMetricValue)]
直译为:当前副本数乘以(当前指标值 / 期望指标值),结果向上取整即为期望副本数量。
示例:
如果比率接近1,则HPA不会进行缩放。
当基于CPU利用率缩放时,尚未准备好的Pod会被暂时保留。
FROM java:8COPY ./hello-world-0.0.1-SNAPSHOT.jar hello-world.jarCMD java -jar hello-world.jar
kubectl run hello-world-example \--image=registry.cn-hangzhou.aliyuncs.com/chengjs/hello-world:2.0 \--requests='cpu=200m' \--limits='cpu=500m' \--expose \--port=80 \--generator=run-pod/v1
kubectl autoscale deployment hello-world-example --cpu-percent=50 --min=1 --max=10
kubectl get hpa
kubectl get deployment hello-world-example
HPA支持自定义指标,可以通过以下方式定义:
metrics:- type: Pods pods: metric: name: packets-per-second target: type: AverageValue averageValue: 1k
metrics:- type: Object object: metric: name: requests-per-second describedObject: apiVersion: networking.k8s.io/v1beta1 kind: Ingress name: main-route target: type: Value value: 10k
完整示例:
apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata: name: hello-world-example namespace: defaultspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hello-world-example minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 - type: Pods pods: metric: name: packets-per-second target: type: AverageValue averageValue: 1k - type: Object object: metric: name: requests-per-second describedObject: apiVersion: networking.k8s.io/v1beta1 kind: Ingress name: main-route target: type: Value value: 10k
转载地址:http://wmqkz.baihongyu.com/