多租户 Kubernetes 集群中的 Traefik¶
Traefik 主要设计为集群级入口控制器。因此,使用 Kubernetes Ingress 或 IngressRoute 规范时,不建议在多个团队或租户共享同一集群的多租户 Kubernetes 环境中,共用一个 Traefik 实例。
主要原因包括:
- 资源可见性与隔离:Traefik 需要集群级权限,并监听跨命名空间的资源。一个租户的资源配置错误可能影响其他租户。
- 共享 CRD:Middleware 或 TLSOptions 等高级配置资源属于集群作用域。定义冲突可能影响多个租户。
- 流量与可用性风险:一个租户的路由规则、中间件或大流量可能干扰其他租户,影响可靠性和性能。
- 可观测性与隐私:日志、指标和追踪默认共享,可能导致敏感信息跨租户暴露。
TLS 证书管理¶
这一限制的核心是 TLS Store,它保存 Traefik 使用的所有 TLS 证书。
由于这个存储在 Traefik 中是全局的,所有命名空间都会共享它,因此集群中的任何 Ingress 或 IngressRoute 都有可能引用或影响原本属于其他租户的 TLS 配置。
在不同团队或应用需要严格资源边界的多租户环境中,这种隔离缺失会带来风险,尤其涉及 TLS 证书等敏感数据时。
推荐部署方式¶
对于多租户 Kubernetes 集群,推荐为每个租户部署专用的 Traefik 实例,并将其范围限制在该租户的命名空间内。 这样可以建立严格的租户边界,防止配置跨租户泄漏。
每个 Traefik 实例都应:
- 部署在租户的命名空间中,并使用专用的
ServiceAccount。 - 配置
providers.kubernetesCRD.namespaces和/或providers.kubernetesIngress.namespaces,只监听该租户命名空间中的资源。 - 通过 Kubernetes RBAC 将其访问权限限制为实际需要的资源。
这种每租户独立命名空间的拓扑与 Kubernetes NetworkPolicy 资源配合,可以在共享集群上运行 Traefik 时提供目前最强的隔离能力。
通过 Helm Chart 为每个租户配置独立的 Traefik 实例
providers:
kubernetesCRD:
namespaces:
- tenant
kubernetesIngress:
namespaces:
- tenant
Gateway API¶
我们也鼓励用户采用 Kubernetes Gateway API,它在设计中将多租户作为首要考虑。 Gateway API 提供了表达力更强、面向角色的入口管理模型,内置支持将路由配置委派给各个租户, 同时让集群运维人员保持基础设施层面的控制。 相比传统 Ingress 模型,这套机制能够更稳健地处理多租户场景,也是新部署推荐采用的方向。
例如,在 TLS 证书管理方面,管理员可以通过 Listener 资源显式定义:
允许哪些 Route 资源(例如 HTTPRoute)绑定到哪些域名或端口。
这样可以更严格地约束租户之间的所有权与隔离,使 Gateway API 相比传统 Ingress 模型
更适合多租户场景,也更安全、更稳健。
对于多租户环境中的新部署,推荐采用 Gateway API。