自定义 Azure Kubernetes 服务 (AKS) 节点池的节点配置

通过自定义节点配置,你可以调整操作系统 (OS) 设置或 kubelet 参数,以满足工作负载的需求。 创建 AKS 群集或向群集添加节点池时,你可以自定义一个常用 OS 和 kubelet 设置的子集。 若要在此子集之外配置设置,可以使用守护程序集自定义所需配置,而不会失去对节点的 AKS 支持

使用自定义节点配置创建 AKS 群集

创建配置文件

OS 和 kubelet 配置更改要求使用参数和所需设置创建新的配置文件。 如果未指定参数的值,则会将该值设置为默认值。

Kubelet 配置

创建具有以下内容的 linuxkubeletconfig.json 文件:

{
 "cpuManagerPolicy": "static",
 "cpuCfsQuota": true,
 "cpuCfsQuotaPeriod": "200ms",
 "imageGcHighThreshold": 90,
 "imageGcLowThreshold": 70,
 "topologyManagerPolicy": "best-effort",
 "allowedUnsafeSysctls": [
  "kernel.msg*",
  "net.*"
],
 "failSwapOn": false
}

OS 配置

创建具有以下内容的 linuxosconfig.json 文件:

{
 "transparentHugePageEnabled": "madvise",
 "transparentHugePageDefrag": "defer+madvise",
 "swapFileSizeMB": 1500,
 "sysctls": {
  "netCoreSomaxconn": 163849,
  "netIpv4TcpTwReuse": true,
  "netIpv4IpLocalPortRange": "32000 60000"
 }
}

使用自定义配置文件创建新群集

创建新群集时,可以使用在前面的步骤中创建的自定义配置文件来指定 kubelet 配置和/或 OS 配置。

注意

如果在创建群集时指定配置,该配置只会对初始节点池中的节点应用。 JSON 文件中未配置的任何设置都将保留默认值。 Windows 操作系统类型不支持 CustomLinuxOsConfig

如需使用自定义配置文件创建新群集,请使用 az aks create 命令并指定配置文件。 以下示例命令将使用自定义 ./linuxkubeletconfig.json./linuxosconfig.json 文件创建一个新群集:

az aks create --name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json --linux-os-config ./linuxosconfig.json

使用自定义配置文件添加节点池

将节点池添加到群集时,可以使用在上一步中创建的自定义配置文件来指定 kubelet 配置。 Linux 和 Windows 节点池支持 CustomKubeletConfig

注意

将 Linux 节点池添加到现有群集时,可以指定 kubelet 配置和/或 OS 配置。 将 Windows 节点池添加到现有群集时,仅可以指定 kubelet 配置。 如果在添加节点池时指定配置,则该配置只会对新节点池中的节点应用。 JSON 文件中未配置的任何设置都将保留默认值。

az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --kubelet-config ./linuxkubeletconfig.json

其他配置

以下设置可用于修改其他操作系统设置:

当天的消息

--message-of-the-day 标志与文件的位置一起传递,以在创建群集或节点池时替换 Linux 节点上“当天的消息”。

az aks create --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt
节点池创建
az aks nodepool add --name mynodepool1 --cluster-name myAKSCluster --resource-group myResourceGroup --message-of-the-day ./newMOTD.txt

自定义节点配置疑难解答

确认设置已应用

应用自定义节点配置后,可以通过连接到主机并验证是否已在文件系统上进行了 sysctl 或配置更改,来确认设置已应用到节点。

自定义节点配置支持的参数

Kubelet 自定义配置

Linux 和 Windows 节点池支持 Kubelet 自定义配置。 支持的参数有所不同,具体记录如下。

Linux Kubelet 自定义配置

参数 允许的值/间隔 默认 说明
cpuManagerPolicy 无、静态 静态策略允许 CPU 请求数为整数的 Guaranteed Pod 中的容器访问节点上的独占 CPU。
cpuCfsQuota true、false true 为指定 CPU 限制的容器启用/禁用 CPU CFS 配额强制。
cpuCfsQuotaPeriod 以毫秒为单位的间隔(毫秒) 100ms 设置 CPU CFS 配额周期值。
imageGcHighThreshold 0-100 85 自此起始终运行映像垃圾回收的磁盘使用量百分比。 会触发垃圾回收的最低磁盘使用率。 如果要禁用映像垃圾回收,则设置为 100。
imageGcLowThreshold 0-100,不大于 imageGcHighThreshold 80 在此之前从不运行映像垃圾回收的磁盘使用量百分比。 可触发垃圾回收的最低磁盘使用率。
topologyManagerPolicy 无、最大努力、受限制、单个 numa 节点 有关优化 Numa 节点对齐的信息,请在此处详细了解。
allowedUnsafeSysctls kernel.shm*kernel.msg*kernel.semfs.mqueue.*net.* 允许的不安全 sysctl 或不安全 sysctl 模式的列表。
containerLogMaxSizeMB 以兆字节 (MB) 为单位的大小 50 容器日志文件在轮换前的最大大小(例如,10 MB)。
containerLogMaxFiles ≥ 2 5 一个容器可以存在的最大容器日志文件数。
podMaxPids -1 到内核 PID 限制 -1(无穷大) 一个 Pod 中可以运行的最大进程 ID 数
seccompDefault UnconfinedRuntimeDefault Unconfined 为所有工作负载设置默认的 seccomp 配置文件。 RuntimeDefault 使用容器的默认 seccomp 配置文件,限制某些系统调用来提高安全性。 受限制的 syscall 将失败。 Unconfined 未对 syscall 设置限制,允许所有系统调用,这降低了安全性。 有关详细信息,请参阅 containerD 默认 seccomp 配置文件。 此参数仍以预览版提供。 使用包含 --namespace "Microsoft.ContainerService" 的 az feature register 命令注册“KubeletDefaultSeccompProfilePreview”功能标志。

Windows Kubelet 自定义配置

参数 允许的值/间隔 默认 说明
imageGcHighThreshold 0-100 85 自此起始终运行映像垃圾回收的磁盘使用量百分比。 会触发垃圾回收的最低磁盘使用率。 如果要禁用映像垃圾回收,则设置为 100。
imageGcLowThreshold 0-100,不大于 imageGcHighThreshold 80 在此之前从不运行映像垃圾回收的磁盘使用量百分比。 可触发垃圾回收的最低磁盘使用率。
containerLogMaxSizeMB 以兆字节 (MB) 为单位的大小 10 容器日志文件在轮换前的最大大小(例如,10 MB)。
containerLogMaxFiles ≥ 2 5 一个容器可以存在的最大容器日志文件数。

Linux 自定义 OS 配置设置

重要

为了简化搜索和可读性,OS 设置在本文中直接显示名称,但在添加到配置 JSON 文件或 AKS API 中时,应遵循 camelCase 大小写约定

例如,如果修改“vm.max_map_count 设置”,则应在配置 JSON 文件中重新格式化为“vmMaxMapCount”。

文件句柄限制

当提供大量流量时,流量通常来自大量的本地文件。 你可以调整以下内核设置和内置限制,以便只占用部分系统内存来处理更大的量。

设置 允许的值/间隔 默认 说明
fs.file-max 8192 - 12000500 709620 Linux 内核将分配的最大文件句柄数,通过增加该值,可以增加允许打开的最大文件数。
fs.inotify.max_user_watches 781250 - 2097152 1048576 系统允许的最大文件监视数。 每个监视在 32 位内核上约为 90 字节,在 64 位内核上约为 160 字节。
fs.aio-max-nr 65536 - 6553500 65536 Aio-nr 显示当前系统范围内的异步 IO 请求数。 使用 aio-max-nr,你可以更改 aio-nr 可以增加到的最大值。
fs.nr_open 8192 - 20000500 1048576 进程可分配的最大文件句柄数。

套接字和网络优化

对于预期会处理大量并发会话的代理节点,你可以使用下面的 TCP 和网络选项子集,可按节点池调整这些选项。

设置 允许的值/间隔 默认 说明
net.core.somaxconn 4096 - 3240000 16384 可为任何给定侦听套接字排队的最大连接请求数。 传递给 listen(2) 函数的积压工作 (backlog) 形式参数值的上限。 如果积压工作 (backlog) 实际参数大于 somaxconn,则以静默方式截断为此上限。
net.core.netdev_max_backlog 1000 - 3240000 1000 接口接收数据包的速度快于内核的处理速度时,在 INPUT 端排队的数据包的最大数量。
net.core.rmem_max 212992 - 134217728 212992 接收套接字缓冲区最大大小(以字节为单位)。
net.core.wmem_max 212992 - 134217728 212992 发送套接字缓冲区最大大小(以字节为单位)。
net.core.optmem_max 20480 - 4194304 20480 每个套接字允许的辅助缓冲区(选项内存缓冲区)最大大小。 在少数情况下,套接字选项内存用于存储与套接字使用相关的附加结构。
net.ipv4.tcp_max_syn_backlog 128 - 3240000 16384 尚未收到连接客户端确认的最大排队连接请求数。 如果超出此数量,内核会开始删除请求。
net.ipv4.tcp_max_tw_buckets 8000 - 1440000 32768 系统同时容纳 timewait 套接字的最大数量。 如果超过此数量,则会立即销毁 time-wait 套接字并显示警告消息。
net.ipv4.tcp_fin_timeout 5 - 120 60 孤立连接(任何应用程序均不再引用)在本地终止之前保持 FIN_WAIT_2 状态的时间长度。
net.ipv4.tcp_keepalive_time 30 - 432000 7200 启用 keepalive 时,TCP 发出 keepalive 消息的频率。
net.ipv4.tcp_keepalive_probes 1 - 15 9 TCP 在确定连接已中断前,发出 keepalive 探测的数量。
net.ipv4.tcp_keepalive_intvl 10 - 90 75 探测发出的频率。乘以 tcp_keepalive_probes,等于在启动探测后终止未响应连接所需的时间。
net.ipv4.tcp_tw_reuse 0 或 1 0 从协议角度看安全时,允许将 TIME-WAIT 套接字重用于新连接。
net.ipv4.ip_local_port_range 第一个:1024 - 60999,最后一个:32768 - 65535] 第一个:32768,最后一个:60999 TCP 和 UDP 流量用来选择本地端口的本地端口范围。 由两个数字组成:第一个数字是代理节点上允许 TCP 和 UDP 流量使用的第一个本地端口,第二个数字是最后一个本地端口号。
net.ipv4.neigh.default.gc_thresh1 128 - 80000 4096 ARP 缓存中可能的最小项数。 如果项数低于此设置,不会触发垃圾回收。
net.ipv4.neigh.default.gc_thresh2 512 - 90000 8192 ARP 缓存中项数可能的软最大值。 此设置可能是最重要的,因为达到这一软最大值大约 5 秒后会触发 ARP 垃圾回收。
net.ipv4.neigh.default.gc_thresh3 1024 - 100000 16384 ARP 缓存中项数的硬最大值。
net.netfilter.nf_conntrack_max 131072 - 2097152 131072 nf_conntrack 是在 Linux 中跟踪 NAT 连接项的模块。 nf_conntrack 模块使用哈希表来记录 TCP 协议的已建立连接记录。 nf_conntrack_max 是哈希表中的最大节点数,即 nf_conntrack 模块支持的最大连接数或连接跟踪表大小。
net.netfilter.nf_conntrack_buckets 65536 - 524288 65536 nf_conntrack 是在 Linux 中跟踪 NAT 连接项的模块。 nf_conntrack 模块使用哈希表来记录 TCP 协议的已建立连接记录。 nf_conntrack_buckets 是哈希表的大小。

工作线程限制

与文件描述符限制一样,进程可以创建的辅助角色或线程的数量受内核设置和用户限制所限制。 AKS 中的用户数不受限制。

设置 允许的值/间隔 默认 说明
kernel.threads-max 20 - 513785 55601 进程可以启动工作线程。 可创建的所有线程的最大数量均使用内核设置 kernel.threads-max 进行设置。

虚拟内存

以下设置可用于调整 Linux 内核虚拟内存 (VM) 子系统的操作以及向磁盘进行脏数据的 writeout

设置 允许的值/间隔 默认 说明
vm.max_map_count 65530 - 262144 65530 此文件包含进程可能具有的最大内存映射区域数。 内存映射区域被用作 mmapmprotectmadvise 直接调用 malloc 的副作用,也是加载共享库时的副作用。
vm.vfs_cache_pressure 1 - 100 100 此百分比值控制内核回收内存(用于缓存目录和 Inode 对象)的趋势。
vm.swappiness 0 - 100 60 此控制用于定义内核交换内存页的积极程度。 增加值会提高积极程度,降低值会减少交换量。 值 0 指示内核不发起交换,直到可用且文件支持的页数小于区域中的高水印。
swapFileSizeMB 1 MB - 临时磁盘 (/dev/sdb) 的大小 SwapFileSizeMB 指定将在此节点池的代理节点上创建的交换文件的大小(以 MB 为单位)。
transparentHugePageEnabled alwaysmadvisenever always 透明大页是一项 Linux 内核功能,它旨在通过更高效地利用处理器的内存映射硬件来提高性能。 启用后,内核会尝试尽可能地分配 hugepages,如果 mmap 区域自然对齐 2 MB,则任何 Linux 进程都将收到 2 MB 大小的页面。 在某些情况下,如果在系统范围内启用 hugepages,应用程序最终可能会分配更多的内存资源。 应用程序可能会对一个较大的区域执行 mmap,但只接触其中 1 个字节,在这种情况下,可能会无故分配一个 2 MB 大小的页面,而不是 4k 大小的页面。 这种情况可能是在系统范围内禁用 hugepages 或者只将它们限定在 MADV_HUGEPAGE madvise 区域内的原因。
transparentHugePageDefrag alwaysdeferdefer+madvisemadvisenever madvise 此值可控制内核是否应充分利用内存压缩,以使更多 hugepages 可用。

后续步骤