一、为何进行缩扩容?
在实际生产中,经常会遇到某个服务需要扩容的场景,可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。可以利用Deployment/RC的Scale机制来完成这些工作。
二、缩扩容模式
Kubernetes 对 Pod 扩容与缩容提供了手动和自动两种模式。
-
一、手动扩容和缩容模式:手动模式通过执行 kubectl scale -- replicas=num 命令对一个Deployment/RC进行Pod副本数量的设置,可一键完成。
-
二、自动扩容和缩容模式 :自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整。
三、手动缩扩容
伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数。
方式1:
kubectl scale --replicas=2 deployments/httpd-deployment
方式2:直接修改deployment.yaml文件中的spec.replicas值,然后kubectl apply -f httpd-deployment.yaml
三、自动缩扩容
3.1、HPA介绍
Kubernetes有一个
HPA(Horizontal Pod Autoscaler)的资源,可以
实现基于CPU使用率的Pod自动伸缩的功能。
Horizontal Pod Autoscal(
Pod 横向扩容 简称 HPA)与 RC、 Deployment 一样, 也属于一种
Kubernetes 资源对象。
通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况, 来确定是
否需要针对性地调整目标 Pod 的副本数, 这是 HPA 的 实现原理
。
Horizontal Pod Autoscaling仅适用于Deployment和ReplicaSet
。
3.2、HPA如何工作?
Horizontal Pod Autoscaler 由一个控制循环实现,循环周期由 controller manager 中的--horizontal-pod-autoscaler-sync-period标志指定(默认是 15 秒)。
在每个周期内,controller manager会查询HorizontalPodAutoscaler中定义的metric指标的资源利用率。controller manager从resource metric API(针对每个pod的resource metric)或者自定义metric API(所有的metric)中获取metric指标。
-
每个Pod的resource metric(例如CPU),controller通过resource metric API获取HorizontalPodAutoscaler中定义的每个Pod的metric;然后,如果设置了目标利用率,controller计算利用的值与每个Pod的容器里的resource request值的百分比。如果设置了目标原始值,将直接使用该原始 metric 值。然后 controller 计算所有目标 Pod 的利用率或原始值(取决于所指定的目标类型)的平均值,产生一个用于缩放所需 replica 数量的比率。 请注意,如果某些 Pod 的容器没有设置相关的 resource request ,则不会定义 Pod 的 CPU 利用率,并且 Aucoscaler 也不会对该 metric 采取任何操作。
-
对于每个 Pod 自定义的 metric,controller 功能类似于每个 Pod 的 resource metric,只是它使用原始值而不是利用率值;
-
对于 object metric,获取单个度量(描述有问题的对象),并与目标值进行比较,以产生如上所述的比率。
算法细节:
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
直译为:(当前指标值 ➗ 期望指标值) ✖️ 当前副本数 ,结果再向上取整,最终结果就是期望的副本数量
假设一个nginx-deployment有4个pod,pod1的cpu利用率50%,pod2的cpu利用率60%,pod3的cpu利用率70%,pod4的cpu利用率80%kubectl autoscale deployment nginx-deployment --min=1 --max=5 --cpu-percent=80
期望的cpu利用率是80%((0.5 / 0.8) + (0.6 / 0.8) + (0.7 / 0.8) + (0.8 / 0.8)) / 4 *3 = 2.4375向上取整为3,则该deployment需要缩容到3个pod(3在[1, 5]之间)。kubectl autoscale deployment nginx-deployment --min=1 --max=5 --cpu-percent=30
期望的cpu利用率是30%((0.5 / 0.3) + (0.6 / 0.3) + (0.7 / 0.3) + (0.8 / 0.3)) / 4 *3 = 6.500向上取整为7,则该deployment需要扩展到7个pod,但7不在[1, 5]之间,所以扩展到5个pod。
3.3、实现HPA需要先部署metrics-server
部署metrics-server步骤:
# 查看autoscalers列表
kubectl get hpa
# 查看具体描述
kubectl describe hpa
# 删除autoscaler
kubectl delete hpa
3.4、缩扩容实现
手动扩容和缩容:
kubectl autoscale deployment nginx-deployment --min=1 --max=10 --cpu-percent=50
# 当CPUUtilizationPercentage的值超过50%时会触发自动动态扩容行为,扩容或缩容时必须满足的一个约束条件是Pod的副本数要介于1与10之间
自动扩容和缩容:
apiVersion: v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
cpu: 50m
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc # service名称
spec:
selector:
app: nginx-deployment # 必填,在selector字段中指定了为哪一个标签的app进行负载均衡
ports:
- port: 80
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler # 根据kubectl api-resources查到
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: v1
kind: Deployment
name: nginx-deployment
minReplicas: 1 # 最小副本数
maxReplicas: 10 # 最大副本数
targetCPUUtilizationPercentage: 50 # CPU阈值
四、参考
kubernetes中Horizontal Pod Autoscaler的理解 | Carey的博客
Horizontal Pod Autoscaler(Pod水平自动伸缩) - 废物大师兄 - 博客园