Kubernetes/GKE多租户Ingress实现疑问:单Ingress集群部署相关问题
GKE多租户场景下单一Ingress模式落地指南
一、模式落地核心思路
基于主机名(Host)路由划分实现租户隔离:平台维护全局唯一的Ingress对象,通过host字段匹配不同租户的子域名(如service1.tenanta.example.com),将流量精准转发到对应租户命名空间内的Service。核心依赖两个关键点:
- 集群级RBAC权限控制,确保租户仅能操作自身命名空间资源
- 平台统一管控Ingress的全局配置(如TLS证书、负载均衡器绑定)
二、单一Ingress的生命周期
- 初始化创建:由平台运维团队在集群部署阶段创建,绑定GKE的Google Cloud Load Balancer(GCLB),配置全局基础规则(如平台自身服务路由、通配符TLS证书)。
- 日常维护:
- 平台负责Ingress的核心配置变更(如证书更新、负载均衡器参数调整)
- 租户提交路由注册申请后,平台审核并更新Ingress的
spec.rules字段,添加对应租户的路由规则
- 销毁:仅平台团队有权操作,仅在集群退役或整体架构调整时删除Ingress对象及关联的负载均衡器资源。
三、Ingress的创建与维护主体
明确由平台运维团队创建并全权维护:
- 单一Ingress属于集群级共享资源,若开放给租户修改,极易引发路由冲突、配置错误等跨租户影响
- 平台团队负责制定路由规范(如子域名命名规则:
[服务名].[租户名].example.com)、审核租户路由申请、保障Ingress的高可用性
四、租户服务注册到Ingress的流程
常规流程(适合中小规模集群)
- 租户在自身命名空间内部署Service(确保Service已正常运行)
- 租户提交路由注册申请,包含以下信息:
- 期望的访问域名(如
service1.tenanta.example.com) - 自身命名空间名称、Service名称及端口
- 期望的访问域名(如
- 平台团队审核域名唯一性、Service合法性后,更新全局Ingress的规则配置
自动化流程(适合大规模集群)
通过自定义CRD(如TenantIngressRoute)+ 平台控制器实现自动注册:
- 平台定义自定义CRD,允许租户在自身命名空间内提交路由规则
- 平台部署控制器,监听所有租户命名空间的
TenantIngressRoute资源,自动合并规则到全局Ingress - 租户只需在自身命名空间创建CRD实例,无需人工审核(需提前约定域名规则避免冲突)
示例配置
1. 平台创建的全局Ingress
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: shared-gke-ingress namespace: platform-system annotations: kubernetes.io/ingress.class: "gce" networking.gke.io/managed-certificates: "wildcard-example-com" # GKE托管通配符证书 spec: tls: - hosts: - "*.example.com" secretName: wildcard-example-com-tls # 若不使用托管证书,指定证书Secret rules: # 平台自身服务路由 - host: "platform.example.com" http: paths: - path: "/" pathType: Prefix backend: service: name: platform-dashboard port: number: 80
2. 租户Tenanta的Service(命名空间tenanta)
apiVersion: v1 kind: Service metadata: name: service1 namespace: tenanta spec: selector: app: service1 ports: - protocol: TCP port: 80 targetPort: 8080
3. 平台更新Ingress添加租户路由
在全局Ingress的spec.rules中新增以下规则:
- host: "service1.tenanta.example.com" http: paths: - path: "/" pathType: Prefix backend: service: name: service1 namespace: tenanta # 必须指定租户命名空间(Ingress在平台命名空间) port: number: 80
4. 租户权限控制RBAC示例
平台为租户创建仅能操作自身命名空间的Role:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: tenanta name: tenant-service-manager rules: - apiGroups: [""] resources: ["services", "deployments", "pods"] verbs: ["get", "list", "create", "update", "delete"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] verbs: ["get", "list"] # 租户仅能查看Ingress,无修改权限
内容的提问来源于stack exchange,提问作者Vsoma
相关产品推荐
相关产品推荐

