背景

默认情况下,如果一台服务器上部署了多个服务,那么这些服务之间是共享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"

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐