分配 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 分数: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 指定 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 使用受到限制,因为容器正在尝试使用超出 Pod CPU 限制的 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 和 100 MiB 内存。此外,两个容器加起来使用的资源不会超过 Pod 级别限制中指定的资源,确保它们不会超过 200 MiB 的总内存和 1 核 CPU。
清理
删除您的命名空间
kubectl delete namespace pod-resources-example