023.掌握PodPod扩容和缩容

编程

一 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:

5name: 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

  1 [root@uk8s-m-01 study]# kubectl scale deployment nginx-deployment --replicas=2	#缩容至2个

2 [root@uk8s-m-01 study]# kubectl get pods

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的副本数量,完成扩缩容操作。

  • 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:

5name: php-apache

6 spec:

7 scaleTargetRef:

8 apiVersion: apps/v1

9 kind: Deployment

10name: 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:

5name: php-apache

6 spec:

7 scaleTargetRef:

8 apiVersion: apps/v1

9 kind: Deployment

10name: php-apache

11 minReplicas: 1

12 maxReplicas: 10

13 metrics:

14 - type: Resource

15 resource:

16name: 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:

5name: packets-per-second

6 target:

7 type: AverageValue

8 averageValue: 1k

以上是 023.掌握PodPod扩容和缩容 的全部内容, 来源链接: utcz.com/z/511117.html

回到顶部