k8s集群CPU静态调度实施
背景默认情况下,如果一台服务器上部署了多个服务,那么这些服务之间是共享GPU资源的,当服务存在资源竞争时,性能敏感的服务可能会发生剧烈的性能抖动。通过k8s部署的服务,默认情况下,kubelet 使用 CFS 配额 来执行 pod 的 CPU 约束。当节点上运行了很多 CPU 密集的 pod 时,工作负载可能会迁移到不同的 CPU 核,这取决于调度时 pod 是否被扼制,以及哪些 CPU 核是可用
背景
默认情况下,如果一台服务器上部署了多个服务,那么这些服务之间是共享GPU资源的,当服务存在资源竞争时,性能敏感的服务可能会发生剧烈的性能抖动。
通过k8s部署的服务,默认情况下,kubelet
使用 CFS 配额 来执行 pod 的 CPU 约束。当节点上运行了很多 CPU 密集的 pod 时,工作负载可能会迁移到不同的 CPU 核,这取决于调度时 pod 是否被扼制,以及哪些 CPU 核是可用的。许多工作负载对这种迁移不敏感,因此无需任何干预即可正常工作。
然而对于性能敏感的服务,性能明显地受到 CPU 缓存亲和性以及调度延迟的影响。那么,有没有某种方式能够将CPU核心绑定给某个服务使用,从而减少CPU资源晶振和切换带来的性能抖动呢?答案是肯定的,kubelet
提供了可选的 CPU 管理策略。
下面将通过具体的步骤,介绍如何实现k8s集群CPU的静态调度。
版本信息
version:1.12.5
配置系统预留CPU
当启用static策略时,要求使用--kebe-reserved
或--system-reserved
来保证预留的CPU值大于0,以确保共享池中的CPU不会变空。否则,只修改CPU调度策略,会导致kubelet无法启动。
配置kube-reserved项:
-
在配置文件
/var/lib/kubelet/kubeadm-flags.env
中追加参数--kube-reserved=cpu=1000m
-
重启kubelet:
systemctl restart kubelet
修改CPU调度策略
-
禁止机器调度
kubectl cordon [node-name]
-
驱逐节点上的容器
kubectl drain [node-name]
-
停止kubelet
systemctl stop kubelet
-
删除
/var/lib/kubelet/cpu_manager_state
【不同版本,或不同初始配置情况下,文件路径可能不同,如果无法得知该文件所在位置,可以跳过该步骤,待启动kubelet失败后,查看kubelet日志,日志中会提示删除该文件】 -
编辑配置文件:
/var/lib/kubelet/config.yaml
-
配置项
cpuManagerPolicy
的值修改为static
-
重启kubelet:
systemctl restart kubelet
-
恢复机器调度
kubectl undordon [node-name]
验证示例
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: cpu-static
spec:
replicas: 1
template:
metadata:
labels:
name: cpu-static
spec:
nodeSelector:
node-role.kubernetes.io/master: ''
kubernetes.io/hostname: hf-master-03.aiaas.cn
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Equal"
value: ""
effect: "NoSchedule"
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 4
memory: 200Mi
requests:
cpu: 4
memory: 200Mi
通过docker inspect [container-id]
查看容器的信息,CpusetCpus
是具体的CPU编号枚举值,形如:"CpusetCpus": "3,5,15,17"
。非CPU静态调度的则为除已经被绑定CPU编号之外的范围值,形如:"CpusetCpus": "0-2,4,6-14,16,18-23"
。
更多推荐
所有评论(0)