使用Traefik代理UDP服务

前面我们介绍了 Traefik2.3.x 版本中的绝大部分使用方法,此外 Traefik2.2 版本开始就已经提供了对 UDP 的支持,所以我们可以用于诸如 DNS 解析的服务提供负载。

首先部署一个如下所示的 UDP 服务:

apiVersion: v1kind: Servicemetadata:  name: whoamiudpspec:  ports:  - protocol: UDP    name: udp    port: 8080  selector:    app: whoamiudp---kind: DeploymentapiVersion: apps/v1metadata:  name: whoamiudp  labels:    app: whoamiudpspec:  replicas: 2  selector:    matchLabels:      app: whoamiudp  template:    metadata:      labels:        app: whoamiudp    spec:      containers:        - name: whoamiudp          image: containous/whoamiudp          ports:            - name: udp              containerPort: 8080

直接部署上面的应用,部署完成后我们需要在 Traefik 中定义一个 UDP 的 entryPoint 入口点,修改我们部署 Traefik 的 values-prod.yaml 文件(查看前文),增加 UDP 协议的入口点:

# values-prod.yaml# Configure portsports:  web:    port: 8000    hostPort: 80  websecure:    port: 8443    hostPort: 443  mongo:    port: 27017    hostPort: 27017  udpep:    port: 18080    hostPort: 18080    protocol: UDP

我们这里定义了一个名为 udpep 的入口点,但是 protocol 协议是 UDP(此外 TCP 和 UDP 共用同一个端口也是可以的,但是协议一定要声明为不一样),然后重新更新 Traefik:

➜ helm upgrade --install traefik --namespace=kube-system ./traefik -f ./values-prod.yaml 

更新完成后我们可以导出 Traefik 部署的资源清单文件来检测是否增加上了 UDP 的入口点:

➜ kubectl get deploy traefik -n kube-system -o yaml......containers:- args:  - --entryPoints.mongo.address=:27017/tcp  - --entryPoints.traefik.address=:9000/tcp  - --entryPoints.udpep.address=:18080/udp  - --entryPoints.web.address=:8000/tcp  - --entryPoints.websecure.address=:8443/tcp  - --api.dashboard=true  - --ping=true  - --providers.kubernetescrd  - --providers.kubernetesingress......

UDP 的入口点增加成功后,接下来我们可以创建一个 IngressRouteUDP 类型的资源对象,用来代理 UDP 请求:

➜ cat <<EOF | kubectl apply -f -apiVersion: traefik.containo.us/v1alpha1kind: IngressRouteUDPmetadata:  name: whoamiudpspec:  entryPoints:  - udpep  routes:  - services:    - name: whoamiudp      port: 8080EOF➜ kubectl get ingressrouteudp                      NAME        AGEwhoamiudp   31s

创建成功后我们首先在集群上通过 Service 来访问上面的 UDP 应用:

➜ kubectl get svcNAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                 AGEwhoamiudp           ClusterIP   10.106.10.185    <none>        8080/UDP                                36m➜ echo "WHO" | socat - udp4-datagram:10.106.10.185:8080Hostname: whoamiudp-d884bdb64-6mpk6IP: 127.0.0.1IP: 10.244.1.145➜ echo "othermessage" | socat - udp4-datagram:10.106.10.185:8080Received: othermessage

我们这个应用当我们输入 WHO 的时候,就会打印出访问的 Pod 的 Hostname 这些信息,如果不是则打印接收到字符串。现在我们通过 Traefik 所在节点的 IP(10.151.30.11)与 18080 端口来访问 UDP 应用进行测试:

➜ echo "othermessage" | socat - udp4-datagram:10.151.30.11:18080Received: othermessage➜  echo "WHO" | socat - udp4-datagram:10.151.30.11:18080Hostname: whoamiudp-d884bdb64-hkw6kIP: 127.0.0.1IP: 10.244.2.87

我们可以看到测试成功了,证明我就用 Traefik 来代理 UDP 应用成功了。除此之外 Traefik 还有很多功能,特别是强大的中间件和自定义插件的功能,为我们提供了不断扩展其功能的能力,我们完成可以根据自己的需求进行二次开发。

 点击屏末 | 阅读原文 | 即刻学习