自定义节点系统配置

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

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

本文档详细介绍了节点系统配置的可用配置,以及如何将这些配置应用于 GKE Standard 节点池。请注意,由于 GKE Autopilot 集群具有更受管理的节点环境,因此与 GKE Standard 节点池相比,其直接节点系统配置选项受到限制。

为何要使用节点系统配置

节点系统配置具有以下优势:

  • 性能调优:针对 AI 训练或服务、数据库、高流量 Web 服务器或延迟敏感型服务等高要求应用,优化网络堆栈性能、内存管理、CPU 调度或 I/O 行为。
  • 安全加固:应用特定的内核级安全设置或限制某些系统行为,以减少攻击面。
  • 资源管理:微调 kubelet 管理 PID、磁盘空间、映像垃圾回收或 CPU 和内存资源的方式。
  • 工作负载兼容性:帮助确保节点环境满足需要特定内核设置的专业软件或旧版应用的特定前提条件。

用于自定义节点配置的其他选项

您还可以使用其他方法自定义节点配置:

  • 运行时配置文件:如需在 GKE 节点上自定义 containerd 容器运行时,您可以使用名为运行时配置文件的其他文件。如需了解详情,请参阅在 GKE 节点中自定义 containerd 配置
  • ComputeClass:您可以在 GKE ComputeClass 规范中指定节点属性。在 GKE 1.32.1-gke.1729000 版及更高版本中,您可以在 GKE Autopilot 模式和 Standard 模式下使用 ComputeClass。如需了解详情,请参阅自定义节点系统配置
  • DaemonSet:您还可以使用 DaemonSet 自定义节点。如需了解详情,请参阅使用 DaemonSet 自动引导 GKE 节点

Windows Server 节点支持节点系统配置。

准备工作

在开始之前,请务必执行以下操作:

  • 安装命令行工具
    • 如果您使用本文档中的 gcloud CLI 示例,请确保您已安装并配置 Google Cloud CLI
    • 如果您使用 Terraform 示例,请确保您已安装并配置 Terraform
  • 授予权限:您需要拥有适当的 IAM 权限才能创建和更新 GKE 集群和节点池,例如 container.clusterAdmin 或具有同等权限的其他角色。
  • 规划潜在的工作负载中断:自定义节点配置是在节点池级别应用的。更改通常会触发池中节点的滚动更新,这涉及重新创建节点。规划潜在的工作负载中断,并在适当情况下使用 Pod 中断预算 (PDB)。
  • 备份并测试所有更改:在将配置更改应用到生产环境之前,请务必先在预演或开发环境中测试这些更改。设置不正确可能会导致节点不稳定或工作负载失败。
  • 查看 GKE 默认设置:GKE 节点映像附带了经过优化的默认配置。只有在有特定需求且了解所做更改的影响时,才自定义参数。

在 GKE Standard 模式下使用节点系统配置

使用节点系统配置时,您可以使用包含 kubelet 和 Linux 内核配置参数的 YAML 文件。虽然节点系统配置也可在 GKE Autopilot 模式中使用,但本文档中的步骤介绍了如何为 GKE Standard 模式创建和使用配置文件。

如需在 GKE Standard 模式下使用节点系统配置,请执行以下操作:

  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: static 字段将 kubelet 配置为使用静态 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 CLI

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

替换以下内容:

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

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

Terraform

如需使用 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"
      }
    }
  }
}

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

创建具有具有节点系统配置的新节点池

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

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

gcloud CLI

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 配置的文件的路径

Terraform

如需使用 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 选项。

CPU 管理

下表介绍了 kubelet 的 CPU 管理选项。

kubelet 配置设置 限制 默认设置 说明
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 节流行为。

内存管理和驱逐

下表介绍了内存管理和逐出功能的可修改选项。此部分还包含一个单独的表格,其中介绍了 evictionSoft 标志的可修改选项。

kubelet 配置设置 限制 默认设置 说明
evictionSoft 信号名称的映射。有关值限制,请参阅下表。 none 此设置将信号名称映射到定义软驱逐阈值的数量或百分比。软驱逐阈值必须具有宽限期。在宽限期结束之前,kubelet不会逐出 Pod。
evictionSoftGracePeriod 信号名称的映射。对于每个信号名称,相应值必须是小于 5m 的正时长。有效时间单位为 nsus(或 µs)、mssm none 此设置将信号名称映射到时长,这些时长定义了软驱逐阈值的宽限期。每个软驱逐阈值都必须有相应的宽限期。
evictionMinimumReclaim 信号名称的映射。对于每个信号名称,该值必须是小于 10% 的正百分比。 none 此设置将信号名称映射到百分比,用于定义 kubelet 在执行 Pod 驱逐时回收的给定资源的最低量。
evictionMaxPodGracePeriodSeconds 值必须为 0300 之间。的整数。 0 此设置定义了在驱逐期间 Pod 终止的最长宽限期(以秒为单位)。

下表显示了 evictionSoft 标志的可修改选项。 相同的选项也适用于 evictionSoftGracePeriodevictionMinimumReclaim 标志,但限制不同。

kubelet 配置设置 限制 默认设置 说明
memoryAvailable 值必须大于节点内存的 100Mi 且小于 50% none 此设置表示软驱逐之前的可用内存量。定义 kubelet 中的 memory.available 信号量。
nodefsAvailable 值必须介于 10%50% 之间。 none 此设置表示软驱逐之前的 nodefs 可用空间。定义 kubelet 中的 nodefs.available 信号量。
nodefsInodesFree 值必须介于 5%50% 之间。 none 此设置表示软驱逐之前可用的 nodefs inode。定义 kubelet 中的 nodefs.inodesFree 信号量。
imagefsAvailable 值必须介于 15%50% 之间。 none 此设置表示软驱逐之前可用的 imagefs。定义 kubelet 中的 imagefs.available 信号量。
imagefsInodesFree 值必须介于 5%50% 之间。 none 此设置表示软驱逐之前空闲的 imagefs inode。定义 kubelet 中的 imagefs.inodesFree 信号量。
pidAvailable 值必须介于 10%50% 之间。 none 此设置表示软驱逐之前可用的 PID。定义 kubelet 中的 pid.available 信号量。
singleProcessOOMKill 值必须为 truefalse 对于 cgroupv1 节点,值为 true;对于 cgroupv2 节点,值为 false 此设置用于设置容器中的进程是单独还是作为一组被 OOMkilled。

适用于 GKE 1.32.4-gke.1132000、1.33.0-gke.1748000 或更高版本。

PID 管理

下表介绍了 PID 管理的可修改选项。

kubelet 配置设置 限制 默认设置 说明
podPidsLimit 值必须介于 10244194304 之间。 none 此项设置每个 Pod 可以使用的进程 ID (PID) 数量上限。

日志记录

下表介绍了可修改的日志记录选项。

kubelet 配置设置 限制 默认设置 说明
containerLogMaxSize 值必须是正数,并且单位后缀介于 10Mi500Mi 之间(含边界值)。 10Mi 此设置用于控制容器日志轮换政策的 containerLogMaxSize 设置,您可以通过该设置为每个日志文件配置大小上限。默认值为 10Mi。有效单位包括 KiMiGi
containerLogMaxFiles 值必须为 210 之间。的整数(含边界值)。 5 此设置用于控制容器日志文件轮换政策的 containerLogMaxFiles 设置,您可以通过此设置分别为每个容器配置允许的文件数量上限。默认值为 5。每个容器的总日志大小 (container_log_max_size*container_log_max_files) 不得超过节点总存储空间的 1%。

映像垃圾回收

下表介绍了可修改的映像垃圾回收选项。

kubelet 配置设置 限制 默认设置 说明
imageGCHighThresholdPercent 值必须是介于 10 到 85 之间。的整数(含边界值),且高于 imageGcLowThresholdPercent 85 此设置定义一个磁盘使用率百分比,高于此百分比将运行映像垃圾回收。它表示要进行垃圾回收的最高磁盘使用率。此百分比的计算方法为:将相应字段的值除以 100。
imageGCLowThresholdPercent 值必须是介于 10 到 85 之间。的整数(含边界值),且低于 imageGcHighThresholdPercent 80 此设置定义了一个磁盘使用率百分比,低于此百分比将永不运行映像垃圾回收。它表示要进行垃圾回收的最低磁盘使用率。此百分比的计算方法为:将相应字段的值除以 100。
imageMinimumGcAge 值必须是时长,且不得超过 2m。有效时间单位为 nsus(或 µs)、mssmh 2m 此设置定义了未使用的映像在被垃圾回收之前的最短存留时间。
imageMaximumGcAge 值必须是时长。 0s

此设置定义了映像在被垃圾回收之前的最大空闲时长。此字段的默认值为 0s,表示停用此字段。因此,映像不会因未使用而被垃圾回收。如果指定了此值,则该值必须大于 imageMinimumGcAge 字段的值。

适用于 GKE 1.30.7-gke.1076000、1.31.3-gke.1023000 或更高版本。

映像拉取

下表介绍了可修改的映像拉取选项。

kubelet 配置设置 限制 默认设置 说明
maxParallelImagePulls 值必须是介于 2 到 5 之间。的整数(含边界值)。 23,具体取决于磁盘类型。 此设置定义并行进行映像拉取的最大数量。默认值由启动磁盘类型决定。

安全操作和不安全操作

下表介绍了用于配置安全性和处理不安全操作的可修改选项。

kubelet 配置设置 限制 默认设置 说明
allowedUnsafeSysctls

sysctl 个名称或群组的列表。允许的 sysctl 群组如下:

  • kernel.shm*
  • kernel.msg*
  • kernel.sem
  • fs.mqueue.*
  • net.*
none 此设置定义了一个以英文逗号分隔的不安全 sysctl 名称或 sysctl 群组的许可清单,可针对 Pod 设置该许可清单。
insecureKubeletReadonlyPortEnabled 值必须是布尔值(truefalse)。 true 此设置会在集群中的每个新节点池上停用不安全的 kubelet 只读端口 10255。如果您在此文件中配置此设置,则无法使用 GKE API 客户端在集群级层更改此设置。

资源管理器

Kubernetes 提供了一套资源管理器。您可以配置这些资源管理器,为配置了特定 CPU、设备和内存(大内存页)资源要求的 Pod 协调和优化节点资源的分配。

下表介绍了资源管理器的可修改选项。

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

将该值设置为 static 可允许将同时属于 Guaranteed QoS 类且具有整数 CPU 请求的 Pod 分配给专用 CPU。
memoryManager.policy 值必须为 NoneStatic None

此设置控制 kubelet 内存管理器政策。如果默认值为 None,Kubernetes 的行为与不存在内存管理器时相同。

如果您将此值设置为 Static,内存管理器政策会发送拓扑提示,拓扑提示取决于 Pod 的类型。如需了解详情,请参阅静态政策

此设置适用于控制平面运行 GKE 1.32.3-gke.1785000 或更高版本的集群。

topologyManager

值必须是每个对应字段的受支持设置之一。

使用 Terraform 说明向标准节点池添加配置时,您无法设置 topologyManager 字段。

  • policynone
  • scopecontainer

这些设置通过 policyscope 子字段控制 kubelet 拓扑管理器配置。拓扑管理器可协调负责 CPU 隔离、内存和设备本地性方面的性能优化的组件组。

您可以单独设置政策设置和范围设置。如需详细了解这些设置,请参阅拓扑管理器范围和政策

以下 GKE 资源支持此设置:

  • 控制平面运行 GKE 1.32.3-gke.1785000 或更高版本的集群。对于控制平面和节点运行 1.33.0-gke.1712000 或更高版本的集群,拓扑管理器还会接收有关 GPU 拓扑的信息。
  • 具有以下机器类型的节点:A2、A3、A4、C3、C4、C4A、G2、G4、M3、N4

Sysctl 配置选项

如需调节系统的性能,您可以修改 Linux 内核参数。本部分中的表格介绍了您可以配置的各种内核参数。

文件系统参数 (fs.*)

下表介绍了 Linux 文件系统的可修改参数。这些设置可控制 Linux 文件系统的行为,例如文件句柄限制和事件监控。

Sysctl 参数 限制 说明
fs.aio-max-nr 必须介于 [65536, 4194304] 之间。 此设置定义了整个系统的异步 I/O 请求数量上限。
fs.file-max 必须介于 [104857, 67108864] 之间。 此设置定义了 Linux 内核可以分配的文件句柄数量上限。
fs.inotify.max_user_instances 必须介于 [8192, 1048576] 之间。 此设置定义了用户可以创建的 inotify 实例数量上限。
fs.inotify.max_user_watches 必须介于 [8192, 1048576] 之间。 此设置定义了用户可以创建的 inotify 监视数量上限。
fs.nr_open 必须介于 [1048576, 2147483584] 之间。 此设置定义了进程可以打开的文件描述符数量上限。

内核参数 (kernel.*)

下表介绍了 Linux 内核的可修改参数。 这些设置用于配置核心内核功能,包括共享内存分配。

Sysctl 参数 限制 说明
kernel.shmmni 必须介于 [4096, 32768] 之间。 此设置定义了系统范围内的共享内存段数量上限。如果未设置此值,则默认为 4096
kernel.shmmax 必须介于 [0, 18446744073692774399] 之间。 此设置定义了内核允许的单个共享内存段的最大大小(以字节为单位)。如果该值大于实际 RAM 量,系统会忽略该值,这意味着所有可用 RAM 都可以共享。
kernel.shmall 必须介于 [0, 18446744073692774399] 之间。 此设置定义了系统一次可使用的共享内存页总数。在 AMD64 和 Intel 64 架构上,一个页面为 4,096 字节。
kernel.perf_event_paranoid 必须介于 [-1, 3] 之间。 此设置用于控制无特权用户在没有 CAP_PERFMON 的情况下对性能事件系统的使用。内核中的默认值为 2
kernel.sched_rt_runtime_us 必须介于 [-1, 1000000] 之间。 此设置定义了实时调度可使用的总时间限制。
kernel.softlockup_panic 可选(布尔值)。 此设置用于控制在检测到软死锁时内核是否会崩溃。
kernel.yama.ptrace_scope 必须介于 [0, 3] 之间。

此设置定义了 ptrace() 系统调用的范围和限制,会影响进程调试和跟踪。支持的值包括:

  • 0:经典 ptrace 权限。
  • 1:受限 ptrace,这是许多发行版的默认设置。仅限子进程或 CAP_SYS_PTRACE。
  • 2:仅限管理员的 ptrace。只有具有 CAP_SYS_PTRACE 的进程。
  • 3:无 ptrace。不允许进行 ptrace 调用。
kernel.kptr_restrict 必须介于 [0, 2] 之间。 此设置用于指示是否限制通过 /proc 和其他接口公开内核地址。
kernel.dmesg_restrict 可选(布尔值)。 此设置用于指示是否禁止非特权用户使用 dmesg(8) 查看内核日志缓冲区中的消息。
kernel.sysrq 必须介于 [0, 511] 之间。

此设置用于控制允许通过 SysRq 键调用的函数。可能的值包括下列项:

  • 0:完全停用 sysrq。
  • 1:启用所有 sysrq 功能。
  • >1:允许的 sysrq 功能的位掩码。如需了解详情,请参阅 Linux 魔法系统请求键技巧

网络参数 (net.*)

下表介绍了可修改的网络参数。这些设置可调整网络堆栈的性能和行为,从套接字缓冲区到连接跟踪。

Sysctl 参数 限制 说明
net.core.busy_poll 任何小于 2147483647 的正整数。 此设置定义了轮询和选择的低延迟繁忙轮询超时时间。它表示忙循环等待事件的大致时间(以微秒为单位)。
net.core.busy_read 任何小于 2147483647 的正整数。 此设置定义了套接字读取的低延迟繁忙轮询超时时间。它表示在设备队列上忙循环等待数据包的大致时间(以微秒为单位)。
net.core.netdev_max_backlog 任何小于 2147483647 的正整数。 此设置用于定义当接口接收数据包的速度快于内核处理数据包的速度时,在 INPUT 端排队的数据包数量上限。
net.core.rmem_default 任何小于 2147483647 的正整数。 此设置定义了默认接收套接字缓冲区大小(以字节为单位)。
net.core.rmem_max 任何小于 2147483647 的正整数。 此设置定义了最大接收套接字缓冲区大小(以字节为单位)。
net.core.wmem_default 任何小于 2147483647 的正整数。 此设置定义了套接字发送缓冲区的默认设置(以字节为单位)。
net.core.wmem_max 任何小于 2147483647 的正整数。 此设置定义了最大发送套接字缓冲区大小(以字节为单位)。
net.core.optmem_max 任何小于 2147483647 的正整数。 此设置定义了每个套接字允许的最大辅助缓冲区大小。
net.core.somaxconn 必须介于 [128, 2147483647] 之间。 此设置定义了 socket listen() 积压的限制,在用户空间中称为 SOMAXCONN。此设置的默认值为 128
net.ipv4.tcp_rmem {min, default, max}(每个值都大于 0,内存以字节为单位)。 此设置定义了在适度调节时 UDP 套接字使用的接收缓冲区的最小大小(以字节为单位)。默认设置为 1 页。
net.ipv4.tcp_wmem {min, default, max}(每个值都大于 0,内存以字节为单位)。 此设置定义了在适度情况下 UDP 套接字使用的发送缓冲区的最小大小(以字节为单位)。默认设置为 1 页。
net.ipv4.tcp_tw_reuse 必须介于 {0, 1} 之间。 此设置用于定义在协议方面安全的情况下,是否允许将处于 TIME_WAIT 状态的套接字重用于新连接。默认值为 0
net.ipv4.tcp_max_orphans 必须介于 [16384, 262144] 之间。 此设置定义了未附加到任何用户文件句柄的 TCP 套接字的最大数量。
net.ipv4.tcp_max_tw_buckets 必须介于 [4096, 2147483647] 之间。 此设置定义了系统同时持有的 timewait 套接字的最大数量。如果超出此数量,系统会立即销毁 time-wait 套接字并发出警告。
net.ipv4.tcp_syn_retries 必须介于 [1, 127] 之间。 此设置定义了为尝试建立有效 TCP 连接而重新传输初始 SYN 的次数。
net.ipv4.tcp_ecn 必须介于 [0, 2] 之间。 此设置用于控制 TCP 对显式拥塞通知 (ECN) 的使用。只有当 TCP 连接的两端都表示支持 ECN 时,才会使用 ECN。
net.ipv4.tcp_mtu_probing 必须介于 [0, 2] 之间。

此设置用于控制 TCP 数据包化层路径 MTU 发现。支持的值如下:

  • 0:已停用。
  • 1:默认处于停用状态,检测到 ICMP 黑洞时启用。
  • 2:始终启用。使用初始 MSS tcp_base_mss
net.ipv4.tcp_congestion_control 当集群上启用 Dataplane V2 时,不支持此设置。
net.ipv6.conf.all.disable_ipv6 布尔值。 更改此值与将 conf/default/disable_ipv6 设置以及所有接口级 disable_ipv6 设置更改为相同的值相同。
net.ipv6.conf.default.disable_ipv6 布尔值。 此设置会停用 IPv6 的运行。
net.netfilter.nf_conntrack_acct 必须介于 {0, 1} 之间。 此设置可启用连接跟踪流统计。默认值为 0,表示该设置处于停用状态。适用于 GKE 1.32.0-gke.1448000 版或更高版本。
net.netfilter.nf_conntrack_max 必须介于 [65536, 4194304] 之间。 此设置用于定义连接跟踪表的大小。如果达到最大值,新连接将失败。适用于 GKE 1.32.0-gke.1448000 版或更高版本。
net.netfilter.nf_conntrack_buckets 必须介于 [65536, 524288] 之间。

此设置用于定义哈希表的大小。建议的设置是以下各项的计算结果:nf_conntrack_max = nf_conntrack_buckets * 4

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

net.netfilter.nf_conntrack_tcp_timeout_close_wait 必须介于 [60, 3600] 之间。

此设置定义了 TCP 连接可以保持 CLOSE_WAIT 状态的时间段(以秒为单位)。默认值为 3600

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

net.netfilter.nf_conntrack_tcp_timeout_established 必须介于 [600, 86400] 之间。

此设置定义了无效连接在从连接跟踪表中自动删除之前的时长(以秒为单位)。

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

net.netfilter.nf_conntrack_tcp_timeout_time_wait 必须介于[1, 600] 之间。

此设置定义了 TCP 连接可以保持 TIME_WAIT 状态的时间段(以秒为单位)。默认值为 120

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

虚拟内存参数 (vm.*)

下表介绍了虚拟内存子系统的可修改参数。这些设置用于管理虚拟内存子系统,该子系统可控制内核处理内存、交换和磁盘缓存的方式。

sysctl 参数 限制 说明
vm.max_map_count 必须介于 [65536, 2147483647] 之间。 此文件定义了进程可以拥有的内存映射区域数量上限。
vm.dirty_background_ratio 必须介于 [1, 100] 之间。 此设置定义了在后台内核刷写程序线程开始回写之前,可填充脏页的系统内存百分比。该值必须小于 vm.dirty_ratio 字段的值。
vm.dirty_background_bytes 必须介于 [0, 68719476736] 之间。

此设置定义了后台内核刷写程序线程开始回写的脏内存量。

请注意,vm.dirty_background_bytesvm.dirty_background_ratio 的对应项。只能指定其中一项设置。

vm.dirty_expire_centisecs 必须介于 [0, 6000] 之间。 此设置定义了脏数据在内核刷新线程将其写入磁盘之前可以保留在内存中的最长时间(以百分之一秒为单位)。
vm.dirty_ratio 必须介于 [1, 100] 之间。 此设置定义了在执行写入操作的进程被迫阻塞并同步写出脏数据之前,可填充脏页的系统内存百分比。
vm.dirty_bytes 必须介于 [0, 68719476736] 之间。

此设置定义了生成磁盘写入的进程开始自行回写的脏内存量。vm.dirty_bytes 允许的最小值为两个内存页(以字节为单位)。任何低于此限制的值都将被忽略,并且系统会保留旧配置。

请注意,vm.dirty_bytesvm.dirty_ratio 的对应项。只能指定其中一项设置。

vm.dirty_writeback_centisecs 必须介于 [0, 1000] 之间。 此设置定义了内核刷写程序线程唤醒以将旧脏数据写入磁盘的间隔(以百分之一秒为单位)。
vm.overcommit_memory 必须介于 {0, 1, 2} 之间。

此设置决定了内核处理内存过度分配的策略。值如下所示:

  • 0:拒绝大型分配
  • 1:始终允许
  • 2:防止提交超出交换空间 + RAM 比率
vm.overcommit_ratio 必须介于 [0, 100] 之间。 此设置用于定义当 vm.overcommit_memory 字段的值设置为 2 时,允许过度使用的物理 RAM 百分比。
vm.vfs_cache_pressure 必须介于 [0, 100] 之间。 此设置可调整内核在回收用于目录项 (dentry) 和 inode 缓存的内存时的偏好设置。
vm.swappiness 必须介于 [0, 200] 之间。 此设置用于控制内核将进程移出物理内存并移到交换磁盘的倾向。默认值为 60
vm.watermark_scale_factor 必须介于 [10, 3000] 之间。 此设置用于控制 kswapd 的激进程度。它定义了 kswapd 唤醒前的剩余内存以及在 kswapd 休眠前要释放的内存。默认值为 10
vm.min_free_kbytes 必须介于 [67584, 1048576] 之间。 此设置定义了 OOM 之前的最小可用内存。默认值为 67584

如需详细了解每个 sysctl 标志支持的值,请参阅 --system-config-from-file gcloud CLI 文档

不同的 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 配置取决于初始集群版本,而不是节点池版本。Arm 机器不支持 cgroupv1

您可以使用节点系统配置将节点池的设置更改为明确使用 cgroupv1cgroupv2。将使用 cgroupv1 的现有节点池升级到 1.26 版不会将设置更改为 cgroupv2。运行早于 1.26 的版本且不包含自定义 cgroup 配置的现有节点池将继续使用 cgroupv1。如需更改此设置,您必须为现有节点池明确指定 cgroupv2

例如,要将节点池配置为使用 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 或更高版本。
  • 您必须使用带 containerd 的 Container-Optimized OS 或带 containerd 的 Ubuntu 节点映像
  • 如果您的任何工作负载依赖于读取 cgroup 文件系统 (/sys/fs/cgroup/...),请确保它们与 cgroupv2 API 兼容。
  • 如果您使用任何监控或第三方工具,请确保它们与 cgroupv2 兼容。
  • 如果您使用 Java 工作负载 (JDK),我们建议您使用完全支持 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 验证此节点池中节点的 cgroup 配置,请选择一个节点并按照以下说明连接到该节点:

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

Linux 大内存页配置选项

您可以使用节点系统配置文件预先分配大内存页。Kubernetes 支持预分配的大内存页作为一种资源类型,类似于 CPU 或内存。

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

  • 为了确保节点不会被大内存页完全占用,分配的大内存页总大小不能超过以下任一值:
    • 对于内存不足 30 GB 的机器:总内存的 60%。例如,在具有 8 GB 内存的 e2-standard-2 机器上,您不能分配超过 4.8 GB 的大内存页。
    • 对于内存超过 30 GB 的机器:总内存的 80%。例如,在具有 32 GB 内存的 c4a-standard-8 机器上,大内存页不能超过 25.6 GB。
  • 1 GB 大内存页仅适用于 A3、C2D、C3、C3D、C4、C4A、C4D、CT5E、CT5LP、CT6E、H3、M2、M3、M4 或 Z3 机器类型。

下表介绍了 Linux 大内存页的可修改设置。

配置参数 限制 默认值 说明
hugepage_size2m 整数计数。受之前所述的内存分配限制约束。 0 此设置会预先分配特定数量的 2 MB 大内存页。
hugepage_size1g 整数计数。同时受上述内存和机器类型限制的约束。 0 此设置会预先分配特定数量的 1 GB 大内存页。

透明大内存页 (THP)

您可以使用节点系统配置文件来启用 Linux 内核的透明大内存页支持。使用 THP 时,内核会自动为进程分配大内存页,无需手动预分配。

下表介绍了 THP 的可修改参数。

配置参数 支持的值 默认值 说明
transparentHugepageEnabled
  • TRANSPARENT_HUGEPAGE_ENABLED_ALWAYS:透明大内存页在整个系统范围内处于启用状态。
  • TRANSPARENT_HUGEPAGE_ENABLED_MADVISE:透明大内存页在 MADV_HUGEPAGE 区域内处于启用状态。此设置是默认的内核配置。
  • TRANSPARENT_HUGEPAGE_ENABLED_NEVER:透明大内存页已停用。
  • TRANSPARENT_HUGEPAGE_ENABLED_UNSPECIFIED:默认值。GKE 不会修改内核配置。
UNSPECIFIED 此设置用于控制是否为匿名内存启用 THP。
transparentHugepageDefrag
  • TRANSPARENT_HUGEPAGE_DEFRAG_ALWAYS:请求 THP 的应用会在分配失败时停滞,并直接回收页面和压缩内存,以尝试立即分配 THP。
  • TRANSPARENT_HUGEPAGE_DEFRAG_DEFER:应用在后台唤醒 kswapd 以回收页面,唤醒 kcompactd 以压缩内存,以便在不久后使用 THP。然后,khugepaged 负责稍后安装 THP 页面。
  • TRANSPARENT_HUGEPAGE_DEFRAG_DEFER_WITH_MADVISE:应用像往常一样进入直接回收和压缩流程,但仅针对已使用 madvise(MADV_HUGEPAGE) 的区域。所有其他区域都会在后台唤醒 kswapd 以回收页面,唤醒 kcompactd 以压缩内存,以便在不久后提供 THP。
  • TRANSPARENT_HUGEPAGE_DEFRAG_MADVISE:应用像往常一样进入直接回收和压缩流程,但仅针对已使用 madvise(MADV_HUGEPAGE) 的区域。所有其他区域都会在后台唤醒 kswapd 以回收页面,唤醒 kcompactd 以压缩内存,以便在不久后提供 THP。
  • TRANSPARENT_HUGEPAGE_DEFRAG_NEVER:应用永远不会进入直接回收或压缩流程。
  • TRANSPARENT_HUGEPAGE_DEFRAG_UNSPECIFIED:默认值。GKE 不会修改内核配置。
UNSPECIFIED 此设置定义了 THP 的碎片整理配置。

GKE 1.33.2-gke.4655000 或更高版本支持 THP。在 GKE 1.33.2-gke.4655000 或更高版本中,它还默认在新 TPU 节点池上启用。将现有节点池升级到受支持的版本或更高版本时,系统不会启用 THP。

后续步骤