• k8s 使用HPA 进行弹性扩容pod节点,


    弹性扩容分为三种,内存,cpu,自定义指标:

    使用hpa之前要进行添加Kubernetes Metrics Server 从集群中的 kubelets 收集资源指标
    这个的安装请自行百度,可以考虑官网文档:https://github.com/kubernetes-sigs/metrics-server#deployment

    基于CPU进行弹性扩容pod节点:

    概述:当一个业务压力过大的时候可能出现一系列问题,所有k8s引用了一个hpa的概念进行弹性扩容,pod节点,cpu只是参考的一种,建议按照业务情况进行选择

    yaml文件:

    vim nginx-deploy.yaml
    apiVersion: apps/v1
    kind: Deployment   # k8s的资源类型
    metadata:
      name: nginx     # deploy的名字
    spec:
      selector:
        matchLabels:
          app: nginx # deploy的标签
      replicas: 1     # 副本数
      template:
        metadata:
          labels:
            app: nginx # 管理的pod节点的标签
        spec:
          containers:
          - name: nginx    # images的名字
            image: nginx   # nginx的地址
            ports:
            - containerPort: 80 # pod暴露的端口号
            resources:
              limits:
                cpu: 500m # cpu配置,添加cpu之类也是为了使用hpa进行弹性扩容,生成环境中配置的更加麻烦,这边把yaml进行简单化,方便进行理解。
              requests:
                cpu: 200m # cpu配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    开始进行配置HPA

    kubectl autoscale deployment nginx  --cpu-percent=50 --min=1 --max=10 --dry-run=client  -oyaml  # 整体的这个命令相当于当cpu使用率到达50%的时候进行弹性扩容,最高扩容到10个版本,最低缩容到1个版本, 后面的 --dry-run=client  -oyaml 的意思是进行输出成一个yaml,这边方便进行查看 ## 注意HPA有命名空间隔离性
    [root@hecs-266792 HPA]# kubectl autoscale deployment nginx  --cpu-percent=50 --min=1 --max=10 --dry-run=client  -oyaml
    apiVersion: autoscaling/v1   # hpa的版本
    kind: HorizontalPodAutoscaler  # 资源类型
    metadata:
      creationTimestamp: null  
      name: nginx   # hpa的名称,可以使用kubectl get hpa 进行查看到的
    spec:
      maxReplicas: 10    # 弹性扩容的最大副本数
      minReplicas: 1     # 弹性缩容的最小副本数
      scaleTargetRef:
        apiVersion: apps/v1   # deploy的版本可以使用kubectl api-resources |grep deploy进行查看到
        kind: Deployment  # deploy的资源  
        name: nginx    # deploy的名称
      targetCPUUtilizationPercentage: 10
    status:
      currentReplicas: 0
      desiredReplicas: 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    配置完整之后,咱们这边可以进行测试一下,是否达到效果:

    [root@hecs-266792 HPA]# kubectl get po -owide
    NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE          NOMINATED NODE   READINESS GATES
    nginx-5fc6fd5469-bwls6   1/1     Running   0          47h   172.20.255.221   hecs-266792              
    [root@hecs-266792 HPA]# cat lll.sh 
    #!/bin/bash
    a=0
    while [ $a -le 10 ]
    do 
     curl  http://172.20.255.221 
    echo "正常测试" 
    done
    
    
    进行执行lll.sh并进行观察pod是否进行扩容成功:
    [root@hecs-266792 HPA]# kubectl top po 
    NAME                     CPU(cores)   MEMORY(bytes)   
    nginx-5fc6fd5469-bwls6   31m          3Mi             
    [root@hecs-266792 HPA]# kubectl get po 
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-5fc6fd5469-bwls6   1/1     Running   0          47h
    nginx-5fc6fd5469-ffgzm   0/1     Pending   0          31s
    nginx-5fc6fd5469-jssll   1/1     Running   0          31s
    [root@hecs-266792 HPA]# kubectl get hpa
    NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    nginx   Deployment/nginx   15%/10%   1         10        3          51s
    发现已经进行扩容成功了,扩容到了3个,后面还会进行扩容,这边就暂停演示了,当压力降低的时候就回把刚刚扩容的进行弹性缩容
    [root@hecs-266792 HPA]# kubectl get po 
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-5fc6fd5469-bwls6   1/1     Running   0          47h
    nginx-5fc6fd5469-ffgzm   0/1     Pending   0          2m12s
    nginx-5fc6fd5469-jssll   1/1     Running   0          2m12s
    [root@hecs-266792 HPA]# kubectl get hpa # 注意默认检测时间是5分钟,此参数是可以进行修改的
    NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    nginx   Deployment/nginx   0%/10%    1         10        3          2m52s
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    基于内存进行弹性扩容pod节点:

    deploy的yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
            resources:
              limits:
                cpu: 500m
                memory: 1000Mi
              requests:
                cpu: 200m
                memory: 1000Mi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    # hpa的yaml,这边配置和cpu和内存的2方式进行扩容,作为参考
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx  # hpa的名字,可以使用kubectl get hpa 进行查看的
    spec:
      scaleTargetRef:
        apiVersion: apps/v1   # deploy的版本可以使用kubectl api-resources |grep deploy进行查看到
        kind: Deployment      # deploy资源
        name: nginx           # deploy名称
      minReplicas: 1          # 最小副本数  
      maxReplicas: 10         # 最大副本数
      metrics:                # 采集的类型
      - type: Resource        #   资源
        resource:
          name: cpu           # cpu资源
          targetAverageUtilization: 80  # cpu使用率到达80%
      - type: Resource        # 资源
        resource:
          name: memory        # 内存资源
          targetAverageValue: 30Mi    # 当使用内存到达30M的是时候就是
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    进行验证是否扩容成功:
    进入pod中:kubectl exec -it nginx-664fc7cf5f-s6bsg – sh
    进入之后执行:
    dd if=/dev/zero of=/1.txt # 执行几分钟之后,进行退出ctrl+c即可
    进行打开1.txt文件
    cat 1.txt
    在这里插入图片描述

    [root@hecs-266792 HPA]# kubectl get po && kubectl top po && kubectl get hpa
    # 这边pod处于Pending的状态是因为我服务器内存不够导致的
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-664fc7cf5f-2g7k2   0/1     Pending   0          12m
    nginx-664fc7cf5f-bln2l   0/1     Pending   0          12m
    nginx-664fc7cf5f-cnjkw   0/1     Pending   0          12m
    nginx-664fc7cf5f-p6zxt   0/1     Pending   0          12m
    nginx-664fc7cf5f-s6bsg   1/1     Running   0          34m
    nginx-664fc7cf5f-slw7c   0/1     Pending   0          12m
    nginx-664fc7cf5f-spn5j   0/1     Pending   0          12m
    nginx-664fc7cf5f-vjxhp   0/1     Pending   0          12m
    nginx-664fc7cf5f-z4dbl   0/1     Pending   0          12m
    nginx-664fc7cf5f-zn6d4   0/1     Pending   0          12m
    NAME                     CPU(cores)   MEMORY(bytes)   
    nginx-664fc7cf5f-s6bsg   0m           418Mi           
    NAME    REFERENCE          TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
    nginx   Deployment/nginx   438513664/30Mi   1         10        10         28m
    
    # 发现是可以进行弹性扩容的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    使用自定义的监控指标进行弹性扩容:

    这个后期会进行更新

  • 相关阅读:
    【面试普通人VS高手系列】ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?
    C/C++编程新手容易犯的10种编程错误
    毕业从事弱电3个月,我为什么会选择转行网络工程师
    leetcode19-删除链表的倒数第n个结点
    Hive创建分区表并插入数据
    服务器入侵之找出隐藏字符的原理
    Flutter中GetX的用法(路由管理)
    Java高级——内存分配机制
    SANSAN每周新鲜事|OPC UA 数据采集,你真的了解吗?
    学习Android的第二十七天
  • 原文地址:https://blog.csdn.net/weixin_44932410/article/details/127829659