跳到正文
Træfɪk

Traefik 与 Kubernetes

Traefik Kubernetes Ingress 提供者是一个 Kubernetes Ingress 控制器;也就是说,它通过支持 Ingress 规范管理对集群服务的访问。

不支持 Ingress Backend Resource

不支持使用 spec.rules.http.paths.backend.resource 引用后端服务端点。请改用 spec.rules.http.paths.backend.service。

Ingress API 已冻结

Kubernetes Ingress API 已冻结,不再接受后续修改或更新。建议改用 Kubernetes Gateway 提供者。

配置示例

可以按以下方式启用 kubernetesIngress 提供者:

providers:
  kubernetesIngress: {}
[providers.kubernetesIngress]
--providers.kubernetesingress=true
## Values file
providers:
  kubernetesIngress:
    enabled: true

随后,该提供者监听传入的 Ingress 事件(如下例所示),并据此生成相应的动态配置,进而创建最终的路由器、服务、处理器等。

配置选项

字段 说明 默认值 必填
providers.providersThrottleDuration 配置重新加载后,等待至少这么长时间,才会处理任何新的配置刷新事件。
如果在此期间发生多个事件,只会处理最新事件,其余事件全部丢弃。
此选项不能针对单个提供者设置,但节流算法会独立应用于每个提供者。
2s 否
providers.kubernetesIngress.endpoint 服务器端点 URL。
更多信息请参阅此处。
"" 否
providers.kubernetesIngress.token 用于 Kubernetes 客户端配置的 Bearer 令牌。
接受直接提供的令牌值,或包含令牌的文件路径。
"" 否
providers.kubernetesIngress.certAuthFilePath 证书颁发机构文件的路径。
用于 Kubernetes 客户端配置。
"" 否
providers.kubernetesIngress.namespaces 要监听的命名空间数组。
留空则监听所有命名空间。
否
providers.kubernetesIngress.labelSelector 允许使用标签选择器过滤 Ingress 对象。
对 Kubernetes Secrets、EndpointSlices 和 Services 无效。
详情请参阅标签选择器。
"" 否
providers.kubernetesIngress.ingressClass 用于标识待处理资源对象的 IngressClass 资源名称或 kubernetes.io/ingress.class 注解值。
留空时,会处理未设置注解、注解值为空或值为 traefik 的资源。
"" 否
providers.kubernetesIngress.disableIngressClassLookup 已弃用: 请改用 disableClusterScopeResources。
禁止发现集群中的 IngressClass。
这可降低向 Traefik 授予查询 IngressClass 权限的要求。
忽略带有 IngressClass 的 Ingress。
注解不受此选项影响。
false 否
providers.kubernetesIngress.
ingressEndpoint.hostname
Kubernetes Ingress 端点使用的主机名。 "" 否
providers.kubernetesIngress.
ingressEndpoint.ip
此 IP 会复制到 Ingress 的 status.loadbalancer.ip,目前仅支持一个 IP 值(IPv4 或 IPv6)。 "" 否
providers.kubernetesIngress.
ingressEndpoint.publishedService
要从中复制状态的 Kubernetes 服务。
更多信息请参阅此处。
"" 否
providers.kubernetesIngress.throttleDuration 生成新配置前,两个 Kubernetes 事件之间至少需要等待的时间。
这可以防止每秒更新多次的 Kubernetes 集群持续修改 Traefik 配置。
留空则捕获每个事件。
0s 否
providers.kubernetesIngress.allowEmptyServices 允许创建通向没有可用端点的服务的路由。
这使 Traefik 能够在返回 HTTP 503 状态之前,处理发往此服务的请求和响应(应用中间件或执行可观测性操作)。
false 否
providers.kubernetesIngress.allowExternalNameServices 允许 Ingress 引用 ExternalName 服务。 false 否
providers.kubernetesIngress.crossProviderNamespaces 允许 Ingress 或 Service 从中使用 traefik.ingress.kubernetes.io/router.middlewares、traefik.ingress.kubernetes.io/router.tls.options、traefik.ingress.kubernetes.io/service.middlewares 或 traefik.ingress.kubernetes.io/service.serverstransport 注解的命名空间列表。
未设置时允许所有命名空间。设置为 [] 时,拒绝所有跨提供者引用。
[] 否
providers.kubernetesIngress.nativeLBByDefault 允许每个 Ingress 默认使用 Kubernetes Service 在 Pod 之间进行负载均衡,而不是使用 Traefik 提供的负载均衡。
可在 Service 中覆盖
false 否
providers.kubernetesIngress.disableClusterScopeResources 禁止发现集群范围资源(IngressClass 和 Nodes)。
这样可降低向 Traefik 授予查询集群资源权限的要求。
此外,Traefik 将不处理引用 IngressClass 的 Ingress,因此会忽略此类 Ingress(请注意,注解不受此选项影响)。
这也会阻止在服务上使用 NodePortLB 选项。
false 否
providers.kubernetesIngress.strictPrefixMatching 使前缀匹配严格遵守 Kubernetes Ingress 规范(按路径元素匹配,而非逐字符匹配字符串)。例如,/foo 这个 PathPrefix 会匹配 /foo、/foo/ 和 /foo/bar,但不会匹配 /foobar。 false 否

endpoint

Kubernetes 服务器的端点 URL。

部署到 Kubernetes 中时,Traefik 会读取环境变量 KUBERNETES_SERVICE_HOST 和 KUBERNETES_SERVICE_PORT,或 KUBECONFIG,以构造端点。

访问令牌从 /var/run/secrets/kubernetes.io/serviceaccount/token 读取,SSL CA 证书从 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 读取。部署在 Kubernetes 内部时,两者都会自动挂载。

可以指定端点,以覆盖集群内环境变量的值。

找不到环境变量时,Traefik 会尝试使用集群外客户端连接 Kubernetes API 服务器。

这种情况下必须指定端点。具体而言,可以将其设置为 kubectl proxy 使用的 URL,以使用关联 kubeconfig 授予的身份认证和授权连接 Kubernetes 集群。

providers:
  kubernetesIngress:
    endpoint: "http://localhost:8080"
    # ...
[providers.kubernetesIngress]
  endpoint = "http://localhost:8080"
  # ...
--providers.kubernetesingress.endpoint=http://localhost:8080

ingressEndpoint.publishedService

格式:namespace/servicename。

要从中复制状态的 Kubernetes 服务,其行为取决于服务类型:

  • ClusterIP: 服务的 ExternalIPs 会传播至 Ingress 状态。
  • NodePort: 集群节点的 ExternalIP 地址会传播至 Ingress 状态。
  • LoadBalancer: 服务的 loadBalancer.status 字段中的 IP(即负载均衡器提供的端点)会传播至 Ingress 状态。
  • ExternalName: 服务的 spec.externalName 字段中的主机名会传播至 Ingress 状态。

使用 External-DNS 等第三方工具时,此选项允许将服务的外部 IP 复制到 Ingress 资源。

providers:
  kubernetesIngress:
    ingressEndpoint:
      publishedService: "namespace/foo-service"
    # ...
[providers.kubernetesIngress.ingressEndpoint]
  publishedService = "namespace/foo-service"
  # ...
--providers.kubernetesingress.ingressendpoint.publishedservice=namespace/foo-service

路由配置

请参阅路由中的专门章节。

延伸阅读

要进一步了解 Traefik 支持的 Ingress 规范的各个方面,可查看 Traefik 仓库测试示例中的大量 Ingress 定义示例。


在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。

为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。


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

文档由 HeadFile Studio 翻译。

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