023.掌握Pod-Pod扩容和缩容
程序员文章站
2022-05-09 14:49:20
一 Pod的扩容和缩容 Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过执行kubectl scale命令或通过RESTful API对一个Deployment/RC进行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
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: 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
上一篇: 一文看懂Color OS 7 OPPO说它是迄今为止最好的手机系统
下一篇: 在公共汽车上