首页 > 解决方案 > 使用 udp 协议时,Traefik 背后的 hashcorp consul DNS 没有响应

问题描述

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

当我将 dig 命令与 tcp 协议一起使用时,这里的问题它可以工作,但如果使用 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) 入口点

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

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

有任何想法吗 ?提前致谢

标签: dnsudpconsultraefik-ingress

解决方案


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 地址共享)。例如:

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

当您部署 Helm 图表时,traefik负载traefik-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

推荐阅读