首页 > 解决方案 > 从 docker 容器中隐藏节点核心数

问题描述

我目前正在构建一个系统,该系统在 kubernetes 集群中的单个部署中运行服务,并且需要限制容器内的可见核心。

节点规格:
8 核
16 GB 内存

当我部署时,登录到容器并使用 python 的multiprocessing模块检查核心数,我得到以下输出:

In [1]: import multiprocessing
In [2]: multiprocessing.cpu_count()
Out[2]: 8

看到我的节点有 8 个核心,这个输出是正确的。

我希望容器在运行相同multiprocessing.cpu_count()命令时返回核心计数 1 作为核心计数。

示例用例如下:

开发人员创建一个运行 python 和 gunicorn 的 api 服务,gunicorn 的默认行为是为可用的内核数量创建工作程序。

当 pod 只允许 100m CPU 和 300m Mem 时,以上将是一个问题,因为 8 个工作人员会在某个时候填满内存并且 pod 会崩溃,我也想隐藏这一点,以防潜在的混乱和意外以编程方式检测资源时的行为。

我曾尝试使用该--cpuset-cpus=0标志,因为它作为一种潜在的解决方案脱颖而出,但据我了解和经验,这只会将容器限制为指定的核心,而不会隐藏其他 7 个核心。

有没有办法做到这一点,任何帮助将不胜感激。

标签: pythondockerkubernetesmultiprocessing

解决方案


你可以有一个环境变量NUM_CPUS,如果它存在,你应该使用它而不是multiprocessing.cpu_count(). 就像是:

import os

num_cpus = os.getenv("NUM_CPUS")
if num_cpus is not None:
    cpu_count = max(round(num_cpus), 1)
else:
    cpu_count = multiprocessing.cpu_count()       

推荐阅读