自定义节点系统配置


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

概览

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

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

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

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

使用节点系统配置

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

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

创建配置文件

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

kubeletConfig:
  cpuManagerPolicy: static
  allowedUnsafeSysctls:
  - 'kernel.shm*'
  - 'kernel.msg*'
  - 'kernel.sem'
  - 'fs.mqueue*'
  - 'net.*'
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 CLI 或 Terraform 创建集群期间添加节点系统配置。以下说明会将节点系统配置应用于默认节点池:

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

替换以下内容:

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

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

如需使用 Terraform 创建具有自定义节点系统配置的区域级集群,请参阅以下示例:

resource "google_container_cluster" "default" {
  name     = "gke-standard-regional-cluster"
  location = "us-central1"

  initial_node_count = 1

  node_config {
    # Kubelet configuration
    kubelet_config {
      cpu_manager_policy = "static"
    }

    linux_node_config {
      # Sysctl configuration
      sysctls = {
        "net.core.netdev_max_backlog" = "10000"
      }

      # Linux cgroup mode configuration
      cgroup_mode = "CGROUP_MODE_V2"

      # Linux huge page configuration
      hugepages_config {
        hugepage_size_2m = "1024"
      }
    }
  }

  # Set `deletion_protection` to `true` will ensure that one cannot
  # accidentally delete this instance by use of Terraform.
  deletion_protection = false
}

如需详细了解如何使用 Terraform,请参阅针对 GKE 的 Terraform 支持

使用节点系统配置创建新节点池

使用 gcloud CLI 或 Terraform 创建新节点池时,您可以添加节点系统配置。您还可以更新现有节点池的节点系统配置。

以下说明会将节点系统配置应用于新的节点池:

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

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

如需使用 Terraform 创建具有自定义节点系统配置的节点池,请参阅以下示例:

resource "google_container_node_pool" "default" {
  name    = "gke-standard-regional-node-pool"
  cluster = google_container_cluster.default.name

  node_config {
    # Kubelet configuration
    kubelet_config {
      cpu_manager_policy = "static"
    }

    linux_node_config {
      # Sysctl configuration
      sysctls = {
        "net.core.netdev_max_backlog" = "10000"
      }

      # Linux cgroup mode configuration
      cgroup_mode = "CGROUP_MODE_V2"

      # Linux huge page configuration
      hugepages_config {
        hugepage_size_2m = "1024"
      }
    }
  }
}

如需详细了解如何使用 Terraform,请参阅针对 GKE 的 Terraform 支持

更新现有节点池的节点系统配置

运行以下命令:

  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 配置设置 限制 默认设置 说明
containerLogMaxSize 值必须是正数,且单位后缀介于 10Mi500Mi(含)之间。有效单位包括:Ki, Mi, Gi 10Mi 此设置用于控制容器日志轮换政策的 containerLogMaxSize 设置,您可以通过该设置为每个日志文件配置大小上限。默认值为 10Mi

containerLogMaxFiles 值必须是介于 210(含)之间的整数。 5 此设置用于控制容器日志文件轮换政策的 containerLogMaxFiles 设置,您可以通过此设置分别为每个容器配置允许的文件数量上限。默认值为 5。每个容器的日志总大小 (container_log_max_size*container_log_max_files) 不得超过节点总存储空间的 1%。

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 节流行为。
imageGcLowThresholdPercent 值必须为介于 10 到 85 之间的整数(包括 10 和 85),且低于 imageGcHighThresholdPercent 80 imageGcLowThresholdPercent 是磁盘使用率百分比,低于此百分比将永不运行映像垃圾回收。垃圾回收的最低磁盘使用率。百分比的计算方法是将此字段的值除以 100。如果指定了该值,则该值必须小于 imageGcThresholdPercent
imageGcHighThresholdPercent 值必须是介于 10 到 85 之间的整数(包括 10 和 85),且高于 imageGcLowThresholdPercent 85 imageGcHighThresholdPercent 是磁盘使用率百分比,高于此百分比将运行映像垃圾回收。垃圾回收的磁盘使用率上限。百分比的计算方法是将此字段的值除以 100。如果指定了该值,则该值必须大于 imageGcLowThresholdPercent
imageMinimumGcAge 值必须是时长,且不得超过“2 分钟”。有效的时间单位为 "ns", "us" (or "µs"), "ms", "s", "m", "h" 2m imageMinimumGcAge 是未使用的映像在被垃圾回收之前的最短存留时间。
imageMaximumGcAge 值必须是时长 0s imageMaximumGcAge 是映像在被垃圾回收之前的最大空闲时长。此字段的默认值为“0 秒”,这会停用此字段。这意味着,映像不会因长时间未使用而被垃圾回收。如果指定了该值,则该值必须大于 imageMinimumGcAge。imageMaximumGcAge 适用于 GKE 版本 1.30.7-gke.1076000、1.31.3-gke.1023000 或更高版本
insecureKubeletReadonlyPortEnabled 值必须是布尔值(truefalse true 此设置会在集群中的每个新节点池上停用不安全的 kubelet 只读端口 10255。如果您在此文件中配置此设置,则无法使用 GKE API 客户端在集群级层更改此设置。
podPidsLimit 值必须介于 1024 到 4194304 之间 none 此项设置每个 Pod 可以使用的进程 ID (PID) 数量上限。
allowedUnsafeSysctls sysctl 名称或群组的列表。允许的 sysctl 组:kernel.shm*kernel.msg*kernel.semfs.mqueue.*net.*。 示例:[kernel.msg*, net.ipv4.route.min_pmtu] none 此设置定义了一个以英文逗号分隔的安全列表,其中包含可在 Pod 上设置的安全的 sysctl 名称或 sysctl 群组。

适用于 GKE 1.32.0-gke.1448000 或更高版本。

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 版及更高版本的新 Standard 节点池使用 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 配置:

检查节点池的 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 配置,请选择一个节点并按照以下说明连接到该节点:

  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、CT5LP、CT6E、H3、M2、M3 或 Z3 机器类型

后续步骤