容器服务
类别 | 限制项 | 限制值 | 说明与影响 |
类别 | 限制项 | 限制值 | 说明与影响 |
数据量 | ETCD 总容量 | 默认支持 8 GiB,最大支持 16 GiB | 该值过大会影响性能,包括数据读写延迟、系统资源占用和选举延时,也会导致服务和数据恢复过程更加耗时。ETCD 数据库大小上限为 16GiB,超过该值集群会进入只读状态。 |
| 每种类型 ETCD 对象总大小 | 800 MiB | 单一类型的资源对象占用 ETCD 过多空间,会导致客户端(如 Controller)在 List 该资源时对 kube-apiserver 造成巨大压力,可能导致超时或 OOM。 |
| 单个资源大小 | 1 MiB | 单个资源对象过大会严重影响 ETCD 写入性能和 API Server 处理效率。对于高频修改的资源,建议将单个资源大小控制在 10 KiB 以下。在 ETCD 中,每次对键值对的更新都会生成一个新的历史版本,在高频更新大数据对象的场景下,ETCD 保存其数据的历史版本时会消耗更多的资源。 |
数量 | Node 数量 |
| 集群超过 5000 节点时,控制面组件会面临显著压力。Flannel 模型受 VPC 路由条目限制,上限为 1000 节点。大规模集群建议选用 VPC-CNI 模型。 |
| Pod 数量 |
| Pod 数量过多会增大 ETCD 存储压力,升高 API Server 的 List/Watch 操作延迟,拉长 Controller Manager 的资源同步周期,增加 Scheduler 的调度决策延迟,加剧控制面组件负载。建议单集群 Pod 总规模控制在 150000 以内。 |
| Pending Pod 数量 | 10000 | Pending Pod 数量过多时,新提交的 Pod 可能会长时间处于等待状态,调度器会周期性产生 Event,继而可能导致 Event 泛滥。 |
| CiliumIdentities 数量 | 65535 | Cilium 通过 Identity 来实现安全策略。每个具有唯一 Label 组合的 Pod 都会消耗一个 Identity。当 Identity 数量接近上限时,新的 Pod 可能无法获取网络身份,导致网络不通。 |
| HPA 数量 | 2000 | 每个 HPA 会每 15 秒处理一次。当 HPA 对象数量超过 2000 时,性能会线性下降,增加 kube-controller-manager 和 API Server 的压力。 |
密度 | 单节点 Pod 数量 |
|
分类 | 说明 | 配置建议 |
分类 | 说明 | 配置建议 |
控制 Pod 对象大小 | 如需高频操作(如扩缩容)大型工作负载,应当将 Pod 大小控制小于 10 KiB 以下。Kubernetes 将资源清单存储在 ETCD 数据库中,每次获取资源时(List/Watch)都会传输完整清单,过大的数据量会显著增加 API Server 负载和网络带宽消耗,进而影响控制平面整体性能。当集群中 Pod 数量较多时,Pod 大小对性能的影响会成倍放大。 | 避免将大量配置数据直接内嵌在 Pod YAML 的env或args中,可使用 ConfigMap 或 Secret 进行挂载。 |
控制集群中 Watch 的总连接数 | 对于 Pod 配置的每个 Secret 和 ConfigMap,节点上的 kubelet 都会创建一个对应的 Watch 连接以监听变化。所有节点产生的 Watch 总数可能对控制平面造成巨大负载。当集群中的 Watch 数量超过 200000 时,可能会影响集群初始化时间,甚至导致控制平面频繁重启。 |
|
禁止 Daemonset 按百分比更新 | 在数千节点的大规模集群中,批量创建或更新 DaemonSet 会对控制平面造成较高负载。如果 DaemonSet 中的 Pod 在启动过程中向 API Server 发起大量请求,将进一步加剧控制平面资源的消耗。 | 通过配置updateStrategy来严格控制滚动更新的并发度:
updateStrategy配置 YAML 示例如下: apiVersion: apps/v1 kind: DaemonSet metadata: ... spec: minReadySeconds: 5 updateStrategy: rollingUpdate: maxSurge: 0 maxUnavailable: 10 type: RollingUpdate |
设置 Job ttlSecondsAfterFinished | 对于通过 CronJob 或其他机制创建的大量 Job 对象,应当配置ttlSecondsAfterFinished字段,使其在完成后自动被清理。未配置自动清理时,已完成和失败的 Job 及其 Pod 会持续占用 ETCD 存储空间和控制面资源,可能导致 API Server List 操作延迟升高、ETCD 存储膨胀以及命名空间内对象数量超限等问题。 |
YAML 示例如下: apiVersion: batch/v1 kind: Job metadata: ... spec: ttlSecondsAfterFinished: 100 template: spec: containers: - name: pi |
禁用 Pod 自动挂载 ServiceAccount 功能 | 默认情况下,Kubernetes 会为 Pod 自动挂载 ServiceAccount 的凭证相关 Secret,kubelet 还会在每个节点上为每个 Secret 创建 Watch 监听变化,会对 API Server 造成显著负载。 | 对于无需访问 API Server 的 Pod,在 Pod Spec 中设置automountServiceAccountToken: false。 YAML 示例如下: spec: automountServiceAccountToken: false # 关键配置:禁用 Token 自动挂载 containers: - name: app image: nginx:latest |
禁用 Pod 自动注入 Service 环境变量 | Kubernetes 默认会为每个 Pod 注入命名空间内所有活跃 Service 的环境变量(如 MY_SERVICE_SERVICE_HOST、MY_SERVICE_SERVICE_PORT 等)。当服务数量过多时,可能导致 Pod 启动时因环境变量过多而崩溃。 | 在 Pod Spec 中设置enableServiceLinks: false,禁用服务环境变量注入。 YAML 示例如下: spec: enableServiceLinks: false # 关键配置:禁用 Service 环境变量注入 containers: - name: app image: nginx:latest |
设置 revisionHistoryLimit 减少 RS 数量 | Kubernetes 默认保留 10 个历史 ReplicaSet 版本。在大规模集群中存在大量 Deployment 时,每个 Deployment 的历史 ReplicaSet 版本会被存储在 ETCD 中,持续消耗 ETCD 存储空间。 |
YAML 示例如下: apiVersion: apps/v1 kind: Deployment metadata: ... spec: replicas: 5 revisionHistoryLimit: 3 |
禁止 Daemonset List-Watch ClusterScope 资源 | 避免在每个节点上部署独立控制器监听全量集群数据。这种模式在节点启动阶段会同时向 API Server 发送大量 List 请求以同步集群状态,且每个节点都会维护独立的 Watch 连接,导致 Watch 连接数和请求量激增,造成控制面巨大压力。 |
|
分类 | 说明 | 配置建议 |
分类 | 说明 | 配置建议 |
访问 APIServer | 在大规模集群中,客户端访问 kube-apiserver 的方式对控制面稳定性有直接影响。不合理的 API 调用模式会导致 kube-apiserver 和 ETCD 的 CPU、内存和网络负载激增,严重时可能引发控制面过载或请求超时。VKE 已内置限流机制保护 API Server,但从客户端侧优化 API Server 访问模式,仍是保障集群性能的核心措施。 |