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

Kubernetes:获取容器内的实际资源限制,kubernetes,Kubernetes,有没有办法获得容器中的实际资源(CPU和内存)约束 假设节点有4个核心,但我的容器通过资源请求/限制仅配置了1个核心,因此它实际上使用了1个核心,但它仍然可以从/proc/cpuinfo看到4个核心。我想根据应用程序实际可以使用的内核数来确定应用程序的线程数。我还对内存感兴趣。您可以使用kubectl descripe nodes命令检查节点容量和分配的数量。例如: kubectl describe nodes e2e-test-node-pool-4lw4 Pod的每个容器可以指定以下一项或

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


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

您可以使用
kubectl descripe 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
简短回答 您可以使用访问资源请求和限制。为此,不需要服务帐户或对apiserver的任何其他访问

例如:

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
测试:

长话短说 Kubernetes将资源请求和限制转换为内核原语。也可以从pod访问这些信息,但要复杂得多,而且不可移植(Window$nodes,有人吗?)

  • 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得到CPU限制,相对于1个核心)
  • 内存限制:
    /sys/fs/cgroup/Memory/kubepods/.QOS../podXX/Memory.limit(以字节为单位)
  • 内存请求:这个很棘手。它在
    /proc/.PID../oom\u score\u adj
    下转换为oom调整分数。祝您在计算返回内存请求量时好运:)

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

我想指出的是,虽然@janos answer是有帮助的,但给出一个pod 1 CPU单元并不局限于只使用一个内核。。。您应该继续允许应用程序在多个线程中运行,特别是在有相当长的空闲时间的情况下。另一方面,如果您的应用程序在没有空闲(不基于事件)的情况下100%处理数字,那么您可能希望限制应用程序中的线程数量,因为您只分配了1个CPU单元。长答案很好。要从pod内部获取CPU内核的数量,只需执行以下操作:
CPUPOD=$(cat/sys/fs/cgroup/CPU/CPU.shares)
然后除以1024
echo$($CPUPOD/1024))
$ kubectl logs dapi-envars-resourcefieldref
125
250
33554432
67108864