• Kubernetes Pod水平自动伸缩(HPA)


    HPA简介

    HAP,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
    Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

    Pod HAP工作机制示意图

    实际生产中,广泛使用这四类指标:
    1、Resource metrics - CPU核内存利用率指标
    2、Pod metrics - 例如网络利用率和流量
    3、Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
    4、Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容

    好了,概念就说这些,想了解更多,请参看官网,现在开始实战。

    示例

    1、首先我们部署一个nginx,副本数为2,请求cpu资源为200m。同时为了便宜测试,使用NodePort暴露服务。命名空间:hpa

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx
      namespace: hpa
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
            resources:
              requests:
                cpu: 200m
                memory: 100Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: hpa
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
      selector:
        app: nginx
    

    2、查看部署结果

    [root@k8s-node001 HPA]# kubectl  get po -n hpa
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-5c87768685-48b4v   1/1     Running   0          8m38s
    nginx-5c87768685-kfpkq   1/1     Running   0          8m38s
    

    3、创建HPA
    简单说下:这里创建一个HPA,用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。
    HPA 将通过增加或者减少 Pod 副本的数量(通过 Deployment)以保持所有 Pod 的平均 CPU 利用率在 50% 以内。
    算法参见

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx
      namespace: hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
    

    4、查看部署结果

    [root@k8s-node001 HPA]# kubectl  get hpa -n hpa
    NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    nginx   Deployment/nginx   0%/50%      1                10                 2          50s
    

    5、压测,观察Pod数和HPA变化
    执行压测命令

    [root@k8s-node001 ~]# ab -c 1000 -n 100000000 http://192.168.100.185:30792/
    This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    Benchmarking 192.168.100.185 (be patient)
    

    观察变化

    [root@k8s-node001 HPA]#  kubectl  get hpa -n hpa
    NAME    REFERENCE          TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
    nginx   Deployment/nginx   303%/50%   1         10        7          12m
    
    [root@k8s-node001 HPA]# kubectl  get po -n hpa
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/nginx-5c87768685-6b4sl   1/1     Running   0          85s
    pod/nginx-5c87768685-99mjb   1/1     Running   0          69s
    pod/nginx-5c87768685-cls7r   1/1     Running   0          85s
    pod/nginx-5c87768685-hhdr7   1/1     Running   0          69s
    pod/nginx-5c87768685-jj744   1/1     Running   0          85s
    pod/nginx-5c87768685-kfpkq   1/1     Running   0          27m
    pod/nginx-5c87768685-xb94x   1/1     Running   0          69s
    

    从以上输出可以看出,hpa TARGETS达到了303%,需要扩容。pod数自动扩展到了7个。
    继续等待压测结束或者直接打断压测

    [root@k8s-node001 ~]# kubectl get hpa -n hpa
    NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    nginx   Deployment/nginx   20%/50%   1         10        7          16m
    
    。。。N分钟后。。。
    
    [root@k8s-node001 ~]# kubectl get hpa -n hpa
    NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    nginx   Deployment/nginx   0%/50%    1         10        7          18m
    
    。。。再过N分钟后。。。
    
    [root@k8s-node001 ~]# kubectl  get po -n hpa
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-5c87768685-jj744   1/1     Running   0          11m
    
    

    这时,CPU 利用率已经降到 0,所以 HPA 将自动缩减副本数量至 1。
    这里需要注意下:为什么会将副本数降为1,而不是我们部署时指定的replicas: 2呢?
    因为在创建HPA时,指定了副本数范围,这里是minReplicas: 1,maxReplicas: 10。所以HPA在缩减副本数时减到了1。
    Tips: 自动扩缩完成副本数量的改变可能需要几分钟的时间。

    总结

  • 相关阅读:
    序列化
    restfull风格,规范的项目,django-DRF与django的区别
    JWT的应用
    七牛云上传文件
    微博三方登录
    celery原理与使用
    Redis五大数据类型
    图片验证码
    单点登录
    Django Rest Framework JWT
  • 原文地址:https://www.cnblogs.com/scofield666/p/13753039.html
Copyright © 2020-2023  润新知