zoukankan      html  css  js  c++  java
  • k8s Pod的自动水平伸缩(HPA)

    我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能

    但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少。

    这就很麻烦了,总不能为了需求总是把pod设置为最多状态,这样太浪费资源;也不能当请求量上来以后再去伸缩pod,这样会有好多请求不成功。

    k8s既然是云原生时代的产品,当然得有智能,自动这些特性。

    所以现在引入一个新的概念:

    HPA(Horizontal Pod Autoscaler )

    pod的自动水平伸缩

    有了HPA,我们就不用为上面的问题而烦恼,HPA会帮我们自动完成pod的扩缩容。

    当资源需求过高时,会自动创建出pod副本;当资源需求低时,会自动收缩pod副本数。

    注意:首先必须确保集群中已经安装metrics-server的组件,否则无法获取集群内资源数据,无法进行以下操作。

    原理:

    通过集群内的资源监控系统(metrics-server),来获取集群中资源的使用状态。

    根据CPU、内存、以及用户自定义的资源指标数据的使用量或连接数为参考依据,来制定一个临界点,一旦超出这个点,HPA就会自动创建出pod副本。

    版本:

    通过kubectl api-versions可以看到,目前有3个版本:

    autoscaling/v1                 #只支持通过cpu为参考依据,来改变pod副本数
    autoscaling/v2beta1       #支持通过cpu、内存、连接数以及用户自定义的资源指标数据为参考依据。
    autoscaling/v2beta2       #同上,小的变动

    查询:

    1 kubectl explain hpa   ##默认查询到的是autoscaling/v1版本
    2 
    3 kubectl explain hpa --api-version=autoscaling/v2beta1   ##如果使用其他版本,可以使用--api-version指明版本

    部署HPA:

    哪个资源最多几个最少几个通过什么判断伸缩

    例如:我有个deployment叫myapp现在只有一个副本数,最多只能8个副本数,当pod的cpu平均利用率超过百分之50或内存平均值超过百分之50时,pod将自动增加副本数以提供服务。

    SVC、Deployment资源清单:

     1 apiVersion: v1
     2 kind: Service
     3 metadata:
     4   name: svc-hpa
     5   namespace: default
     6 spec:
     7   selector:
     8     app: myapp
     9   type: NodePort  ##注意这里是NodePort,下面压力测试要用到。
    10   ports:
    11   - name: http
    12     port: 80
    13 ---
    14 apiVersion: apps/v1
    15 kind: Deployment
    16 metadata:
    17   name: myapp
    18   namespace: default
    19 spec:
    20   replicas: 1
    21   selector:
    22     matchLabels:
    23       app: myapp
    24   template:
    25     metadata:
    26       name: myapp-demo
    27       namespace: default
    28       labels:
    29         app: myapp
    30     spec:
    31       containers:
    32       - name: myapp
    33         image: ikubernetes/myapp:v1
    34         imagePullPolicy: IfNotPresent
    35         ports:
    36         - name: http
    37           containerPort: 80
    38         resources:
    39           requests:
    40             cpu: 50m
    41             memory: 50Mi
    42           limits:
    43             cpu: 50m
    44             memory: 50Mi

    HPA资源清单如下:

     1 apiVersion: autoscaling/v2beta1
     2 kind: HorizontalPodAutoscaler
     3 metadata:
     4   name: myapp-hpa-v2
     5   namespace: default
     6 spec:
     7   minReplicas: 1         ##至少1个副本
     8   maxReplicas: 8         ##最多8个副本
     9   scaleTargetRef:
    10     apiVersion: apps/v1
    11     kind: Deployment
    12     name: myapp
    13   metrics:
    14   - type: Resource
    15     resource:
    16       name: cpu
    17       targetAverageUtilization: 50  ##注意此时是根据使用率,也可以根据使用量:targetAverageValue
    18   - type: Resource
    19     resource:
    20       name: memory
    21       targetAverageUtilization: 50  ##注意此时是根据使用率,也可以根据使用量:targetAverageValue

    使用ab工具模拟压力测试:

    1 ab -c 1000 -n 5000000 http://192.168.1.103:31727/index.html

    等待数分钟后,查看hpa及pod数量

    1 [root@K8s-master ~]# kubectl get hpa
    2 NAME           REFERENCE          TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    3 myapp-hpa-v2   Deployment/myapp   5%/50%, 72%/50%   1         8         2          44m
    4 [root@K8s-master ~]# kubectl get pods
    5 NAME                     READY   STATUS    RESTARTS   AGE
    6 myapp-558db64459-pwzsd   1/1     Running   0          16m
    7 myapp-558db64459-x9c4k   1/1     Running   0          23s
  • 相关阅读:
    转盘抽奖活动代码
    信息滚动条
    gulp应用学习
    js实现语音播报功能
    如何安装使用sass
    纯CSS写三角形-border法
    css兼容性写法
    字体中英文对照
    浏览器内核判断
    个人课程总结
  • 原文地址:https://www.cnblogs.com/Smbands/p/10989261.html
Copyright © 2011-2022 走看看