• 使用 Traefik 代理 UDP 服务


    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488836&idx=1&sn=740f9aac069de3fbf82dfc4be340973f&chksm=fdb91a59cace934f48591409a53743df8b2bdbe02eecdbeb66779feb0b5e40e3b00055f83ec4&cur_album_id=1319287026209947648&scene=190#rd

    TCP服务查看这篇文章:https://www.cnblogs.com/sanduzxcvbnm/p/15745150.html

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

    apiVersion: v1
    kind: Service
    metadata:
      name: whoamiudp
    spec:
      ports:
      - protocol: UDP
        name: udp
        port: 8080
      selector:
        app: whoamiudp
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: whoamiudp
      labels:
        app: whoamiudp
    spec:
      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 ports
    ports:
      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/v1alpha1
    kind: IngressRouteUDP
    metadata:
      name: whoamiudp
    spec:
      entryPoints:
      - udpep
      routes:
      - services:
        - name: whoamiudp
          port: 8080
    EOF
    ➜ kubectl get ingressrouteudp                      
    NAME        AGE
    whoamiudp   31s
    

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

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

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

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

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

  • 相关阅读:
    <<网络是怎样连接的>>笔记第一章browser生成message
    豆知识( DNS; HTTP入门;网络协议)
    日期和时间的操作
    类型转换
    分组查询
    存储过程
    触发器
    表连接
    变量
    union以及一些扩展
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/15749677.html
Copyright © 2020-2023  润新知