一、为什么需要多租户隔离

想象一下,你有一套公寓要租给不同的人。如果所有租客共用同一个大门钥匙,那谁都能进谁的房间,显然不行。Kubernetes集群也是类似的道理——多个团队或项目共用同一个集群时,如果没有隔离措施,就可能出现以下问题:

  • 资源打架:A团队不小心删了B团队的Pod
  • 安全风险:开发人员能看到生产环境的敏感数据
  • 资源浪费:某个租户狂占资源导致其他租户服务瘫痪

解决这些问题的核心思路是:让每个租户有自己的"独立空间",同时共享底层集群资源

二、四种主流隔离方案

方案1:Namespace隔离(基础版)

就像给每个租户分配独立的房间,用门牌号(Namespace)区分。

技术栈:原生Kubernetes

# 创建租户专属命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: tenant-a  # 租户A的独立空间

---
# 限制租户资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-a-quota
  namespace: tenant-a
spec:
  hard:
    pods: "50"          # 最多50个Pod
    cpu: "40"           # 总共40核CPU
    memory: 100Gi       # 总共100G内存

优点

  • 实现简单,Kubernetes原生支持
  • 可以配合RBAC做权限控制

缺点

  • 网络默认还是相通的
  • 租户仍然能看到其他Namespace的存在

方案2:NetworkPolicy网络隔离

给每个房间装上防盗门,指定谁能进谁不能进。

技术栈:Calico网络插件

# 只允许tenant-a内部的Pod互相访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: tenant-a-network
  namespace: tenant-a
spec:
  podSelector: {}  # 匹配本Namespace所有Pod
  ingress:
  - from:
    - podSelector: {} # 只允许本Namespace的Pod进入

典型应用场景

  • 开发环境隔离(防止开发人员误连生产环境)
  • 多客户SaaS服务(确保客户数据隔离)

方案3:虚拟集群(进阶方案)

相当于给每个租户一栋独立别墅,他们以为自己独占整个小区。

技术栈:vcluster

# 为租户创建虚拟集群
vcluster create tenant-a \
  --namespace tenant-a \
  --kubernetes-version 1.25

虚拟集群的特点:

  • 每个租户有自己的"假"控制平面
  • 实际资源仍由宿主集群统一调度
  • 租户无法感知其他虚拟集群存在

方案4:物理集群隔离(土豪版)

直接给每个租户买一套房,彻底物理隔离。

实现方式

  • 每个租户独占Kubernetes集群
  • 通过集群联邦统一管理

适用场景

  • 金融/医疗等强监管行业
  • 超大型企业不同事业部

三、实战中的精妙设计

案例:电商平台多租户架构

假设我们有一个电商平台需要支持:

  • 主站服务
  • 商家后台
  • 数据分析部门

分层隔离方案

(注:此处应为文字描述,因要求不包含图片)  
1. 网络层:Calico按Namespace划分安全域  
2. 存储层:每个Namespace绑定专属PVC  
3. 权限层:RBAC控制商家只能操作自己的Namespace  
4. 资源层:HPA为不同租户设置弹性伸缩策略  

关键配置示例

# 商家专属资源限制
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: merchant-high-prio
value: 1000000  # 高优先级数值

---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: merchant-hpa
  namespace: merchant-123
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: merchant-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

四、避坑指南与最佳实践

常见坑点

  1. 资源配额设置不合理

    • 现象:某个租户的Deployment卡在Pending状态
    • 排查:kubectl describe quota -n tenant-a
    • 建议:预留20%缓冲资源
  2. 网络策略冲突

    • 典型错误:忘记放行CoreDNS端口
    • 检查命令:kubectl describe networkpolicy -n tenant-a
  3. 存储卷混淆

    • 危险操作:在StorageClass中设置错误的回收策略
    • 建议:每个租户使用独立的StorageClass

性能优化技巧

  • 节点亲和性:将同一租户的Pod调度到相同节点

    affinity:
      podAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: tenant
              operator: In
              values: ["a"]
          topologyKey: kubernetes.io/hostname
    
  • 请求压缩:对于大量小租户场景

    # 启用Namespace资源压缩
    kube-controller-manager --enable-resource-quota-compression=true
    

五、技术选型决策树

遇到多租户需求时,可以这样选择:

if 需要强隔离 && 预算充足 ➔ 物理集群隔离  
elif 需要虚拟控制平面 ➔ vcluster方案  
elif 只需要基础隔离 ➔ Namespace+NetworkPolicy  
else ➔ 单Namespace配合RBAC  

六、未来演进方向

  1. Kubernetes原生多租户改进

    • KEP-3223:Hierarchical Namespaces
    • KEP-3243:租户级资源计量
  2. 服务网格集成

    • 通过Istio实现租户级流量治理
    • 示例:为每个租户设置专属的VirtualService
  3. 混合云场景延伸

    • 跨集群的租户身份统一
    • 使用Cluster API管理多集群资源