性能调优之 Kubenetes Pod 部署&滚动升级调优

Kubenetes Pod 部署&滚动升级调优

Posted by 董江 on Thursday, September 1, 2022

Kubenetes Pod 部署&滚动升级 调优

Pod 在滚动升级部署中部署pod个数到可用指标更新速率 是衡量 Kubenetes 调度能力最核心指标

举个例子:

  rollingUpdate:
    maxSurge: 25% #每个滚动更新的实例数量
    maxUnavailable: 25% #允许更新过程中有多少实例不可用

默认情况下,滚动升级是逐个更新的,当有几十上百个POD需要更新时,再加上、系统Admission WebhookScheduler Binding Score & filterProbe就绪检测整个过程Qps和Burst限制,整个过程将会更慢。

Pod 部署&滚动升级

核心涉及几个步骤:

pod 部署过程

部署核心流程:

  1. kubectlapiserver发送部署请求(例如使用: kubectl create -f deployment.yml
  2. apiserverDeployment 持久化到 etcdetcdapiserver进行一次http2.0通信。
  3. controller manager通过watch api监听 apiserverdeployment controller看到了一个新创建的deplayment对象更后,将其从队列中拉出,根据deployment的描述创建一个ReplicaSet并将 ReplicaSet 对象返回apiserver并持久化回etcd
  4. 以此类推,当replicaset controller 看到新创建的replicaset对象,将其从队列中拉出,根据描述创建pod对象。
  5. 接着scheduler调度器看到未调度的pod对象,根据调度规则选择一个可调度的节点,加载到pod描述中nodeName字段,并将pod对象返回apiserver并写入etcd
  6. kubelet在看到有pod对象中nodeName字段属于本节点,将其从队列中拉出,通过容器运行时创建pod中描述的容器。

优化点

组件之间通信是通过 http2.0 watch apiserver资源来获得,是实时长连接通知信息。基本上无可用加速点

1. 调整 kubelet 上报频次

调整kubelet 上报频次, 让scheduler拿到较准确的Node资源拓扑信息, 用于更精准计算node权重

默认 kubelet 是通过

   --node-status-update-frequency=10s  #默认上报时间
   --kube-api-qps=5
   --kube-api-burst=10

更改为

   --node-status-update-frequency=3s  
   --kube-api-qps=50 #pod 部署后信息上报
   --kube-api-burst=100 #pod 部署后信息上报

2. controller manager 调整Node信息获取周期

默认 controller manager 检查 kubelet 周期

   --node-monitor-period=5s #检查 kubelet 的状态时间间隔
   --node-monitor-grace-period=40s #检查 notready node 时间间隔
   --pod-eviction-timeout=5m # pod 绑定失败后重新调度时间间隔

更改为

   --node-monitor-period=2s
   --node-monitor-grace-period=20s
   --pod-eviction-timeout=30s

3. 关闭自定义的 webhookscheduler

关闭链路中,不必要的自定义调度

kube-scheduler:

  --feature-gates=CustomResourceValidationExpressions=false,...

4. 调整 controller manager 并发度

kube-controller-manager 进行调整:

  --concurrent-deployment-syncs=5
  --concurrent-endpoint-syncs=5
  --concurrent-namespace-syncs=10
  --concurrent-replicaset-syncs=5
  --concurrent-service-syncs=10
  --kube-api-qps=20
  --kube-api-burst=30

更改

  --concurrent-deployment-syncs=50
  --concurrent-endpoint-syncs=50
  --concurrent-namespace-syncs=100
  --concurrent-replicaset-syncs=50
  --concurrent-service-syncs=100
  --kube-api-qps=500
  --kube-api-burst=100

5. pod 设置 request和limit,并且添加PDB

pod deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1000
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
	    resources:
          requests:
            cpu: "10m"
            memory: 10Mi
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: nginx-pdb
spec:
  maxUnavailable: 25%
  minAvailable: 25%
  selector:
    matchLabels:
      app: nginx

总结

1000个 pod 创建到ready状态,在以上配置后,耗时 从 78s->24s, 这个控制面Qps 高了10倍

发散: 资源拓扑感知调度优化

下一个阶段:资源拓扑感知调度干预

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付