自定义节点系统配置


本文档介绍如何使用名为节点系统配置的配置文件来自定义 Google Kubernetes Engine (GKE) 节点配置。

概览

您可以使用各种方法自定义节点配置。例如,您可以在创建节点池时指定机器类型和最小 CPU 平台等参数。

节点系统配置是一个配置文件,提供了一种调整一组有限的系统设置的方法。您可以使用节点系统配置来指定 Kubernetes 节点代理 (kubelet) 和低级别的 Linux 内核配置的自定义设置( sysctl)。

您还可以使用名为运行时配置文件的其他文件在 GKE 节点上自定义 containerd 容器运行时。 如需了解相关说明,请参阅在 GKE 节点中自定义 containerd 配置

您还可以使用 DaemonSet 自定义节点,例如使用 DaemonSet 自动引导 GKE 节点

使用节点系统配置

如需使用节点系统配置,请执行以下操作:

  1. 创建配置文件。此文件包含 kubeletsysctl 配置。
  2. 您可以在创建集群时或在创建或更新节点池时添加配置

创建配置文件

编写 YAML 格式的节点系统配置文件。以下示例展示了如何为 kubeletsysctl 选项添加配置:

kubeletConfig:
  cpuManagerPolicy: static
linuxConfig:
 sysctl:
   net.core.somaxconn: '2048'
   net.ipv4.tcp_rmem: '4096 87380 6291456'

在此示例中:

  • cpuManagerPolicy: statickubelet 配置为使用静态 CPU 管理政策
  • net.core.somaxconn: '2048'socket listen() 积压输入量限制为 2048 字节。
  • net.ipv4.tcp_rmem: '4096 87380 6291456' 将 TCP 套接字的接收缓冲区的最小值、默认值和最大值分别设置为 4096 字节、87380 字节和 6291456 字节。

如果您只想为 kubeletsysctl 添加配置,请仅在配置文件中包含该部分。例如,如需添加 kubelet 配置,请创建以下文件:

kubeletConfig:
  cpuManagerPolicy: static

如需查看可添加到配置文件中的字段的完整列表,请参阅 Kubelet 配置选项Sysctl 配置选项部分。

将配置添加到节点池

创建配置文件后,使用 Google Cloud CLI 添加 --system-config-from-file 标志。您可以在创建集群时或者在创建或更新节点池时添加此标志。您无法使用 Google Cloud 控制台添加节点系统配置。

如需添加节点系统配置,请运行以下命令:

创建集群

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --system-config-from-file=SYSTEM_CONFIG_PATH

请替换以下内容:

  • CLUSTER_NAME:您的集群的名称
  • LOCATION:集群的计算可用区或区域。
  • SYSTEM_CONFIG_PATH:包含 kubeletsysctl 配置的文件的路径

应用节点系统配置后,集群的默认节点池将使用您定义的设置。

创建节点池

gcloud container node-pools create POOL_NAME \
     --cluster CLUSTER_NAME \
     --location=LOCATION \
     --system-config-from-file=SYSTEM_CONFIG_PATH

请替换以下内容:

  • POOL_NAME:您的节点池的名称
  • CLUSTER_NAME:您要向其中添加节点池的集群的名称
  • LOCATION:集群的计算可用区或区域。
  • SYSTEM_CONFIG_PATH:包含 kubeletsysctl 配置的文件的路径

更新节点池

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --system-config-from-file=SYSTEM_CONFIG_PATH

请替换以下内容:

  • POOL_NAME:您要更新的节点池的名称
  • CLUSTER_NAME:您要更新的集群的名称
  • LOCATION:集群的计算可用区或区域。
  • SYSTEM_CONFIG_PATH:包含 kubeletsysctl 配置的文件的路径

修改节点系统配置

如需修改节点系统配置,您可以使用所需的配置创建新的节点池,或更新现有节点池的节点系统配置。

通过创建节点池进行修改

如需通过创建节点池来修改节点系统配置,请执行以下操作:

  1. 使用所需的配置创建配置文件
  2. 将配置添加到新的节点池。
  3. 将您的工作负载迁移到新节点池。
  4. 删除旧节点池

通过更新现有节点池进行修改

如需通过更新现有节点池来修改节点系统配置,请使用所需的值更新节点系统配置。更新节点系统配置会使用新配置替换节点池的系统配置。如果您在更新期间省略了任何参数,则这些参数将被设置为各自的默认值。

如果您要将节点系统配置重置为默认值,请使用 kubeletsysctl 的空值更新配置文件。例如:

kubeletConfig: {}
linuxConfig:
  sysctl: {}

删除节点系统配置

如需移除节点系统配置,请执行以下操作:

  1. 创建节点池
  2. 将您的工作负载迁移到新节点池。
  3. 删除节点池,其中包含旧版节点系统配置。

Kubelet 配置选项

下表显示了您可以修改的 kubelet 选项。

Kubelet 配置设置 限制 默认设置 说明
cpuManagerPolicy 值必须为 nonestatic none 此设置用于控制 kubelet 的 CPU 管理器政策。默认值为 none,这是默认的 CPU 关联方案,除了操作系统调度工具自动提供之外,没有其他关联性。

将该值设置为 static 可允许将具有整数 CPU 请求的保证 QoS 类中的 Pod 分配给专用 CPU 使用。
cpuCFSQuota 值必须为 truefalse true 此设置会强制执行 Pod 的 CPU 限制。将该值设置为 false 表示忽略 Pod 的 CPU 限制。

在某些情况下,如果 Pod 对 CPU 限制敏感,则可能会忽略 CPU 限制。停用 cpuCFSQuota 的风险在于,恶意 Pod 可能会消耗比预期更多的 CPU 资源。
cpuCFSQuotaPeriod 值必须是时长 "100ms" 此设置会设置 CPU CFS 配额时长值 cpu.cfs_period_us,该值用于指定 Cgroup 对 CPU 资源的访问频率应重新分配的时长。此选项允许您调节 CPU 节流行为。
insecureKubeletReadonlyPortEnabled 值必须是布尔值(truefalse true 此设置会在集群中的每个新节点池上停用不安全的 kubelet 只读端口 10255。如果您在此文件中配置此设置,则无法使用 GKE API 客户端在集群级别更改设置。
podPidsLimit 值必须介于 1024 到 4194304 之间 none 此项设置每个 Pod 可以使用的进程 ID (PID) 数量上限。

Sysctl 配置选项

如需调节系统的性能,您可以修改以下内核属性:

不同的 Linux 命名空间对于给定 sysctl 可能具有唯一的值,而其他 Linux 命名空间对于整个节点都是全局性的。使用节点系统配置来更新 sysctl 选项可确保 sysctl 在节点及每个命名空间中进行全局应用,从而使每个 Pod 在每个 Linux 命名空将都具有相同的 sysctl 值。

Linux cgroup 模式配置选项

kubelet 和容器运行时使用 Linux 内核 cgroups 进行资源管理,例如限制 Pod 中每个容器可以访问的 CPU 或内存量。内核中有两个 cgroup 子系统版本:cgroupv1cgroupv2。Kubernetes 对 cgroupv2 的支持在 Kubernetes 1.18 版中为 Alpha 版,在 1.22 版中为 Beta 版,并在 1.25 版中成为正式版。如需了解详情,请参阅 Kubernetes cgroups v2 文档

节点系统配置使您可以自定义节点池的 cgroup 配置。您可以使用 cgroupv1cgroupv2。GKE 对运行 1.26 及更高版本的新标准节点池使用 cgroupv2,对 1.26 之前的版本使用 cgroupv1。对于使用节点自动预配创建的节点池,cgroup 配置取决于初始集群版本,而不是节点池版本。

您可以使用节点系统配置将节点池的设置更改为明确使用 cgroupv1cgroupv2。仅将现有节点池升级到 1.26 不会将设置更改为 cgroupv2,因为运行早于 1.26 的版本创建的现有节点池(没有自定义的 cgroup 配置)将继续使用 cgroupv1,除非您明确指定其他方式。

例如,要将节点池配置为使用 cgroupv2,请使用以下节点系统配置文件:

linuxConfig:
  cgroupMode: 'CGROUP_MODE_V2'

支持的 cgroupMode 选项包括:

  • CGROUP_MODE_V1:在节点池上使用 cgroupv1
  • CGROUP_MODE_V2:在节点池上使用 cgroupv2
  • CGROUP_MODE_UNSPECIFIED:使用默认的 GKE cgroup 配置。

如需使用 cgroupv2,则需要遵循以下要求和限制:

  • 对于运行 1.26 之前版本的节点池,您必须使用 gcloud CLI 版本 408.0.0 或更高版本,亦可使用版本 395.0.0 或更高版本的 gcloud beta
  • 您的集群和节点池必须运行 1.24.2-gke.300 或更高版本。
  • 您必须将 Container-Optimized OS 与 containerd 节点映像搭配使用。
  • 如果您的任何工作负载依赖于读取 cgroup 文件系统 (/sys/fs/cgroup/...),请确保它们与 cgroupv2 API 兼容。
    • 确保所有监控或第三方工具与 cgroupv2 兼容。
  • 如果您使用 JDK(Java 工作负载),我们建议您使用完全支持 cgroupv2 的版本,包括 JDK 8u372、JDK 11.0.16 及更高版本或 JDK 15 及更高版本。

验证 cgroup 配置

当您添加节点系统配置时,GKE 必须重新创建节点才能实现更改。将配置添加到节点池并重新创建节点后,您可以验证新配置。

您可以使用 gcloud CLI 或 kubectl 命令行工具验证节点池中节点的 cgroup 配置:

gcloud CLI

检查节点池的 cgroup 配置:

gcloud container node-pools describe POOL_NAME \
    --format='value(Config.effectiveCgroupMode)'

POOL_NAME 替换为您的节点池的名称。

可能的输出结果如下:

  • EFFECTIVE_CGROUP_MODE_V1:节点使用 cgroupv1
  • EFFECTIVE_CGROUP_MODE_V2:节点使用 cgroupv2

只有在节点池中的节点重新创建后,输出才会显示新的 cgroup 配置。对于不支持 cgroup 的 Windows Server 节点池,输出为空。

kubectl

如需验证此节点池中节点的 kubectl 配置,请选择一个节点并按照以下说明连接到该节点:

  1. 使用节点池中的任意节点创建交互式 shell。将命令中的 mynode 替换为节点池中任意节点的名称。
  2. 确定 Linux 节点上的 cgroup 版本

Linux 大内存页配置选项

您可以通过节点系统配置文件来使用 Linux 内核功能大内存页

Kubernetes 支持在节点上使用大内存页作为一种资源,类似于 CPU 或内存。使用以下参数指示 Kubernetes 节点预先分配大内存页以供 Pod 使用。如需管理 Pod 对大内存页的使用情况,请参阅管理大内存页

如需为节点预先分配大内存页,请指定数量和大小。例如,如需将节点配置为分配三个 1 GB 大小的大内存页和 1024 个 2 MB 大小的大内存页,请使用如下节点系统配置:

linuxConfig:
  hugepageConfig:
    hugepage_size2m: 1024
    hugepage_size1g: 3

如需使用大内存页,需要遵循以下限制和要求:

  • 为了确保节点不会被大内存页完全占用,分配的大内存页总大小不能超过总内存的 60%。例如,对于具有 8 GB 内存的 e2-standard-2 机器,您不能为大内存页分配超过 4.8 GB 的内存。
  • 1 GB 大小的大内存页仅适用于 A3、C2D、C3、C3A、C3D、C4、CT5E、CT5L、CT5LP、CT6E、H3、M2、M3 或 Z3 机器类型

后续步骤