美文网首页
Kubernetes的Pod自动化扩缩容及HPA原理

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

作者: IT软件技术分享 | 来源:发表于2020-09-24 00:24 被阅读0次

    在实际的业务场景中,我们经常会遇到某个服务需要扩容的场景(例如:测试压测、电商秒杀、大促、或由于资源紧张、工作负载降低等等都需要对服务实例数进行扩缩容操作)。在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-controller-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/

    相关文章

      网友评论

          本文标题:Kubernetes的Pod自动化扩缩容及HPA原理

          本文链接:https://www.haomeiwen.com/subject/qhwayktx.html