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:8080ingressEndpoint.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 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。