前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubenetes Pod 部署&滚动升级 调优

Kubenetes Pod 部署&滚动升级 调优

原创
作者头像
KubeService@dongjiang
发布2022-11-16 10:36:11
7371
发布2022-11-16 10:36:11
举报
文章被收录于专栏:Kubeservice

Kubenetes Pod 部署&滚动升级 调优

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

举个例子:

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

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

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 是通过

代码语言:shell
复制
   --node-status-update-frequency=10s  #默认上报时间
   --kube-api-qps=5
   --kube-api-burst=10

更改为

代码语言:shell
复制
   --node-status-update-frequency=3s  
   --kube-api-qps=50 #pod 部署后信息上报
   --kube-api-burst=100 #pod 部署后信息上报
2. controller manager 调整Node信息获取周期

默认 controller manager 检查 kubelet 周期

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

更改为

代码语言:shell
复制
   --node-monitor-period=2s
   --node-monitor-grace-period=20s
   --pod-eviction-timeout=30s

3. 关闭自定义的 webhookscheduler

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

kube-scheduler:

代码语言:shell
复制
  --feature-gates=CustomResourceValidationExpressions=false,...

4. 调整 controller manager 并发度

kube-controller-manager 进行调整:

代码语言:yaml
复制
  --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

更改

代码语言:yaml
复制
  --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:

代码语言:yaml
复制
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:
          limits:
            cpu: "10m"
            memory: 10Mi
          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倍

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Kubenetes Pod 部署&滚动升级 调优
    • Pod 部署&滚动升级
      • 优化点
        • 1. 调整 kubelet 上报频次
        • 2. controller manager 调整Node信息获取周期
      • 3. 关闭自定义的 webhook 和 scheduler
        • 4. 调整 controller manager 并发度
          • 5. pod 设置 request和limit,并且添加PDB
          • 总结
          • 发散: 资源拓扑感知调度优化
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档