跳到正文
Træfɪk

IngressRouteTCP

IngressRouteTCP 是 Traefik TCP 路由器的 CRD 实现。

创建 IngressRouteTCP 对象前,需要将 Traefik Kubernetes CRD 应用到 Kubernetes 集群。

这会注册 IngressRouteTCP 类型及其他 Traefik 专用资源。

通用说明

如果 HTTP 路由器和 TCP 路由器连接到同一个入口点,会先应用 TCP 路由器。如果 TCP 路由器未找到匹配路由,再交给 HTTP 路由器处理。

配置示例

可以按以下方式声明 IngressRouteTCP:

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 入口点名称列表。 否
routes 路由列表。 是
routes[n].match 定义底层路由器使用的规则。 是
routes[n].priority 定义用于区分相同长度规则的路由匹配优先级。 否
routes[n].middlewares[n].name 定义 MiddlewareTCP 名称。 是
routes[n].middlewares[n].namespace 定义 MiddlewareTCP 命名空间。 "" 否
routes[n].services Kubernetes 服务定义列表。 否
routes[n].services[n].name 定义 Kubernetes 服务名称。 是
routes[n].services[n].namespace 定义所引用的 Kubernetes 服务的命名空间。 "" 否
routes[n].services[n].port 定义 Kubernetes 服务端口,也可以引用命名端口。 是
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 默认使用 Kubernetes 服务所在的命名空间。
否
routes[n].services[n].tls 决定与后端建立连接时是否使用 TLS。 false 否
routes[n].services[n].nativeLB 创建负载均衡器时,控制其子节点是各 Pod IP,还是唯一的 Kubernetes Service clusterIP。详见 NativeLB。 false 否
routes[n].services[n].nodePortLB 创建负载均衡器时,控制在服务类型为 NodePort 时是否直接以节点内部 IP 和 nodePort 作为子节点。这样,当 Traefik 运行在 Kubernetes 集群外部、但与节点位于同一网络时,仍能访问服务。 false 否
tls 定义 TLS 证书配置。 否
tls.secretName 定义用于存储证书的 Secret 名称,必须位于 IngressRoute 命名空间。 "" 否
tls.options 定义对 TLSOption 的引用。 "" 否
tls.options.name 定义 TLSOption 名称。 "" 否
tls.options.namespace 定义 TLSOption 命名空间。 "" 否
tls.store 定义对 TLSStore 的引用。请注意,只能使用 default TLSStore。 否
tls.certResolver 定义对 CertResolver 的引用。 "" 否
tls.domains 域名列表。 "" 否
tls.domains[n].main 定义主域名。 "" 否
tls.domains[n].sans SAN(备用域名)列表。 "" 否
tls.passthrough 设为 true 时,将 TLS 终止交给后端处理。 false 否

ExternalName 服务

Traefik 使用域名和端口连接后端,但 Kubernetes 的 ExternalName Service 可以不定义端口。因此,Traefik 支持以下两种端口定义方式:

  • 仅在 IngressRouteTCP 的服务中定义
  • 在两端都定义;如果端口不匹配,会发出警告,并使用 IngressRouteTCP 服务中的端口

因此,在两端都定义端口时,Traefik 期望它们相互匹配。

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: apps

spec:
  entryPoints:
    - foo
  routes:
  - match: Host(`example.net`)
    services:
    - name: external-svc
      port: 80
apiVersion: v1
kind: Service
metadata:
  name: external-svc
  namespace: apps

spec:
  externalName: external.domain
  type: ExternalName
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: apps

spec:
  entryPoints:
    - foo
  routes:
  - match: Host(`example.net`)
    services:
    - name: external-svc
apiVersion: v1
kind: Service
metadata:
  name: external-svc
  namespace: apps

spec:
  externalName: external.domain
  type: ExternalName
  ports:
    - port: 80
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: apps

spec:
  entryPoints:
    - foo
  routes:
  - match: Host(`example.net`)
    services:
    - name: external-svc
      port: 80
apiVersion: v1
kind: Service
metadata:
  name: external-svc
  namespace: apps

spec:
  externalName: external.domain
  type: ExternalName
  ports:
    - port: 80

NativeLB

如果希望直接使用 Kubernetes Service 的 clusterIP,而不是根据 Pod IP 创建服务器负载均衡器,应将 NativeLB 设为 true。默认情况下,NativeLB 为 false。

apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test.route
  namespace: default
spec:
  entryPoints:
    - foo
  routes:
  - match: HostSNI(`*`)
    services:
    - name: svc
      port: 80
      # Here, nativeLB instructs to build the servers load balancer with the Kubernetes Service clusterIP only.
      nativeLB: true
apiVersion: v1
kind: Service
metadata:
  name: svc
  namespace: default
spec:
  type: ClusterIP
  ...

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

文档由 HeadFile Studio 翻译。

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