Namespace 与资源隔离
Namespace 将同一集群中的资源按团队、环境或系统划分。它是 Kubernetes 里第一个也是最基本的隔离边界,适合承载权限、配额和资源命名边界。本章讲清它的能力边界、常用操作和踩坑点。
本篇目标:理解 Namespace 隔离了什么、不隔离什么,掌握增删改查与 Terminating 排查,并会用 ResourceQuota / LimitRange 做基于 Namespace 的资源管控。
1. Namespace 概念与逻辑隔离机制
1.1 什么是 Namespace
Namespace 是资源的"虚拟分组":同一个集群内,不同 Namespace 中的同名资源可以共存,比如 staging 和 prod 里各有一个名为 api 的 Deployment。
kubectl get namespaces
kubectl get pods -A # 所有 Namespace
kubectl get all -n learning # 指定 Namespace
生产常见划分是 platform-system、observability、staging-app、prod-app。不要把应用、监控和系统组件全部部署到 default。
1.2 隔离了什么,不隔离什么
Namespace 是逻辑隔离,不是物理或安全隔离:
| 维度 | Namespace 能做的 | Namespace 做不到的 |
|---|---|---|
| 命名冲突 | ✅ 同名资源可在不同 Namespace 共存 | — |
| 权限边界 | ✅ RBAC 可按 Namespace 授权 | 不是安全隔离,跨 Namespace 访问由权限决定 |
| 资源管控 | ✅ ResourceQuota 按 Namespace 限总量 | 不限制节点、不限制网络流量 |
| 网络隔离 | ❌ | 需要 NetworkPolicy(见第 17 章) |
| 物理隔离 | ❌ | Namespace 不是集群,不提供硬件隔离 |
2. 常用操作与 Terminating 排查
2.1 常用操作
kubectl create namespace learning
# 让当前 context 默认使用该 Namespace(仅当前终端/配置生效)
kubectl config set-context --current --namespace=learning
kubectl config view --minify --output 'jsonpath={..namespace}{"\n"}'
kubectl get namespace learning
kubectl describe namespace learning
2.2 Namespace 一直 Terminating
删除 Namespace 时,kubectl delete ns learning 可能卡在 Terminating 状态很久。原因通常是:Namespaces 里还有资源,或某些对象的 finalizer 未完成。
kubectl get ns learning -o jsonpath='{.status.conditions}'
kubectl get ns learning -o json | jq '.metadata.finalizers'
# 查看该 Namespace 里还有什么资源
kubectl get all -n learning
kubectl get pvc,secrets,configmaps -n learning
常见处理方向:
| 现象 | 原因 | 处理 |
|---|---|---|
| 有残留工作负载 | 删除 Namespace 不会等 Pod 优雅终止完就继续 | 等一会,或确认无重要资源后强制清理 |
| finalizer 卡住 | 某控制器(如备份、负载均衡器清理)未完成 | 排查对应控制器;确认安全后移除 finalizer |
| 依赖外部资源 | 云负载均衡、PVC 等待底层删除 | 先处理外部依赖 |
3. 多租户隔离与资源管控
3.1 谁能用多少:ResourceQuota
多团队共享集群时,需要在 Namespace 层面设上限,防止某个团队耗尽集群资源:
apiVersion: v1
kind: ResourceQuota
metadata:
name: learning-quota
namespace: learning
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "50"
persistentvolumeclaims: "10"
count/services: "20"
requests.*/limits.*限制 Namespace 内所有 Pod 的 requests / limits 总和;pods、persistentvolumeclaims限制资源数量;count/<资源>可限制任意资源的数量;- 超出配额时创建请求被拒绝,Pod 停留在
Pending,事件里会出现exceeded quota。
kubectl get resourcequota -n learning
kubectl describe resourcequota learning-quota -n learning
3.2 单 Pod 的默认值与边界:LimitRange
ResourceQuota 管总量,LimitRange 管单 Pod / 容器 / PVC 的默认值与上下限:
apiVersion: v1
kind: LimitRange
metadata:
name: learning-limitrange
namespace: learning
spec:
limits:
- type: Container
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
max:
cpu: "2"
memory: 2Gi
min:
cpu: 10m
memory: 16Mi
default/defaultRequest:未声明时的默认 limits / requests,避免"忘记写"导致无限制;max/min:单容器上下限,越界拒绝;type还可设为Pod或PersistentVolumeClaim。
3.3 落地建议
- 从可观测开始:先在测试 Namespace 只设 LimitRange 观察,再逐步收紧 ResourceQuota;
- 配额只负责资源上限,不是安全边界——权限控制仍依赖 RBAC(第 17 章),网络隔离依赖 NetworkPolicy(第 17 章);
- requests/limits 的取值方法见第 14 章《Resource 资源限制与 QoS》。
4. 练习
练习 A
- 创建 Namespace
team-a和team-b,在两个 Namespace 各创建一个同名 ConfigMap,确认互不冲突 - 把当前 context 的默认 Namespace 切到
team-a,用kubectl config view --minify确认 - 删除
team-b,观察删除过程
练习 B
- 给
team-a设置 ResourceQuota(pods: "2"、requests.memory: 512Mi),尝试创建第 3 个 Pod,观察被拒绝的事件 - 设置 LimitRange(
default内存 128Mi),创建一个不写 resources 的 Pod,用kubectl get pod -o yaml确认默认值被注入 - 故意让 Namespace 进入 Terminating(残留一个 finalizer),练习排查步骤
下一篇:Pod 核心资源。