Kubenetes Pod 部署&滚动升级 调优
Pod 在滚动升级部署中部署pod个数到可用指标
更新速率 是衡量 Kubenetes
调度能力最核心指标
举个例子:
代码语言:yaml复制 rollingUpdate:
maxSurge: 25% #每个滚动更新的实例数量
maxUnavailable: 25% #允许更新过程中有多少实例不可用
默认情况下,滚动升级是逐个更新的,当有几十上百个POD需要更新时,再加上、系统Admission Webhook
、Scheduler Binding Score & filter
、Probe就绪检测
、整个过程Qps和Burst限制
,整个过程将会更慢。
Pod 部署&滚动升级
核心涉及几个步骤:
部署核心流程:
kubectl
向apiserver
发送部署请求(例如使用:kubectl create -f deployment.yml
)apiserver
将Deployment
持久化到etcd
;etcd
与apiserver
进行一次http2.0
通信。controller manager
通过watch api
监听apiserver
,deployment controller
看到了一个新创建的deplayment
对象更后,将其从队列中拉出,根据deployment
的描述创建一个ReplicaSet
并将ReplicaSet
对象返回apiserver
并持久化回etcd
。- 以此类推,当
replicaset controller
看到新创建的replicaset
对象,将其从队列中拉出,根据描述创建pod
对象。 - 接着
scheduler
调度器看到未调度的pod
对象,根据调度规则
选择一个可调度的节点,加载到pod
描述中nodeName
字段,并将pod
对象返回apiserver
并写入etcd
。 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
更改为
代码语言:shell复制 --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 绑定失败后重新调度时间间隔
更改为
代码语言:shell复制 --node-monitor-period=2s
--node-monitor-grace-period=20s
--pod-eviction-timeout=30s
3. 关闭自定义的 webhook
和 scheduler
关闭链路中,不必要的自定义调度
kube-scheduler:
代码语言:shell复制 --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
更改
代码语言: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倍
发散: 资源拓扑感知调度优化
下一个阶段:资源拓扑感知调度干预