【问题标题】:Sharing CPU limits for containers within a pod共享 pod 中容器的 CPU 限制
【发布时间】:2019-02-04 17:32:56
【问题描述】:

在 Openshift/Kubernetes 中,我想测试由 2 个容器组成的应用程序(pod)如何在具有不同内核数的机器上执行。我手头的机器有 32 个核心,但我想限制为 4、8、16...

一种方法是在容器上使用资源限制,但这会迫使我在每个容器上设置比率;相反,我想为整个 pod 设置资源限制,让容器在 CPU 上竞争。我的感觉是这应该是可能的,因为容器可以属于同一个 cgroup,因此共享调度程序 POV 的限制。

pod 上的 LimitRange 会满足我的要求吗? LimitRange 是项目/命名空间范围的,有没有办法以更精细的粒度实现相同的目标(仅适用于某些 pod)?

【问题讨论】:

    标签: kubernetes resources openshift throttling cgroups


    【解决方案1】:

    根据documentation:资源限制仅适用于容器级别。但是,您可以定义不同的 requestslimits 以允许容器爆发超出请求中定义的数量。但这还有其他含义,请参阅Quality of Service

    这是因为某些资源(例如内存)无法竞争,因为它适用于 CPU。内存要么足够,要么太少。 Kubernetes 中没有共享 RAM 这样的东西。 (如果您没有明确调用相关的系统调用)

    请问,Pod 内部 CPU 竞争的用例是什么?

    【讨论】:

    • 两个容器在功能上协作完成任务,我不想寻找容器之间的最佳比例;我想要的只是将 N 个核心分配给逻辑任务。
    • 您好,谢谢您的解释。恕我直言,这是一个有效的用例。正如答案中所述,目前不可能。我想你会花一些时间研究最优的。我会将一个容器限制为例如一个 cpu,然后测量另一个不受限制的容器的 CPU 负载。通过这种方式,您可以获得可以应用于要使用的 CPU 数量的比率。然而,这假设了一个不随时间变化的稳定配给。顺便说一句,如果您接受答案,如果它对您有帮助,我将不胜感激。
    • 抱歉,忘记接受了……至少你确认了似乎是这样的情况。顺便说一句,你知道 LimitRange 是否会满足我的要求吗?假设我可以为 pod 创建一个单独的命名空间...
    • 谢谢。不,limitranges 仅设置默认资源请求和限制(如果不存在)...
    【解决方案2】:

    如何使用资源配额控制 K8S 集群内的资源使用情况。这应该使您能够在通过 LimitRange 设置的不同条件或直接使用 Container 的资源限制和请求设置的不同条件下,借助 kube_resourcequota 监控指标对专用命名空间内的 pod 的 cpu/内存使用情况进行基准测试。

    我的意思是设置资源配额类似于this一:

    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: mem-cpu-demo
    spec:
      hard:
        requests.cpu: "1"
        requests.memory: 1Gi
        limits.cpu: "2"
        limits.memory: 2Gi
        pods: "1"
    

    使用资源限制和请求运行 pod:

     ...
     containers:
        - image: gcr.io/google-samples/hello-app:1.0
          imagePullPolicy: IfNotPresent
          name: hello-app
          ports:
          - containerPort: 8080
            protocol: TCP
          resources:
            limits:
              cpu: "1"
              memory: 800Mi
            requests:
              cpu: 900m
              memory: 600Mi 
      ...
    

    只需在监控控制台中观察 pod 的执行情况*,例如使用 Prometheus:

    * 绿色 - 代表 Pod 的整体内存使用情况, 红色 - 使用 ResourceQuota 设置的固定/硬资源限制

    我猜你选择减少行之间的间隙以避免未充分使用的系统,同时避免像这样的 Pod 故障:

      status:
        message: 'Pod Node didn''t have enough resource: cpu, requested: 400, used: 893,
          capacity: 940'
        phase: Failed
        reason: OutOfcpu
    

    当然,如果这种内存使用趋势与您感兴趣的其他一些自定义/性能监控指标叠加在驾驶舱图表上,那当然是理想的。

    【讨论】:

    • IIUC ResourceQuota 仅强制设置资源限制并且请求资源的总和不超过阈值;它不影响调度本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2019-01-16
    相关资源
    最近更新 更多