本文档介绍如何使用名为节点系统配置的配置文件来自定义 Google Kubernetes Engine (GKE) 节点配置。
概览
您可以使用各种方法自定义节点配置。例如,您可以在创建节点池时指定机器类型和最小 CPU 平台等参数。
节点系统配置是一个配置文件,提供了一种调整一组有限的系统设置的方法。您可以使用节点系统配置来指定 Kubernetes 节点代理 (kubelet
) 和低级别的 Linux 内核配置的自定义设置( sysctl
)。
您还可以使用名为运行时配置文件的其他文件在 GKE 节点上自定义 containerd 容器运行时。 如需了解相关说明,请参阅在 GKE 节点中自定义 containerd 配置。
您还可以使用 DaemonSet 自定义节点,例如使用 DaemonSet 自动引导 GKE 节点。
使用节点系统配置
如需使用节点系统配置,请执行以下操作:
创建配置文件
编写 YAML 格式的节点系统配置文件。以下示例展示了如何为 kubelet
和 sysctl
选项添加配置:
kubeletConfig:
cpuManagerPolicy: static
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 字节。
如果您只想为 kubelet
或 sysctl
添加配置,请仅在配置文件中包含该部分。例如,如需添加 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
:包含kubelet
和sysctl
配置的文件的路径
应用节点系统配置后,集群的默认节点池将使用您定义的设置。
创建节点池
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
:包含kubelet
和sysctl
配置的文件的路径
更新节点池
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
:包含kubelet
和sysctl
配置的文件的路径
修改节点系统配置
如需修改节点系统配置,您可以使用所需的配置创建新的节点池,或更新现有节点池的节点系统配置。
通过创建节点池进行修改
如需通过创建节点池来修改节点系统配置,请执行以下操作:
通过更新现有节点池进行修改
如需通过更新现有节点池来修改节点系统配置,请使用所需的值更新节点系统配置。更新节点系统配置会使用新配置替换节点池的系统配置。如果您在更新期间省略了任何参数,则这些参数将被设置为各自的默认值。
如果您要将节点系统配置重置为默认值,请使用 kubelet
和 sysctl
的空值更新配置文件。例如:
kubeletConfig: {}
linuxConfig:
sysctl: {}
删除节点系统配置
如需移除节点系统配置,请执行以下操作:
Kubelet 配置选项
下表显示了您可以修改的 kubelet
选项。
Kubelet 配置设置 | 限制 | 默认设置 | 说明 |
---|---|---|---|
cpuManagerPolicy | 值必须为 none 或 static |
none
|
此设置用于控制 kubelet 的 CPU 管理器政策。默认值为 none ,这是默认的 CPU 关联方案,除了操作系统调度工具自动提供之外,没有其他关联性。将该值设置为 static 可允许将具有整数 CPU 请求的保证 QoS 类中的 Pod 分配给专用 CPU 使用。 |
cpuCFSQuota | 值必须为 true 或 false |
true
|
此设置会强制执行 Pod 的 CPU 限制。将该值设置为 false 表示忽略 Pod 的 CPU 限制。在某些情况下,如果 Pod 对 CPU 限制敏感,则可能会忽略 CPU 限制。停用 cpuCFSQuota 的风险在于,恶意 Pod 可能会消耗比预期更多的 CPU 资源。 |
cpuCFSQuotaPeriod | 值必须是时长 |
"100ms"
|
此设置会设置 CPU CFS 配额时长值 cpu.cfs_period_us ,该值用于指定 Cgroup 对 CPU 资源的访问频率应重新分配的时长。此选项允许您调节 CPU 节流行为。 |
insecureKubeletReadonlyPortEnabled |
值必须是布尔值(true 或 false ) |
true |
此设置会在集群中的每个新节点池上停用不安全的 kubelet 只读端口 10255 。如果您在此文件中配置此设置,则无法使用 GKE API 客户端在集群级别更改设置。 |
podPidsLimit | 值必须介于 1024 到 4194304 之间 |
none
|
此项设置每个 Pod 可以使用的进程 ID (PID) 数量上限。 |
Sysctl 配置选项
如需调节系统的性能,您可以修改以下内核属性:
net.core.busy_poll
net.core.busy_read
net.core.netdev_max_backlog
net.core.rmem_max
net.core.wmem_default
net.core.wmem_max
net.core.optmem_max
net.core.somaxconn
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.tcp_tw_reuse
net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.default.disable_ipv6
vm.max_map_count
不同的 Linux 命名空间对于给定 sysctl
可能具有唯一的值,而其他 Linux 命名空间对于整个节点都是全局性的。使用节点系统配置来更新 sysctl
选项可确保 sysctl
在节点及每个命名空间中进行全局应用,从而使每个 Pod 在每个 Linux 命名空将都具有相同的 sysctl
值。
Linux cgroup 模式配置选项
kubelet 和容器运行时使用 Linux 内核 cgroups 进行资源管理,例如限制 Pod 中每个容器可以访问的 CPU 或内存量。内核中有两个 cgroup 子系统版本:cgroupv1
和 cgroupv2
。Kubernetes 对 cgroupv2
的支持在 Kubernetes 1.18 版中为 Alpha 版,在 1.22 版中为 Beta 版,并在 1.25 版中成为正式版。如需了解详情,请参阅 Kubernetes cgroups v2 文档。
节点系统配置使您可以自定义节点池的 cgroup 配置。您可以使用 cgroupv1
或 cgroupv2
。GKE 对运行 1.26 及更高版本的新标准节点池使用 cgroupv2
,对 1.26 之前的版本使用 cgroupv1
。对于使用节点自动预配创建的节点池,cgroup 配置取决于初始集群版本,而不是节点池版本。
您可以使用节点系统配置将节点池的设置更改为明确使用 cgroupv1
或 cgroupv2
。仅将现有节点池升级到 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
配置,请选择一个节点并按照以下说明连接到该节点:
- 使用节点池中的任意节点创建交互式 shell。将命令中的
mynode
替换为节点池中任意节点的名称。 - 确定 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 机器类型。