kubernetes内网和本地局域网互通方法
kubernetes集群部署好以后,我们是无法直接在集群外部访问集群内的网络环境。当我们把SpringCloud的微服务迁移到k8s 中后,虽然不需要做什么改动,微服务实例就可以注册到Eureka注册中心实现和原生SpringCloud一样的访问效果。
但是当我们本地电脑启动某个微服务模块,需要注册到k8s中的eureka中进行调试,或者本地电脑需要连接集群内部的mysql、redis、zk等中间件的时候,此时就无法和原来一样直接连接了。
集群外访问集群内服务,kubernetes提供了NodePort和ingress两种方式,但是ingress只提供7层转发,NodePort维护起来就比较麻烦了。
网上也提供了几种实现kubernetes内网和本地局域网互通的方法,由于我公司本地网络比较简单,所以直接采用静态路由+dns解析的方式,实现本地电脑直接访问kubernetes集群内部服务。下面介绍下实现方法:
网络环境:
本地PC和服务器网段:192.168.1.0/24
k8s集群pod网段:10.42.0.0/16
k8s集群svc网段:10.43.0.0/16
本地dns服务器:192.168.1.222
集群node节点一:192.168.1.224
由于集群node节点默认会有路由访问集群内部如下图,所以我们只需要把本地的请求,路由到任意node节点ip即可。
我直接在公司网关设备添加两条静态路由,保证所有的设备生效,避免每个开发都去维护静态路由。
添加好静态路由以后,本地ping测试,已经可以访问集群内网络。
10.43.0.0/16这个svc网段,由于是虚拟ip,所以无法ping通,添加此条路由,主要是为了dns解析。
虽然现在可以在本地电脑访问kubernetes集群内部的ip了,但是svc地址无法解析。此时我们就需要借助kubernetes集群的内部dns解析内部的svc地址。
查看kubernetes集群内部coreDNS ClusterIP地址
1
2
|
kubectl get svc -n kube-system | grep dns kube-dns ClusterIP 10.43.0.10 <none> 53 /UDP ,53 /TCP ,9153 /TCP 337d |
接下来部署一个轻量级的DNS服务DNSmasq
安装
1
|
yum -y install dnsmasq |
修改/etc/dnsmasq.conf配置:
1
2
3
4
5
6
|
resolv- file = /etc/resolv .dnsmasq.conf #指定上游dns服务器 strict-order #严格按照resolv-file文件中的顺序进行从上到下解析,直到成功为止 server= /cluster . local /10 .43.0.10 #指定以cluster.local为后缀的域名,使用coredns的地址解析,这里可以不配直接把coredns配置在/etc/resolv.dnsmasq.conf 里面。 listen-address=192.168.1.222 #指定本地IP地址 addn-hosts= /etc/dnsmasq .hosts #自定义dns记录文件 conf- dir = /etc/dnsmasq .d #所有的解析记录都会存在此目录下 |
配置上游dns服务器
1
2
3
4
|
cat /etc/resolv .dnsmasq.conf nameserver 61.139.2.69 nameserver 202.98.96.68 nameserver 192.168.2.1 |
设置自建DNS解析
1
2
3
|
cat /etc/dnsmasq .hosts 192.168.1.224 zuul.amd5.cn 192.168.1.224 eureka.amd5.cn |
设置开机启动并启动服务
1
|
systemctl enable dnsmasq && systemctl start dnsmasq |
然后把本地电脑DNS改成192.168.1.222
本地ping测试,集群eureka svc地址测试
本地启动一个springcloud 微服务,查看kubernetes集群eureka注册中心已经注册成功。
访问此服务接口测试