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 解决就别上节点池。

标签: none

添加新评论