为命名空间配置最小和最大内存限制
此页面介绍如何设置在 命名空间 中运行的容器使用的内存的最小值和最大值。您在 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