有没有办法获取容器内的实际资源(CPU 和内存)约束?
假设节点有 4 个核心,但我的容器通过资源请求/限制仅配置了 1 个核心,因此它实际上使用了 1 个核心,但它仍然从 /proc/cpuinfo 看到 4 个核心。我想根据应用程序实际可以使用的核心数来确定应用程序的线程数。我对记忆也很感兴趣。
您可以使用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$ 节点,有人吗?)
/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 调整分数。祝你好运,计算回内存请求量:)简短的回答很好,对吧? ;)
您可以使用
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
您可以在 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"