在 Kubernetes 中,HorizontalPodAutoscaler 自动更新工作负载资源 (例如 Deployment 或者 StatefulSet),目的是自动扩缩工作负载以满足需求。
如果负载减少,并且 Pod 的数量高于配置的最小值,HorizontalPodAutoscaler 会指示工作负载资源( Deployment、StatefulSet 或其他类似资源)缩减。
HorizontalPodAutoscaler 被实现为 Kubernetes API 资源和控制器。
2.下载metrics
GitHUB地址
https://github.com/kubernetes-sigs/metrics-server
3.测试是否metrics是否正常运行,metrics正常运行。
kubectl top node
kubernetes-master01 183m 4% 1279Mi 21%
kubernetes-node01 49m 1% 1111Mi 18%
kubernetes-node02 39m 0% 369Mi 6%
4.创建测试应用
vim web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web-nginx-hpa
name: web-deployment-nginx-test
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: web-nginx-hpa
template:
metadata:
labels:
app: web-nginx-hpa
spec:
containers:
- image: nginx
name: web-deployment-nginx-test
resources:
limits:
cpu: "50m"
memory: 20Mi
requests:
cpu: "50m"
memory: 20Mi
5.创建Serivce,这一步可以为前端提供一个访问入口。方便我们测试使用。
cat service-hpa.yaml
apiVersion: v1
kind: Service
metadata:
name: hpa-service
spec:
selector:
run: php-apache
ports:
name: http
port: 80
targetPort: 80
cat web.hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: web-deployment-nginx-test
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-deployment-nginx-test
minReplicas: 2 # 最小Pod数量
maxReplicas: 10 # 最大Pod数量
targetCPUUtilizationPercentage: 30 # CPU到百分之30使用扩缩容。
while :;do wget -q -O- http://nginx-hpa;done
8.随着不断访问,流量渐渐上来了。会触发扩缩容。
kubectl get hpa -w
web-deployment-nginx-test Deployment/web-deployment-nginx-test 0%/30% 2 10 2 90m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 76%/30% 2 10 2 90m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 76%/30% 2 10 4 91m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 55%/30% 2 10 6 91m
web-deployment-nginx-test Deployment/web-deployment-nginx-test 50%/30% 2 10 6 91m
9.停止压测。因为默认情况下,每30s检测一次指标,只要检测到了配置HPA的目标值,则会计算出预期的工作负载的副本数,再进行扩缩容操作。同时,为了避免过于频繁的扩缩容,默认在5min内没有重新扩缩容的情况下,才会触发扩缩容。 不过,HPA本身的算法相对比较保守,可能并不适用于很多场景。例如,一个快速的流量突发场景,如果正处在5min内的HPA稳定期,这个时候根据HPA的策略,会导致无法扩容。 另外,在一些Serverless场景下,有缩容到0然后冷启动的需求,但HPA默认不支持。
kubectl get pod -w
web-deployment-nginx-test-54f8c5b657-c2wc4 1/1 Running 0 44m
web-deployment-nginx-test-54f8c5b657-c54w4 0/1 ContainerCreating 0 1s
web-deployment-nginx-test-54f8c5b657-cgf74 0/1 ContainerCreating 0 16s
web-deployment-nginx-test-54f8c5b657-k4mpc 0/1 ContainerCreating 0 1s
web-deployment-nginx-test-54f8c5b657-qv9f2 1/1 Running 0 16s
web-deployment-nginx-test-54f8c5b657-v5zfr 1/1 Running 0 3m4s
web-deployment-nginx-test-54f8c5b657-cgf74 1/1 Running 0 27s