Kubernetes IngressRouteTCP
IngressRouteTCP 是 Traefik TCP 路由器 的 CRD 实现。
在创建 IngressRouteTCP 对象之前,你需要将 Traefik Kubernetes CRDs 应用到你的 Kubernetes 集群。
这会注册 IngressRouteTCP 类型以及其它 Traefik 专属资源。
一般说明
如果 HTTP 路由器和 TCP 路由器连接到同一 EntryPoint,TCP 路由器将在 HTTP 路由器之前应用。如果没有找到匹配的 TCP 路由,则 HTTP 路由器将接管。
配置示例
你可以按如下方式声明一个 IngressRouteTCP:
yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: ingressroutetcpfoo
namespace: apps
spec:
ingressClassName: traefik-lb
entryPoints:
- footcp
routes:
- match: HostSNI(`*`)
priority: 10
middlewares:
- name: middleware1
namespace: default
services:
- name: foo
port: 8080
weight: 10
serversTransport: transport
nativeLB: true
nodePortLB: true
tls:
secretName: supersecret
options:
name: opt
namespace: default
certResolver: foo
domains:
- main: example.net
sans:
- a.example.net
- b.example.net
passthrough: false配置选项
| 字段 | 描述 | 默认值 | 必填 |
|---|---|---|---|
ingressClassName | 定义要使用的 IngressClass 集群资源。它取代了已弃用的 kubernetes.io/ingress.class 注解。spec 字段优先于该注解。 | 否 | |
entryPoints | EntryPoint 名称列表。 | 否 | |
routes | 路由列表。 | 是 | |
routes[n].match | 定义底层路由器的规则。 | 是 | |
routes[n].priority | 定义用于区分相同长度规则的优先级。 | 否 | |
routes[n].middlewares[n].name | 定义中间件名称。 | 是 | |
routes[n].middlewares[n].namespace | 定义中间件命名空间。 | "" | 否 |
routes[n].services | Kubernetes Service 定义列表。 | 否 | |
routes[n].services[n].name | 定义 Kubernetes Service 的名称。 | 是 | |
routes[n].services[n].port | 定义 Kubernetes Service 的端口。可以是对命名端口的引用。 | 是 | |
routes[n].services[n].weight | 定义应用于服务器负载均衡的权重。 | 1 | 否 |
routes[n].services[n].proxyProtocol | 定义 PROXY 协议配置。 | 否 | |
routes[n].services[n].proxyProtocol.version | 定义 PROXY 协议版本。 | 否 | |
routes[n].services[n].serversTransport | 定义 ServersTransportTCP 资源。ServersTransport 命名空间假定为 IngressRoute 命名空间。 | 否 | |
routes[n].services[n].nativeLB | 控制创建负载均衡器时,LB 的子项是直接是 pod IP 还是仅是 Kubernetes Service clusterIP。详见 NativeLB。 | false | 否 |
routes[n].services[n].nodePortLB | 控制创建负载均衡器时,当 service 类型为 NodePort 时,LB 的子项是否使用节点内部 IP 和 nodePort。它允许在 Traefik 在 Kubernetes 集群外部但在节点同一网络内运行时,service 仍可访问。 | false | 否 |
tls | 定义 TLS 证书配置。 | 否 | |
tls.secretName | 定义用于存储证书的 Secret 名称(在 IngressRoute 命名空间中)。 | "" | 否 |
tls.options | 定义对 TLSOption 的引用。 | "" | 否 |
tls.options.name | 定义 TLSOption 名称。 | "" | 否 |
tls.options.namespace | 定义 TLSOption 命名空间。 | "" | 否 |
tls.certResolver | 定义对 CertResolver 的引用。 | "" | 否 |
tls.domains | 域名列表。 | "" | 否 |
tls.domains[n].main | 定义主域名。 | "" | 否 |
tls.domains[n].sans | SAN 列表(备用域名)。 | "" | 否 |
tls.passthrough | 如果为 true,将 TLS 终止委托给后端。 | false | 否 |
ExternalName Service
Traefik 使用域名和端口连接到后端。但是 Kubernetes ExternalName Service 可以在没有任何端口的情况下定义。因此,Traefik 支持通过两种方式定义端口:
- 仅在
IngressRouteTCPservice 上 - 两侧都定义,如果端口不匹配会发出警告,使用
IngressRouteTCPservice 端口
因此,如果两侧都定义了端口,Traefik 期望端口匹配。
在资源上定义端口
IngressRouteTCP
yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80Service ExternalName
yaml
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName在 Service 上定义端口
IngressRouteTCP
yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svcService ExternalName
yaml
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80两侧都定义端口
IngressRouteTCP
yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: test.route
namespace: apps
spec:
entryPoints:
- foo
routes:
- match: Host(`example.net`)
kind: Rule
services:
- name: external-svc
port: 80Service ExternalName
yaml
apiVersion: v1
kind: Service
metadata:
name: external-svc
namespace: apps
spec:
externalName: external.domain
type: ExternalName
ports:
- port: 80NativeLB
要避免使用 pod IP 创建服务器负载均衡器,而直接使用 Kubernetes Service clusterIP,应将 NativeLB 选项设置为 true。默认情况下,NativeLB 为 false。
IngressRouteTCP
yaml
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: test.route
namespace: default
spec:
entryPoints:
- foo
routes:
- match: HostSNI(`*`)
services:
- name: svc
port: 80
# 此处,nativeLB 指示仅使用 Kubernetes Service clusterIP 构建服务器负载均衡器。
nativeLB: trueService
yaml
apiVersion: v1
kind: Service
metadata:
name: svc
namespace: default
spec:
type: ClusterIP
...在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。