提升大规模集群的 Kubernetes 稳定性

集群运维人员和 SRE 可以使用这些实践来降低控制平面过载、提升可靠性,并限制大规模 Kubernetes 集群中的故障影响范围。

目录

说明

说明

  • 对于网络、存储、负载均衡器、日志和监控调优,请使用针对这些能力的组件专用指导。
WARNING
  • 在生产环境之前测试配置更改。
  • 当风险较高时,避免使用单个超大集群;可以考虑多集群管理以缩小故障影响范围。
问题描述优化
etcd 磁盘在大规模集群中,etcd 对磁盘 I/O 非常敏感。为 etcd 数据目录使用专用的 NVMe SSD。
etcd DB 大小大于 ~8 GB 的数据库会显著增加延迟、资源使用和恢复时间。将 etcd DB 保持在 ≤ 8 GB;删除未使用的对象,并保持频繁更新的对象较小(~≤100 KB)。
etcd 键抖动键的高读写频率会给 etcd 带来压力。分析 etcd 指标以查找并减少热点键。
etcd 中每种资源类型的数据大小每种资源类型的总量过大会使全量列表操作代价高昂,并可能阻塞控制器。将每种资源类型的总数据量保持在 ≤ 800 MB;清理未使用的 Deployment/Service。 1
API server LB 带宽和连接数负载均衡器的带宽或连接数限制可能导致节点变为 NotReady。提前监控/预配 API server 的负载均衡器。
每个 namespace 中的 Service 数量过多的 Service 会向 Pod 注入大量环境变量,并减慢启动速度。将每个 namespace 中的 Service 数量控制在 < 5,000,或设置 enableServiceLinks: false2
集群中的 Service 总数过多的 Service 会增加 kube-proxy 规则并影响性能。将 Service 总数控制在 < 10,000,并清理未使用的 Service。 1
CoreDNS大量 Pod 可能会降低 CoreDNS 性能。运行 NodeLocal DNSCache (nodelocaldns)。
Pod 更新速率过高的更新速率会将 Endpoint/EndpointSlice 变更推送到所有节点,并可能引发风暴。降低 Pod 抖动;对于 RollingUpdate,设置保守的 maxUnavailable/maxSurge
ServiceAccount token 挂载每个 token Secret 都可能创建一个 watch;大量 watch 会加重控制平面负担。对于不需要 API 访问的 Pod,设置 automountServiceAccountToken: false3
对象数量/大小累积的 ConfigMaps、Secrets、PVCs 等会增加控制平面负载。限制 ReplicaSet 历史记录(revisionHistoryLimit),并为 Jobs/CronJobs 使用 ttlSecondsAfterFinished
Pod requests/limitsrequests 与 limits 之间的差距过大,在节点丢失时可能触发级联故障。在可行的情况下,优先将 requests 设置为等于 limits。
控制器重启与监控控制器或 API server 重启会触发重新列表,可能使 API server 过载。监控控制器,设置合适的资源以避免重启,并减少不必要的控制平面操作。

Footnotes

  1. https://github.com/kubernetes/community/blob/master/sig-scalability/configs-and-limits/thresholds.md 2

  2. https://kubernetes.io/docs/tutorials/services/connect-applications-service/#accessing-the-service

  3. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#opt-out-of-api-credential-automounting