前面我们介绍了 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 还有很多功能,特别是强大的中间件和自定义插件的功能,为我们提供了不断扩展其功能的能力,我们完成可以根据自己的需求进行二次开发。
点击屏末 | 阅读原文 | 即刻学习