2. 命名空间生命周期管理
命名空间(Namespace)是 Kubernetes 中用于实现多租户资源隔离的核心逻辑单元。本章将系统讲解命名空间的完整生命周期管理,包括创建、查看、删除以及常见异常状态的处理方法。掌握这些操作是进行服务目录安全权限配置的基础。
2.1 创建命名空间
创建命名空间有两种主要方式:声明式(YAML 文件)和命令式(kubectl 命令)。在生产环境中,推荐使用声明式方式,便于版本管理和审计。
2.1.1 使用 YAML 声明式创建
# namespace-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
environment: development
team: backend
annotations:
description: "Development environment namespace"
kubectl apply -f namespace-dev.yaml
2.1.2 使用 kubectl 命令式创建
kubectl create namespace staging
最佳实践:创建命名空间时,建议同时添加
labels 和 annotations。labels 用于资源选择与策略绑定(如网络策略、RBAC),annotations 用于记录元数据信息(如负责人、创建目的)。
2.2 查看命名空间
查看命名空间及其状态是日常运维中最频繁的操作之一。以下列出常用查看命令及其输出示例。
| 命令 | 说明 | 典型输出字段 |
|---|---|---|
kubectl get ns |
列出所有命名空间及状态 | NAME, STATUS, AGE |
kubectl describe ns <name> |
查看命名空间详细信息 | Labels, Annotations, ResourceQuota, Status |
kubectl get ns <name> -o yaml |
以 YAML 格式输出完整定义 | metadata, spec, status |
# 查看所有命名空间
kubectl get ns
# 输出示例
NAME STATUS AGE
default Active 30d
kube-system Active 30d
kube-public Active 30d
dev Active 7d
staging Active 2d
关键字段说明:
- STATUS:命名空间当前状态,正常为
Active,异常为Terminating。 - AGE:命名空间从创建至今的存活时间。
- ResourceQuota:通过
describe可查看该命名空间是否绑定了资源配额。
2.3 删除命名空间
删除命名空间会级联删除该空间下的所有资源(Pod、Service、ConfigMap、Secret 等),操作前务必确认。
# 删除命名空间
kubectl delete namespace dev
# 强制删除(不推荐,仅用于异常情况)
kubectl delete namespace dev --force --grace-period=0
⚠️ 风险提示:
- 删除命名空间前,请确认该空间下没有运行中的关键业务。
- 建议先导出命名空间下所有资源清单作为备份:
kubectl get all -n <ns> -o yaml > backup.yaml。 - 强制删除可能导致资源残留,仅在命名空间卡在
Terminating状态时使用。
2.4 命名空间状态与 Terminating 问题处理
命名空间在删除过程中会进入 Terminating 状态。正常情况下,该状态持续几秒到几分钟后自动消失。如果长时间卡在 Terminating,说明存在资源清理障碍。
2.4.1 Terminating 状态产生原因
| 原因 | 说明 | 常见场景 |
|---|---|---|
| Finalizer 未释放 | 某些资源(如 CRD、自定义控制器)注册了 Finalizer,阻止命名空间删除 | 安装了 Istio、Cert-Manager 等 Operator 的命名空间 |
| APIService 不可用 | 命名空间下存在依赖外部 API 服务的资源,且该服务已不可达 | 自定义资源定义(CRD)对应的 APIService 被删除 |
| 资源残留 | 部分资源(如 PodDisruptionBudget)未能被正常清理 | 集群节点故障导致资源删除超时 |
2.4.2 诊断步骤
- 查看命名空间详情:
kubectl describe namespace <name>,关注Status和Finalizers字段。 - 检查 Finalizer 列表:
kubectl get namespace <name> -o json | jq '.spec.finalizers'。 - 查找残留资源:
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <name>。
2.4.3 解决方案
方案一:移除 Finalizer(推荐)
# 导出命名空间 JSON
kubectl get namespace <name> -o json > ns.json
# 编辑 JSON,将 "spec" 下的 "finalizers" 字段置空
# 原内容:"spec": { "finalizers": ["kubernetes"] }
# 修改为:"spec": { "finalizers": [] }
# 替换 API 对象
kubectl replace --raw "/api/v1/namespaces/<name>/finalize" -f ns.json
方案二:强制删除(应急)
kubectl delete namespace <name> --force --grace-period=0
注意:强制删除可能留下孤儿资源,需要手动清理。
2.5 命名空间生命周期流程图
下图展示了命名空间从创建到删除的完整生命周期,以及 Terminating 状态的处理路径。
2.6 命名空间资源清理对比
下表对比了正常删除与强制删除在资源清理行为上的差异,帮助您在不同场景下做出正确选择。
| 对比维度 | 正常删除 | 强制删除(--force) |
|---|---|---|
| Pod 终止 | 发送 SIGTERM,等待优雅终止(默认 30s) | 立即删除,不等待优雅终止 |
| Finalizer 处理 | 等待所有 Finalizer 执行完毕 | 跳过 Finalizer,直接移除命名空间 |
| 资源残留风险 | 低,所有资源被级联删除 | 高,可能留下孤儿资源 |
| 适用场景 | 日常运维、正常下线 | 命名空间卡在 Terminating 且无法恢复 |
生产建议:
- 优先使用正常删除,确保业务优雅下线。
- 在 CI/CD 流水线中,删除命名空间前先检查是否存在
Finalizers,提前处理。 - 对于长期卡在
Terminating的命名空间,先尝试移除 Finalizer,再考虑强制删除。
2.7 命名空间状态迁移图
下图展示了命名空间在不同操作下的状态迁移路径,帮助理解状态转换的完整逻辑。
2.8 常见问题排查清单
当命名空间出现异常时,可按照以下清单快速定位问题。
- 问题:命名空间创建后一直处于 Pending 状态
- 检查集群资源是否充足:
kubectl describe node - 检查是否存在资源配额限制:
kubectl get resourcequota -n <ns>
- 检查集群资源是否充足:
- 问题:删除命名空间后资源未清理
- 检查 Finalizer:
kubectl get ns <name> -o json | jq '.spec.finalizers' - 手动移除 Finalizer 后重试
- 检查 Finalizer:
- 问题:强制删除后出现孤儿资源
- 使用
kubectl get all -A | grep <ns>查找残留资源 - 手动删除残留的 CRD 实例或自定义资源
- 使用
核心要点回顾:
- 命名空间生命周期包括:创建 → Active → 删除 → Terminating → 已删除。
- Terminating 状态是删除过程中的正常阶段,但长时间停留需要人工介入。
- Finalizer 是导致 Terminating 卡住的最常见原因,优先尝试移除 Finalizer。
- 强制删除是最后手段,使用前务必评估资源残留风险。