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 诊断步骤

  1. 查看命名空间详情:kubectl describe namespace <name>,关注 Status 和 Finalizers 字段。
  2. 检查 Finalizer 列表:kubectl get namespace <name> -o json | jq '.spec.finalizers'。
  3. 查找残留资源: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 状态的处理路径。

命名空间生命周期流程图 创建命名空间 Active(活跃) 执行删除操作 Terminating? 正常完成删除 异常处理流程 否 是 说明:Terminating 状态通常由 Finalizer 未释放或 APIService 不可用导致,可通过移除 Finalizer 或强制删除解决。

2.6 命名空间资源清理对比

下表对比了正常删除与强制删除在资源清理行为上的差异,帮助您在不同场景下做出正确选择。

对比维度 正常删除 强制删除(--force)
Pod 终止 发送 SIGTERM,等待优雅终止(默认 30s) 立即删除,不等待优雅终止
Finalizer 处理 等待所有 Finalizer 执行完毕 跳过 Finalizer,直接移除命名空间
资源残留风险 低,所有资源被级联删除 高,可能留下孤儿资源
适用场景 日常运维、正常下线 命名空间卡在 Terminating 且无法恢复
生产建议:
  • 优先使用正常删除,确保业务优雅下线。
  • 在 CI/CD 流水线中,删除命名空间前先检查是否存在 Finalizers,提前处理。
  • 对于长期卡在 Terminating 的命名空间,先尝试移除 Finalizer,再考虑强制删除。

2.7 命名空间状态迁移图

下图展示了命名空间在不同操作下的状态迁移路径,帮助理解状态转换的完整逻辑。

命名空间状态迁移图 不存在 创建中 Active Terminating 已删除 创建 就绪 删除 清理完成 创建失败 状态迁移关键点:创建失败可回退到不存在;Terminating 清理完成后进入已删除状态。

2.8 常见问题排查清单

当命名空间出现异常时,可按照以下清单快速定位问题。

  • 问题:命名空间创建后一直处于 Pending 状态
    • 检查集群资源是否充足:kubectl describe node
    • 检查是否存在资源配额限制:kubectl get resourcequota -n <ns>
  • 问题:删除命名空间后资源未清理
    • 检查 Finalizer:kubectl get ns <name> -o json | jq '.spec.finalizers'
    • 手动移除 Finalizer 后重试
  • 问题:强制删除后出现孤儿资源
    • 使用 kubectl get all -A | grep <ns> 查找残留资源
    • 手动删除残留的 CRD 实例或自定义资源
核心要点回顾:
  • 命名空间生命周期包括:创建 → Active → 删除 → Terminating → 已删除。
  • Terminating 状态是删除过程中的正常阶段,但长时间停留需要人工介入。
  • Finalizer 是导致 Terminating 卡住的最常见原因,优先尝试移除 Finalizer。
  • 强制删除是最后手段,使用前务必评估资源残留风险。