可伸缩性

本页面介绍了在 VMware (GKE On-Prem) 集群上创建、配置和运行 Anthos 集群的最佳做法,以适应那些即将达到 Kubernetes 可扩缩限制的工作负载。

集群名称规则

对于每个 Google Cloud 项目:* 每个用户集群在单个 Google Cloud 项目内的所有管理集群中必须具有唯一名称。

可扩缩性限制

在 Anthos clusters on VMware 上设计应用时,请考虑以下限制:

了解限制

因为 Anthos clusters on VMware 是一个集成表面很大的复杂系统,所以集群可扩缩性涉及许多相互关联的维度。例如,Anthos clusters on VMware 可以通过节点、pod 或 Service 数量进行扩缩。一次扩展多个维度可能会导致问题,即使是在较小的集群中也是如此。例如,在含有 500 个节点的集群中为每个节点安排 110 个 pod 可能会使得 pod 数、每个节点的 pod 数和节点数扩展得太多。

如需了解详情,请参阅 Kubernetes 可扩缩性阈值

可扩缩性限制对集群运行所在的 vSphere 配置和硬件也极为敏感。这些限制已在可能与您的环境不同的环境中经过验证。因此,当底层环境成为限制因素时,您可能无法重现确切的数字。

准备扩缩

在准备扩缩管理员集群或用户集群时,请考虑以下要求和限制。

CPU、内存和存储空间要求

查看每个虚拟机的 CPU、RAM 和存储空间要求

磁盘和网络 I/O 要求

数据密集型工作负载和某些控制层面组件对磁盘和网络 I/O 延迟时间敏感。例如,在具有数十个节点和数千个 Pod 的集群中,etcd 的性能和稳定性通常需要 500 个顺序 IOPS(例如典型的 SSD 或高性能虚拟化块设备)。

节点 IP 地址

每个 Anthos clusters on VMware 节点都需要一个 DHCP 或静态分配的 IP 地址。

例如,在包含一个含有 50 个节点的非高可用性 (HA) 用户集群和一个含有 250 个节点的高可用性 (HA) 用户集群的设置中,需要 308 个 IP 地址。

下表显示了 IP 地址的明细:

节点类型 IP 地址数量
管理员集群控制层面虚拟机 1
管理员集群插件节点虚拟机 3
用户集群 1(非 HA)控制层面虚拟机 1
用户集群 1 节点虚拟机 50
用户集群 2 (HA) 控制层面虚拟机 3
用户集群 2 节点虚拟机 250
总计 308

在管理员集群中运行多个用户集群

在准备在管理员集群中运行多个用户集群时,请在创建管理员集群时执行以下步骤。

管理员集群中的 Pod CIDR 地址块

Pod CIDR 地址块是管理员集群中所有 Pod 的 CIDR 地址块。它通过 admin-cluster.yaml 中的 network.podCIDR 字段进行配置。

在此范围内,系统会为每个节点分配较小的 /24 地址块。如果您需要一个 N 节点的管理员集群,则必须确保此地址块足够大,能够支持 N 个 /24 地址块。

下表介绍了不同 pod CIDR 地址块大小支持的节点数上限:

pod CIDR 地址块大小 支持的节点数上限
/18 64
/17 128
/16 256
/15 512

管理员集群的默认 Pod CIDR 块为 192.168.0.0/16,支持 256 个节点。

在包含 100 个高可用性用户集群的管理员集群中(每个用户集群有 3 个控制平面节点),有 1 个管理员集群控制平面节点、2 个管理员集群插件节点和 300 个用户集群控制平面节点。总节点数为 303(超过 256 个)。因此,您必须将 Pod CIDR 地址块更新为 /15,以支持多达 100 个高可用性用户集群。

如需配置 Pod CIDR 地址块,请在管理员集群配置文件中设置 network.podCIDR 字段。

管理员集群中的服务 CIDR 地址块

Service CIDR 地址块是管理员集群中所有服务的 CIDR 地址块。它通过 admin-cluster.yaml 中的 network.serviceCIDR 字段进行配置。

下表介绍了不同 Service CIDR 地址块大小支持的最大 Service 数量:

Service CIDR 地址块大小 支持的 Service 数量上限
/24 256
/23 512
/22 1024

默认值为 10.96.232.0/24,支持 256 个 Service。

每个用户集群使用 6 项 Service,管理员集群控制平面使用 14 项 Service。因此,若要运行 100 个用户集群,您必须更改管理员集群中的 Service CIDR 地址块才能使用 /22 范围。

Cloud Logging 和 Cloud Monitoring

Cloud LoggingCloud Monitoring 可帮助您跟踪资源。

在管理员集群中部署的 Logging 和 Monitoring 组件的 CPU 和内存用量会根据用户集群的数量进行扩缩。

下表介绍了运行大量用户集群所需的管理员集群节点 CPU 和内存的数量:

用户集群数量 管理员集群节点 CPU 管理员集群节点内存
0 至 10 4 个 CPU 16 GB
11 至 20 4 个 CPU 32 GB
20 至 100 4 个 CPU 90GB

例如,如果有 2 个管理员集群节点,每个节点有 4 个 CPU 和 16GB 内存,则您可以运行 0 到 10 个用户集群。如需创建超过 20 个用户集群,则必须先将管理员集群节点内存从 16GB 调整为 90GB。

如要更改管理员集群插件节点的内存,请修改 MachineDeployment 配置:

  1. 运行以下命令:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG edit machinedeployment gke-admin-node

    其中,ADMIN_CLUSTER_KUBECONFIG 是管理员集群的 kubeconfig 文件的路径。

  2. spec.template.spec.providerSpec.value.machineVariables.memory 字段更改为 32768

  3. 保存修改。重新创建具有 32GB 内存的管理员集群节点。

GKE Hub

默认情况下,您最多可以注册 15 个用户集群。

如需在 GKE Hub 中注册更多集群,您可以在 Google Cloud Console 中提交增加配额的申请:

 [Go to Quotas](https://console.cloud.google.com/apis/api/gkehub.googleapis.com/quotas){: target="console"
 class="button button-primary" track-type="quotas" track-name="consoleLink" track-metadata-end-goal="modifyQuota"}

在用户集群中运行多个节点和 pod

准备在用户集群中运行多个节点和 pod 时,请在创建用户集群时执行以下步骤。

用户集群中的 Pod CIDR 地址块

Pod CIDR 地址块是用户集群中所有 pod 的 CIDR 地址块。它通过 user-cluster.yaml 中的 network.podCIDR 字段进行配置。

在此范围内,系统会为每个节点分配一个较小的 /24 地址块。如果您需要一个 N 节点集群,则必须确保此地址块足够大,能够支持 N 个 /24 地址块。

下表介绍了不同 pod CIDR 地址块大小支持的节点数上限:

pod CIDR 地址块大小 支持的节点数上限
/18 64
/17 128
/16 256
/15 512

默认的 pod CIDR 地址块为 192.168.0.0/16,支持 256 个节点。例如,如需创建包含 500 个节点的集群,您必须更改用户集群中的 Pod CIDR 地址块以使用 /15 范围。

用户集群中的服务 CIDR 地址块

Service CIDR 地址块是用户集群中所有 Service 的 CIDR 地址块。它通过 user-cluster.yaml 中的 network.serviceCIDR 字段进行配置。

下表介绍了不同 Service CIDR 地址块大小支持的最大 Service 数量:

Service CIDR 地址块大小 支持的 Service 数量上限
/21 2048
/20 4096
/19 8192
/18 16384

默认值为 10.96.0.0/20,支持 4096 个 Service。通过默认 Service CIDR 地址块,您可以创建具有 500 个 Service 的集群,这是 Anthos clusters on VMware 在用户集群中支持的 LoadBalancer 类型的 Service 数上限。

用户集群控制平面节点

用户集群控制平面组件的内存用量会根据用户集群中的节点数而扩缩。

下表根据用户集群的大小,提供用户集群控制平面节点所需的 CPU 和内存:

用户集群节点数 控制平面节点 CPU 控制平面节点内存
0 至 20 3 个 CPU 5 GB
21 至 75 3 个 CPU 6 GB
76 至 250 4 个 CPU 8 GB
251 至 500 4 个 CPU 16 GB

例如,要在一个用户集群中创建 250 个以上的节点,必须使用内存至少 16GB 的用户集群控制平面节点。

您可以通过 user-cluster.yaml 中的 masterNode 字段更改用户集群控制平面节点规范。

Dataplane v2

对于使用数据平面 V2 的 500 个节点用户集群,我们建议为用户集群控制平面节点使用 120 GB 的内存和 32 个 CPU 核心。

Cloud Logging 和 Cloud Monitoring

Cloud LoggingCloud Monitoring 可帮助您跟踪资源。

在用户集群中部署的集群内代理的 CPU 和内存用量会根据用户集群中的节点数和 Pod 数量进行扩缩。

prometheus-serverstackdriver-prometheus-sidecar 等 Cloud Logging 和 Cloud Monitoring 组件根据节点数量和 pod 数量具有不同的 CPU 和内存资源用量。在扩容集群之前,请根据这些组件的预估平均用量设置资源请求和限制。下表显示了每个组件的平均用量的估算值:

节点数 容器名称 估计 CPU 利用率 估计内存用量
0 个 pod/节点 30 个 pod/节点 0 个 pod/节点 30 个 pod/节点
3 至 50 prometheus-server 100m 390m 650M 1.3G
stackdriver-prometheus-sidecar 100m 340m 1.5G 1.6G
51 至 100 prometheus-server 160m 500m 1.8G 5.5G
stackdriver-prometheus-sidecar 200m 500m 1.9G 5.7G
101 至 250 prometheus-server 400m 2500m 6.5G 16G
stackdriver-prometheus-sidecar 400m 1300m 7.5G 12G
250 至 500 prometheus-server 1200m 2600m 22G 25G
stackdriver-prometheus-sidecar 400m 2250m 65G 78G

请确保您有足够的节点来安排 Cloud Logging 和 Cloud Monitoring 组件。一种方法是先创建小型集群,根据上表修改 Cloud Logging 和 Cloud Monitoring 组件资源,创建节点池以适应组件,然后将集群逐步纵向扩容到更大的大小。

您可以选择保持将足够大的节点池用于 Logging 和 Monitoring 组件,以防止将其他 pod 安排到节点池中。为此,您必须将以下污点添加到节点池中:

taints:
  - effect: NoSchedule
    key: node-role.gke.io/observability

这样可以防止在节点池上调度其他组件,并阻止用户因为监控组件的资源消耗而被逐出。

负载平衡器

在本部分中讨论的 Service 是指类型为 LoadBalancer 的 Kubernetes Service。

集群中的节点数量以及可以在负载平衡器上配置的 Service 数量有限制。

对于捆绑式负载均衡 (Seesaw),健康检查数量也有限制。健康检查数量取决于节点数和本地流量 Service 数。本地流量 Service 是 externalTrafficPolicy 设置为 Local 的 Service。

下表介绍了捆绑式负载均衡 (Seesaw) 和集成负载均衡 (F5) 的 Service、节点和健康检查数上限:

捆绑式负载平衡 (Seesaw) 集成负载平衡 (F5)
Service 数上限 500 250 2
节点数上限 500 250 2
最大健康检查数 N + (L * N) <= 10K,其中 N 是节点数,L 是流量本地服务的数量 1 N/A 2

1 例如,假设您有 100 个节点和 99 个本地流量 Service。健康检查数为 100 + (99 * 100) = 10,000,不超过 10,000 的限制。

2 如需了解详情,请参阅 F5。此数量受 F5 硬件型号、虚拟机实例 CPU/内存和许可等因素的影响。

自动扩缩系统组件

Anthos clusters on VMware 会根据节点数在用户集群内自动扩缩系统组件,而不需要对配置进行任何更改。您可以使用本部分中的信息来规划资源。

  • Anthos clusters on VMware 通过使用 addon-resizer 来扩缩以下系统组件的 CPU 和内存请求/限制来自动执行垂直扩缩:

    • kube-state-metrics 是在集群工作器节点上运行的 Deployment,用于侦听 Kubernetes API 服务器并生成有关对象状态的指标。CPU 和内存请求和限制基于节点数进行扩缩。

      下表说明了系统根据集群中的节点数设置的资源请求/限制:

      节点数 近似1 CPU 请求/限制 (milli) 近似1 内存请求/限制 (Mi)
      3 至 5 105 110
      6 至 500 100 + num_nodes 100 + (2 * num_nodes)

      1 在扩缩过程中,有 +-5% 的余地减少组件重启次数。

      例如,在含有 50 个节点的集群中,CPU 请求/限制设置为 150m/150m,内存请求/限制设置为 200Mi/200Mi。在含有 250 个节点的集群中,CPU 请求/限制设置为 350m/350m,内存请求/限制设置为 600Mi。

    • metrics-server 是在 Kubernetes 内置自动扩缩流水线所使用的集群工作器节点上运行的 Deployment。 CPU 和内存请求和限制基于节点数进行扩缩。

  • Anthos clusters on VMware 会通过扩缩以下系统组件的副本数量,在管理员集群和用户集群中执行横向扩缩:

    • core-dns 是用于在 Anthos clusters on VMware 中发现服务的 DNS 解决方案。它在用户集群工作器节点上作为 Deployment 运行。Anthos clusters on VMware 会根据集群中的节点数和 CPU 核心数自动扩缩副本的数量。每增加/删除 16 个节点或 256 个核心,系统就会增加/减少 1 个副本。如果您有一个集群具有 N 个节点和 C 个核心,则可能会有 max(N/16, C/256) 个副本。

    • calico-typha 是一个组件,用于支持 Anthos clusters on VMware 中的 pod 网络。它在用户集群工作器节点上作为 Deployment 运行。VMware 上的 Anthos 集群根据集群中的节点数自动扩缩 calico-typha 副本的数量:

      节点数 (N) calico-typha 副本数量
      N = 1 1
      1 < N < 200 2
      N >= 200 3 个或更多

    • ingress-gateway/istio-pilot 是用于支持集群 Ingress 的组件,它们在用户集群工作器节点上作为 Deployment 运行。Anthos clusters on VMware 使用水平 pod 自动扩缩器来根据副本的 CPU 利用率扩缩副本数量,最少 2 个副本,最多 5 个副本。

    • konnectability 网络代理 (KNP) 为来自用户集群控制平面节点的出站流量提供 TCP 级代理。它会将流量定向到用户集群节点的用户 kube-apiserver 出站流量。Konnectability 代理作为 Deployment 在用户集群工作器节点上运行。Anthos clusters on VMware 根据集群中的节点数自动扩缩 calico-typha 副本的数量:

      节点数 (N) 响应代理代理副本数
      1 <= N <= 6
      6 < N < 10 6
      10 <= N < 100 8
      N >= 100 12 个或更多

最佳做法

本部分介绍扩缩资源的最佳做法。

分阶段扩缩集群

创建 Kubernetes 节点的操作包括将节点操作系统映像模板克隆到新的磁盘文件中,此操作是 I/O 密集型 vSphere 操作。克隆操作和工作负载 I/O 操作之间没有 I/O 隔离。如果同时创建的节点太多,则克隆操作将需要很长时间才能完成,并且可能会影响集群和现有工作负载的性能和稳定性。

确保根据 vSphere 资源分阶段扩缩集群。例如,如要将集群大小从 3 个节点调整到 500 个节点,请考虑分阶段进行:先将集群扩展到 150 个节点、接着扩展到 350 个节点,然后再扩展到 500 个节点。这有助于减少 vSphere 基础架构上的负载。

优化 etcd 磁盘 I/O 性能

etcd 是用作所有集群数据的 Kubernetes 后备存储的键值对存储。它的性能和稳定性对集群的运行状况至关重要,并且它对磁盘和网络 I/O 延迟时间敏感。

  • 按照以下建议优化用于控制层面虚拟机的 vSphere 数据存储区的 I/O 性能:

  • 几百毫秒的延迟会引起磁盘或网络 I/O 的瓶颈,还可能导致集群运行状况不佳。监控以下 etcd I/O 延迟时间指标并设置提醒阈值:

    • etcd_disk_backend_commit_duration_seconds
    • etcd_disk_wal_fsync_duration_seconds

优化节点启动磁盘 I/O 性能

pod 将临时存储空间用于内部操作,例如保存临时文件。临时存储空间由容器的可写入层、日志目录和 emptyDir 卷使用。临时存储空间来自 Anthos clusters on VMware 节点的文件系统,由节点的启动磁盘提供支持。

由于 Kubernetes 节点上没有存储空间 I/O 隔离,因此在其临时存储空间上使用高度高 I/O 的应用,可能导致通过加注星标的系统组件(如 Kubelet 和 Docker 守护程序)导致节点不稳定资源。

确保预配启动磁盘的数据存储区的 I/O 性能特征可为应用使用临时存储空间和日志记录流量提供合适的性能。

监控物理资源争用

请注意 vCPU 与 pCPU 比率内存过度使用。物理主机上比率不佳或内存争用可能导致虚拟机性能下降。您应在主机层级监控物理资源利用率,并分配足够的资源来运行大型集群。