为 Pod 分配 Pod 级别 CPU 和内存资源
Kubernetes v1.32 [alpha]
(默认禁用:false)本页面展示了如何在容器级别资源规约的基础上,在 Pod 级别为 Pod 指定 CPU 和内存资源。Kubernetes 节点根据 Pod 的资源请求为 Pod 分配资源。这些请求可以在 Pod 级别定义,也可以为 Pod 中的每个容器单独定义。当两者都存在时,Pod 级别的请求优先。
类似地,Pod 的资源使用受到限制,这些限制也可以在 Pod 级别设置,或者为 Pod 中的每个容器单独设置。同样,当两者都存在时,Pod 级别的限制优先。这使得资源管理更加灵活,你可以在 Pod 级别和容器级别控制资源分配。
为了在 Pod 级别指定资源,需要启用 PodLevelResources
特性门控。
关于 Pod 级别资源
- 优先级:当同时指定 Pod 级别和容器级别资源时,Pod 级别资源优先。
- QoS:Pod 级别资源在影响 Pod 的 QoS 类别时具有优先权。
- OOM Score:OOM 分数调整的计算同时考虑 Pod 级别和容器级别资源。
- 兼容性:Pod 级别资源旨在与现有特性兼容。
开始之前
你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与你的集群通信。建议在至少有两个非控制平面主机的节点的集群上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用以下任一 Kubernetes 在线环境:
你的 Kubernetes 服务器版本必须是 1.32 或更高。要检查版本,输入 kubectl version
。
你的控制平面和集群中的所有节点都必须启用 PodLevelResources
特性门控。
创建命名空间
创建一个命名空间,以便在此练习中创建的资源与集群的其余部分隔离开。
kubectl create namespace pod-resources-example
在 Pod 级别创建具有内存请求和限制的 Pod
要在 Pod 级别为 Pod 指定内存请求,请在 Pod 规约清单中包含 resources.requests.memory
字段。要指定内存限制,请包含 resources.limits.memory
。
在本练习中,你将创建一个包含一个容器的 Pod。该 Pod 的内存请求为 100 MiB,内存限制为 200 MiB。以下是该 Pod 的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: memory-demo
namespace: pod-resources-example
spec:
resources:
requests:
memory: "100Mi"
limits:
memory: "200Mi"
containers:
- name: memory-demo-ctr
image: nginx
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
清单中的 args
部分为容器启动时提供参数。"--vm-bytes", "150M"
参数告诉容器尝试分配 150 MiB 内存。
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-memory-request-limit.yaml --namespace=pod-resources-example
验证 Pod 正在运行
kubectl get pod memory-demo --namespace=pod-resources-example
查看 Pod 的详细信息
kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example
输出显示该 Pod 的内存请求为 100 MiB,内存限制为 200 MiB。
...
spec:
containers:
...
resources:
requests:
memory: 100Mi
limits:
memory: 200Mi
...
运行 kubectl top
获取 Pod 的指标
kubectl top pod memory-demo --namespace=pod-resources-example
输出显示该 Pod 使用大约 162,900,000 字节内存,约为 150 MiB。这超出了 Pod 的 100 MiB 请求,但在 Pod 的 200 MiB 限制内。
NAME CPU(cores) MEMORY(bytes)
memory-demo <something> 162856960
在 Pod 级别创建具有 CPU 请求和限制的 Pod
要在 Pod 级别为 Pod 指定 CPU 请求,请在 Pod 规约清单中包含 resources.requests.cpu
字段。要指定 CPU 限制,请包含 resources.limits.cpu
。
在本练习中,你将创建一个包含一个容器的 Pod。该 Pod 的请求为 0.5 CPU,限制为 1 CPU。以下是该 Pod 的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: cpu-demo
namespace: pod-resources-example
spec:
resources:
limits:
cpu: "1"
requests:
cpu: "0.5"
containers:
- name: cpu-demo-ctr
image: vish/stress
args:
- -cpus
- "2"
配置文件的 args
部分为容器启动时提供参数。-cpus "2"
参数告诉容器尝试使用 2 个 CPU。
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-cpu-request-limit.yaml --namespace=pod-resources-example
验证 Pod 正在运行
kubectl get pod cpu-demo --namespace=pod-resources-example
查看 Pod 的详细信息
kubectl get pod cpu-demo --output=yaml --namespace=pod-resources-example
输出显示该 Pod 的 CPU 请求为 500 毫核(milliCPU),CPU 限制为 1 CPU。
spec:
containers:
...
resources:
limits:
cpu: "1"
requests:
cpu: 500m
使用 kubectl top
获取 Pod 的指标
kubectl top pod cpu-demo --namespace=pod-resources-example
此示例输出显示该 Pod 使用 974 毫核(milliCPU),略低于 Pod 配置中指定的 1 CPU 限制。
NAME CPU(cores) MEMORY(bytes)
cpu-demo 974m <something>
回顾一下,通过设置 -cpu "2"
,你配置容器尝试使用 2 个 CPU,但容器实际上只能使用大约 1 个 CPU。容器的 CPU 使用受到限制,因为容器尝试使用的 CPU 资源超过了 Pod 的 CPU 限制。
在 Pod 级别和容器级别创建具有资源请求和限制的 Pod
要为 Pod 分配 CPU 和内存资源,可以在 Pod 级别和容器级别进行指定。在 Pod 规约中包含 resources
字段来定义整个 Pod 的资源。此外,在 Pod 清单中容器的规约内包含 resources
字段来设置容器特定的资源需求。
在本练习中,你将创建一个包含两个容器的 Pod,以探索 Pod 级别和容器级别资源规约的相互作用。Pod 本身将定义 CPU 请求和限制,而其中只有一个容器会具有自己的明确资源请求和限制。另一个容器将继承 Pod 级别的资源约束。以下是该 Pod 的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: pod-resources-demo
namespace: pod-resources-example
spec:
resources:
limits:
cpu: "1"
memory: "200Mi"
requests:
cpu: "1"
memory: "100Mi"
containers:
- name: pod-resources-demo-ctr-1
image: nginx
resources:
limits:
cpu: "0.5"
memory: "100Mi"
requests:
cpu: "0.5"
memory: "50Mi"
- name: pod-resources-demo-ctr-2
image: fedora
command:
- sleep
- inf
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/resource/pod-level-resources.yaml --namespace=pod-resources-example
验证 Pod 容器正在运行
kubectl get pod-resources-demo --namespace=pod-resources-example
查看 Pod 的详细信息
kubectl get pod memory-demo --output=yaml --namespace=pod-resources-example
输出显示 Pod 中的一个容器内存请求为 50 MiB,CPU 请求为 0.5 核,内存限制为 100 MiB,CPU 限制为 0.5 核。Pod 本身的内存请求为 100 MiB,CPU 请求为 1 核,内存限制为 200 MiB,CPU 限制为 1 核。
...
containers:
name: pod-resources-demo-ctr-1
resources:
requests:
cpu: 500m
memory: 50Mi
limits:
cpu: 500m
memory: 100Mi
...
name: pod-resources-demo-ctr-2
resources: {}
resources:
limits:
cpu: 1
memory: 200Mi
requests:
cpu: 1
memory: 100Mi
...
由于指定了 Pod 级别的请求和限制,Pod 中两个容器的请求保障将等于 1 核或 CPU 和 100Mi 内存。此外,两个容器总共不能使用超过 Pod 级别限制中指定的资源,确保它们合计不会超过 200 MiB 内存和 1 核 CPU。
清理
删除你的命名空间
kubectl delete namespace pod-resources-example