1. 程式人生 > 程式設計 >SpringCloud容器化服務發現及註冊實現方法解析

SpringCloud容器化服務發現及註冊實現方法解析

springclould專案容器化過程中,可能是採用部分部分容器化,逐步遷移到容器環境,這時候我們就會面臨一個問題: 外部服務如何呼叫k8s內部服務.

Eureka Server提供服務註冊服務,各個節點啟動後,會在Eureka Server中進行註冊,這樣Eureka Server中的服務登錄檔中將會儲存所有可用服務節點的資訊,consumer 通過 Eureka 發現其他節點/服務.
應用場景

Eureka,gateway,app01,app02 處於k8s叢集外部
app03,app04 位於k8s內部

問題: k8s叢集內部可以訪問外部 eureka,gateway等服務,但是外部服務無法訪問k8s內部 app03,app04.

打通網路

打通外部環境與k8s環境service與pod網段,可以做的網路直連.使得外部服務可以直接訪問k8s內網.

方案一 : k8s node 節點可以直接訪問pod與service網段,我們只需要將其中一個節點作為 Gateway,其他外部機器新增靜態路由閘道器執行這臺 node 節點即可.

方案二: 將其他機器部署flannel外掛,打通pod與service網段.

PS 這裡我們使用第一種方案.

PS阿里雲環境下由於使用VPC,這是我們只需要在VPC新增路由策略即可.

開啟伺服器路由轉發

node 節點

vim /etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 1

sysctl -p

外部伺服器新增靜態路由

10.0.0.0/16 pod 網段
10.10.0.0/16 service 網段
172.17.71.209 開啟路由轉發的node節點.

ip route add 10.0.0.0/16 via 172.17.71.208 dev eth0
ip route add 10.10.0.0/16 via 172.17.71.208 dev eth0

SpringCloud容器化服務發現及註冊實現方法解析

Eureka 註冊問題

打通網路後,我們啟動服務,我們發現雖然節點已經註冊到Eureka,但是使用的是hostname:port的格式,而springclould中節點相互訪問就是使用的Eureka中的註冊資訊,這樣也就意味著我k8s裡的springclould節點註冊的是pod 的 hostname (Eureka在k8s外部不需要打通網路也可以正常註冊)

也就是外部服務雖然可以訪問k8s內部網路,但是這個hostname解析不成對於的IP,也就是還是沒有辦法相互呼叫.
也就是說我們節點註冊時而是使用pod IP註冊就可以解決這個問題,下邊我們修改下k8s內部的springclould節點配置

vim BOOT-INF/classes/application-k8s.yml
# 配置服務註冊中心的地址
eureka:
 client:
  serviceUrl:
   defaultZone: http://xx:xxx@sreg-smix3-k8s-t:7000/eureka/
 instance:
  preferIpAddress: true # 使用IP註冊

重新打版,重啟pod.看起來和之前一樣,我們點選進去看下:

SpringCloud容器化服務發現及註冊實現方法解析

雖然顯示是hostname,但是註冊地址以及改成了ip,這時候其他非容器化節點去訪問時就可以正常調通了.

SpringCloud容器化服務發現及註冊實現方法解析

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。