控制节点上的 CPU 管理策略

    按照设计,Kubernetes 对 pod 执行相关的很多方面进行了抽象,使得用户不必关心。 然而,为了正常运行,有些工作负载要求在延迟和/或性能方面有更强的保证。 为此,kubelet 提供方法来实现更复杂的负载放置策略,同时保持抽象,避免显式的放置指令。

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 kubectl version.

    CPU 管理策略

    默认情况下,kubelet 使用 CFS 配额 来执行 Pod 的 CPU 约束。 当节点上运行了很多 CPU 密集的 Pod 时,工作负载可能会迁移到不同的 CPU 核, 这取决于调度时 Pod 是否被扼制,以及哪些 CPU 核是可用的。 许多工作负载对这种迁移不敏感,因此无需任何干预即可正常工作。

    然而,有些工作负载的性能明显地受到 CPU 缓存亲和性以及调度延迟的影响。 对此,kubelet 提供了可选的 CPU 管理策略,来确定节点上的一些分配偏好。

    CPU 管理策略通过 kubelet 参数 --cpu-manager-policy 来指定。支持两种策略:

    • none: 默认策略,表示现有的调度行为。
    • static: 允许为节点上具有某些资源特征的 pod 赋予增强的 CPU 亲和性和独占性。

    none 策略显式地启用现有的默认 CPU 亲和方案,不提供操作系统调度器默认行为之外的亲和性策略。 通过 CFS 配额来实现 的 CPU 使用限制。

    static 策略针对具有整数型 CPU requestsGuaranteed Pod ,它允许该类 Pod 中的容器访问节点上的独占 CPU 资源。这种独占性是使用 cpuset cgroup 控制器 来实现的。

    该策略管理一个共享 CPU 资源池,最初,该资源池包含节点上所有的 CPU 资源。可用 的独占性 CPU 资源数量等于节点的 CPU 总量减去通过 --kube-reserved--system-reserved 参数保留的 CPU 。从1.17版本开始,CPU保留列表可以通过 kublet 的 ‘—reserved-cpus’ 参数显式地设置。 通过 ‘—reserved-cpus’ 指定的显式CPU列表优先于使用 ‘—kube-reserved’ 和 ‘—system-reserved’ 参数指定的保留CPU。 通过这些参数预留的 CPU 是以整数方式,按物理内 核 ID 升序从初始共享池获取的。 共享池是 BestEffortBurstable pod 运行 的 CPU 集合。Guaranteed pod 中的容器,如果声明了非整数值的 CPU requests ,也将运行在共享池的 CPU 上。只有 Guaranteed pod 中,指定了整数型 CPU requests 的容器,才会被分配独占 CPU 资源。

    说明: 当启用 static 策略时,要求使用 --kube-reserved 和/或 --system-reserved--reserved-cpus 来保证预留的 CPU 值大于零。 这是因为零预留 CPU 值可能使得共享池变空。

    考虑以下 Pod 规格的容器:

    该 Pod 属于 QoS 类型,因为其未指定 requestslimits 值。 所以该容器运行在共享 CPU 池中。

    1. spec:
    2. containers:
    3. image: nginx
    4. resources:
    5. limits:
    6. memory: "200Mi"
    7. requests:
    8. memory: "100Mi"

    该 Pod 属于 Burstable QoS 类型,因为其资源 requests 不等于 limits,且未指定 cpu 数量。 所以该容器运行在共享 CPU 池中。

    该 pod 属于 Burstable QoS 类型,因为其资源 requests 不等于 limits。 所以该容器运行在共享 CPU 池中。

    1. spec:
    2. containers:
    3. - name: nginx
    4. image: nginx
    5. resources:
    6. cpu: "2"
    7. requests:
    8. memory: "200Mi"
    9. cpu: "2"

    该 Pod 属于 Guaranteed QoS 类型,因为其 requests 值与 limits相等。 同时,容器对 CPU 资源的限制值是一个大于或等于 1 的整数值。 所以,该 nginx 容器被赋予 2 个独占 CPU。

    该 Pod 属于 Guaranteed QoS 类型,因为其 requests 值与 limits相等。 但是容器对 CPU 资源的限制值是一个小数。所以该容器运行在共享 CPU 池中。

    1. spec:
    2. containers:
    3. - name: nginx
    4. image: nginx
    5. resources:
    6. limits:
    7. cpu: "2"