zoukankan      html  css  js  c++  java
  • 023.Kubernetes掌握Pod-Pod扩容和缩容

    一 Pod的扩容和缩容

    Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过执行kubectl scale命令或通过RESTful API对一个Deployment/RC进行Pod副本数量的设置。自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整。

    1.1 手动缩容和扩容

      1 [root@uk8s-m-01 study]# vi nginx-deployment.yaml
      2 apiVersion: apps/v1beta1
      3 kind: Deployment
      4 metadata:
      5   name: nginx-deployment
      6 spec:
      7   replicas: 3
      8   template:
      9     metadata:
     10       labels:
     11         app: nginx
     12     spec:
     13       containers:
     14       - name: nginx
     15         image: nginx:1.7.9
     16         ports:
     17         - containerPort: 80
      1 [root@uk8s-m-01 study]# kubectl create -f nginx-deployment.yaml
      2 [root@uk8s-m-01 study]# kubectl scale deployment nginx-deployment --replicas=5	#扩容至5个
      3 [root@uk8s-m-01 study]# kubectl get pods	                                	#查看扩容后的Pod
    clipboard
      1 [root@uk8s-m-01 study]# kubectl scale deployment nginx-deployment --replicas=2	#缩容至2个
      2 [root@uk8s-m-01 study]# kubectl get pods
    clipboard

    1.2 自动扩容机制

    Kubernetes使用Horizontal Pod Autoscaler(HPA)的控制器实现基于CPU使用率进行自动Pod扩缩容的功能。HPA控制器基于Master的kube-controller-manager服务启动参数--horizontal-pod-autoscaler-sync-period定义的探测周期(默认值为15s),周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的扩缩容条件进行对比,在满足条件时对Pod副本数量进行调整。
    • HPA原理
    Kubernetes中的某个Metrics Server(Heapster或自定义MetricsServer)持续采集所有Pod副本的指标数据。HPA控制器通过Metrics Server的API(Heapster的API或聚合API)获取这些数据,基于用户定义的扩缩容规则进行计算,得到目标Pod副本数量。
    当目标Pod副本数量与当前副本数量不同时,HPA控制器就向Pod的副本控制器(Deployment、RC或ReplicaSet)发起scale操作,调整Pod的副本数量,完成扩缩容操作。
    clipboard
    • HPA指标类型
    Master的kube-controller-manager服务持续监测目标Pod的某种性能指标,以计算是否需要调整副本数量。目前Kubernetes支持的指标类型如下:
    Pod资源使用率:Pod级别的性能指标,通常是一个比率值,例如CPU使用率。
    Pod自定义指标:Pod级别的性能指标,通常是一个数值,例如接收的请求数量。
    Object自定义指标或外部自定义指标:通常是一个数值,需要容器应用以某种方式提供,例如通过HTTP URL“/metrics”提供,或者使用外部服务提供的指标采集URL。
    Metrics Server将采集到的Pod性能指标数据通过聚合API(Aggregated API) 如metrics.k8s.io、 custom.metrics.k8s.io和external.metrics.k8s.io提供给HPA控制器进行查询。
    • 扩缩容算法
    Autoscaler控制器从聚合API获取到Pod性能指标数据之后,基于下面的算法计算出目标Pod副本数量,与当前运行的Pod副本数量进行对比,决定是否需要进行扩缩容操作:
    desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
    即当前副本数 x(当前指标值/期望的指标值),将结果向上取整。
    释义:以CPU请求数量为例,如果用户设置的期望指标值为100m,当前实际使用的指标值为200m,则计算得到期望的Pod副本数量应为两个(200/100=2)。如果设置的期望指标值为50m,计算结果为0.5,则向上取整值为1, 得到目标Pod副本数量应为1个。
    注意:当计算结果与1非常接近时,可以设置一个容忍度让系统不做扩缩容操作。容忍度通过kube-controller-manager服务的启动参数--horizontalpod-autoscaler-tolerance进行设置,默认值为0.1(即10%),表示基于上述算法得到的结果在[-10%-+10%]区间内,即[0.9-1.1],控制器都不会进行扩缩容操作
    也可以将期望指标值(desiredMetricValue)设置为指标的平均值类型,例如targetAverageValue或targetAverageUtilization,此时当前指标值(currentMetricValue) 的算法为所有Pod副本当前指标值的总和除以Pod副本数量得到的平均值。
    此外,存在几种Pod异常的如下情况:
    • Pod正在被删除(设置了删除时间戳):将不会计入目标Pod副本数量。
    • Pod的当前指标值无法获得:本次探测不会将这个Pod纳入目标Pod副本数量,后续的探测会被重新纳入计算范围。
    • 如果指标类型是CPU使用率,则对于正在启动但是还未达到Ready状态的Pod,也暂时不会纳入目标副本数量范围。
    提示:可以通过kubecontroller-manager服务的启动参数--horizontal-pod-autoscaler-initialreadiness-delay设置首次探测Pod是否Ready的延时时间,默认值为30s。
    另一个启动参数--horizontal-pod-autoscaler-cpuinitialization-period设置首次采集Pod的CPU使用率的延时时间。
    当存在缺失指标的Pod时,系统将更保守地重新计算平均值。系统会假设这些Pod在需要缩容(Scale Down) 时消耗了期望指标值的100%,在需要扩容(Scale Up)时消耗了期望指标值的0%,这样可以抑制潜在的扩缩容操作。
    此外,如果存在未达到Ready状态的Pod,并且系统原本会在不考虑缺失指标或NotReady的Pod情况下进行扩展,则系统仍然会保守地假设这些Pod消耗期望指标值的0%,从而进一步抑制扩容操作。如果在HorizontalPodAutoscaler中设置了多个指标,系统就会对每个指标都执行上面的算法,在全部结果中以期望副本数的最大值为最终结果。如果这些指标中的任意一个都无法转换为期望的副本数(例如无法获取指标的值),系统就会跳过扩缩容操作。
    最后, 在HPA控制器执行扩缩容操作之前,系统会记录扩缩容建议信息(Scale Recommendation)。控制器会在操作时间窗口(时间范围可以配置)中考虑所有的建议信息,并从中选择得分最高的建议。这个值可通过kube-controller-manager服务的启动参数--horizontal-podautoscaler-downscale-stabilization-window进行配置,默认值为5min。这个配置可以让系统更为平滑地进行缩容操作,从而消除短时间内指标值快速波动产生的影响。

    1.3 HorizontalPodAutoscaler

    Kubernetes将HorizontalPodAutoscaler资源对象提供给用户来定义扩缩容的规则。
    HorizontalPodAutoscaler资源对象处于Kubernetes的API组“autoscaling”中, 目前包括v1和v2两个版本。 其中autoscaling/v1仅支持基于CPU使用率的自动扩缩容, autoscaling/v2则用于支持基于任意指标的自动扩缩容配置, 包括基于资源使用率、 Pod指标、 其他指标等类型的指标数据。
    示例1:基于autoscaling/v1版本的HorizontalPodAutoscaler配置,仅可以设置CPU使用率。
      1 [root@uk8s-m-01 study]# vi php-apache-autoscaling-v1.yaml
      2 apiVersion: autoscaling/v1
      3 kind: HorizontalPodAutoscaler
      4 metadata:
      5   name: php-apache
      6 spec:
      7   scaleTargetRef:
      8     apiVersion: apps/v1
      9     kind: Deployment
     10     name: php-apache
     11   minReplicas: 1
     12   maxReplicas: 10
     13   targetCPUUtilizationPercentage: 50
    释义:
    scaleTargetRef:目标作用对象,可以是Deployment、ReplicationController或ReplicaSet。
    targetCPUUtilizationPercentage:期望每个Pod的CPU使用率都为50%,该使用率基于Pod设置的CPU Request值进行计算,例如该值为200m,那么系统将维持Pod的实际CPU使用值为100m。
    minReplicas和maxReplicas:Pod副本数量的最小值和最大值,系统将在这个范围内进行自动扩缩容操作, 并维持每个Pod的CPU使用率为50%。
    为了使用autoscaling/v1版本的HorizontalPodAutoscaler,需要预先安装Heapster组件或Metrics Server,用于采集Pod的CPU使用率。
    示例2:基于autoscaling/v2beta2的HorizontalPodAutoscaler配置。
      1 [root@uk8s-m-01 study]# vi php-apache-autoscaling-v2.yaml
      2 apiVersion: autoscaling/v2beta2
      3 kind: HorizontalPodAutoscaler
      4 metadata:
      5   name: php-apache
      6 spec:
      7   scaleTargetRef:
      8     apiVersion: apps/v1
      9     kind: Deployment
     10     name: php-apache
     11   minReplicas: 1
     12   maxReplicas: 10
     13   metrics:
     14   - type: Resource
     15     resource:
     16       name: cpu
     17       target:
     18         type: Utilization
     19         averageUtilization: 50
    释义:
    scaleTargetRef:目标作用对象,可以是Deployment、ReplicationController或ReplicaSet。
    minReplicas和maxReplicas:Pod副本数量的最小值和最大值,系统将在这个范围内进行自动扩缩容操作, 并维持每个Pod的CPU使用率为50%。
    metrics:目标指标值。在metrics中通过参数type定义指标的类型;通过参数target定义相应的指标目标值,系统将在指标数据达到目标值时(考虑容忍度的区间)触发扩缩容操作。
    • metrics中的type(指标类型)设置为以下几种:
      • Resource:基于资源的指标值,可以设置的资源为CPU和内存。
      • Pods:基于Pod的指标,系统将对全部Pod副本的指标值进行平均值计算。
      • Object:基于某种资源对象(如Ingress)的指标或应用系统的任意自定义指标。
    Resource类型的指标可以设置CPU和内存。对于CPU使用率,在target参数中设置averageUtilization定义目标平均CPU使用率。对于内存资源,在target参数中设置AverageValue定义目标平均内存使用值。指标数据可以通过API“metrics.k8s.io”进行查询,要求预先启动Metrics Server服务。
    Pods类型和Object类型都属于自定义指标类型,指标的数据通常需要搭建自定义Metrics Server和监控工具进行采集和处理。指标数据可以通过API“custom.metrics.k8s.io”进行查询,要求预先启动自定义Metrics Server服务。
    类型为Pods的指标数据来源于Pod对象本身, 其target指标类型只能使用AverageValue,示例:
      1  metrics:
      2   - type: Pods
      3     pods:
      4       metrics:
      5         name: packets-per-second
      6       target:
      7         type: AverageValue
      8         averageValue: 1k
  • 相关阅读:
    PHP 方法整合类 -- 1.根据概率产生随机数 --2.判断手机号归属地及运营商 --3.过滤emoji表情
    PHP 多图下载并打包压缩方法
    PHP 导出excel 精简版
    PHP获取首字母相关方法
    no input file specified 解决办法
    百度地图相关
    经纬度相关方法
    阿里云SSL证书部署至宝塔
    微信入口、生成菜单,公众号授权获取用户信息(unionid)
    超级好用超级简单的支付类库
  • 原文地址:https://www.cnblogs.com/itzgr/p/11921727.html
Copyright © 2011-2022 走看看