Skip to content

多租户 Kubernetes 集群中的 Traefik

多租户 Kubernetes 集群中的 Traefik

Traefik 主要被设计为集群范围的 ingress controller。出于这个原因,当使用 Kubernetes IngressIngressRoute 规范时,不建议在多租户 Kubernetes 集群中使用 Traefik 的共享实例,其中多个团队或租户共享同一集群。

主要原因包括:

  • 资源可见性和隔离:Traefik 需要集群级别的权限并监视跨命名空间的资源。一个租户资源的错误配置可能会影响其它租户。
  • 共享 CRD:高级配置资源(如 Middleware 或 TLSOptions)是集群范围的。冲突的定义会影响多个租户。
  • 流量和可用性风险:一个租户的路由规则、中间件或大量流量可能会干扰其它租户,影响可靠性和性能。
  • 可观测性和隐私:日志、指标和 traces 默认是共享的,这可能会在租户之间暴露敏感信息。

TLS 证书管理

此限制的核心是 TLS Store,它保存 Traefik 使用的所有 TLS 证书。由于此 Store 在 Traefik 中是全局的,它在所有命名空间之间共享,这意味着集群中的任何 IngressIngressRoute 都可能潜在地引用或影响针对其它租户的 TLS 配置。

在多租户环境中,这种隔离缺失会带来风险,因为不同团队或应用程序需要在资源之间设置严格的边界,特别是围绕 TLS 证书等敏感数据。

推荐的设置

多租户 Kubernetes 集群的推荐方法是为每个租户部署一个专用的 Traefik 实例,范围限定为该租户的命名空间。这确保了租户之间的严格边界,并防止跨租户配置泄漏。

每个 Traefik 实例应该:

  • 部署在租户的命名空间中,使用专用的 ServiceAccount
  • 配置 providers.kubernetesCRD.namespaces 和/或 providers.kubernetesIngress.namespaces 以将资源监视限制为仅该租户的命名空间
  • 受到 Kubernetes RBAC 的约束,限制其对所需资源的访问

这种每租户一个命名空间的拓扑,结合 Kubernetes NetworkPolicy 资源,在共享集群上运行 Traefik 时提供最强大的可用隔离。

使用 Helm Chart 为每个租户专用一个 Traefik 实例

yaml
providers:
  kubernetesCRD:
    namespaces:
      - tenant
  kubernetesIngress:
    namespaces:
      - tenant

Gateway API

我们还鼓励用户采用 Kubernetes Gateway API,它将多租户作为一等公民来设计。Gateway API 提供了一种更具表达性和面向角色的模型来管理 ingress,内置支持将路由配置委托给各个租户,同时为集群操作员保留基础设施级别的控制。此工具比传统的 Ingress 模型更稳健地处理多租户场景,是新部署的推荐方向。

例如,关于 TLS 证书管理,Listener 资源允许管理员显式定义哪些 Route 资源(例如 HTTPRoute)被允许绑定到哪些域名或端口。这强制实施了租户之间更严格的所有权和隔离,使 Gateway API 成为多租户用例比传统 Ingress 模型更安全、更强大的选择。

对于多租户环境中的新部署,采用 Gateway API 是推荐方向。

基于 MIT 协议发布