本页面演示如何为在 命名空间 中运行的容器所使用的内存设置最小值和最大值。您可以在 LimitRange 对象中指定最小和最大内存值。如果 Pod 不满足 LimitRange 所施加的约束,则它无法在该命名空间中创建。
你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。
您必须有权在集群中创建命名空间。
集群中的每个节点必须至少有 1 GiB 的内存可供 Pod 使用。
创建一个命名空间,以便您在此练习中创建的资源与集群的其余部分隔离。
kubectl create namespace constraints-mem-example
这是一个 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 清单。该容器指定了 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 清单。该容器指定了 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 清单。该容器未指定内存请求,也未指定内存限制。
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