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

想象一下,你有一套公寓要出租给不同的租户。如果所有租户共用同一个大门钥匙、同一个卫生间,甚至同一个冰箱,那肯定会乱套。Kubernetes 集群也是一样,当多个团队或项目共用同一个集群时,如果没有良好的隔离机制,就会导致资源争抢、配置冲突甚至安全问题。

多租户隔离的核心目标有三个:

  1. 资源隔离:确保不同租户的资源(CPU、内存等)不会互相挤占
  2. 权限隔离:防止租户A误操作或恶意访问租户B的资源
  3. 网络隔离:避免租户间的服务互相干扰

二、命名空间:最基础的隔离单元

命名空间(Namespace)是 Kubernetes 原生的隔离机制,相当于给集群划分了多个虚拟工作区。

2.1 基本操作示例(技术栈:Kubernetes)

# 创建开发环境命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: dev
  labels:
    env: development  # 用标签标识环境类型
---
# 创建生产环境命名空间  
apiVersion: v1  
kind: Namespace  
metadata:  
  name: prod  
  labels:  
    env: production

通过标签可以批量管理命名空间:

# 查看所有开发环境命名空间
kubectl get ns -l env=development

2.2 资源配额控制

单纯的命名空间划分还不够,还需要资源配额(ResourceQuota):

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "10"  # 总共可申请10核CPU
    requests.memory: 20Gi  # 总共可申请20GB内存
    pods: "50"  # 最多50个Pod

三、进阶隔离方案

3.1 网络策略(NetworkPolicy)

默认情况下,Kubernetes 集群内所有 Pod 可以互相通信。通过 NetworkPolicy 可以实现网络隔离:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-cross-ns
  namespace: dev
spec:
  podSelector: {}  # 匹配本命名空间所有Pod
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector: {}  # 只允许本命名空间内部通信
  egress:
  - to:
    - podSelector: {}  # 只允许出站到本命名空间

3.2 基于 RBAC 的权限控制

通过 Role 和 RoleBinding 实现精细权限管理:

# 开发人员只能查看dev命名空间的资源
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: developer-role
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developer-binding
  namespace: dev
subjects:
- kind: User
  name: alice@company.com
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer-role
  apiGroup: rbac.authorization.k8s.io

四、多租户管理实践

4.1 租户资源模板

使用 Kustomize 为每个租户创建标准配置:

base/
├── namespace.yaml
├── quota.yaml
└── network-policy.yaml
tenants/
└── tenant-a/
    ├── kustomization.yaml
    └── patch.yaml

tenant-a/kustomization.yaml 示例:

resources:
- ../../base
namespace: tenant-a
patchesStrategicMerge:
- patch.yaml

4.2 租户自助服务

结合 Kubernetes API 和 CI/CD 工具,可以实现租户自助服务:

# 租户通过API申请新环境
curl -X POST https://k8s-admin/api/v1/tenants \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name":"marketing-team"}'

五、方案对比与选型建议

方案 隔离级别 实现复杂度 适用场景
纯命名空间 简单 开发测试环境
命名空间+配额 中等 中小型生产环境
虚拟集群 复杂 严格隔离的企业环境

六、常见问题与解决方案

问题1:如何监控各租户的资源使用情况?

# 使用kubectl top查看资源使用
kubectl top pod --namespace=dev --containers

问题2:跨命名空间服务发现怎么办?

# 使用完整的服务DNS名称
backend-service.prod.svc.cluster.local

七、总结与最佳实践

  1. 从简单开始:先使用命名空间+配额的基础方案
  2. 渐进式增强:根据实际需求逐步添加网络策略和RBAC
  3. 自动化管理:通过工具链实现租户环境的自动创建和维护
  4. 监控告警:为每个租户设置独立的使用阈值和告警规则

记住:没有完美的方案,只有最适合当前业务场景的方案。随着业务发展,你的多租户策略也需要不断演进。