最佳实践
大规模集群场景下kube-controller-manager参数调优最佳实践
在Kubernetes中,每个控制器是一个控制回路,通过API服务器监视集群的共享状态,并尝试进行更改以将当前状态转为期望状态。
目标
本最佳实践聚集在kube-controller-manager的性能提升,以支持大规模场景下的kube-controller-manager能力,主要包含如下部分。
- 调整kube-controller-manager资源占用,以支持大规模集群正常工作。
- 调整kube-controller-manager参数,提高集群可用性,减少内存占用。
前提条件
集群使用kube-controller作为Kubernetes集群的控制管理器,并部署多个实例。
使用限制
适用于通过installer部署工具构建的大规模集群环境。
背景信息
在大规模的场景下,kube-controller-manager需要对上万Pod等资源进行状态调谐,需要对此进行优化,防止kube-controller-manager性能劣化或内存溢出。
操作步骤
请按以下步骤,通过修改kube-controller-manager对应的部署配置以完成优化。
资源占用
CPU:CPU占用过高将影响可用性,若条件允许,建议不设置上限。
内存:若kube-controller-manager内存超过限制,将导致kube-controller-manager重启,导致kube-controller-manager在一定时间内无法正常进行资源调谐,影响整个集群可用性。若条件允许,建议不设置上限。若要设置,则可设置为90000Mi。
启动参数
表1 启动参数说明与建议值
参数名 说明与建议值 leader-elect说明:是否开启选主功能。
默认值:true。
建议配置:true。leader-elect-lease-duration说明:选主租约时长,超过此时长将开始选主。kube-controller-manager主实例将定期续租,以保证Leader身份,此值设置过低将导致kube-controller-manager频繁访问kube-apiserver向etcd更新数据;设置过高将导致kube-controller-manager实例倒换时间过长。
默认值:15s。
建议配置:65s,提高可用性。leader-elect-renew-deadline说明:刷新租约时长的周期,超过此时长将尝试续约Leader身份。
默认值:10s。
建议配置:60s,提高可用性。kube-api-burst说明:与Kubernetes API服务器通信时突发峰值请求个数上限。
默认值:30 (次/s)。
建议配置:15000(次/s),以满足大规模集群需要。kube-api-qps说明:与API服务器通信时每秒请求数(QPS)限制。
默认值:20 (次/s)。
建议配置:10000(次/s),以满足大规模集群需要。node-eviction-rate说明:节点驱逐速率。 默认值为:0.1,表示每10s至多从1个节点驱逐Pod。
建议配置:0.05。node-monitor-period说明:cloud-node-lifecycle-controller对节点状态进行同步的周期。
默认值:10s。
建议配置:5s。node-monitor-grace-period说明:在将一个Node标记为不健康之前允许其无响应的时长上限。此值依赖kubelet节点状态更新频率。
默认值:40s。
建议配置:保持不变,配置为:40s。feature-gates说明:ComponentSLIs:在Kubernetes组件上启用 /metrics/slisendpoint,从而允许抓取健康检查指标,但会消耗额外的资源。
在1.28版本中建议配置:ComponentSLIs=false。环境变量
表2 环境变量说明与建议值
参数名 说明与建议值 GOGC说明:定义触发垃圾回收的新分配内存与存活内存之比。因kube-scheduler内存消耗较低,建议配置为70。
建议配置:70。GOMEMLIMIT说明:Go运行时可以使用的总体内存限制。
建议配置:67500MiB(总内存限制的85%)。GOMAXPROCS说明:设置运行时核心数量。
建议配置:多节点场景下建议配置为环境CPU核心数。HTTP2_READ_IDLE_TIMEOUT_SECONDS说明:client-go HTTP/2连接健康检查超时时间。
建议配置:15(s),以确保可用性。HTTP2_PING_TIMEOUT_SECONDS说明:client-go使用 ping执行HTTP/2连接健康检查超时时间。
建议配置:10(s),以确保可用性。