一、Namespace 到底是什么¶
Namespace 提供了一种把同一个集群里的资源按逻辑维度隔离开的方式。它不是物理隔离,而是对集群进行“虚拟分区”。
在实际场景中,Namespace 通常用来区分:
- 不同团队
- 不同项目
- 不同租户
- 不同环境,如开发、测试、预发、生产
也正因为有了 Namespace,同一个集群才能同时服务多类业务,而不会在资源和权限上完全混在一起。
二、Namespace 的主要作用¶
Namespace 的核心价值,通常体现在下面几个方面:
- 资源隔离:不同团队和项目可以有各自独立的资源空间
- 权限控制:可以按 Namespace 设置不同访问权限
- 环境拆分:可以用不同 Namespace 模拟不同业务环境
- 配额限制:便于叠加资源配额与资源限制策略
- 服务治理:同一 Namespace 下的资源管理和服务发现更直观
- 运维简化:备份、迁移、清理时更容易按空间维度处理
简单说,Namespace 不是“可有可无的命名规则”,而是 Kubernetes 做多团队治理的基础工具。
三、Kubernetes 默认有哪些命名空间¶
一个标准集群里,常见的默认命名空间有四个:
kubectl get ns
通常会看到:
default:默认命名空间,不显式指定时大多资源都会落到这里kube-node-lease:保存节点 Lease 信息,用于节点心跳和故障探测优化kube-public:公开空间,通常可被所有用户读取kube-system:Kubernetes 核心系统组件所在的命名空间
其中 kube-node-lease 很值得注意。比如查看 Lease:
kubectl get leases -n kube-node-lease
kubectl get leases -n kube-node-lease k8s-master01 -o yaml
通过这些信息,可以观察节点心跳续租时间,这在排查节点状态问题时很有帮助。
四、Namespace 的基本使用¶
1. 创建命名空间¶
命令行方式:
kubectl create ns ns01
YAML 方式:
apiVersion: v1
kind: Namespace
metadata:
name: development
再执行:
kubectl apply -f test1.yaml
2. 查看命名空间¶
kubectl get ns
kubectl get ns --show-labels
3. 删除命名空间¶
命令行删除:
kubectl delete ns ns01
文件删除:
kubectl delete -f test1.yaml
五、Namespace 一直 Terminating 怎么办¶
Namespace 删除时最常见的问题,就是状态一直卡在 Terminating。
kubectl get ns | grep ns01
如果确认该命名空间下资源已经清理完成,但仍然删不掉,可以继续排查 finalizers。
1. 先尝试强制删除¶
kubectl delete ns ns01 --force --grace-period=0
2. 再处理 finalizers¶
先导出 JSON:
kubectl get namespace development -o json > development.json
然后清空 spec.finalizers 内容,再执行:
kubectl replace --raw "/api/v1/namespaces/development/finalize" -f development.json
这一步的核心思路是:当控制器无法正常完成回收逻辑时,手工移除阻塞删除的 finalizer。
六、顺手看看当前环境配置文件¶
学习 Namespace 时,顺便理解当前节点上的 Kubernetes 配置文件也很有帮助。
查看 kubelet 的配置路径:
ps aux | grep kubelet
通常能看到类似:
--config=/var/lib/kubelet/config.yaml
再看静态 Pod 目录:
cat /var/lib/kubelet/config.yaml | grep staticPodPath
ll /etc/kubernetes/manifests
你会发现 etcd、kube-apiserver、kube-controller-manager、kube-scheduler 这些核心组件,往往就是以静态 Pod 的方式由 Kubernetes 直接管理的。
这也是理解集群结构的一个很好的切入口。