上一篇讲解了Pod的资源限制,那现实情况会出现,当业务流量上涨后,Pod对资源的占用也上涨了。之前分配的资源不够用了。不可能再又手动的去调整yaml文件,重新创建占用更多资源的pod吧?Kubernetes
为我们提供了这样一个资源对象:Horizontal Pod Autoscaling
(Pod水平自动伸缩),简称HPA
。HAP
通过监控分析RC
或者Deployment
控制的所有Pod
的负载变化情况来确定是否需要调整Pod
的副本数量,这是HPA
最基本的原理。
HPA概念
HPA是Kubernetes中的一个控制器,它可以基于指定的指标(如CPU利用率、内存利用率或自定义指标)自动扩展或缩减Pod的数量。这样,当应用程序的负载增加时,HPA会自动增加Pod的数量以分散负载;当负载减少时,则会减少Pod的数量以节省资源。
HPA工作原理
- 监控指标:HPA通过Kubernetes Metrics API持续监控指定目标对象(如Deployment、StatefulSet或ReplicationController等)关联的Pods的资源使用情况。默认情况下,它主要关注CPU利用率,但也可以配置为监控其他资源或自定义指标。
- 阈值设定:用户需要为HPA设置最小和最大Pod副本数,并指定一个资源使用率的目标阈值。例如,可以设置当CPU使用率达到80%时触发扩展。
- 评估及决策:当HPA检测到实际平均资源利用率超过用户设定的目标阈值时,它会决定增加Pod副本的数量;反之,当资源利用率低于另一个较低的阈值时,可能会减少Pod副本的数量。
- 执行扩展/缩容:根据上述决策,HPA会更新目标对象的
.spec.replicas
字段,从而触发Kubernetes控制器(如Deployment Controller)去创建或删除相应的Pod实例,达到调整副本数量的目的。
HPA举例
还是用上一章创建的example-deployment为例:
root@k8s-master:~# cat dep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
namespace: dev
spec:
replicas: 3 # 副本数
selector:
matchLabels:
app: example-app
template:
metadata:
labels:
app: example-app
spec:
containers:
- name: nginx-res
image: m.daocloud.io/docker.io/nginx # 使用nginx镜像
ports:
- containerPort: 80
resources: # 资源请求和限制
requests:
memory: "64Mi" # 内存请求
cpu: "250m" # CPU请求
limits:
memory: "128Mi" # 内存限制
cpu: "500m" # CPU限制
从yaml文件中知道,做了资源限制,并且启动了3个pod
.
现在我们来创建一个HPA
,可以使用kubectl autoscale
命令来创建:
root@k8s-master:~# kubectl autoscale -n dev deployment example-deployment --cpu-percent=10 --min=1 --max=5
horizontalpodautoscaler.autoscaling/example-deployment autoscaled
查看这个HPA
root@k8s-master:~# kubectl get hpa -n dev
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
example-deployment Deployment/example-deployment cpu: <unknown>/10% 1 5 3 19s
此命令创建了一个关联资源 example-deployment 的HPA
,最小的 pod 副本数为1,最大为5。HPA
会根据设定的 cpu使用率(10%)动态的加或者cpod数量。当cpu超过限制后,HPA会自动扩容这个example-deployment的Deployment,将pod副本变为最大5。
当然除了通过命令直接创建HPA,也可以在yaml文件中修改,下面yaml文件中在dev的namespace创建了一个名为example-hpa 的HPA,最大副本为5,最小为1,绑定的是名为example-deployment的Deployment对象。CPU利用率目标阈值为50
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: example-hpa
namespace: dev
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: example-deployment # 与上面的Deployment名称一致
minReplicas: 1 # 最小副本数
maxReplicas: 5 # 最大副本数
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # CPU利用率目标阈值
查看hpa,注意这里cpu后面出现了一个unknown,这是由于HPA对资源占用的监控是依赖于Metrics监控 的,这个到后面讲解安装后,就会显示。
root@k8s-master:~# kubectl apply -f example-hpa.yaml
horizontalpodautoscaler.autoscaling/example-hpa unchanged
root@k8s-master:~#
root@k8s-master:~# kubectl get hpa -n dev
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
example-deployment Deployment/example-deployment cpu: <unknown>/10% 1 5 3 18m