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即可。

kubernetes内网和本地局域网互通方法

我直接在公司网关设备添加两条静态路由,保证所有的设备生效,避免每个开发都去维护静态路由。

kubernetes内网和本地局域网互通方法

添加好静态路由以后,本地ping测试,已经可以访问集群内网络。

kubernetes内网和本地局域网互通方法

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地址测试

kubernetes内网和本地局域网互通方法

本地启动一个springcloud 微服务,查看kubernetes集群eureka注册中心已经注册成功。

kubernetes内网和本地局域网互通方法

访问此服务接口测试

kubernetes内网和本地局域网互通方法

发表评论

邮箱地址不会被公开。 必填项已用*标注