您的位置:首页 > 其它

Kubernetes的Pod自动化扩缩容及HPA原理

2020-09-17 16:20 435 查看

在实际的业务场景中,我们经常会遇到某个服务需要扩容的场景(例如:测试压测、电商秒杀、大促、或由于资源紧张、工作负载降低等等都需要对服务实例数进行扩缩容操作)。在Kubernetes中,可以对Deployment/RC的Scale机制来方便的进行自动化扩缩容操作。

Kubernetes扩缩容

Kubernetes对Pod的扩缩容分为:手动和自动两种

1.手动模式

手动模式通过kubectl scale命令对一个Deployment/RC进行Pod副本数量的设置。即可一键完成。

示例:

cat scale.yaml

---

apiVersion: apps/v1

kind: Deployment

metadata:

 name: ops-nginx

 namespace: ops

spec:

 selector:

   matchLabels:

     app: ops-nginx

 replicas: 1

 template:

   metadata:

     labels:

       app: ops-nginx

   spec:

     imagePullSecrets:

     - name: cd-registry

     containers:

     - image: harbor.ttsingops.com/nginx/nginx:1.16.0

       name: ops-nginx

kubectl apply -f scale.yaml

kubectl get po -n ops

#进行扩容

kubectl scale deployment ops-nginx -n ops --replicas 5

#缩容操作

kubectl scale deployment ops-nginx -n ops --replicas 2

kubectl get po -n ops

2.自动模式

需要通过用户根据某个性能指标或者基于Prometheus自定义指标来进行扩缩容,系统会自动在这个范围内根据性能指标进行变化调整。

HAP简介

 HPA(Horizontal Pod Autoscaler,Pod水平自动伸缩) 是从Kubernetes V1.1版本引入。用于实现基于CPU使用率进行自动Pod扩缩容的功能。 HPA控制器基于Master的kube-controller-manager服务启动参数 --horizontal-pod-autoscaler-sync-period定义的时长,周期性的检测目标Pod的CPU使用率,并在满足条件时对RC或Deployment中的Pod副本数量进行调整,以符合用户定义的平均Pod CPU使用率。

HPA的版本演进:

目前HPA已经支持三大版本:autoscaling/v1、autoscaling/v2beta1和autuscaling/v2beta2 三个大版本。

哪这个三个版本有何区别呢?

autoscaling/v1版本,只支持CPU一个指标的Pod水平伸缩。

而autoscaling/v2beta1增加了支持自定义指标,除了cadvisor暴露的指标外,还支持自定义指标,比如像第三方提供的QPS,或者基于其他的一些资源进行扩容,就是支持一些第三方的一些组件了。

autoscaling/v2beta2又额外增加了外部指标支持

HPA自动扩缩容原理?

 Kubernetes中的Metrics Server持续采集所有Pod副本的指标数据。HPA控制器通过Metrics Server的API(Heapster的API或聚合API,已经慢慢废弃了,使用metrice Server)获取这些数据,基于用于定义的扩缩容规则进行计算,得到目标Pod副本数量。当目标Pod副本数量与当前副本数量不同时,HPA控制器向Pod的副本控制器(RC/Deployment)发起scale操作,调整Pod的副本数量,完成扩缩容操作。

思考:

若某个Pod的CPU使用率在在一定时间内,突然升高其后立马降低,这样Pod岂不是频繁的扩缩容。也即是副本的数量不断的调整。这里就会有冷却周期。每次在扩缩容后,冷却时间是多少。

在HPA中,默认的扩容冷却周期是3min,缩容冷却周期是5min。

可以通过调整kube-controll 3eac er-manager组件启动参数设置冷却时间:

--horizontal-pod-autoscaler-downscale-delay  扩容冷却

--horizontal-pod-autoscaler-upscale-delay 缩容冷却

示例:

下面通过一个示例,然后对pod进行施压,进行自动扩缩容。

cat auto_scale.yaml

---

apiVersion: apps/v1

kind: Deployment

metadata:

 name: auto-nginx

 namespace: ops

spec:

 selector:

   matchLabels:

     app: auto-nginx

 replicas: 1

 template:

   metadata:

     labels:

       app: auto-nginx

   spec:

     imagePullSecrets:

     - name: cd-registry

     containers:

     - image: harbor.ttsingops.com/nginx/nginx:1.16.0

       name: auto-nginx

       resources:

         requests:

           cpu: 200m

       ports:

       - containerPort: 80

---

#Service

apiVersion: v1

kind: Service

metadata:

 name: auto-nginx

 namespace: ops

spec:

 type: NodePort

 ports:

 - port: 8088

   protocol: TCP

   targetPort: 80

   nodePort: 38088

 selector:

   app: auto-nginx

kubectl apply -f auto_scale.yaml

kubectl get svc,pod -n ops -o wide

cat auto_nginx_hpa.yaml

apiVersion: autoscaling/v1

kind: HorizontalPodAutoscaler

metadata:

 name: auto-nginx-hpa

 namespace: ops

spec:

 scaleTargetRef:

   apiVersion: apps/v1

   kind: Deployment

   name: auto-nginx

 minReplicas: 1

 maxReplicas: 8

 targetCPUUtilizationPercentage: 50

kubectl apply -f auto_nginx_hpa.yaml

kubectl get  hpa -n ops

使用apache的ab压测工具进行施压

可以在node任意节点安装ab工具

yum install -y httpd-tools

ab -n 10000000  -c 10000 http://192.168.1.211:38088/index.html

#因为我把Service映射到NodePort

#查看hpa情况

kubectl get hpa -n ops

#查看Pod情况

kubectl get pods -n ops

#查看events信息

kubectl get events -n ops

#等待几分钟后,再次查看Pod缩容情况

kubectl get po -n ops

思考:

Kubernetes是如何对Pod的副本数量进行扩缩容的呢?

官网已经有详细解释:就是根据当前CPU指标和所需CPU指标进行相除。

例如:当前CPU指标为200m,所需指标值为100m,则副本数量将增加一倍,因为200.0/100.0=2。

如果当前值为50m,会将副本数量减半,因50.0/100.0 = 0.5。

具体可参见官网解释:

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

问题:

1.在进行HPA自动伸缩Pod,无法进行自动伸缩

需要安装metrics-server组件

可参见<<Ansbile部署Kubernetes 1.16.10 集群>>中的5.安装metrics-server

配置步骤

【参考资料】

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: