V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuyu01
V2EX  ›  Kubernetes

k8s 网络工具:用于集群外节点访问 pod ip,有直接路由和隧道两种方式

  •  
  •   yuyu01 · 2023-08-07 15:06:26 +08:00 · 1663 次点击
    这是一个创建于 509 天前的主题,其中的信息可能已经有所发展或是发生改变。

    学习和使用 k8s 一段时间了,以下是学习过程中开发的两个小项目,希望能够得到大家的批评和指正,顺便点个 🌟 star ! 😁😁😁

    出发点是,在云原生转型过程中,部分应用实例部署在常规虚拟机(192.168.0.0/16)中,部分应用实例部署在 k8s 中(10.233.0.0/16)中,正常情况下,常规虚拟机中的应用无法访问 k8s 中的应用实例。因此开发了这个小工具以同步 calico 路由信息,使常规虚拟机可以访问 pod ip, 使云原生转型更加平滑。

    项目一:calico-route-sync

    简介

    相同网络下,k8s 集群外的节点同步 calico 路由信息,以直接访问 pod ip

    img.png

    用法

    bin:

    sudo ./calico-route-sync --kubeconfig=/home/root/.kube/config
    

    docker:

    docker run --rm -it --network=host --cap-add NET_ADMIN -v ~/.kube/config:/root/config q946666800/calico-route-sync:0.1 --kubeconfig=/root/config
    

    注意

    使用场景比较有限,仅支持 calico ,且 vm-01 与 k8s 节点处于同一网络。

    优点是简单、高效、稳定(类似 Calico 节点)。流量直接从 vm-01 流向 k8s 节点,无需经过其他路由器或隧道。

    如果您希望 vm-01 可以处于不同的网络中,可以使用项目k8s-tun

    项目二:k8s-tun

    简介

    k8s 集群外的节点访问 pod ip, service ip

    img.png

    用法

    服务端

    kubectl apply -f https://raw.githubusercontent.com/yzxiu/k8s-tun/master/deploy.yaml
    

    客户端

    Linux & Mac

    # download client
    wget https://github.com/yzxiu/k8s-tun/releases/download/0.86-3/client-darwin-amd64-086-3
    chmod +x client-linux-amd64-086-3
    # start client
    sudo ./client-linux-amd64-086-3 -s <k8s-node-ip>:30011
    

    Windows

    download [client-windows-amd64-086-3.exe]( https://github.com/yzxiu/k8s-tun/releases/download/0.86-3/client-windows-amd64-086-3.exe)
    install the attached tap-windows-9.24.2-I601-Win10 driver
    right click `client-windows-amd64-086-3.exe` and run as administrator
    

    注意

    优点:理论上支持所有 cni 插件,vm-01 可以与 k8s 集群处于不同网络,使用比较灵活。客户端无需配置 kubeconfig

    缺点:流量通过隧道传输(类似于 openvpn),效率较低。

    隧道实现参考了 https://github.com/net-byte/vtun

    15 条回复    2024-12-19 10:18:02 +08:00
    ysicing
        1
    ysicing  
       2023-08-07 17:07:13 +08:00
    为啥不是直接打通 pod/svc cidr 呢?
    yimiaoxiehou
        2
    yimiaoxiehou  
       2023-08-07 17:56:47 +08:00 via Android
    挺好的,我都说 wireguard 完事
    kknd22
        3
    kknd22  
       2023-08-07 23:10:54 +08:00
    限定 pod 访问外部的 IP 用什么方法呢?
    yuyu01
        4
    yuyu01  
    OP
       2023-08-08 09:35:06 +08:00
    @ysicing 项目一模拟 calico node ,将各个不同的小网段路由到不同的节点,有多少个 blockaffinity 就有多少条路由。
    项目二是通过隧道,就是直接 打通 pod/svc cidr ,一般就只需要加两条路由。
    yuyu01
        5
    yuyu01  
    OP
       2023-08-08 09:36:11 +08:00
    ln33653
        6
    ln33653  
       2023-08-08 10:02:39 +08:00
    挺好的,简单明了,集群外到集群内的方式比 kt-connect 简单不少,可以更进一步搞个拦截集群内流量到本地的功能,就完美了
    latteczy
        7
    latteczy  
       2023-08-10 09:43:19 +08:00
    calico 是用的 ipip 吗? calico-route-sync 这个项目中,在 vm 中添加的路由是走的哪张网卡出去的?
    yuyu01
        8
    yuyu01  
    OP
       2023-08-10 12:03:37 +08:00
    @latteczy calico-route-sync 这个项目只能在通个网络下使用,走的是对应网络的网卡。

    ```
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    0.0.0.0 192.168.4.2 0.0.0.0 UG 600 0 0 wlp4s0
    10.233.74.0 192.168.4.32 255.255.255.192 UG 0 0 0 wlp4s0
    10.233.100.192 192.168.4.33 255.255.255.192 UG 0 0 0 wlp4s0
    10.233.114.128 192.168.4.34 255.255.255.192 UG 0 0 0 wlp4s0
    10.233.122.192 192.168.4.31 255.255.255.192 UG 0 0 0 wlp4s0
    192.168.4.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp4s0
    ```

    这个项目曾经做过兼容 calico 的 ipip 模式,会复杂很多,还需要给每个外部节点分配一个虚拟 ip ,在 k8s 集群部署一个 daemonSet ,用来处理 ipip 流量。感觉复杂了许多,不太适合生产使用。后面就去掉了。
    yuyu01
        9
    yuyu01  
    OP
       2023-08-10 12:10:03 +08:00 via Android
    上面说错了,k8s 集群部署一个 daemonSet ,应该是用来维护流量返回外部节点的 ipip 路由,
    latteczy
        10
    latteczy  
       2023-08-10 14:14:35 +08:00
    > 这个项目只能在通个网络下使用
    啥叫`通个网络`?是指不需要封包的二层网络吧?那这个限制就太大了,基本没什么用处了。
    yuyu01
        11
    yuyu01  
    OP
       2023-08-10 14:34:24 +08:00
    @latteczy
    同个网络。是的,限制就太大了。🤣
    latteczy
        12
    latteczy  
       2023-08-10 15:29:41 +08:00
    @yuyu01 #11 在 vm 上建个 ipip 隧道,发包的时候也用 ipip 封包就可以突破这个限制吧?
    latteczy
        13
    latteczy  
       2023-08-10 15:36:35 +08:00
    @latteczy #12 想了一下不行,封包的源 IP 没法弄
    kknd22
        14
    kknd22  
       2023-08-11 17:29:28 +08:00
    @yuyu01
    感觉梳理策略和管理起来会比较麻烦
    adamwhite
        15
    adamwhite  
       9 天前
    --kubeconfig=/home/root/.kube/config

    config 这个文件里面应该写哪些内容呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2472 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:34 · PVG 23:34 · LAX 07:34 · JFK 10:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.