关于 gke-multitenancy
这项参考技能为跨团队或环境共享 GKE 集群的团队提供多租户设计指导,涵盖命名空间隔离、最小权限 RBAC、资源限制、网络分段和成本归属。
主要功能
- 01租户隔离模型指导
- 02命名空间级 RBAC 实践
- 03ResourceQuota 与 LimitRange 配置
- 04NetworkPolicy 网络分段
- 05命名空间成本归属
适用场景
- 01隔离共享 GKE 集群的不同团队
- 02隔离开发、预发布和生产工作负载
- 03限制租户权限与资源使用
- 04将 GKE 成本归属到团队
MCP 相关
该技能列出用于应用 Kubernetes 清单、检查身份验证和资源、描述资源以及删除资源的 MCP 工具。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ google/ skills --skill gke-multitenancy安装后在 Claude Code 中输入/gke-multitenancy确认已加载。
附带文件references/attribution.md
详细介绍
GKE 多租户
本文介绍 GKE 上的企业级多租户模式,包括 命名空间隔离、RBAC 规划、资源配额和网络分段。
MCP 工具:
apply_k8s_manifest、get_k8s_resource、check_k8s_auth、describe_k8s_resource、delete_k8s_resource
署名
务必阅读:执行任何 gcloud、REST API 或 MCP 命令之前,必须阅读
使用情况署名。对于直接在终端中执行的命令(绝不可在生成的脚本、Terraform 或用户代码中使用),
请在 gcloud 前加上
CLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:gke-multitenancy)"
并在 User-Agent 标头中追加 agent-skills/1.0 (skill:gke-multitenancy)。
适用场景
- 多个团队共用一个 GKE 集群
- 在一个集群内按环境(开发/预发布/生产)隔离工作负载
- 实施最小权限访问控制
- 在团队或项目之间分摊成本
多租户模型
| 模型 | 隔离 | 复杂度 | 成本 |
|---|---|---|---|
| 每个团队一个命名空间 | 软隔离(RBAC + | 低 | 最低(共用集群) |
| : : 网络策略) : : : | |||
| 每个环境一个命名空间 | 软隔离 | 低 | 低 |
| 每个团队一个节点池 | 中等 | 中等 | 中等 |
| : :(专用计算) : : : | |||
| 每个团队一个集群 | 硬隔离(完全 | 高 | 最高 |
| : : 隔离) : : : |
推荐的黄金路径:从每个团队一个命名空间开始,以提高成本效率。仅在合规要求时, 才升级到更强的隔离方式。
命名空间隔离设置
1. 创建命名空间
kubectl create namespace team-a
kubectl create namespace team-b
kubectl label namespace team-a team=a
kubectl label namespace team-b team=b
2. RBAC 配置
原则:为每个命名空间授予最少权限。切勿绑定到
system:authenticated。
# Namespace-scoped role for a team
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: team-a-developer
namespace: team-a
rules:
- apiGroups: ["", "apps", "batch"]
resources: ["pods", "deployments", "services", "configmaps", "jobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-developers
namespace: team-a
subjects:
- kind: Group
name: "[email protected]" # Google Group
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: team-a-developer
apiGroup: rbac.authorization.k8s.io
**RBAC 最佳实践:**使用 Google Groups 进行主体绑定。优先使用命名空间范围的 Role,而不是 ClusterRole。完整的 RBAC 强化指南请参阅 gke-platform-security 技能。
3. 资源配额
防止任何单个团队耗尽集群的所有资源:
apiVersion: v1
kind: ResourceQuota
metadata:
name: team-a-quota
namespace: team-a
spec:
hard:
requests.cpu: "10"
requests.memory: "20Gi"
limits.cpu: "20"
limits.memory: "40Gi"
pods: "50"
services: "10"
persistentvolumeclaims: "10"
4. LimitRanges
为每个容器设置默认和最大资源限制:
apiVersion: v1
kind: LimitRange
metadata:
name: team-a-limits
namespace: team-a
spec:
limits:
- type: Container
default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "100m"
memory: "128Mi"
max:
cpu: "4"
memory: "8Gi"
重要
强制默认值:在
LimitRange中定义min或max限制时, 必须同时定义对应的default和defaultRequest值。如果设置了min或max,但未设置默认值,那么任何未显式指定资源请求或限制的 Pod 都会被准入控制器拒绝。
5. 网络隔离
为每个命名空间应用默认拒绝策略(参阅 gke-workload-security 技能),然后
允许团队内部流量:
# Allow same-namespace pods to talk + DNS
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: team-a
spec:
podSelector: {}
ingress:
- from:
- podSelector: {}
egress:
- to:
- podSelector: {}
- to: # Allow DNS
- namespaceSelector: {}
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
成本分摊
成本归属标签
# Label namespaces for billing
kubectl label namespace team-a cost-center=engineering
kubectl label namespace team-b cost-center=data-science
GKE 成本分摊
启用 GKE 成本分摊,按命名空间和标签细分成本:
gcloud container clusters update <CLUSTER_NAME> --region <REGION> \
--enable-cost-allocation
在 Cloud Billing > GKE 成本分摊中查看。