CKA [Networking] – HPA的使用
HPA是让pod水平扩展,使用HPA之前必须在Kubernetes集群中按照Metric Server否则就无法使用。因为这个Metric Server的作用就是记录着服务器的资源使用状况,如果没有安装这个Metric Server那么Kubernetes就无法得知是否足够资源,HPA 会显示状态为 Unknown
,无法自动扩缩容。
HPA 可以用于 Deployment、ReplicaSet、StatefulSet 等控制器,但不能用于 DaemonSet。
🧠 为什么 HPA 不能用于 DaemonSet?
- DaemonSet 的设计目标是:在每个节点上运行一个(或多个)Pod 实例,不随着负载自动扩缩容。
- 因此它的 Pod 数量是 和节点数绑定 的,不支持动态增减副本。
- 这就与 HPA 的目标(根据负载动态调整副本数)逻辑上冲突。
使用案例
我们创建一个服务应用, 然后创建一个观察terminal , 和一个执行一直请求服务应用的程式,目的就是为了拉高服务应用的使用量,以便达到水平扩展。
1. 创建Deployment和Service
在设定HPA的前提是你的Deployment必须设置了Request资源的请求,否则无法设置HPA
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
requests:
cpu: 50m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
2. 创建HPA,使用yaml或命令
【命令行】- 缺点是无法为HPA命名
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=5
【Yaml文件】
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: cpu-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
behavior:
scaleDown:
stabilizationWindowSeconds: 60
3. 进行测试
Terminal 1 【执行watch一直观察HPA的变化】
kubectl get hpa cpu-hpa --watch
Terminal 2 【执行一直对服务APP进行http请求】
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
可以看到你的pod使用状况慢慢提高,然后进行扩容。扩容的速度比较快,但是缩容就相对比较慢,如果pod是cpu用来立刻降低了,也不会马上缩容的,所以需要多一下。
HPA设置了stabilizationWindowSeconds,这个是防止使用量降低立马缩容,而是等待一段时间之后才进行缩容,所以流量可能比较瞬间波动,从而提高系统的稳定性。
【查看pod的数量,看看是否有扩容】
kubectl get pods

4. 删除设置
kubectl delete hpa cpu-hpa
Facebook评论