容器中容器的共享 CPU 限制

Sharing CPU limits for containers within a pod

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

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

pod 上的 LimitRange 是否符合我的要求? LimitRange 是 project/namespace 范围的,有没有办法以更细的粒度实现相同的效果(仅针对某些 pods)?

根据 documentation: resource constraints are only applicable on container level. You can however define different requests and limits to allow the container to burst beyond the amount defined in requests. But this comes with other implications see Quality of Service

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

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

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

我的意思是设置资源配额类似于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 的整体内存使用情况, 红色 - fixed/hard 使用 ResourceQuota

设置的资源限制

我猜你选择减少行之间的差距以避免系统提交不足,同时避免像这样的 Pod 故障:

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

当然,理想情况下,如果此内存使用趋势与您感兴趣的其他一些 custom/performance 监控指标叠加在驾驶舱图表上。