为命名空间配置最小和最大内存约束

为命名空间定义有效内存资源限制的范围,以便该命名空间中的每个新 Pod 都符合您配置的范围。

本页面演示如何为在 命名空间 中运行的容器所使用的内存设置最小值和最大值。您可以在 LimitRange 对象中指定最小和最大内存值。如果 Pod 不满足 LimitRange 所施加的约束,则它无法在该命名空间中创建。

开始之前

你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。

您必须有权在集群中创建命名空间。

集群中的每个节点必须至少有 1 GiB 的内存可供 Pod 使用。

创建命名空间

创建一个命名空间,以便您在此练习中创建的资源与集群的其余部分隔离。

kubectl create namespace constraints-mem-example

创建 LimitRange 和 Pod

这是一个 LimitRange 的清单示例

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-min-max-demo-lr
spec:
  limits:
  - max:
      memory: 1Gi
    min:
      memory: 500Mi
    type: Container

创建 LimitRange

kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints.yaml --namespace=constraints-mem-example

查看有关 LimitRange 的详细信息

kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml

输出按预期显示了最小和最大内存约束。但请注意,即使您在 LimitRange 的配置文件中没有指定默认值,它们也会自动创建。

  limits:
  - default:
      memory: 1Gi
    defaultRequest:
      memory: 1Gi
    max:
      memory: 1Gi
    min:
      memory: 500Mi
    type: Container

现在,每当您在 constraints-mem-example 命名空间内定义 Pod 时,Kubernetes 都会执行以下步骤

  • 如果该 Pod 中的任何容器没有指定自己的内存请求和限制,控制平面会为该容器分配默认的内存请求和限制。

  • 验证该 Pod 中的每个容器是否都请求至少 500 MiB 内存。

  • 验证该 Pod 中的每个容器所请求的内存是否不超过 1024 MiB (1 GiB)。

这里有一个包含一个容器的 Pod 清单。在 Pod 规约(spec)中,该唯一容器指定了 600 MiB 的内存请求和 800 MiB 的内存限制。这些满足了 LimitRange 施加的最小和最大内存约束。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo
spec:
  containers:
  - name: constraints-mem-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
      requests:
        memory: "600Mi"

创建 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod.yaml --namespace=constraints-mem-example

验证 Pod 正在运行且其容器健康

kubectl get pod constraints-mem-demo --namespace=constraints-mem-example

查看 Pod 的详细信息

kubectl get pod constraints-mem-demo --output=yaml --namespace=constraints-mem-example

输出显示该 Pod 中的容器具有 600 MiB 的内存请求和 800 MiB 的内存限制。这些满足了此命名空间内 LimitRange 施加的约束

resources:
  limits:
     memory: 800Mi
  requests:
    memory: 600Mi

删除您的 Pod

kubectl delete pod constraints-mem-demo --namespace=constraints-mem-example

尝试创建一个超出最大内存限制的 Pod

这里有一个包含一个容器的 Pod 清单。该容器指定了 800 MiB 的内存请求和 1.5 GiB 的内存限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo-2
spec:
  containers:
  - name: constraints-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1.5Gi"
      requests:
        memory: "800Mi"

尝试创建 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-2.yaml --namespace=constraints-mem-example

输出显示该 Pod 未能创建,因为它定义的容器请求的内存超过了允许范围

Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-2.yaml":
pods "constraints-mem-demo-2" is forbidden: maximum memory usage per Container is 1Gi, but limit is 1536Mi.

尝试创建一个不满足最小内存请求的 Pod

这里有一个包含一个容器的 Pod 清单。该容器指定了 100 MiB 的内存请求和 800 MiB 的内存限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo-3
spec:
  containers:
  - name: constraints-mem-demo-3-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
      requests:
        memory: "100Mi"

尝试创建 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-3.yaml --namespace=constraints-mem-example

输出显示该 Pod 未能创建,因为它定义的容器请求的内存低于强制执行的最小值

Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-3.yaml":
pods "constraints-mem-demo-3" is forbidden: minimum memory usage per Container is 500Mi, but request is 100Mi.

创建一个未指定任何内存请求或限制的 Pod

这里有一个包含一个容器的 Pod 清单。该容器未指定内存请求,也未指定内存限制。

apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo-4
spec:
  containers:
  - name: constraints-mem-demo-4-ctr
    image: nginx

创建 Pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-4.yaml --namespace=constraints-mem-example

查看 Pod 的详细信息

kubectl get pod constraints-mem-demo-4 --namespace=constraints-mem-example --output=yaml

输出显示该 Pod 的唯一容器具有 1 GiB 的内存请求和 1 GiB 的内存限制。该容器是如何获得这些值的?

resources:
  limits:
    memory: 1Gi
  requests:
    memory: 1Gi

因为您的 Pod 没有为该容器定义任何内存请求和限制,集群从 LimitRange 应用了默认的内存请求和限制

这意味着该 Pod 的定义显示了这些值。您可以使用 kubectl describe 进行检查

# Look for the "Requests:" section of the output
kubectl describe pod constraints-mem-demo-4 --namespace=constraints-mem-example

此时,您的 Pod 可能正在运行,也可能没有运行。回想一下,此任务的前提条件是您的节点至少有 1 GiB 内存。如果您的每个节点只有 1 GiB 内存,那么任何节点上都没有足够的可用内存来容纳 1 GiB 的内存请求。如果您使用的节点有 2 GiB 内存,那么您可能就有足够的空间来容纳 1 GiB 的请求。

删除您的 Pod

kubectl delete pod constraints-mem-demo-4 --namespace=constraints-mem-example

强制执行最小和最大内存约束

LimitRange 对命名空间施加的最大和最小内存约束仅在 Pod 创建或更新时强制执行。如果您更改 LimitRange,它不会影响之前创建的 Pod。

说明

当使用就地 Pod 资源调整(In-place Pod resize)时,内存约束也会被强制执行。如果调整大小会导致 Pod 的内存值违反 LimitRange 约束(要么超过最大值,要么低于最小值),则调整请求将被拒绝,Pod 的资源将保持其先前的值。

设置最小和最大内存约束的动机

作为集群管理员,您可能希望对 Pod 可以使用的内存量施加限制。例如

  • 集群中的每个节点都有 2 GiB 内存。您不希望接受任何请求超过 2 GiB 内存的 Pod,因为集群中没有任何节点可以支持该请求。

  • 一个集群由您的生产部门和开发部门共享。您希望允许生产工作负载消耗最多 8 GiB 的内存,但希望将开发工作负载限制为 512 MiB。您可以为生产和开发创建单独的命名空间,并将内存约束应用于每个命名空间。

清理

删除您的命名空间

kubectl delete namespace constraints-mem-example

接下来

针对集群管理员

针对应用开发者


最后修改于 2026 年 1 月 9 日太平洋标准时间下午 7:49:向概念和任务页面添加 Pod 调整大小文档 (cf1ef9e145)