1.1 命名空间概念与集群资源隔离

Kubernetes 命名空间(Namespace)是集群内实现逻辑隔离的核心机制。它并非物理或网络层面的硬隔离,而是通过资源对象的作用域限定与访问控制策略,将单个物理集群划分为多个虚拟集群。理解命名空间是掌握 Kubernetes 安全权限配置的第一步。

1.1.1 命名空间的核心作用

命名空间主要解决以下三类问题:

  • 资源组织与分组:将同一团队、项目或环境(如 dev、staging、prod)的资源归入同一命名空间,避免命名冲突。
  • 访问控制边界:结合 RBAC(基于角色的访问控制),为不同命名空间设置独立的权限策略,实现最小权限原则。
  • 资源配额管理:通过 ResourceQuota 和 LimitRange 限制命名空间内的 CPU、内存、存储等资源总量,防止单个应用耗尽集群资源。
关键认知:命名空间是 Kubernetes 安全模型的第一道隔离边界。默认情况下,Pod 可以跨命名空间访问 Service(通过 DNS 名称),但 RBAC 策略、NetworkPolicy 和 ResourceQuota 均以命名空间为作用单位。

1.1.2 默认命名空间与特殊命名空间

Kubernetes 集群在创建时会自动生成以下四个命名空间:

命名空间名称 类型 主要用途
default 用户默认 未指定命名空间时资源默认创建于此;生产环境建议显式指定命名空间
kube-system 系统核心 运行控制平面组件(kube-apiserver、etcd、scheduler、controller-manager)及 CoreDNS 等
kube-public 公共可读 所有用户(包括未认证用户)均可读取;通常存放集群公共信息,如集群 CA 证书
kube-node-lease 节点心跳 存储节点心跳 Lease 对象,用于节点健康检测(Kubernetes v1.13+)
安全警示:切勿在 kube-system 命名空间中部署用户应用。该命名空间拥有集群最高权限,误操作可能导致控制面崩溃。生产集群应通过 RBAC 限制普通用户对 kube-system 的写权限。

1.1.3 命名空间与集群资源隔离的关系

命名空间提供的隔离是多维度的,下表总结了不同资源类型的隔离行为:

资源类型 隔离范围 跨命名空间访问 安全影响
Pod / Deployment / StatefulSet 命名空间内 不允许直接访问 Pod 名称仅在命名空间内唯一
Service 命名空间内 允许通过 <svc>.<ns>.svc.cluster.local 访问 需配合 NetworkPolicy 限制流量
ConfigMap / Secret 命名空间内 不允许直接引用 敏感数据隔离的关键机制
PersistentVolumeClaim 命名空间内 不允许跨命名空间绑定 存储隔离,防止数据泄露
RBAC Role / RoleBinding 命名空间内 仅作用于本命名空间 实现细粒度权限控制
NetworkPolicy 命名空间内 可设置跨命名空间规则 默认允许所有流量,需显式声明
ResourceQuota / LimitRange 命名空间内 不适用 防止资源争抢

以下 SVG 图展示了命名空间在集群中的逻辑位置及其与核心资源的关系:

Kubernetes 命名空间逻辑隔离架构 Kubernetes 集群 kube-system kube-apiserver etcd scheduler controller-manager CoreDNS dev(开发环境) Pod: frontend-v1 Pod: backend-v1 Service: frontend Service: backend ResourceQuota: CPU 4核 / 内存 8Gi prod(生产环境) Pod: frontend-v2 Pod: backend-v2 Service: frontend Service: backend ResourceQuota: CPU 16核 / 内存 32Gi RBAC 权限策略 Role: prod-admin(读写) Role: prod-viewer(只读) NetworkPolicy 入站规则:仅允许 frontend 访问 backend 出站规则:禁止访问外部公网 Secret 隔离 数据库密码、仅限本命名空间使用 每个命名空间拥有独立的 RBAC 策略、ResourceQuota、NetworkPolicy 和 Secret 作用域

1.1.4 命名空间操作实践

以下命令展示了命名空间的基本操作,这些操作是后续安全配置的基础:

# 查看所有命名空间
kubectl get namespaces

# 创建命名空间(方式一:命令式)
kubectl create namespace team-alpha

# 创建命名空间(方式二:声明式,推荐)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha
  labels:
    environment: development
    team: alpha
EOF

# 在指定命名空间中创建资源
kubectl run nginx --image=nginx --namespace=team-alpha

# 切换默认命名空间上下文(避免每次指定 --namespace)
kubectl config set-context --current --namespace=team-alpha

# 查看当前上下文使用的命名空间
kubectl config view --minify | grep namespace:
最佳实践:始终使用声明式方式(YAML 文件)创建命名空间,并在 metadata.labels 中添加环境、团队、项目等标签。这些标签后续可用于 NetworkPolicy 选择器、成本分摊和审计报告。

1.1.5 命名空间隔离的局限性

理解命名空间的隔离边界同样重要,以下资源不受命名空间隔离:

  • ClusterRole / ClusterRoleBinding:集群级别的 RBAC 资源,作用于所有命名空间。
  • Node:节点是集群资源,不属于任何命名空间。
  • PersistentVolume:PV 是集群资源,PVC 才是命名空间级别的。
  • StorageClass:存储类定义是集群范围的。
  • CustomResourceDefinition (CRD):CRD 定义是集群范围的,但 CRD 实例可以限定在命名空间内。

以下 SVG 图展示了命名空间隔离的边界与例外:

命名空间隔离边界与集群级资源 集群级资源(不受命名空间隔离) ClusterRole ClusterRoleBinding Node PersistentVolume StorageClass 命名空间级资源(受隔离) Namespace: dev Pod, Service, ConfigMap Secret, PVC, Role RoleBinding, NetworkPolicy Namespace: staging Pod, Service, ConfigMap Secret, PVC, Role RoleBinding, NetworkPolicy Namespace: prod Pod, Service, ConfigMap Secret, PVC, Role RoleBinding, NetworkPolicy 集群级资源可被所有命名空间引用;命名空间级资源彼此隔离,名称可重复
安全陷阱:不要认为命名空间提供了网络隔离。默认情况下,Pod 可以通过 Service DNS 跨命名空间访问。真正的网络隔离需要额外配置 NetworkPolicy,且集群必须使用支持 NetworkPolicy 的 CNI 插件(如 Calico、Cilium、Weave Net)。