配置分配更合理的 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"说明配置成功。