【问题标题】:Limit total CPU core docker can allocate限制 docker 可以分配的 CPU 内核总数
【发布时间】:2021-04-20 10:23:06
【问题描述】:

我正在使用 docker/K8s 部署一些 pod。

现在,我需要限制工作人员可用于运行容器的总 CPU(而不是限制每个容器的 CPU)。

例如:我们有 24 核 Linux 服务器。但我只想为 docker 运行时使用 20 个内核。

我们可以这样做吗?

【问题讨论】:

  • Kubernetes 的典型假设是它对其运行的节点拥有绝对控制权;通常,像集群自动缩放器这样的工具会创建或销毁您直接控制之外的节点。你想用这个保留的容量做什么,你希望它保留到什么程度? (您是只想将资源请求限制在节点容量的 80%,还是限制实际利用率,还是保留核心?)
  • 因为在同一个工作服务器中,我们有一些其他代理(防病毒、监视器..)可能占用 CPU,所以我需要限制 docker 运行时的 CPU 数量(不是所有 CPU 核心)。
  • 只需运行这些进程(可能通过 Kubernetes DaemonSets),主机内核就会负责分配 CPU 片。

标签: docker kubernetes


【解决方案1】:

您可以限制操作系统中 docker 的资源:

  1. 使用以下内容创建文件/etc/systemd/system/docker_limit.slice

    [Unit]
    Description=Slice that limits docker resources
    Before=slices.target
    
    [Slice]
    CPUAccounting=true
    CPUQuota=2000% 
    
  2. 起始单位:systemctl start docker_limit.slice

  3. 编辑/etc/docker/daemon.json

    {
      "cgroup-parent": "/docker_limit.slice"
    }
    
  4. 重启 Docker 守护进程:systemctl restart docker

感谢@Leletir

提示: 我们采用2000% 的配额,因为CPUQuota 与一个 CPU(在您的情况下为20 CPU * 100%)相关:

CPU配额=

将指定的 CPU 时间配额分配给执行的进程。需要一个 百分比值,后缀为“%”。百分比指定多少 相对于总 CPU 时间,单元应获得的最大 CPU 时间 在一个 CPU 上可用。 使用值 > 100% 来分配更多 CPU 时间 超过一个 CPU。 这控制统一上的“cpu.max”属性 控制组层次结构和旧版上的“cpu.cfs_quota_us”。详情 关于这些控制组属性,请参阅控制组 v2 和 sched-bwc.txt。

示例:CPUQuota=20% 确保执行的进程永远不会 在一个 CPU 上获得超过 20% 的 CPU 时间。

您可以从systemd.resource-control 的手册页中获得有关参数的更多详细信息:

$ man systemd.resource-control

或https://www.freedesktop.org/software/systemd/man/systemd.resource-control.html

【讨论】:

  • 我们可以配置 CPU 内核而不是百分比吗?我会尝试您的解决方案并告诉您结果。
  • 你好 @user3611168 来自手册页 (man systemd.resource-control) 它说它只接受百分比值 (Assign the specified CPU time quota to the processes executed. Takes a percentage value, suffixed with "%". The percentage specifies how much CPU time the unit shall get at maximum, relative to the total CPU time available on one CPU. Use values > 100% for allotting CPU time on more than one CPU.)
【解决方案2】:

我建议查看Kubelet configuration parameters。 systemReserved、reservedSystemCPUs 等参数可以帮助您完成所需的工作。

过去这些是Kubelet options,但现在不推荐使用这些,取而代之的是配置文件。

【讨论】:

【解决方案3】:

每个容器对主机 CPU 周期的访问是无限制的。你可以对limit给定容器对宿主机CPU周期的访问设置各种约束,k8s使用内核节流来实现CPU限制。 (容器不能使用超过其资源limit 例如CPU 表示计算处理,以Kubernetes CPUs 为单位指定

cgroups 被用于控制 CPU 调度和隔离容器级别的 CPU 使用,kubelet 使用 CFS 配额机制来强制 pod CPU 限制你可以设置 --cpu-manager-policy kubelet 选项,看看这个答案:Changing the CPU Manager Policy in Kubernetes

https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#configuration

附带说明,通常在主机级别,您可以尝试配置 CFS 调度程序或实时调度程序

https://docs.docker.com/config/containers/resource_constraints/#configure-the-default-cfs-scheduler https://docs.docker.com/config/containers/resource_constraints/#configure-the-realtime-scheduler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-09-18
    • 2019-01-04
    • 2022-08-15
    • 2021-02-11
    相关资源
    最近更新 更多