为命名空间配置最小和最大内存限制

为命名空间定义一个有效内存资源限制范围,以便该命名空间中的每个新 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 规范中,唯一容器指定 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 可以使用的内存量施加限制。例如

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

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

清理

删除您的命名空间

kubectl delete namespace constraints-mem-example

下一步

针对集群管理员

针对应用程序开发人员

上次修改时间:2023 年 8 月 24 日下午 6:38 PST:使用 code_sample shortcode 代替 code shortcode (e8b136c3b3)