深色模式
命名空间与资源配额
摘要:本文演示如何用 Namespace 隔离环境、用 ResourceQuota 给每个命名空间设总量上限、用 LimitRange 给单个容器设默认值与范围,并说明配额耗尽时的典型报错与处理。
适用环境
- 可用 K8s 集群 +
kubectl(需有创建命名空间的权限) - 集群规模 ≥ 2 节点效果更直观
操作步骤
一、创建与切换命名空间
bash
kubectl create namespace dev
kubectl create namespace prod
kubectl get ns
kubectl config set-context --current --namespace=dev # 设默认命名空间
kubectl config view --minify | grep namespace1
2
3
4
5
2
3
4
5
用 YAML 创建(便于版本化):
yaml
apiVersion: v1
kind: Namespace
metadata:
name: team-a
labels:
env: prod1
2
3
4
5
6
2
3
4
5
6
建议
命名空间不等于安全边界。它只是逻辑分组,跨命名空间的 Pod 默认仍可互相访问。真正的网络隔离要靠 NetworkPolicy,权限隔离靠 RBAC。
二、跨命名空间访问
Service 的完整域名带命名空间:
bash
kubectl exec -it <pod> -- nslookup web.prod.svc.cluster.local1
三、配置 ResourceQuota(总量上限)
yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
pods: "100"
services: "20"
persistentvolumeclaims: "10"
count/deployments.apps: "30"
count/ingresses.networking.k8s.io: "10"1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bash
kubectl apply -f quota.yaml
kubectl get resourcequota -n team-a
kubectl describe quota team-a-quota -n team-a1
2
3
2
3
超过配额时创建 Pod 会报错:exceeded quota: team-a-quota, requested: cpu=1, used: cpu=20, limited: cpu=20。
四、限制存储总量
yaml
spec:
hard:
requests.storage: "500Gi"
nfs-client.storageclass.storage.k8s.io/requests.storage: "300Gi"1
2
3
4
2
3
4
第二行可按 StorageClass 分别限制,写法是 <storageClassName>.storageclass.storage.k8s.io/requests.storage。
五、配置 LimitRange(单对象范围与默认值)
yaml
apiVersion: v1
kind: LimitRange
metadata:
name: team-a-limits
namespace: team-a
spec:
limits:
- type: Container
max:
cpu: "4"
memory: 8Gi
min:
cpu: 50m
memory: 64Mi
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
- type: PersistentVolumeClaim
max:
storage: 100Gi
min:
storage: 1Gi1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
作用:
- 未声明资源的容器自动注入
default/defaultRequest; - 超出
max或低于min的声明会被直接拒绝。
注意
LimitRange 只在 Pod 创建时通过准入控制器注入默认值。已存在的 Pod 不受影响,改 LimitRange 也不会回填。
六、批量查看各命名空间用量
bash
kubectl describe quota -A
kubectl get pod -A --no-headers | awk '{print $1}' | sort | uniq -c
kubectl top pod -A --sort-by=memory | head -201
2
3
2
3
七、清理命名空间
bash
kubectl delete namespace team-a1
危险
删除命名空间会级联删除其中所有资源(Pod、Service、PVC、Secret……),且默认没有二次确认。执行前务必确认该命名空间内无生产数据,尤其是 PVC 绑定的后端存储可能不会被回收但会变成孤儿。
验证
- [ ]
kubectl describe quota -n team-a显示 Used / Hard 两列 - [ ] 在 team-a 创建超过
max资源的 Pod 被拒绝 - [ ] 创建未声明资源的 Pod 后,
kubectl get pod -o yaml能看到自动注入的 requests - [ ] 配额写满后再创建 Pod 得到 exceeded quota 报错
常见坑
- 配额不生效:ResourceQuota 建晚了,已存在的资源不会被追溯统计;或 Pod 没声明 requests(Quota 统计的是 requests 之和)。
- Pod 报
forbidden: exceeded quota:整个命名空间资源用满,需清理无用 Pod 或申请扩容配额。 pods配额卡住 Deployment:副本数超过剩余 pod 配额时,ReplicaSet 会一直创建失败,事件里能看到。- 默认命名空间 default 里塞了生产服务:难以做配额与权限管理,务必按环境/团队拆分。
- 删命名空间卡在 Terminating:存在无法处理的 finalizer 或 API 聚合服务异常,需检查
kubectl get ns <name> -o yaml的 spec.finalizers。