讲解
Namespace(命名空间)是 Kubernetes 的多租户隔离单位:同一集群里划分出多个逻辑空间,资源名在不同命名空间下可以重复,RBAC 权限、网络策略、资源配额都以它为边界施加。集群自带的命名空间:default(默认)、kube-system(系统组件)、kube-public、kube-node-lease。典型用法是按环境分(dev/staging/prod)或按团队分;注意它是「软隔离」——默认情况下不同命名空间的网络是互通的,强隔离要配合 NetworkPolicy。
和资源范围相关的两个要点。一是哪些资源属于命名空间:Pod、Service、Deployment、ConfigMap、Secret、PVC 等都有命名空间归属;而 Node、PersistentVolume、ClusterRole、StorageClass 是集群级资源,不属于任何命名空间(kubectl api-resources 的 NAMESPACED 列写得明明白白)。二是 DNS:Service 的完整域名是 服务名.命名空间.svc.cluster.local,同命名空间短名直达,跨命名空间要带命名空间后缀。
ResourceQuota 是命名空间级的资源管家:限制这个命名空间里总共能用多少 CPU/内存(requests/limits 总量)、能建多少 Pod/Service/ConfigMap 等。一个关键联动规则:一旦配额里限制了 requests.cpu 或 limits.memory 之类,这个命名空间里新建的每个 Pod 都必须显式声明对应的 requests/limits,否则直接被拒绝——这是为了防止有人绕过配额。配合 LimitRange(给没写 requests/limits 的 Pod 补默认值,第 17 章细讲)可以让这个规则落地得更顺滑。
示例
创建演示命名空间 ohmydocs-verify-demo,并给它配上配额(最多 4 个 Pod,CPU 申请总量不超过 500m):
apiVersion: v1
kind: Namespace
metadata:
name: ohmydocs-verify-demo
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: ohmydocs-verify-quota
namespace: ohmydocs-verify-demo
spec:
hard:
pods: "4"
requests.cpu: "500m"
requests.memory: 256Mi
在配额管控的命名空间里建一个声明了 requests 的 Pod(合规),看配额的用量统计:
cat > quota-ok.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: ohmydocs-verify-q1
namespace: ohmydocs-verify-demo
spec:
containers:
- name: busybox
image: busybox:1.36
command: ["sleep", "3600"]
resources:
requests:
cpu: 100m
memory: 32Mi
EOF
kubectl apply -f quota-ok.yaml
kubectl wait --for=condition=ready pod/ohmydocs-verify-q1 -n ohmydocs-verify-demo --timeout=120s
kubectl get resourcequota ohmydocs-verify-quota -n ohmydocs-verify-demo
超出配额的 Pod 会在创建时被准入控制直接拒绝(requests.cpu 申请 600m,超过配额总量):
cat > quota-over.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: ohmydocs-verify-over
namespace: ohmydocs-verify-demo
spec:
containers:
- name: busybox
image: busybox:1.36
command: ["sleep", "60"]
resources:
requests:
cpu: 600m
memory: 32Mi
EOF
if kubectl apply -f quota-over.yaml 2>quota-err.log; then
echo "意外:超配额的 Pod 居然创建成功了"
cat quota-err.log
exit 1
else
echo "符合预期:被配额拒绝,原因如下"
grep -o 'exceeded quota[^"]*' quota-err.log | head -1
fi
kubectl delete pod ohmydocs-verify-q1 -n ohmydocs-verify-demo --wait
常见坑
- 配了 CPU/内存配额后所有 Pod 建不出来:配额含 requests/limits 限制时,没写资源声明的 Pod 一律被拒;要么每个 Pod 写清楚,要么配 LimitRange 提供默认值。
- 在 default 里放所有东西:权限、配额、网络策略都无处施加;哪怕小集群也建议按应用/环境分命名空间。
- 以为命名空间隔离网络:默认互通!命名空间只是逻辑分组,网络隔离要 NetworkPolicy。
- 删命名空间不彻底就重建:删命名空间会级联删除其中所有资源,需要一点时间;立刻重建同名空间可能撞上 Terminating 状态。
小结
Namespace 做逻辑隔离与资源分组,ResourceQuota 管命名空间总量,配额一旦涉及 requests/limits 就强制每个 Pod 声明资源;命名空间是 RBAC/NetworkPolicy 的边界,但不是网络隔离本身。下一章看资源间互相找到的机制:标签与选择器。