默认情况下,节点上的 Pod 默认共享节点 CPU 池中所有的 CPU核数, 当节点上运行了很多 CPU 密集的 Pod 时,工作负载可能会切换调度到不同的 CPU 核, 这样就导致有些工作负载的性能明显地受到 CPU 缓存亲和性以及调度延迟的影响。 对此,kubelet 提供了可选的 CPU 管理策略,可以实现某些关键 Pod 的静态绑核,避免 CPU 抢占和切换对业务带来的性能损耗。详情参考:控制节点上的 CPU 管理策略 。
下面介绍在 TKE 中开启 CPU 静态管理策略的两种方式。
在 K8S 1.17 版本之前,可供 Pod 独占 CPU 资源数量等于节点的 CPU 总量减去通过--kube-reserved
或--system-reserved
参数保留的 CPU,从 1.17 版本开始,CPU保留列表可以通过 kublet 的 '--reserved-cpus' 参数显式地设置。由于 TKE 的 GA 版本 一般为偶数,所以:
在节点 /etc/kubernetes/kubelet
文件中添加如下配置:
...
CPU_MANAGER_POLICY="--cpu-manager-policy=static"
KUBE_RESERVED="--kube-reserved=cpu=xxx,memory=xxx"
SYSTEM_RESERVED="--system-reserved=cpu=xxx,memory=xxx"
...
其中, 给 Pods 独占 CPU 可用的资源数量等于节点的 CPU 总量减去通过 --kube-reserved
或 --system-reserved
参数保留的 CPU,如果保留 CPU 数量设置非整数则向上取整,比如 250m,向上取整就是保留 1 核。
由于 TKE 的 systemd 启动参数环境变量是硬编码,所以这里需要再添加下 kubelet 的启动参数环境变量 CPU_MANAGER_POLICY
和SYSTEM_RESERVED
(KUBE_RESERVED
变量默认已经存在了):
修改 kubelet 的 systemd 启动文件 /usr/lib/systemd/system/kubelet.service
, 启动参数添加如下环境变量:
...
ExecStart=/usr/bin/kubelet ... ${CPU_MANAGER_POLICY} ${KUBE_RESERVED} ${SYSTEM_RESERVED} ...
...
在节点 /etc/kubernetes/kubelet 文件中添加如下配置:
...
CPU_MANAGER_POLICY="--cpu-manager-policy=static"
RESERVED_CPUS="--reserved-cpus=xxx"
...
--reserved-cpus
参数为操作系统守护程序和 Kubernetes 系统守护程序预留一组明确指定编号的 CPU
,如"--reserved-cpus=0,1,2,3",或 CPU 范围列表 "--reserved-cpus=0-3" 都是可以的。
同样修改 kubelet 的 systemd 启动文件 /usr/lib/systemd/system/kubelet.service, 启动参数添加如下环境变量:
...
ExecStart=/usr/bin/kubelet ... ${CPU_MANAGER_POLICY} ${RESERVED_CPUS} ...
...
接下来驱逐节点上的 Pods,并通过删除 kubelet 根目录中的状态文件 cpu_manager_state
来手动重置 CPU 管理器:
cpu_manager_state
文件并重启 kubelet 服务:rm /var/lib/kubelet/cpu_manager_state
systemctl daemon-reload
systemctl restart kubelet
直接通过自定义 kubelet 参数的方式完成上述的参数添加,策略配置逻辑和上述存量节点(第一步)描述一致,但目前自定义参数需要开白支持,可联系售后同学帮忙开启即可。
上述内容仅描述了如何在 TKE 中开启静态CPU 管理策略, 关于工作负载的 CPU 静态绑核如何配置和注意事项,请参阅 static 策略。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。