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地址
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
安裝
yum -y install dnsmasq
修改/etc/dnsmasq.conf配置:
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服務器
cat /etc/resolv.dnsmasq.conf nameserver 61.139.2.69 nameserver 202.98.96.68 nameserver 192.168.2.1
設置自建DNS解析
cat /etc/dnsmasq.hosts 192.168.1.224 zuul.amd5.cn 192.168.1.224 eureka.amd5.cn
設置開機啟動并啟動服務
systemctl enable dnsmasq && systemctl start dnsmasq
然后把本地電腦DNS改成192.168.1.222
本地ping測試,集群eureka svc地址測試

本地啟動一個springcloud 微服務,查看kubernetes集群eureka注冊中心已經注冊成功。

訪問此服務接口測試



