網(wǎng)站首頁 編程語言 正文
場景
公司微服務(wù)快上線了,微服務(wù)都是用Docker容器進行部署的,在同一臺主機下,把服務(wù)都部署上,注冊到Nacos的IP與PORT都是內(nèi)網(wǎng)的IP與Dockerfile中定義的端口號,看起來好像也沒什么問題,通過網(wǎng)關(guān)去調(diào)用也是可以調(diào)通的,請注意這有一個大前提:
必須把所有服務(wù)容器部署在同一臺主機上時才可以!
當(dāng)服務(wù)實例沒有部署在同一主機上,比如網(wǎng)關(guān)服務(wù)在A服務(wù)器,服務(wù)a在B服務(wù)器上,同樣注冊到Nacos (或其它注冊中心) ,此時上報上來的都是內(nèi)網(wǎng)的IP,那么當(dāng)外部有請求進來的時候,網(wǎng)關(guān)通過Nacos的服務(wù)列表,找到了對應(yīng)的服務(wù)a的內(nèi)網(wǎng)IP,一調(diào)用發(fā)現(xiàn)調(diào)用不通
ps:內(nèi)網(wǎng)怎么會通……
任務(wù)
微服務(wù)容器可以不在同一臺服務(wù)器上,互相調(diào)用
想法
- 既然上報的是內(nèi)網(wǎng)的IP,我直接讓他上報宿主機的IP和端口唄
- 使用Docker的host網(wǎng)絡(luò)模式
- 修改部署腳本,通過shell部署容器時,獲取宿主機IP與設(shè)置的映射端口號
- 讓Docker的網(wǎng)絡(luò)互通
分析
以下分別按上邊的“想法”部分來進行說明下問題
1.翻遍官方文檔與Github,得出的方案又有兩個:
- 固定IP端口,把宿主機IP與端口寫死在配置文件中:看起來是解決了,但是問題是無法水平擴展了 ——勉強能用
- 固定網(wǎng)卡,防止因多網(wǎng)卡環(huán)境上報錯誤IP端口:沒有用的,進入容器中
ifconfig
發(fā)現(xiàn)內(nèi)部網(wǎng)卡只有兩個,分別是eth0
與lo
,對應(yīng)網(wǎng)卡的IP就是內(nèi)網(wǎng)IP ——還是沒用
2.使用Docker的Host網(wǎng)絡(luò)模式,你會發(fā)現(xiàn)IP這回上報的的確是宿主機IP,但是端口號不對啊……如果自己去通過shell使用Java參數(shù)傳入待映射的端口號的話,這種情況理論上是可行的,唯一缺點是docker ps
再也直接看不到端口號了,需要額外去docker inspect
——可以用
3.映射端口號可以獲取,但是主機的網(wǎng)卡名稱不同,寫死后不靈活,如果有的是eth0
,有的是ens33
呢?還有更多不可測的情況! ——或許可用
4.通過一些成熟的Docker容器網(wǎng)絡(luò)共享,但是會有一定的性能損耗 ——完全可用
概念與選型
最穩(wěn)妥的辦法——使用Docker網(wǎng)絡(luò)共享,在搜索引擎的幫助下,我決定用Overlay的方式來實現(xiàn)效果
以下簡單說下Overlay:
容器在兩個跨主機進行通信的時候,是使用overlay network這個網(wǎng)絡(luò)模式進行通信;如果使用host也可以實現(xiàn)跨主機進行通信,直接使用這個物理的ip地址就可以進行通信。overlay它會虛擬出一個網(wǎng)絡(luò)比如10.0.2.3這個ip地址。在這個overlay網(wǎng)絡(luò)模式里面,有一個類似于服務(wù)網(wǎng)關(guān)的地址,然后把這個包轉(zhuǎn)發(fā)到物理服務(wù)器這個地址,最終通過路由和交換,到達另一個服務(wù)器的ip地址。
想要實現(xiàn)Overlay網(wǎng)絡(luò),需要引入一個K-V數(shù)據(jù)庫,來保存網(wǎng)絡(luò)狀態(tài)信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的K-V數(shù)據(jù)庫
我們這里使用 Consul,相比其它K-V數(shù)據(jù)庫,Consul提供的界面化方便管理,所以這里使用Consul實現(xiàn)Overlay
通過讓每個服務(wù)器的Docker daemon將自己的IP注冊到Consul中,來共享Docker內(nèi)網(wǎng),這里共享的內(nèi)網(wǎng)是Overlay網(wǎng)絡(luò)模式的,也只有在注冊的Docker環(huán)境下使用同overlay網(wǎng)絡(luò)的容器,才能互相通訊
ps: 創(chuàng)建完成后,不使用overlay網(wǎng)絡(luò)的跨服務(wù)器容器,不能ping通
小試身手
單節(jié)點的Consul實現(xiàn)Overlay網(wǎng)絡(luò),使用Docker鏡像
環(huán)境說明
服務(wù)器OS | 主機IP | Docker版本 | 網(wǎng)卡名 |
---|---|---|---|
Ubuntu Server 18.04 LTS | 192.168.87.133 | 18.09.6 | ens33 |
Ubuntu Server 18.04 LTS | 192.168.87.139 | 18.09.7 | ens33 |
本測試環(huán)境適用于Systemd管理的Linux發(fā)行版
Consul沒有使用非官方的progrium/consul,主要是因為這個鏡像實在太老了,四年前的如果有漏洞也沒能及時修復(fù),所以自己去<hub.docker.com>去趟了遍官方的坑!?
注意事項
每臺運行docker的主機都不能同hostname,可以使用
$ sudo hostnamectl set-hostname your-new-hostname
同hostname會導(dǎo)致同名的主機docker無法互相通信
動手做
準(zhǔn)備Consul使用鏡像在133服務(wù)器上啟動,所以可以先配置下Docker daemon的啟動參數(shù)指向133服務(wù)器
分別修改133、139兩臺服務(wù)器的docker.service
$ ifconfig #已經(jīng)去除干擾網(wǎng)卡,記錄網(wǎng)卡名為ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.87.133 netmask 255.255.255.0 broadcast 192.168.87.255 inet6 fe80::20c:29ff:fe02:e00a prefixlen 64 scopeid 0x20<link> ether 00:0c:29:02:e0:0a txqueuelen 1000 (Ethernet) RX packets 156739 bytes 233182466 (233.1 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 45173 bytes 2809606 (2.8 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 $ vim /etc/docker/daemon.json
保存退出.
-
cluster-store
:配置的Consul的leader地址,單體直接寫,其它軟件注意協(xié)議 -
cluster-advertise
: 指定監(jiān)聽的網(wǎng)卡和端口,也可以指定接收訂閱消息的IP:PORT
還有一種是直接修改docker.service的,參考如下:
$ cd /etc/systemd/system/multi-user.target.wants $ sudo vim docker.service
找到ExecStart=
字眼,在此行末尾添加如下代碼
--cluster-store=consul://192.168.87.133:8500 --cluster-advertise=ens33:2375
效果如下:
操作效果與以上方法保持一致
接著執(zhí)行命令,重啟docker服務(wù),另一臺服務(wù)器操作方式相同,注意網(wǎng)卡名稱
$ sudo systemctl daemon-reload && sudo systemctl restart docker
在133服務(wù)器啟動Consul服務(wù)
docker run -d --network host -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2
用主機模式的原因是防止有些端口沒有映射出來,還有就是想讓Consul識別外部網(wǎng)卡的方式只能host模式,下面給個非host的方式
$ docker run -di -h consul -p 8500:8500 --name=consul consul:1.5.2
創(chuàng)建Docker overlay共享網(wǎng)絡(luò)
$ docker network create -d overlay my_overlay
這里與普通創(chuàng)建網(wǎng)絡(luò)不同在于指定了overlay模式的網(wǎng)絡(luò),-d
也可以寫為--driver
訪問Consul的頁面,如我的是192.168.87.133:8500
我們的配置在Key/Value處,
點擊docker -> nodes
出現(xiàn)上邊的兩個節(jié)點,分別是兩個docker daemon (守護進程) 注冊的值
測試
新建兩個centos的容器分別在兩臺服務(wù)器上,使用overlay 我們剛才創(chuàng)建的網(wǎng)絡(luò)
133服務(wù)器
$ docker run -di --network my_overlay --name mycentos1 centos:7
139服務(wù)器
$ docker run -di --network my_overlay --name mycentos2 centos:7
--net
全拼為--network
,--
開頭的可不加=
查看133服務(wù)器mycentos1容器的IP
$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos1 10.0.1.2
查看139服務(wù)器mycentos2容器的IP
$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos2 10.0.1.3
分別從133服務(wù)器ping 139服務(wù)器的mycentos2的內(nèi)網(wǎng)IP
反過來ping也是一樣的,但是并不是讓我們通過外部去訪問的,通過同一overlay網(wǎng)絡(luò)的容器就可以,不信我們作如下嘗試
133服務(wù)器
$ docker exec -it mycentos1 bash # ping 10.0.1.3
訪問得通,沒有丟包,反過來也是一樣的,篇幅有限就不試驗了
這起碼說明,現(xiàn)在的服務(wù)的確已經(jīng)網(wǎng)絡(luò)互通了,下篇文章我們來搞下生產(chǎn)用的集群方式
引文
技術(shù)漫談 | docker overlay網(wǎng)絡(luò)實現(xiàn)
Docker跨主機網(wǎng)絡(luò)——overlay
本文系Hellxz學(xué)習(xí)與實踐文章,禁止布布扣、碼迷等第三方爬蟲網(wǎng)站爬取
原文鏈接:https://www.cnblogs.com/hellxz/p/11402166.html
相關(guān)推薦
- 2022-09-01 Linux實現(xiàn)項目的自動化部署_Linux
- 2022-06-16 .Net?Core解決WebAPI中返回時間格式帶T的問題_實用技巧
- 2023-03-11 Golang的Fork/Join實現(xiàn)代碼_Golang
- 2022-07-04 詳解Python字符串原理與使用的深度總結(jié)_python
- 2022-06-20 關(guān)于Golang獲取當(dāng)前項目絕對路徑的問題_Golang
- 2022-07-09 Nginx利用Logrotate實現(xiàn)日志分割的詳細過程_nginx
- 2022-04-13 .NET5實現(xiàn)操作注冊表的方法_實用技巧
- 2022-10-14 Android適配器和適配器視圖
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支