分配 Pod 级别 CPU 和内存资源

特性状态: Kubernetes v1.32 [alpha] (enabled by default: false)

本页介绍除了容器级别的资源规约外,如何在 Pod 级别指定 CPU 和内存资源。 Kubernetes 节点基于 Pod 的资源请求分配资源。 这些请求可以在 Pod 级别定义,也可以逐个为 Pod 内的容器定义。 当两种级别的请求都存在时,Pod 级别的请求优先。

同样,Pod 的资源用量受限于限制值(limits),这些限制值也可以在 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 的内存请求和 0.5 核的 CPU 请求, 内存限制为 100 MiB,CPU 限制为 0.5 核。 Pod 本身具有 100 MiB 的内存请求和 1 核的 CPU 请求,以及 200 MiB 的内存限制和 1 核的 CPU 限制。

...
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

接下来

对于应用开发者

对于集群管理员

最后修改 December 24, 2024 at 9:31 AM PST: [zh] Add assign-pod-level-resources.md (112b14941d)