一、为什么需要多租户隔离
想象一下,你有一套公寓要出租给不同的租户。如果所有租户共用同一个大门钥匙、同一个卫生间,甚至同一个冰箱,那肯定会乱套。Kubernetes 集群也是一样,当多个团队或项目共用同一个集群时,如果没有良好的隔离机制,就会导致资源争抢、配置冲突甚至安全问题。
多租户隔离的核心目标有三个:
- 资源隔离:确保不同租户的资源(CPU、内存等)不会互相挤占
- 权限隔离:防止租户A误操作或恶意访问租户B的资源
- 网络隔离:避免租户间的服务互相干扰
二、命名空间:最基础的隔离单元
命名空间(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
七、总结与最佳实践
- 从简单开始:先使用命名空间+配额的基础方案
- 渐进式增强:根据实际需求逐步添加网络策略和RBAC
- 自动化管理:通过工具链实现租户环境的自动创建和维护
- 监控告警:为每个租户设置独立的使用阈值和告警规则
记住:没有完美的方案,只有最适合当前业务场景的方案。随着业务发展,你的多租户策略也需要不断演进。
评论