配置分配更合理的 CPU 管理策略
在 Kubernetes 中,给容器组分配 CPU 的方法称为 CPU 管理策略。通过调整 CPU 管理策略,可为调度到节点上的容器组更合理地分配 CPU。
策略类型
kubelet 通过 --cpu-manager-policy
参数控制
CPU 管理策略
。当前使用策略记录在 /var/lib/kubelet/cpu_manager_state
文件中。
策略 | 含义 | 适用场景 |
---|---|---|
none | 默认策略,使用基于 CFS 配额的 CPU 亲和方案。 | 一般场景,可实现更有效的 CPU 资源利用。 |
static | 静态策略,允许特定容器组相对于其他容器组独占 CPU。 | 如有 CPU 敏感型容器组,可减少因节流调度导致的性能损耗。 |
静态策略使用限制
-
容器组的
limit
和request
取值需相等,且为整数。 -
不同节点可以使用不同分配策略,但是不利于管理。建议整个集群保持相同设置。
-
设置静态策略后,如果节点的 CPU 个数或规格发生变化,需删除
/var/lib/kubelet/cpu_manager_state
并重启 kubelet,静态策略才能继续生效。
配置策略
修改 /var/lib/kubelet/config.yaml
文件可配置 CPU 管理策略。下述操作均只针对同一集群内的各节点。
(可选)免密登录设置
如果集群中待设置的节点过多,为避免逐个输入节点密码,可开启节点间免密登录快速完成操作。
注意:CPU 分配策略配置成功后,务必要关闭免密登录确保环境安全。
开启免密登录
-
在控制节点上生成 SSH 密钥对。输入命令后,阅读提示并依次按下回车键确认。
ssh-keygen
-
复制密钥到所有目标节点。
ssh-copy-id root@{目标节点 IP}
说明:如果提示找不到此命令且无法安装,可手动将
.ssh/id_rsa.pub
文件中内容添加到待配置节点的.ssh/authorized_keys
文件。
关闭免密登录
注意:此操作将删除所有已记住公钥,请确保不会影响已有业务。
for i in $(kubectl get nodes | grep -vi name | awk '{print $1}')
do
ssh root@$i "rm /root/.ssh/authorized_keys"
done
启用静态策略
在控制节点执行操作。
KUBECONFIG="/var/lib/kubelet/config.yaml"
BACKUPCONFIG="/root/kubelet-config-before-set-static.yaml"
for i in $(kubectl get nodes | grep -vi name | awk '{print $1}')
do
ssh root@$i "cp ${KUBECONFIG} ${BACKUPCONFIG}; sed -i '/^cpuManagerPolicy.*/d' ${KUBECONFIG}; sed -i '/cpuManagerReconcilePeriod*/acpuManagerPolicy: static' ${KUBECONFIG}; sed -i 's/ cpu: 100m/ cpu: 500m/g' ${KUBECONFIG}; rm -f /var/lib/kubelet/cpu_manager_state; systemctl restart kubelet "
done
恢复默认策略
在控制节点执行操作。
KUBECONFIG="/var/lib/kubelet/config.yaml"
BACKUPCONFIG="/root/kubelet-config-before-set-none.yaml"
for i in $(kubectl get nodes | grep -vi name | awk '{print $1}')
do
ssh root@$i "cp ${KUBECONFIG} ${BACKUPCONFIG}; sed -i '/^cpuManagerPolicy.*/d' ${KUBECONFIG}; sed -i '/cpuManagerReconcilePeriod*/acpuManagerPolicy: none' ${KUBECONFIG} ; rm /var/lib/kubelet/cpu_manager_state ; systemctl restart kubelet"
done
验证
等待约 30 秒重新生成 /var/lib/kubelet/cpu_manager_state
文件后,在控制节点执行操作。
for i in $(kubectl get nodes | grep -vi name | awk '{print $1}')
do
ssh root@$i "cat /var/lib/kubelet/cpu_manager_state"
done
-
启用静态策略时,所有目标节点的回显中都带有
"policyName":"static"
说明配置成功。 -
恢复默认策略时,所有目标节点的回显中都带有
"policyName":"none"
说明配置成功。