Kubernetes:获取容器内的实际资源限制

问题描述 投票:0回答:3

有没有办法获取容器内的实际资源(CPU 和内存)约束?

假设节点有 4 个核心,但我的容器通过资源请求/限制仅配置了 1 个核心,因此它实际上使用了 1 个核心,但它仍然从 /proc/cpuinfo 看到 4 个核心。我想根据应用程序实际可以使用的核心数来确定应用程序的线程数。我对记忆也很感兴趣。

kubernetes
3个回答
14
投票

简短回答

您可以使用Downward API来访问资源请求和限制。为此,不需要服务帐户或任何其他对 api 服务器的访问。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-resourcefieldref
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox:1.24
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_LIMIT;
          sleep 10;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      env:
        - name: MY_CPU_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.cpu
              divisor: "1m"
        - name: MY_CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.cpu
              divisor: "1m"
        - name: MY_MEM_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.memory
        - name: MY_MEM_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.memory
  restartPolicy: Never

测试:

$ kubectl logs dapi-envars-resourcefieldref
125
250
33554432
67108864

长答案

Kubernetes 将资源请求和限制转换为内核原语。也可以从 Pod 访问该信息,但要复杂得多,而且不可移植(Window$ 节点,有人吗?)

  • CPU 请求/限制:
    /sys/fs/cgroup/cpu/kubepods/..QOS../podXX/cpu.*
    :cpu.shares(这是请求;除以 1024 以获得核心百分比)、cpu.cfs_period_us、cpu.cfs_quota_us(将 cfs_quota_us 除以 cfs_period_us 以获得相对于 1 个核心的 cpu 限制)
  • 内存限制:
    /sys/fs/cgroup/memory/kubepods/..QOS../podXX/memory.limit_in_bytes
  • 内存请求:这个很棘手。它被转化为
    /proc/..PID../oom_score_adj
    下的 oom 调整分数。祝你好运,计算回内存请求量:)

简短的回答很好,对吧? ;)


1
投票

您可以使用

kubectl describe nodes
命令检查节点容量和分配的数量。例如:

kubectl describe nodes e2e-test-node-pool-4lw4

Pod 的每个容器都可以指定以下一项或多项:

spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory

0
投票

您可以在 Linux 容器内运行这些命令来列出确切分配的资源:

CPU=`cat /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us`
MEM=`cat /sys/fs/cgroup/memory/memory.limit_in_bytes | numfmt --to=iec`
echo "Compute Resource: $(( $CPU/100000 )) x $MEM"
© www.soinside.com 2019 - 2024. All rights reserved.