Skip to content

Kubernetes IngressRouteTCP

IngressRouteTCPTraefik 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 字段优先于该注解。
entryPointsEntryPoint 名称列表。
routes路由列表。
routes[n].match定义底层路由器的规则。
routes[n].priority定义用于区分相同长度规则的优先级。
routes[n].middlewares[n].name定义中间件名称。
routes[n].middlewares[n].namespace定义中间件命名空间。""
routes[n].servicesKubernetes 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].sansSAN 列表(备用域名)。""
tls.passthrough如果为 true,将 TLS 终止委托给后端。false

ExternalName Service

Traefik 使用域名和端口连接到后端。但是 Kubernetes ExternalName Service 可以在没有任何端口的情况下定义。因此,Traefik 支持通过两种方式定义端口:

  • 仅在 IngressRouteTCP service 上
  • 两侧都定义,如果端口不匹配会发出警告,使用 IngressRouteTCP service 端口

因此,如果两侧都定义了端口,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: 80

Service 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-svc

Service 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: 80

Service ExternalName

yaml
apiVersion: v1
kind: Service
metadata:
  name: external-svc
  namespace: apps

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

NativeLB

要避免使用 pod IP 创建服务器负载均衡器,而直接使用 Kubernetes Service clusterIP,应将 NativeLB 选项设置为 true。默认情况下,NativeLBfalse

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: true

Service

yaml
apiVersion: v1
kind: Service
metadata:
  name: svc
  namespace: default
spec:
  type: ClusterIP
  ...

在生产环境使用 Traefik OSS?

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

基于 MIT 协议发布