![38c06480b99a5b548aff66f5990d7ce8.png](https://i-blog.csdnimg.cn/blog_migrate/7a29e6b8d2197992fb20f524ff6ad38c.jpeg)
在 kubernetes 的网络模型中,基于官方默认的 CNI 网络插件 Flannel,这种 Overlay Network(覆盖网络)可以轻松的实现 pod 间网络的互通。当我们把基于 spring cloud 的微服务迁移到 k8s 中后,无须任何改动,微服务 pod 可以通过 Eureka 注册后可以互相轻松访问。除此之外,我们可以通过 ingress + ingress controller ,在每个节点上,把基于 http 80端口、https 443端口的用户请求流量引入到集群服务中。
本文为圈友 @TangT 分享。
但是实际使用中,我们出现了以下需求:
- 1.办公室网络 和 k8s pod 网络不通。开发在电脑完成某个微服务模块开发后,希望本地启动后,能注册到 k8s 中开发环境的服务中心进行调试,而不是本地起一堆依赖的服务。
- 2.办公室网络 和 k8s svc 网络不通。在 k8s 中运行的 mysql、redis 等,无法通过 ingress 7层暴露,电脑无法通过客户端工具直接访问;如果我们通过 service 的 NodePort 模式,会导致维护量工作量巨大。
网络互通配置
k8s 集群中新加一台配置不高(2核4G)的 node 节点(node-30)专门做路由转发,连接办公室网络和 k8s 集群 pod、svc
- node-30 IP 地址 10.60.20.30
- 内网 DNS IP 地址 10.60.20.1
- pod 网段10.244.0.0/24,svc 网段10.96.0.0/12
- 办公网段 192.168.0.0/22
给 node-30节点打上污点标签(taints),不让 k8s 调度 pod 来占用资源:
kubectl taint nodes node-30 forward=node-30:NoSchedule
node-30节点,做snat:
# 开启转发# vim /etc/sysctl.d/k8s.confnet.ipv4.ip_forward = 1# sysctl -p# 来自办公室访问pod、service snatiptables -t nat -A POSTROUTING -s 192.168.0.0/22 -d 10.244.0.0/24 -j MASQUERADEiptables -t nat -A POSTROUTING -s 192.168.0.0/22 -d 10.96.0.0/12 -j MASQUERADE
在办公室的出口路由器上,设置静态路由,将 k8s pod 和 service 的网段,路由到 node-30 节点上
ip route 10.244.0.0 255.255.255.0 10.60.20.30ip route 10.96.0.0 255.240.0.0 10.60.20.30
<