<p>Is there a way to get the actual resource (CPU and memory) constraints inside a container?</p>

<p>Say the node has 4 cores, but my container is only configured with 1 core through resource requests/limits, so it actually uses 1 core, but it still sees 4 cores from /proc/cpuinfo. I want to determine the number of threads for my application based on the number of cores it can actually use. I'm also interested in memory.</p>

<h2>Short answer</h2>

<p>You can use the <a href="https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#use-container-fields-as-values-for-environment-variables" rel="noreferrer">Downward API</a> to access the resource requests and limits. There is no need for service accounts or any other access to the apiserver for this.</p>

<p>Example:</p>

<pre><code>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
</code></pre>

<p>Test:</p>

<pre><code>$ kubectl logs dapi-envars-resourcefieldref
125
250
33554432
67108864
</code></pre>

<h2>Long answer</h2>

<p>Kubernetes translates resource requests and limits to kernel primitives. It is possible to access that information from the pod too, but considerably more complicated and also not portable (Window$ nodes, anyone?)</p>

<ul>
<li>CPU requests/limits: <code>/sys/fs/cgroup/cpu/kubepods/..QOS../podXX/cpu.*</code> : cpu.shares (this is requests; divide by 1024 to get core percentage), cpu.cfs_period_us, cpu.cfs_quota_us (divide cfs_quota_us by cfs_period_us to get cpu limit, relative to 1 core)</li>
<li>Memory limit: <code>/sys/fs/cgroup/memory/kubepods/..QOS../podXX/memory.limit_in_bytes</code></li>
<li>Memory request: this one is tricky. It gets translated into oom adjustment scores under <code>/proc/..PID../oom_score_adj</code> . Good luck calculating that back to memory request amount :)</li>
</ul>

<p>Short answer is great, right? ;)</p>
