K8s 多租户隔离方案对比
K8s 给多团队 / 多业务用,怎么隔离?方案从弱到强排列。
L1:Namespace 隔离(最弱)
每个团队一个 namespace + RBAC:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-admin
namespace: team-a
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
subjects:
- kind: Group
name: team-a
隔离的:API 权限。
不隔离的:网络(所有 Pod 互通)、节点(混合调度)、资源(无限抢)。
适合:内部团队、互相信任的场景。
L2:加 NetworkPolicy + ResourceQuota
# 资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "100"
requests.memory: 200Gi
limits.cpu: "200"
persistentvolumeclaims: "20"
---
# 默认拒绝所有外部流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: team-a
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
加 NetworkPolicy 后跨 namespace 默认不通,加 ResourceQuota 后无法抢资源。
适合:公司内部多业务、生产级隔离。
L3:节点池隔离
不同租户跑在不同节点上:
# 节点打 taint
kubectl taint nodes worker-team-a tenant=team-a:NoSchedule
# 业务 Pod 加 toleration + nodeSelector
spec:
nodeSelector:
tenant: team-a
tolerations:
- key: tenant
operator: Equal
value: team-a
effect: NoSchedule
物理隔离,避免 noisy neighbor。但成本上升(每个团队都要预留节点)。
适合:金融、政企等强合规场景。
L4:vCluster(虚拟集群)
每个租户一个虚拟 K8s 集群,跑在 host 集群的 namespace 里:
helm install vcluster-team-a vcluster --namespace team-a
每个租户看到的是独立 API server、独立 etcd(轻量),但底层共享 host 节点。
适合:SaaS 平台、PaaS 服务。
L5:独立集群
最强隔离 = 一租户一集群。
适合:完全不能共享的场景(多家公司、跨地域)。
决策树
跨公司租户? → 独立集群
跨业务(同一公司),强合规? → 节点池隔离
内部团队,要看似独立的 K8s? → vCluster
内部团队,控制资源 + 网络就够? → Namespace + Quota + NetworkPolicy
完全信任,简单分组? → Namespace + RBAC
Quota 设置的坑
ResourceQuota 一旦设置,namespace 里所有 Pod 必须设 requests/limits,否则创建失败。配合 LimitRange 设默认值:
apiVersion: v1
kind: LimitRange
metadata:
name: team-a-defaults
namespace: team-a
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
type: Container
教训:多租户隔离不是越强越好——节点池隔离用户体验下降明显,能用 Quota 解决就别上节点池。