【问题标题】:hashicorp consul DNS behind Traefik doesn't respond when using udp protocol使用 udp 协议时,Traefik 背后的 hashcorp 领事 DNS 没有响应
【发布时间】:2023-03-07 10:08:01
【问题描述】:

我的 consul 服务器(使用官方 helm chart 部署的 v1.9.1)在 Traefik 2 后面的 kubernetes 集群中运行,我注册了一个客户端,现在我想使用 dig 命令获取它的 IP 地址。

这里的问题是当我使用带有 tcp 协议的 dig 命令时它可以工作,但如果使用 udp 它不是

# Works
dig @<ip_address_traefik> -p 5053 <registered_node_name>.node.consul. +tcp

# Doesn't work
dig @<ip_address_traefik> -p 5053 <registered_node_name>.node.consul.

5053:是我用于 dns 流量的端口

Traefik 监听 5053/tcp (dns-tcp) 和 5053/udp (dns-udp) 入口点

ingressRouteTCP 和 ingressRouteUDP 我用来将流量路由到 consul-dns k8s 服务

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: consul-dns-tcp
spec:
  entryPoints:
    - dns-tcp
  routes:
    - match: HostSNI(`*`)
      kind: Rule
      services:
        - name: consul-dns
          port:  53
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteUDP
metadata:
  name: consul-dns-udp
spec:
  entryPoints:
    - dns-udp
  routes:
    - services:
        - name: consul-dns
          port:  53

如果我 ssh 到部署了 consul 服务器的工作节点,并且我使用 consul-dns 服务的 ClusterIP(端口 53),甚至使用 consul 服务器 pod 的 IP 地址(端口 8600),dig 命令就可以工作使用两种协议

其他信息

# kubectl get svc
consul-dns      ClusterIP   <clusterIP>    <none>        53/TCP,53/UDP                                                             
consul-server   ClusterIP   None           <none>        8500/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP


# kubectl get ep
consul-dns      <consul-server-podIP>:8600,<consul-server-podIP>:8600

有什么想法吗?提前致谢

【问题讨论】:

    标签: dns udp consul traefik-ingress


    【解决方案1】:

    Traefik 的 Helm 图表在与 TCP 流量不同的负载平衡器上公开 UDP 侦听器。 TCP 流量驻留在 LoadBalancer 服务 traefik 上,而 UDP 流量绑定到 traefik-udp

    https://github.com/traefik/traefik-helm-chart/blob/f147e4c/traefik/templates/service.yaml#L66-L111

    根据您的配置,此 UDP 负载平衡器可能位于不同的 IP 上。检查kubectl get services 的输出,您应该会在其中看到此其他负载平衡器服务的 IP 地址。

    如果您使用的是负载均衡器提供程序,例如 MetalLB,则可以通过将 metallb.universe.tf/allow-shared-ip 注释添加到 Traefik 的服务注释列表中,为 UDP 流量配置负载均衡器服务以使用与 TCP 相同的 IP (参见:MetalLB:IP Address Sharing)。例如:

    ---
    # traefik-values.yaml
    service:
      annotations:
        metallb.universe.tf/allow-shared-ip: traefik-external-service
    

    当您部署 Helm 图表时,traefiktraefik-udp 负载平衡器服务将使用相同的 IP 地址。

    $ kubectl -n traefik get services
    NAME          TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                     AGE
    traefik       LoadBalancer   10.43.230.205   10.0.0.200    5053:31662/TCP,80:32021/TCP,443:31845/TCP   20m
    traefik-udp   LoadBalancer   10.43.82.75     10.0.0.200    5053:30648/UDP                              20m
    

    然后您应该能够通过 TCP 和 UDP 协议查询 Consul 的 DNS。

    $ dig @10.0.0.200 -p 5053 consul.service.consul +short +tcp
    10.0.0.132
    10.0.0.37
    10.0.0.82
    
    $ dig @10.0.0.200 -p 5053 consul.service.consul +short
    10.0.0.82
    10.0.0.37
    10.0.0.132
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      相关资源
      最近更新 更多