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

275 天前
 yuyu01

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

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

项目一:calico-route-sync

简介

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

用法

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

用法

服务端

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

1342 次点击
所在节点    Kubernetes
14 条回复
ysicing
275 天前
为啥不是直接打通 pod/svc cidr 呢?
yimiaoxiehou
275 天前
挺好的,我都说 wireguard 完事
kknd22
275 天前
限定 pod 访问外部的 IP 用什么方法呢?
yuyu01
274 天前
@ysicing 项目一模拟 calico node ,将各个不同的小网段路由到不同的节点,有多少个 blockaffinity 就有多少条路由。
项目二是通过隧道,就是直接 打通 pod/svc cidr ,一般就只需要加两条路由。
yuyu01
274 天前
ln33653
274 天前
挺好的,简单明了,集群外到集群内的方式比 kt-connect 简单不少,可以更进一步搞个拦截集群内流量到本地的功能,就完美了
latteczy
272 天前
calico 是用的 ipip 吗? calico-route-sync 这个项目中,在 vm 中添加的路由是走的哪张网卡出去的?
yuyu01
272 天前
@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
272 天前
上面说错了,k8s 集群部署一个 daemonSet ,应该是用来维护流量返回外部节点的 ipip 路由,
latteczy
272 天前
> 这个项目只能在通个网络下使用
啥叫`通个网络`?是指不需要封包的二层网络吧?那这个限制就太大了,基本没什么用处了。
yuyu01
272 天前
@latteczy
同个网络。是的,限制就太大了。🤣
latteczy
272 天前
@yuyu01 #11 在 vm 上建个 ipip 隧道,发包的时候也用 ipip 封包就可以突破这个限制吧?
latteczy
272 天前
@latteczy #12 想了一下不行,封包的源 IP 没法弄
kknd22
271 天前
@yuyu01
感觉梳理策略和管理起来会比较麻烦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/963046

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX