跳到正文
Træfɪk

多租户 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。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证