大型集群注意事项

集群是运行 Kubernetes 代理的节点(物理或虚拟机)的集合,由控制平面管理。Kubernetes v1.34 支持多达 5000 个节点的集群。更具体地说,Kubernetes 旨在适应满足以下所有条件的配置:

  • 每个节点不超过 110 个 Pod
  • 节点总数不超过 5000 个
  • Pod 总数不超过 150,000 个
  • 容器总数不超过 300,000 个

你可以通过添加或删除节点来扩展集群。具体操作方式取决于集群的部署方式。

云提供商资源配额

为了避免遇到云提供商配额问题,在创建包含大量节点的集群时,请考虑:

  • 申请增加云资源配额,例如:
    • 计算实例
    • CPU
    • 存储卷
    • 正在使用的 IP 地址
    • 包过滤规则集
    • 负载均衡器数量
    • 网络子网
    • 日志流
  • 分批启动新节点,并在批次之间暂停,以控制集群扩缩操作,因为某些云提供商会限制新实例的创建速率。

控制平面组件

对于大型集群,你需要一个具有足够计算能力和其他资源的控制平面。

通常,你会在每个故障区域运行一个或两个控制平面实例,首先垂直扩展这些实例,然后在达到(垂直)扩展收益递减点后,再进行水平扩展。

你至少应在每个故障区域运行一个实例以提供容错能力。Kubernetes 节点不会自动将流量引导至同一故障区域的控制平面端点;但是,你的云提供商可能拥有自己的机制来完成此操作。

例如,使用托管负载均衡器,你可以将负载均衡器配置为将源自故障区域 _A_ 中 kubelet 和 Pod 的流量,仅导向到同样位于区域 _A_ 中的控制平面主机。如果区域 _A_ 中的单个控制平面主机或端点离线,则意味着区域 _A_ 中节点的所有控制平面流量现在都会在区域之间发送。在每个区域中运行多个控制平面主机可以降低发生这种情况的可能性。

etcd 存储

为了提高大型集群的性能,你可以将 Event 对象存储在独立的专用 etcd 实例中。

创建集群时,你可以(使用自定义工具):

  • 启动并配置额外的 etcd 实例
  • 配置API 服务器,使其用于存储事件

有关为大型集群配置和管理 etcd 的详细信息,请参阅为 Kubernetes 运维 etcd 集群使用 kubeadm 设置高可用性 etcd 集群

插件资源

Kubernetes 资源限制有助于最大限度地减少内存泄漏以及 Pod 和容器影响其他组件的其他方式。这些资源限制既适用于插件资源,也适用于应用工作负载。

例如,你可以为日志组件设置 CPU 和内存限制。

  ...
  containers:
  - name: fluentd-cloud-logging
    image: fluent/fluentd-kubernetes-daemonset:v1
    resources:
      limits:
        cpu: 100m
        memory: 200Mi

插件的默认限制通常基于在小型或中型 Kubernetes 集群上运行每个插件所收集的数据。在大型集群上运行时,插件通常会消耗比其默认限制更多的某些资源。如果部署大型集群时未调整这些值,插件可能会由于不断触及内存限制而被持续终止。或者,插件可能会运行,但由于 CPU 时间片限制而导致性能不佳。

为避免遇到集群插件资源问题,在创建包含许多节点的集群时,请考虑以下事项:

  • 某些插件是垂直扩展的——集群中只有一个插件副本或为一个完整的故障区域提供服务。对于这些插件,随着集群的扩展,请增加请求和限制。
  • 许多插件是水平扩展的——通过运行更多的 Pod 来增加容量——但对于非常大的集群,你可能还需要稍微提高 CPU 或内存限制。垂直 Pod 自动扩缩器可以运行在**推荐器**模式下,提供请求和限制的建议值。
  • 一些插件以每个节点一个副本的方式运行,由DaemonSet 控制:例如,一个节点级日志聚合器。与水平扩缩插件的情况类似,你可能还需要稍微提高 CPU 或内存限制。

下一步

  • VerticalPodAutoscaler 是一种自定义资源,你可以将其部署到集群中,以帮助你管理 Pod 的资源请求和限制。
    了解更多关于垂直 Pod 自动扩缩器以及如何使用它来扩缩集群组件(包括集群关键插件)。

  • 阅读节点自动扩缩

  • 插件调整器可以帮助你在集群规模变化时自动调整插件的大小。

上次修改于 2024 年 4 月 26 日太平洋时间下午 3:39:cluster-autoscaling -> node-autoscaling clean-up (dc530ffd6a)