Kubernetes CRD
Traefik 提供了一些 Kubernetes 自定义资源,例如 IngressRoute、Middleware 等。
使用 KubernetesCRD 作为提供者时,Traefik 通过自定义资源定义获取路由配置。Traefik 自定义资源定义列于下文。
使用 Helm Chart 安装 Traefik 时,默认启用 kubernetesCRD 提供者。
要求¶
不使用 Helm Chart 安装 Traefik,或使用 Helm 升级整个部署栈时,请确保满足以下要求:
- 添加或更新 所有 Traefik 资源定义
- 添加或更新 Traefik 自定义资源的 RBAC
# Install Traefik Resource Definitions:
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v3.7/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
# Install RBAC for Traefik:
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v3.7/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml
配置示例¶
可以按以下方式启用 kubernetesCRD 提供者:
providers:
kubernetesCRD: {}[providers.kubernetesCRD]--providers.kubernetescrd=true## Values file
providers:
kubernetesCRD:
enabled: true配置选项¶
| 字段 | 说明 | 默认值 | 必填 |
|---|---|---|---|
providers.providersThrottleDuration |
配置重新加载后,等待至少这么长时间,才会处理任何新的配置刷新事件。 如果在此期间发生多个事件,只会处理最新事件,其余事件全部丢弃。 此选项不能针对单个提供者设置,但节流算法会独立应用于每个提供者。 |
2s | 否 |
providers.kubernetesCRD.endpoint |
服务器端点 URL。 更多信息请参阅此处。 |
"" | 否 |
providers.kubernetesCRD.token |
用于 Kubernetes 客户端配置的 Bearer 令牌(集群内客户端不需要)。 接受令牌值或指向令牌的文件路径。 |
"" | 否 |
providers.kubernetesCRD.certAuthFilePath |
证书颁发机构文件的路径。 用于 Kubernetes 客户端配置。 |
"" | 否 |
providers.kubernetesCRD.namespaces |
要监听的命名空间数组。 留空则监听所有命名空间。 |
[] | 否 |
providers.kubernetesCRD.labelSelector |
允许仅通过标签选择器过滤特定资源对象。 仅作用于 Traefik 自定义资源(它们都必须匹配过滤器)。 对 Kubernetes Secrets、EndpointSlices 和 Services 无效。详情请参阅标签选择器。 |
"" | 否 |
providers.kubernetesCRD.ingressClass |
用于标识待处理资源对象的 spec.ingressClassName 字段值(或已弃用的 kubernetes.io/ingress.class 注解值)。留空时,会处理未设置此字段或注解、值为空或值为 traefik 的资源。spec.ingressClassName 字段优先于注解。 |
"" | 否 |
providers.kubernetesCRD.throttleDuration |
生成新配置前,两个 Kubernetes 事件之间至少需要等待的时间。 这可以防止每秒更新多次的 Kubernetes 集群持续修改 Traefik 配置。 留空则捕获每个事件。 |
0s | 否 |
providers.kubernetesCRD.allowEmptyServices |
允许创建通向没有可用端点的服务的路由。 这使 Traefik 能够在返回 HTTP 503 状态之前,处理发往此服务的请求和响应(应用中间件或执行可观测性操作)。 |
false | 否 |
providers.kubernetesCRD.allowCrossNamespace |
允许 IngressRoutes 引用其所在命名空间之外的资源。 |
false | 否 |
providers.kubernetesCRD.allowExternalNameServices |
允许 IngressRoutes 引用 ExternalName 服务。 |
false | 否 |
providers.kubernetesCRD.crossProviderNamespaces |
允许 IngressRoute、IngressRouteTCP、IngressRouteUDP 和 TraefikService 从中声明跨提供者引用(例如 myservice@file)的命名空间列表。未设置时允许所有命名空间。设置为 [] 时,拒绝所有跨提供者引用。 |
[] | 否 |
providers.kubernetesCRD.nativeLBByDefault |
允许每个 IngressRoute 默认使用 Kubernetes Service 在 Pod 之间进行负载均衡,而不是使用 Traefik 提供的负载均衡。可在 Service 中覆盖。 |
false | 否 |
providers.kubernetesCRD.disableClusterScopeResources |
禁止发现集群范围资源(IngressClass 和 Nodes)。这样可降低向 Traefik 授予查询集群资源权限的要求。 此外,Traefik 将不处理引用 IngressClass 的 IngressRoute,因此会忽略此类 Ingress(请注意,注解不受此选项影响)。 这也会阻止在服务上使用 NodePortLB 选项。 |
false | 否 |
providers.kubernetesCRD.defaultTLSResourcesNamespace |
限制名为 default 的 TLSOption 和 TLSStore 可以在哪个命名空间中定义。更多信息请参阅此处。 |
"" | 否 |
providers.kubernetesCRD.safeNaming |
对提供者生成的路由器、中间件和服务启用可避免冲突的命名方式。 未设置时,使用旧命名方案,并在启动时记录警告。更多信息请参阅此处。 |
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:
kubernetesCRD:
endpoint: "http://localhost:8080"
# ...[providers.kubernetesCRD]
endpoint = "http://localhost:8080"
# ...--providers.kubernetesCRD.endpoint=http://localhost:8080defaultTLSResourcesNamespace¶
名为 default 的 TLSOption 和 TLSStore 在整个集群范围内生效,与其所在命名空间无关:前者保存所有未显式引用 TLSOption 的路由器所采用的 TLS 强制策略,后者保存每个入口点提供的默认证书。此选项允许集群运维人员将这些资源的定义限制在自己控制的命名空间中。
未设置此选项时,无论命名空间是什么,名为 default 的 TLSOption 或 TLSStore 都会被采用;这是默认行为,并且向后兼容。将此选项设置为某个命名空间时,只会采用该命名空间中名为 default 的资源。
被忽略的资源
在配置的命名空间之外定义的、名为 default 的 TLSOption 或 TLSStore 会被忽略,也无法通过带命名空间的名称引用。对于 TLSStore,它定义的证书同样如此。
providers:
kubernetesCRD:
defaultTLSResourcesNamespace: traefik
# ...[providers.kubernetesCRD]
defaultTLSResourcesNamespace = "traefik"
# ...--providers.kubernetesCRD.defaultTLSResourcesNamespace=traefiksafeNaming¶
默认情况下,Kubernetes CRD 提供者通过拼接源对象的命名空间与名称,为其构建的路由器、中间件和服务生成名称。这可能使两个不同对象生成相同名称,导致其中一个静默替换另一个。
safeNaming 会改用可避免冲突的命名方式:生成的名称源自其来源对象的标识;由多个父对象引用的 Kubernetes 服务(例如包含多个服务的路由,或 Weighted/Mirroring/HighestRandomWeight TraefikService)则限定在各自父对象范围内,不再按对象标识共享。
| 值 | 行为 |
|---|---|
| 未设置 | 使用当前命名方式(默认行为,向后兼容),并在启动时记录警告。 |
true |
使用可避免冲突的命名方式。 |
false |
使用当前命名方式,并关闭启动警告。 |
启动警告
未设置 safeNaming 时,由于当前命名方案容易产生冲突,启动时会记录一条警告。建议显式设置此选项:对于新部署,设置为 true;若要保持当前行为并关闭警告,则设置为 false。
启用 safeNaming 后,生成的名称不再进行规范化:各组成部分使用 _ 分隔符连接,而该字符不能出现在 Kubernetes 命名空间或名称中;为路由生成的名称则根据路由索引而非其规则派生。例如,default 命名空间中有一个名为 whoami 的 Kubernetes 服务,以及一个名为 test.route 的 IngressRoute:
default-whoami-80 -> default_whoami_80
default-test-route-6b204d94623b3df4370c -> default_test.route_0
对于由 TraefikService(加权、镜像或最高随机权重)或含有多个服务的路由引用的 Kubernetes 服务,生成的服务名称以声明该引用的父对象命名,后接引用索引,以及被引用 Kubernetes 服务的命名空间、名称和端口:
default-whoami-80 -> default_wrr1_wrr_1_default_whoami_80
每个此类引用都携带自己的选项(serversTransport、scheme、sticky、healthCheck 等)。这些选项以前并不包含在生成的名称中:指向同一 Kubernetes 服务但选项不同的两个引用会被合并成一个服务,最后构建的引用会静默覆盖前者。启用 safeNaming 后,它们会成为不同的服务;这也意味着,如果某个 Kubernetes 服务被多个父对象引用,其服务器会针对每个引用分别接受健康检查,而不是所有引用共用一次检查。
可观测性
这些名称对用户可见:它们会显示在仪表板和 API 中、访问日志的 RouterName 与 ServiceName 字段中,以及指标的 router 与 service 标签中。启用 safeNaming 时,必须相应更新那些匹配 Kubernetes CRD 路由器、中间件或服务名称的仪表板、告警规则和日志查询。
跨提供者引用
其他提供者引用的也是这些生成的名称。启用 safeNaming 后,带命名空间的 @kubernetescrd 引用(例如 Ingress 上的 traefik.ingress.kubernetes.io/router.middlewares 注解)必须使用 namespace_name@kubernetescrd 格式,而不是 namespace-name@kubernetescrd。仍使用旧格式的引用无法解析,使用它的路由器也不会被创建。对于 TLS 选项引用,这些路由器所服务的主机名上的 TLS 握手会被拒绝。
providers:
kubernetesCRD:
safeNaming: true
# ...[providers.kubernetesCRD]
safeNaming = true
# ...--providers.kubernetesCRD.safeNaming=true路由配置¶
Traefik CRD 是可以按需组合的构建块。
可用的自定义资源如下表所示:
| 资源 | 用途 |
|---|---|
| IngressRoute | HTTP 路由 |
| Middleware | 在 HTTP 请求发送到服务之前对其进行调整 |
| TraefikService | HTTP 负载均衡与镜像的抽象 |
| TLSOptions | 允许配置 TLS 连接的部分参数 |
| TLSStores | 允许配置默认 TLS 存储 |
| ServersTransport | 允许配置 Traefik 与后端之间的传输 |
| IngressRouteTCP | TCP 路由 |
| MiddlewareTCP | 在 TCP 请求发送到服务之前对其进行调整 |
| ServersTransportTCP | 允许配置 Traefik 与后端之间的传输 |
| IngressRouteUDP | UDP 路由 |
特点¶
- 使用
name和namespace引用其他 Kubernetes 资源。 - 使用 secret 保存敏感数据(TLS 证书和凭据)。
完整示例¶
有关通过 Kubernetes 暴露服务的更多信息,请参阅 Kubernetes 指南。
在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。
为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。