配置命名空间的默认内存请求和限制

为 Namespace 定义默认内存资源限制,以便该 Namespace 中的每个新 Pod 都配置内存资源限制。

本页介绍如何为 Namespace 配置默认内存请求和限制。

一个 Kubernetes 集群可以划分为多个 Namespace。如果一个 Namespace 配置了默认内存限制,而你试图创建一个 Pod,其中容器未指定自己的内存限制,那么控制平面将为该容器分配默认内存限制。

Kubernetes 在某些条件下会分配默认内存请求,本主题稍后将对此进行解释。

准备工作

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

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

集群中的每个节点必须至少有 2 GiB 内存。

创建命名空间

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

kubectl create namespace default-mem-example

创建一个 LimitRange 和一个 Pod

以下是一个示例 LimitRange 的清单。此清单指定了默认内存请求和默认内存限制。

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

在 default-mem-example Namespace 中创建 LimitRange。

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

现在,如果你在 default-mem-example Namespace 中创建一个 Pod,并且该 Pod 中的任何容器都没有指定自己的内存请求和内存限制值,那么控制平面将应用默认值:内存请求为 256MiB,内存限制为 512MiB。

以下是一个包含一个容器的 Pod 的示例清单。该容器未指定内存请求和限制。

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

创建 Pod。

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

查看 Pod 的详细信息

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

输出显示 Pod 的容器具有 256 MiB 的内存请求和 512 MiB 的内存限制。这些是 LimitRange 指定的默认值。

containers:
- image: nginx
  imagePullPolicy: Always
  name: default-mem-demo-ctr
  resources:
    limits:
      memory: 512Mi
    requests:
      memory: 256Mi

删除你的 Pod

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

如果你指定了容器的限制,但未指定其请求,会发生什么?

以下是一个包含一个容器的 Pod 的清单。该容器指定了内存限制,但未指定请求。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-2
spec:
  containers:
  - name: default-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1Gi"

创建 Pod

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

查看 Pod 的详细信息

kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example

输出显示容器的内存请求被设置为与其内存限制匹配。请注意,该容器未被分配 256Mi 的默认内存请求值。

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

如果你指定了容器的请求,但未指定其限制,会发生什么?

以下是一个包含一个容器的 Pod 的清单。该容器指定了内存请求,但未指定限制。

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        memory: "128Mi"

创建 Pod

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

查看 Pod 的规范。

kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example

输出显示容器的内存请求被设置为容器清单中指定的值。该容器的内存使用限制为 512MiB,与该命名空间的默认内存限制相匹配。

resources:
  limits:
    memory: 512Mi
  requests:
    memory: 128Mi

默认内存限制和请求的动机

如果你的 Namespace 配置了内存资源配额,那么设置内存限制的默认值会很有帮助。以下是资源配额对 Namespace 施加的三个限制:

  • 对于在该 Namespace 中运行的每个 Pod,Pod 及其每个容器都必须有内存限制。(如果为 Pod 中的每个容器都指定了内存限制,Kubernetes 可以通过将其容器的限制相加来推断 Pod 级别的内存限制)。
  • 内存限制对 Pod 调度到的节点施加资源保留。Namespace 中所有 Pod 保留的内存总量不能超过指定限制。
  • Namespace 中所有 Pod 实际使用的内存总量也不能超过指定限制。

当你添加 LimitRange 时:

如果该命名空间中包含容器的任何 Pod 未指定自己的内存限制,控制平面会将默认内存限制应用于该容器,并且该 Pod 可以被允许在受内存 ResourceQuota 限制的命名空间中运行。

清理

删除你的命名空间

kubectl delete namespace default-mem-example

下一步

致集群管理员

致应用开发者

最后修改于 2024 年 10 月 30 日下午 5:17 PST:KEP 2837:Pod 级别资源 Alpha (0374213f57)