1、背景
近期工作中出现了一个问题:某个旧服务中用到了redis,但是在前期项目容器化改造部署阶段研发同事并没有说明需要用到redis,直至部署生产prod环境出现问题。那么疑问来了,为什么在qa环境没有问题呢?经沟通排查发现,源码中也就是qa环境连接的是一个古老的虚拟机运行的redis,所以自然研发测试环境都没问题,至于为什么会连接到这个地址,不得而知!
第一想法:关掉这个redis服务,让研发“被迫”主动告知;规范要求,在k8s集群内部部署该项目的redis服务集群,保证环境一致性,减少不必要麻烦。
项目多数属于微服务应用模块,研发本地无法完整运行全部依赖,希望在本地运行某个服务后,能够注册到qa容器环境的依赖服务中进行调试。例如在k8s中运行的redis、rabbitmq等服务,研发在当前环境下无法直接通过客户端工具连接进行访问,给研发测试进行联调带来了很大麻烦,且k8s内部通过cni插件创建pod和service的内部网络,这类服务无法通过ingress进行7层暴露,如果通过NodePort模式暴露给研发,不仅使用有限而且会导致端口管理困难从而工作量加大。因此打通开发和测试环境k8s集群内网和办公局域网络是有很大必要性的。
2、环境说明相关网络拓扑如下
ip地址情况如下
办公子网:.16.0.0/24DMZ区域服务器子网:.16.1.0/24、.16.2.0/24k8spod子网:.20.0.0/16k8sservice子网:10.68.0.0/16其他涉及到的相关服务及ip说明
k8s网络插件:flannel,对应网络模式为host-gw
k8skube-dnsserviceip:10.68.0.2
内网dns服务:ms(windows)serverdns
内网dnsip:.16.2.3
FortiGateip:.16.2.
3、总体思路k8s集群部署在测试机房,整个局域网链路、外网、防火墙由飞塔防火墙FortiGate设备统一控制,除k8s集群内部网络外,其他网络均已通过FortiGate打通,所以目前面临的问题就是网络打通和dns解析打通。
网络打通
于是,在网关和路由器上添加静态路由,把属于k8s的Pod和Service的子网IP包全转给其中某个k8snode节点,这样访问podip和serviceip这样的IP,网络包会到达某个集群物理节点,而集群内的物理节点或虚拟机,k8s网络cni插件都会与这些目的地址互通。
dns解析打通
网络打通后,就可以在办公网络通过pod或service的ip进行连通了。但是每次更新服务,ip通常都会发生变化,我们想通过服务名称(域名)而不是ip进行通信,解决dns问题主要有以下两个方向
下面两种方式都可以实现dns的互联互通。综合考虑,为了保证两处dns服务的稳定性,只将经过k8s内部服务的dns请求通过coredns,且减少了PC客户端dns服务器地址的配置工作,选择方案二。
网络已经打通了,那么就可以把k8s的coredns作为本地的dns服务器把所有通过办公网络请求k8s中的服务(域名)的记录从内网dns服务器转发到k8s的coredns4、网络打通的具体实现4.1检查现有网络连通情况4.1.1办公网络和k8snode在本地pc电脑上操作
?~ping.16.1.-c4PING.16.1.(.16.1.):56databytes64bytesfrom.16.1.:icmp_seq=0ttl=63time=1.ms64bytesfrom.16.1.:icmp_seq=1ttl=63time=1.ms64bytesfrom.16.1.:icmp_seq=2ttl=63time=1.ms64bytesfrom.16.1.:icmp_seq=3ttl=63time=1.ms---.16.1.pingstatistics---4packetstransmitted,4packetsreceived,0.0%packetlossround-tripmin/avg/max/stddev=1./1./1./0.ms4.1.2k8snode和pod及svc
在k8s任意一台node上操作,通过nslookup同时检查网络和dns功能是否正常,这里以.16.1.这台node为例
[root
k8s-qa-node-02~]#nslookup-q=Akubernetes.default.svc.cluster.local10.68.0.2Server:10.68.0.2Address:10.68.0.2#53Name:kubernetes.default.svc.cluster.localAddress:10.68.0.1查看node的路由
[root
k8s-qa-node-02~]#iproutedefaultvia.16.1.deveth..0.0/16deveth0scopelinkmetric2.16.1.0/24deveth0protokernelscopelinksrc.16.1..17.0.0/16devdocker0protokernelscopelinksrc.17.0.1linkdown.20.0.0/24via.16.1.deveth0.20.1.0/24via.16.1.deveth0.20.2.0/24via.16.1.deveth0.20.3.0/24devcni0protokernelscopelinksrc.20.3.1.20.4.0/24via.16.1.deveth0.20.5.0/24via.16.1.deveth0.20.6.0/24via.16.1.deveth0#...省略部分条目4.2添加地址网络打通主要在网关和路由器设备上进行操作,这里仅以FortiGate为例进行记录。为了配置流程清晰,通过终端命令行进行配置而不是web界面操作,首先通过console或者ssh连接上FortiGate的终端
添加k8spod和k8sservice两个子网的地址
FortiGate#configfirewalladdressFortiGate(address)#editk8s_SERVICE_CIDRnewentryk8s_SERVICE_CIDRaddedFortiGate(clientnet)#setsubnet10.68.0...0.0FortiGate(clientnet)#nextFortiGate(address)#editk8s_POD_CIDRnewentryk8s_POD_CIDRaddedFortiGate(clientnet)#setsubnet.20.0...0.0FortiGate(clientnet)#nextFortiGate(address)#endFortiGate#4.3配置静态路由
配置到达k8ssvc子网的路由
FortiGate#configrouterstatic#新增一条静态路由,id尽量大,不与已有的冲突FortiGate(static)#edit10newentry10added#配置目标地址和掩码FortiGate(2)#setdst10.68.0...0.0#配置网关(下一跳)FortiGate(2)#setgateway.16.1.#配置接口名FortiGate(2)#setdeviceTestFortiGate(2)#nextFortiGate(static)#endFortiGate#
同理,配置到达k8spod子网的路由
FortiGate#configrouterstaticFortiGate(static)#edit11FortiGate(2)#setdst.20.0.0/16..0.0FortiGate(2)#setgateway.16.1.FortiGate(2)#setdeviceTestFortiGate(2)#nextFortiGate(static)#endFortiGate#
检查配置的静态路由
FortiGate#getrouterinforouting-tablestatic#...省略部分条目S10.68.0.0/16[10/0]via.16.1.,TestS.20.0.0/16[10/0]via.16.1.,Test4.4配置策略
配置到达k8sservice网络放行策略
FortiGate#configfirewallpolicy#新增一条网络策略,id尽量大,不与已有的冲突FortiGate(policy)#edit#配置源接口FortiGate()#setsrcintfinternal#配置目的接口FortiGate()#setdstintfTest#配置源地址FortiGate()#setsrcaddr.16.0.0/24#配置目的地址FortiGate()#setdstaddrk8s_SERVICE_CIDR#配置动作类型FortiGate()#setactionaccept#配置动作时间FortiGate()#setschedulealways#配置服务(协议类型)FortiGate()#setserviceALL_TCP#配置是否开启日志FortiGate()#setlogtrafficdisable#配置是否开启natFortiGate()#setnatdisableend
同理,配置到达k8spod网络放行策略
FortiGate#configfirewallpolicyFortiGate(policy)#editFortiGate()#setsrcintfinternalFortiGate()#setdstintfTestFortiGate()#setsrcaddr.16.0.0/24FortiGate()#setdstaddrk8s_POD_CIDRFortiGate()#setactionacceptFortiGate()#setschedulealwaysFortiGate()#setserviceALL_TCPFortiGate()#setlogtrafficdisableFortiGate()#setnatdisableend4.5验证配置4.5.1web界面检查
登录到FortiGate界面,查看配置的静态路由
网络策略
4.5.2pc网络检查在pc端检查pod网络是否可达并在上文中选取的网关node上抓包
5、dns解析打通的具体实现5.1配置dns条件转发上面已经将网络进行了打通,dns解析的打通在内网dns服务器上设置dns转发即可。
打开ms(windows)server类型的dns管理器配置界面,新增条件转发器,如下所示,dns域填写k8s集群中兼容所有命名空间的搜索域。当然,为了安全,建议单独设置允许可达的命名空间下的服务,例如default,则填为default.svc.cluster.local。
5.2验证配置在本地终端上测试解析k8sservice域名,成功解析
?~nslookupredis-abc-gns.default.svc.cluster.localServer:.16.2.3Address:.16.2.3#53Non-authoritativeanswer:Name:redis-dkj-gns.default.svc.cluster.localAddress:.20.4.、小结
至此,就成功的将办公网络和k8s内网进行打通,研发以后就可以在开发机器上利用和qa环境一样配置的svcname连接对应依赖的redis等组件了。
此方案主要利用局域网静态路由,在网关进行配置。透明且高效,且开发测试环境无须再部署其他组件。
预览时标签不可点收录于话题#个上一篇下一篇