通过观察 pod 的 cpu、内存使用率或自定义 metrics 指标进行自动的扩容或缩容 pod 的数量。
通常用于 Deployment,不适用于无法扩/缩容的对象,如 DaemonSet
控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
使用下面的配置文件创建deploy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deploy name: nginx-deploy namespace: default spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: nginx-deploy strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: nginx-deploy spec: containers: - image: nginx:1.7.9 imagePullPolicy: IfNotPresent name: nginx resources: limits: cpu: 200m memory: 128Mi requests: cpu: 100m memory: 128Mi restartPolicy: Always terminationGracePeriodSeconds: 30
|
使用kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5
命令开启自动扩/缩容
1 2
| [root@k8s-master deploy] error: Metrics API not available
|
开启指标服务可以参考这个教程,开启后再次执行上面的操作
1 2 3
| [root@k8s-master deploy] nginx-deploy-56696fbb5-2whv2 0m 2Mi nginx-deploy-56696fbb5-ng9pt 0m 1Mi
|
创建一个服务把上面两个pod聚合在一起
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| apiVersion: v1 kind: Service metadata: name: nginx-svc labels: app: nginx spec: selector: app: nginx-deploy ports: - port: 80 targetPort: 80 name: web type: NodePort
|
1 2 3 4 5
| [root@k8s-master service] NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d7h nginx ClusterIP None <none> 80/TCP 6h53m nginx-svc NodePort 10.99.241.192 <none> 80:31857/TCP 6s
|
使用其他两个node给这个pod发送请求
while true; do wget -q -O- http://<ip:port> > /dev/null; done
这里的ip使用上面nginx-svc的ip即可
使用get hpa 可以看到现在由于负载增加,已经自动扩容到5了
1 2 3
| [root@k8s-master service] NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-deploy Deployment/nginx-deploy 21%/20% 2 5 5 3h11m
|
将发送请求的命令停止后,负载下降,会自动缩容。
ps:对于缩容,由 kube-controller-manager
的 --horizontal-pod-autoscaler-downscale-stabilization-window
参数控制缩容时间窗口,默认 5 分钟,即负载减小后至少需要等 5 分钟才会缩容。