为命名空间配置最小和最大内存约束
本页面介绍如何为 命名空间 中运行的容器使用的内存设置最小值和最大值。您可以在 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
强制执行最小和最大内存约束
仅当创建或更新 Pod 时,才会强制执行 LimitRange 对命名空间施加的最大和最小内存约束。如果您更改 LimitRange,它不会影响以前创建的 Pod。
最小和最大内存约束的动机
作为集群管理员,您可能希望对 Pod 可以使用的内存量施加限制。例如
集群中的每个节点都有 2 GiB 的内存。您不想接受任何请求超过 2 GiB 内存的 Pod,因为集群中的任何节点都无法支持该请求。
一个集群由您的生产部门和开发部门共享。您希望允许生产工作负载最多消耗 8 GiB 的内存,但希望将开发工作负载限制为 512 MiB。您为生产和开发创建了单独的命名空间,并对每个命名空间应用了内存约束。
清理
删除您的命名空间
kubectl delete namespace constraints-mem-example