一、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

你会发现 etcdkube-apiserverkube-controller-managerkube-scheduler 这些核心组件,往往就是以静态 Pod 的方式由 Kubernetes 直接管理的。

这也是理解集群结构的一个很好的切入口。