1.什么是HPA?
在 Kubernetes 中,HorizontalPodAutoscaler 自动更新工作负载资源 (例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。
水平扩缩意味着对增加的负载的响应是部署更多的 Pods。 这与 “垂直(Vertical)” 扩缩不同,对于 Kubernetes, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。
如果负载减少,并且 Pod 的数量高于配置的最小值, HorizontalPodAutoscaler 会指示工作负载资源( Deployment、StatefulSet 或其他类似资源)缩减。
水平 Pod 自动扩缩不适用于无法扩缩的对象(例如:DaemonSet。)
HorizontalPodAutoscaler 被实现为 Kubernetes API 资源和控制器。
资源决定了控制器的行为。在 Kubernetes 控制平面内运行的水平 Pod 自动扩缩控制器会定期调整其目标(例如:Deployment)的所需规模,以匹配观察到的指标, 例如,平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标。

官方是这样给出的。
2.下载metrics
GitHUB地址
https://github.com/kubernetes-sigs/metrics-server
3.测试是否metrics是否正常运行,metrics正常运行。
kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
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
6.创建hpa资源
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使用扩缩容。
7.创建完毕后测试。
while :;do wget -q -O- http://nginx-hpa;done
8.随着不断访问,流量渐渐上来了。会触发扩缩容。
kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
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