首页 > 解决方案 > 在 traefik TCP 路由映射中使用 hostSNI(*) 有什么缺点

问题描述

现在我使用HostSNI(*)来映射 TCP 服务,就像mysql\postgresql...Kubernetes 集群 v1.18 中的 traefik 2.2.1 一样。因为我在我的本地机器上并且没有有效的认证。这是配置:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
    name: mysql-ingress-tcp-route
    namespace: middleware
spec:
    entryPoints:
        - mysql
    routes:
        - match: HostSNI(`*`)
          services:
            - name: report-mysqlha
                port: 3306

是配置在我的本地机器上工作正常。但我仍然想知道使用 HostSNI()映射策略的副作用。HostSNI()不使用域名有什么缺点?是否可以在我的本地机器上使用假域名?

标签: kubernetestraefiktraefik-ingress

解决方案


截至最新的 Traefik 文档(此时为 2.4):

如果 HTTP 路由器和 TCP 路由器都侦听相同的入口点,则 TCP 路由器将在 HTTP 路由器之前应用

需要注意的是,服务器名称指示是 TLS 协议的扩展。因此,只有 TLS 路由器才能使用该规则指定域名。但是,非 TLS 路由器必须明确使用带有 *(每个域)的规则来声明每个非 TLS 请求都将由路由器处理。

因此,回答您的问题:

  • usingHostSNI(`*`)是使用ingressRouteTCP 不带tls 的唯一合理方法——因为您明确要求 TCP 路由器,而 TCP 不使用 TLS。
    • 我在一个部分上取得了好坏参半的成功ingressRouteTCP,但它似乎是第2节所支持的配置HostSNI(`some.fqdn.here`)tls:
  • 对此的一个可能的“缺点”(空中报价,因为它是主观的)是:此配置意味着路由到您entrypoint(即mysql)的任何流量都将通过此路由ingressRouteTCP
    • 考虑:如果由于某种原因您有另一个ingressRoute相同entrypoint的 ,ingressRouteTCP则将按照1优先
    • 考虑:例如,如果您想mysql通过相同的路由多个不同的服务entrypoint: mysql,您将无法基于此配置

推荐阅读