Kubernetes 实操:创建 LimitRange 和 Pod 并管理内存资源
一、前言
在 Kubernetes 集群中,LimitRange 用于为命名空间内的容器设置默认资源请求(requests)和资源限额(limits),避免容器无限制占用资源。本文将通过实操演示如何创建 LimitRange、Pod,并验证不同资源配置场景下的默认值生效规则。
二、前提条件
-
已安装并配置
kubectl命令行工具,能连接到 Kubernetes 集群。 -
已创建命名空间
default-mem-example(若未创建,可执行kubectl create namespace default-mem-example)。
三、创建 LimitRange:设置默认内存资源规则
1. LimitRange 配置文件(memory-defaults.yaml)
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range # LimitRange 名称
spec:
limits:
- default:
memory: 512Mi # 容器默认内存限额(未指定时生效)
defaultRequest:
memory: 256Mi # 容器默认内存请求(未指定时生效)
type: Container # 规则作用对象:容器
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults.yaml --namespace=default-mem-example
- 作用:在
default-mem-example命名空间中创建 LimitRange,为所有未指定内存请求 / 限额的容器应用默认值(256Mi 请求,512Mi 限额)。
四、场景 1:创建无内存配置的 Pod
1. Pod 配置文件(memory-defaults-pod.yaml)
容器未指定任何内存请求或限额:
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo # Pod 名称
spec:
containers:
\- name: default-mem-demo-ctr # 容器名称
image: nginx # 基础镜像(Nginx)
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults-pod.yaml --namespace=default-mem-example
3. 验证默认值生效
查看 Pod 详细配置,验证 LimitRange 的默认值是否被应用:
kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example
4. 预期输出(关键部分)
容器自动继承 LimitRange 的默认配置:
containers:
\- image: nginx
imagePullPolicy: Always
name: default-mem-demo-ctr
resources:
limits:
memory: 512Mi # 继承默认限额
requests:
memory: 256Mi # 继承默认请求
5. 清理资源
kubectl delete pod default-mem-demo --namespace=default-mem-example
五、场景 2:创建仅指定内存限额的 Pod
1. Pod 配置文件(memory-defaults-pod-2.yaml)
容器仅指定内存限额,未指定请求:
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo-2 # Pod 名称
spec:
containers:
- name: defalt-mem-demo-2-ctr # 容器名称
image: nginx
resources:
limits:
memory: "1Gi" # 手动指定内存限额(1Gi)
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults-pod-2.yaml --namespace=default-mem-example
3. 验证资源配置
kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example
4. 预期输出(关键部分)
内存请求会自动与限额相等,不继承 LimitRange 的默认请求值:
resources:
limits:
memory: 1Gi # 手动指定的限额
requests:
memory: 1Gi # 自动匹配限额值(而非 256Mi)
5. 清理资源
kubectl delete pod default-mem-demo-2 --namespace=default-mem-example
六、场景 3:创建仅指定内存请求的 Pod
1. Pod 配置文件(memory-defaults-pod-3.yaml)
容器仅指定内存请求,未指定限额:
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo-3 # Pod 名称
spec:
containers:
\- name: default-mem-demo-3-ctr # 容器名称
image: nginx
resources:
requests:
memory: "128Mi" # 手动指定内存请求(128Mi)
2. 执行创建命令
kubectl create -f https://k8s.io/docs/tasks/administer-cluster/memory-defaults-pod-3.yaml --namespace=default-mem-example
3. 验证资源配置
kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example
4. 预期输出(关键部分)
内存限额会继承 LimitRange 的默认值(512Mi),请求值为手动指定:
resources:
limits:
memory: 512Mi # 继承 LimitRange 的默认限额
requests:
memory: 128Mi # 手动指定的请求
5. 清理资源
kubectl delete pod default-mem-demo-3 --namespace=default-mem-example
七、核心规则总结
| 容器资源配置场景 | 内存请求(requests) | 内存限额(limits) |
|---|---|---|
| 未指定请求和限额 | 继承 LimitRange 的 defaultRequest(256Mi) | 继承 LimitRange 的 default(512Mi) |
| 仅指定限额,未指定请求 | 自动匹配限额值(如 1Gi) | 手动指定值(如 1Gi) |
| 仅指定请求,未指定限额 | 手动指定值(如 128Mi) | 继承 LimitRange 的 default(512Mi) |
八、设置默认资源的核心动机
当命名空间配置了 资源配额(ResourceQuota) 时,默认资源规则尤为重要:
-
资源配额可能要求所有容器必须指定内存限额,否则无法运行;
-
资源配额会限制命名空间的总内存使用量,默认限额可避免单个容器过度占用资源。
通过 LimitRange 设置默认值,既能满足配额要求,又能简化容器配置(无需逐个指定资源参数)。