4. 基于命名空间的隔离方案:Kubernetes Namespace 的隔离边界、NetworkPolicy 实现网络隔离、ResourceQuota 与 LimitRange 实现资源隔离、RBAC 实现权限隔离

Kubernetes Namespace 是构建多租户隔离集群最基础、最常用的逻辑隔离单元。它并非物理或硬边界,而是通过组合多种机制(网络策略、资源配额、权限控制)在共享集群内实现租户间的软隔离。本章将深入剖析 Namespace 的隔离边界,并逐一拆解 NetworkPolicy、ResourceQuota / LimitRange 以及 RBAC 的实现原理与最佳实践。

4.1 Namespace 的隔离边界:逻辑墙与共享宿主机

Namespace 在 Kubernetes 中提供的是 逻辑隔离,而非强安全隔离。它主要隔离了以下资源视图:

  • 资源对象名称:同一 Namespace 内资源名称必须唯一,不同 Namespace 可重名。
  • 服务发现:通过 <service-name>.<namespace>.svc.cluster.local 跨 Namespace 访问,默认不隔离。
  • 资源配额:通过 ResourceQuota 限制 Namespace 级别的总资源消耗。
  • 权限边界:RBAC 规则可限定到 Namespace 级别。

但以下方面 默认不隔离,需要额外配置:

  • 网络通信:Pod 默认可以跨 Namespace 通信(依赖 CNI 插件)。
  • 节点资源:不同 Namespace 的 Pod 可能调度到同一节点,共享内核与宿主机资源。
  • 存储卷:PersistentVolume 是集群级别资源,可被不同 Namespace 的 PVC 绑定。
  • 自定义资源(CRD):CRD 定义是集群级别,但其实例可限定在 Namespace 内。
关键认知: Namespace 是“管理边界”而非“安全边界”。对于强隔离需求(如金融、医疗),需结合节点隔离(NodeSelector / Taint)、安全上下文(Pod Security Admission)或虚拟化容器(Kata Containers)等方案。
Namespace 隔离边界示意图 Kubernetes 集群 Namespace A (租户 A) Pod A1 10.0.1.2 Pod A2 10.0.1.3 Service A ResourceQuota: CPU 4核 / 内存 8Gi / Pod 10 Namespace B (租户 B) Pod B1 10.0.2.2 Pod B2 10.0.2.3 Service B 默认允许通信 NetworkPolicy 可阻断跨 Namespace 流量

4.2 NetworkPolicy:实现网络隔离

NetworkPolicy 是 Kubernetes 原生的网络隔离机制,通过 标签选择器 定义 Pod 的入站(Ingress)和出站(Egress)规则。它需要 CNI 插件(如 Calico、Cilium、Weave Net)支持才能生效。

4.2.1 核心概念

字段 说明 示例值
podSelector 选择策略作用的 Pod(标签匹配) app: frontend
policyTypes 指定策略类型:Ingress / Egress ["Ingress", "Egress"]
ingress 入站规则:允许来源(IP段 / Namespace / Pod) from: - namespaceSelector: {}
egress 出站规则:允许目标(IP段 / Namespace / Pod) to: - ipBlock: {cidr: 0.0.0.0/0}

4.2.2 典型隔离场景:禁止跨 Namespace 通信

以下策略实现:仅允许同一 Namespace 内的 Pod 互相通信,拒绝所有跨 Namespace 入站流量。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-cross-ns-ingress
  namespace: tenant-a
spec:
  podSelector: {}  # 作用于本 Namespace 所有 Pod
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: tenant-a  # 仅允许同 Namespace
注意: NetworkPolicy 是“白名单”机制。未匹配任何允许规则的流量将被拒绝。默认情况下,如果 Namespace 内没有任何 NetworkPolicy,所有流量均被允许。

4.2.3 多租户网络隔离最佳实践

  • 默认拒绝所有入站/出站:为每个租户 Namespace 创建一条默认拒绝策略,再按需开放。
  • 使用 Namespace 标签:为每个租户 Namespace 打上唯一标签(如 tenant: alpha),便于在策略中引用。
  • 允许系统组件:确保 kube-system、监控、日志等基础设施 Namespace 的流量不被误拦。
  • 审计与监控:使用网络流量日志(如 Cilium Hubble)验证策略是否生效。

4.3 ResourceQuota 与 LimitRange:实现资源隔离

资源隔离确保单个租户不会“饿死”其他租户。Kubernetes 提供两层控制:ResourceQuota(Namespace 级别总量限制)和 LimitRange(Pod/容器级别默认值与边界限制)。

4.3.1 ResourceQuota:Namespace 资源天花板

ResourceQuota 限制 Namespace 内所有 Pod 的资源总和上限。常用配置项:

资源类型 配置字段 示例值
CPU 请求 requests.cpu "10"(10 核)
内存请求 requests.memory "20Gi"
CPU 限制 limits.cpu "20"
内存限制 limits.memory "40Gi"
Pod 数量 count/pods "50"
PVC 数量 count/persistentvolumeclaims "10"
Service 数量 count/services "20"

示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-a
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    count/pods: "50"

4.3.2 LimitRange:Pod 级别资源约束

LimitRange 在 Namespace 内设置 Pod 或容器的资源默认值(default)和边界值(min / max)。它防止租户创建过小或过大的容器。

字段 说明 示例值
default 容器未指定资源限制时的默认值 cpu: "500m"
defaultRequest 容器未指定资源请求时的默认值 memory: "256Mi"
max 容器资源限制的最大值 cpu: "4"
min 容器资源请求的最小值 memory: "64Mi"

示例:

apiVersion: v1
kind: LimitRange
metadata:
  name: tenant-limits
  namespace: tenant-a
spec:
  limits:
  - max:
      cpu: "4"
      memory: "8Gi"
    min:
      cpu: "100m"
      memory: "64Mi"
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
    type: Container
最佳实践: 始终为每个租户 Namespace 同时配置 ResourceQuota 和 LimitRange。ResourceQuota 防止总量超卖,LimitRange 防止单个 Pod 规格异常。

4.4 RBAC:实现权限隔离

RBAC(基于角色的访问控制)是 Kubernetes 权限隔离的核心。通过 Role / ClusterRole 定义权限集合,再通过 RoleBinding / ClusterRoleBinding 将角色绑定到用户、组或 ServiceAccount。

4.4.1 核心对象

对象 作用域 说明
Role Namespace 定义对特定 Namespace 内资源的操作权限
ClusterRole 集群 定义集群级别资源(Node、PV、CRD)或跨 Namespace 资源的权限
RoleBinding Namespace 将 Role 或 ClusterRole 绑定到主体(User / Group / SA)
ClusterRoleBinding 集群 将 ClusterRole 绑定到主体,授予集群级别权限

4.4.2 多租户 RBAC 设计模式

典型的多租户权限模型:

  • 租户管理员:拥有所在 Namespace 的完整管理权限(admin ClusterRole 绑定到 Namespace)。
  • 租户开发者:拥有 Pod、Service、Deployment 等资源的读写权限(edit ClusterRole)。
  • 租户只读用户:仅能查看资源(view ClusterRole)。
  • 平台管理员:通过 ClusterRoleBinding 拥有集群级别管理权限。

示例:为租户 A 的开发者创建 RoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-tenant-a-binding
  namespace: tenant-a
subjects:
- kind: User
  name: dev-alice@example.com
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: edit
  apiGroup: rbac.authorization.k8s.io

4.4.3 权限隔离最佳实践

  • 最小权限原则:只授予租户完成工作所需的最小权限集。
  • 使用 ServiceAccount:为应用 Pod 分配专用 ServiceAccount,而非使用用户身份。
  • 避免 ClusterRoleBinding 滥用:尽量使用 RoleBinding 将 ClusterRole 限定到特定 Namespace。
  • 定期审计:使用 kubectl auth can-i --list --as=system:serviceaccount:ns:sa-name 验证权限。
RBAC 多租户权限模型 平台管理员 ClusterRoleBinding ClusterRole: cluster-admin 租户 A 管理员 RoleBinding (ns-a) ClusterRole: admin 租户 A 开发者 RoleBinding (ns-a) ClusterRole: edit 租户 B 只读用户 RoleBinding (ns-b) ClusterRole: view

4.5 四种隔离机制对比总结

隔离维度 机制 作用范围 是否默认生效 依赖组件
资源视图隔离 Namespace API 对象名称与视图 是 Kubernetes API Server
网络隔离 NetworkPolicy Pod 间流量 否(需手动创建策略) 支持 NetworkPolicy 的 CNI 插件
资源隔离 ResourceQuota + LimitRange CPU / 内存 / 存储 / 对象数量 否(需手动创建配额) Kubernetes Scheduler / kubelet
权限隔离 RBAC (Role / RoleBinding) API 操作权限 否(需手动配置绑定) Kubernetes RBAC Authorizer
架构建议: 在基于 Namespace 的多租户方案中,务必同时启用 NetworkPolicy、ResourceQuota / LimitRange 和 RBAC,形成“视图 + 网络 + 资源 + 权限”四维隔离体系。缺少任何一环都可能造成租户间的非预期干扰或安全漏洞。