摘要:在每臺主機(jī)上我們執(zhí)行列出主機(jī)和網(wǎng)絡(luò)接口。其它的應(yīng)用服務(wù)容器每個容器有兩個地址,一個屬于子網(wǎng),另一個屬于的子網(wǎng)。雖然這會帶來一些性能上的影響,但是可以確保的網(wǎng)絡(luò)默認(rèn)是安全的。
本文中,我們首先將Rancher部署到EC2實(shí)例上,并且添加新的主機(jī),之后用Rancher的Catalog啟動了RocketChat應(yīng)用,緊接著對運(yùn)行中的容器的網(wǎng)絡(luò)接口和其他屬性的進(jìn)行了分析。
同時,我們簡要介紹了Rancher的Overlay網(wǎng)絡(luò)和運(yùn)行在Network Agent中的輔助服務(wù)進(jìn)程,并通過上面實(shí)踐中收集的信息構(gòu)建了Rancher集群中網(wǎng)絡(luò)通信的概覽圖。
與此同時,還特別介紹了使用IPSec實(shí)現(xiàn)主機(jī)間的安全通信。
Rancher 是一個容器管理的完整解決方案,并且即將成為一個完整的容器管理平臺。我們對在自己平臺上如何處理容器間的網(wǎng)絡(luò)進(jìn)行了審慎的思考,并打算用一個簡單的例子和大家分享一下Rancher中的網(wǎng)絡(luò)。Rancher既可以被部署在單機(jī),也能被擴(kuò)展到數(shù)千個節(jié)點(diǎn),在這篇文章中我們只用少量的主機(jī)和容器進(jìn)行討論。
配置并啟動一個容器化的應(yīng)用首先我們要配置我們的基礎(chǔ)設(shè)施,本文使用的是AWS。我們先在EC2上用下面的命令安裝Docker并且啟動Rancher部署Master節(jié)點(diǎn):
curl -sSL https://get.docker.com | sh - && sudo docker run -d --restart=always -p 8080:8080 rancher/server
Rancher的server在52.40.47.157:8080上被創(chuàng)建好了(需要注意的是:文中涉及的IP地址指向的AWS實(shí)例已經(jīng)在發(fā)文的時候被銷毀了,文中所列IP僅作示例使用)。通過EC2的console,我們再新增兩個主機(jī)——H1和H2,用來跑我們的應(yīng)用程序容器。下圖展示了我們主機(jī)的邏輯拓?fù)潢P(guān)系:一個節(jié)點(diǎn)用來跑Rancher的Server,另外兩個跑Rancher agent:
為了方便描述容器間的網(wǎng)絡(luò),我們需要先啟動一個容器化的應(yīng)用服務(wù)。用Rancher的Catalog創(chuàng)建應(yīng)用非常方便,這里我們選擇Rocket Chat。Rocket Chat的應(yīng)用模板有三個容器鏡像組成,分別是:mongo、rocketchat和hubot。啟動之后Rocket Chat被分配到:52.11.188.233:3000(關(guān)于更詳細(xì)的關(guān)于Rancher Catalog的攻略可以閱讀這里:http://docs.rancher.com/ranch...)。
探索基礎(chǔ)設(shè)施Rocket Chat跑起來后,我們用Rancher UI來對H1和H2的情況一探究竟。點(diǎn)擊Infrastructure標(biāo)簽頁看看有哪些容器跑在宿主機(jī)上:
圖中可以看出,rocketchat容器被調(diào)度到H1上了,剩下的兩個容器:mongo和hubot被調(diào)度到H2上。截圖中我們還能看到每個節(jié)點(diǎn)都運(yùn)行著一個network agent(注意:只有當(dāng)有容器被調(diào)度到當(dāng)前宿主機(jī)后,network agent才會被創(chuàng)建)。各個容器的IP地址如截圖中所示——這些IP對于我們后面討論很重要。
我們可以下載machine config文件以獲得主機(jī)更詳細(xì)的信息:
解壓下載下來的machine configs之后,我們可以找到主機(jī)的私鑰和公鑰以及一些其他相關(guān)的配置文件。用私鑰我們ssh到主機(jī)。在每臺主機(jī)上我們執(zhí)行ifconfig列出主機(jī)IP和網(wǎng)絡(luò)接口。下面是在H1上的結(jié)果(精簡后的),可以看到docker0網(wǎng)橋的IP(172.17.0.1)和eth0接口地址(172.31.38.255):
`ubuntu@leo-alpha-h1:~$ ifconfig docker0 Link encap:Ethernet HWaddr 02:42:64:4e:c0:c6 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:64ff:fe4e:c0c6/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1114933 errors:0 dropped:0 overruns:0 frame:0 TX packets:1437072 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:198587596 (198.5 MB) TX bytes:1813282482 (1.8 GB) eth0 Link encap:Ethernet HWaddr 02:b8:4d:31:40:f3 inet addr:172.31.39.255 Bcast:172.31.47.255 Mask:255.255.240.0 inet6 addr: fe80::b8:4dff:fe31:40f3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:2187296 errors:0 dropped:0 overruns:0 frame:0 TX packets:1382626 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2627031496 (2.6 GB) TX bytes:277190533 (277.1 MB)`
在H2上重復(fù)上面的過程,獲得相似的結(jié)果:docker0的IP是172.17.0.1,物理網(wǎng)卡eth0的地址是172.31.38.133。
接下來,我們深挖每臺主機(jī)上運(yùn)行的容器的狀態(tài)并查看每個網(wǎng)絡(luò)接口上的IP地址。在H1上我們用sudo docker ps 和 sudo docker exec:
ubuntu@leo-alpha-h1:~$ sudo docker ps | awk "{print $1" "$2}" CONTAINER ID b6a27f5fd2fe rocketchat/rocket.chat:latest f0cd5839d719 rancher/agent-instance:v0.8.1 132d6ad0c6b9 rancher/agent:v1.0.1 ubuntu@leo-alpha-h1:~$ sudo docker exec -it b6a27f5fd2fe /bin/bash rocketchat@b6a27f5fd2fe:/app/bundle$ ip addr 17: eth0:mtu 1500 qdisc noqueue state UP group default link/ether 02:14:82:66:7d:fd brd ff:ff:ff:ff:ff:ff inet 172.17.0.5/16 scope global eth0 valid_lft forever preferred_lft forever inet 10.42.64.98/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::14:82ff:fe66:7dfd/64 scope link valid_lft forever preferred_lft forever ubuntu@leo-alpha-h1:~$ sudo docker exec -it f0cd5839d719 /bin/bash root@f0cd5839d719:/# ip addr 11: eth0: mtu 1500 qdisc noqueue state UP group default link/ether 02:14:82:82:b0:68 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet 10.42.162.246/16 scope global eth0 valid_lft forever preferred_lft forever inet 169.254.169.250/32 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::14:82ff:fe82:b068/64 scope link valid_lft forever preferred_lft forever
在H2上重復(fù)上述過程,我們得到了在H1和H2上運(yùn)行著的容器的信息:
HOST | Container Name | MAC Address | IP addresses |
---|---|---|---|
H1 | rocket.chat | 02:14:82:66:7d:fd | 172.17.0.5/16 10.42.64.98/16 |
H1 | agent-instance | 02:14:82:82:b0:68 | 172.17.0.2/16 10.42.162.246/16 169.254.169.250/32 |
H2 | hubot | 02:14:82:36:a4:6c | 172.17.0.5/16 10.42.42.48/16 |
H2 | mongo | 02:14:82:2d:a0:55 | 172.17.0.4/16 10.42.148.239/16 |
H2 | agent-instance | 02:14:82:ab:9d:5d | 172.17.0.2/16 10.42.69.59/16 169.254.169.250/32 |
從上表中我們發(fā)現(xiàn)每個容器都有一個網(wǎng)絡(luò)接口eth0。除此之外,Rancher的network agent容器(上表中的agent-instance)用三個IP地址:一個屬于Docker的子網(wǎng)(172.17.X.X),一個屬于Rancher的子網(wǎng)(10.42.X.X),以及第三個屬于鏈路本地地址子網(wǎng)(169.254.X.X)。其它的應(yīng)用服務(wù)容器(hubot、mongo、rocketchat)每個容器有兩個IP地址,一個屬于Docker子網(wǎng),另一個屬于Rancher的子網(wǎng)。
Hops and Traceroutes讓我們繼續(xù)了解下Rancher中容器間的數(shù)據(jù)通信。從mongo 容器 ping hubot 容器(這倆是在同一臺宿主機(jī)上):
root@ad4e749d2658:/# ping -c4 hubot PING hubot.rocket-chat.rancher.internal (10.42.42.48): 48 data bytes 56 bytes from 10.42.42.48: icmp_seq=0 ttl=64 time=0.041 ms 56 bytes from 10.42.42.48: icmp_seq=1 ttl=64 time=0.046 ms 56 bytes from 10.42.42.48: icmp_seq=2 ttl=64 time=0.075 ms 56 bytes from 10.42.42.48: icmp_seq=3 ttl=64 time=0.060 ms --- hubot.rocket-chat.rancher.internal ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.041/0.055/0.075/0.000 ms root@ad4e749d2658:/#
網(wǎng)絡(luò)從mongo容器可達(dá)hubot容器,從traceroute的結(jié)果也可以確認(rèn)兩者直接只有一跳:
root@ad4e749d2658:/# traceroute hubot traceroute to hubot (10.42.42.48), 30 hops max, 60 byte packets 1 ip-10-42-42-48.us-west-2.compute.internal (10.42.42.48) 0.029 ms 0.012 ms 0.015 ms root@ad4e749d2658:/#
我們再看下從mongo容器到rocketchat容器的traceroute結(jié)果(兩者在不同的主機(jī)上):
root@ad4e749d2658:/# traceroute rocketchat traceroute to rocketchat (10.42.64.98), 30 hops max, 60 byte packets 1 * * * 2 ip-10-42-162-246.us-west-2.compute.internal (10.42.162.246) 1.391 ms 1.229 ms 1.168 ms 3 ip-10-42-64-98.us-west-2.compute.internal (10.42.64.98) 1.137 ms 1.108 ms 1.086 ms root@ad4e749d2658:/#
上面的結(jié)果中可以看出從mongo到rocketchat容器有三跳,并且中間經(jīng)過了IP地址為10.42.162.246的網(wǎng)絡(luò),這個正是在H1上運(yùn)行著的network agent的地址。
Mongo容器中的ARP Table和IPSec我們從mongo容器中看下此時的ARP table:
root@ad4e749d2658:/# cat /proc/net/arp IP address HW type Flags HW address Mask Device 169.254.169.250 0x1 0x2 02:14:82:ab:9d:5d * eth0 10.42.64.98 0x1 0x2 02:14:82:ab:9d:5d * eth0 10.42.69.59 0x1 0x2 02:14:82:ab:9d:5d * eth0 10.42.42.48 0x1 0x2 02:14:82:36:a4:6c * eth0 172.17.0.1 0x1 0x2 02:42:6c:a6:5e:b8 * eth0 root@ad4e749d2658:/#
在ARP table中rocketchar容器的IP地址10.42.64.98的MAC地址是02:14:82:ab:9d:5d,這和在H2上運(yùn)行著的network agent eth0的MAC地址是一樣的。
讓我們看下IPSec的信息:
root@9cdde771152c:/# swanctl --list-conns conn-52.11.188.233: local: %any remote: 52.11.188.233 local pre-shared key authentication: remote pre-shared key authentication: child-52.11.188.233: TUNNEL local: 0.0.0.0/0 remote: 0.0.0.0/0 root@9cdde771152c:/#
從結(jié)果中我們可以看出H2和H1之間有一條加密的通信通道52.11.188.233。上述結(jié)果的邏輯關(guān)系可由下圖所示:
我們通過查看H1和H2上容器的IP地址可以看出,Docker分配的IP地址在不同的主機(jī)上并不是唯一的。例如,相同的IP地址172.17.0.5在H1上分配給了rocketchat容器,而在H2上則被分配給了hubot容器,所以多帶帶使用Docker分配的IP不能獲得唯一的地址。為了解決這個問題,Rancher給集群中運(yùn)行著的每一容器分配了一個唯一的IP地址,本文例子中的地址是從從ranher的默認(rèn)子網(wǎng)10.42.0.0/16分配而來。
IPSec在Rancher看來,安全性是頭等重要的事情!根據(jù)Rancher的設(shè)計,Rancher的集群的環(huán)境既可以公有云也可以是私有云,所以就不能對主機(jī)間的通訊信道做任何假設(shè)。我們希望從主機(jī)流出的數(shù)據(jù)是安全的,因此我們選擇用IPSec去構(gòu)建主機(jī)間的完整網(wǎng)絡(luò)拓?fù)?。雖然這會帶來一些性能上的影響,但是可以確保Rancher的網(wǎng)絡(luò)默認(rèn)是安全的。未來的版本里我們可能會提供選項(xiàng)關(guān)閉IPsec。
Rancher用strongSwan來配置IPSec。其中strongSwan的組件Charon daemon用來實(shí)現(xiàn)IKEv2協(xié)議。如果想要看完整的拓?fù)浼?xì)節(jié),我們可以用命令swanctl:
root@f0cd5839d719:/# swanctl --list-sas conn-52.11.198.155: #71, ESTABLISHED, IKEv2, 2146471635b90a25:1dc18102c0c48357 local "172.17.0.2" @ 172.17.0.2 remote "172.17.0.2" @ 52.11.198.155 AES_CBC-128/AES_XCBC_96/PRF_AES128_XCBC/MODP_2048 established 524s ago, rekeying in 12694s child-52.11.198.155: #1, reqid 1234, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96 installed 459878s ago in cb2952a7, 0 bytes, 0 packets out c0992075, 0 bytes, 0 packets local 0.0.0.0/0 remote 0.0.0.0/0 conn-52.11.198.155: #70, ESTABLISHED, IKEv2, ff2a5d9495f14efe:dda2d2a6df6a1cf3 local "172.17.0.2" @ 172.17.0.2 remote "172.17.0.2" @ 52.11.198.155 AES_CBC-128/AES_XCBC_96/PRF_AES128_XCBC/MODP_2048 established 8076s ago, rekeying in 5913s child-52.11.198.155: #2, reqid 1234, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96 installed 459859s ago in cf604805, 13790077094 bytes, 11532487 packets out cb46151e, 776570467 bytes, 9019180 packets local 0.0.0.0/0 remote 0.0.0.0/0Network Agent 服務(wù)
如果在Network Agent容器中列舉所有在跑的進(jìn)程,我們可以看到幾個關(guān)鍵的服務(wù)在運(yùn)行:rancher-dns,rancher=net等。rancher-net進(jìn)程是Rancher網(wǎng)絡(luò)服務(wù)的核心,它的作用是用strongSwan 和 charon創(chuàng)建IPSec網(wǎng)絡(luò)。rancher-net的源代碼可以在https://github.com/rancher/ra...查看。類似的,rancher-dns服務(wù)的職責(zé)是解析容器的名字和IP地址,其代碼可以在https://github.com/rancher/ra...查看。
通過應(yīng)用容器內(nèi)的/etc/resolv.conf文件我們可以看到容器的nameserver指向NetworkAgent的地址169.254.169.250。
rocketchat@b6a27f5fd2fe:/app/bundle$ cat /etc/resolv.conf search us-west-2.compute.internal rocket-chat.rancher.internal rocketchat.rocket-chat.rancher.internal rancher.internal nameserver 169.254.169.250總結(jié)
本文中,我們首先將Rancher部署到EC2實(shí)例上,并且添加新的主機(jī),之后用Rancher的Catalog啟動了RocketChat應(yīng)用,緊接著對運(yùn)行中的容器的網(wǎng)絡(luò)接口和其他屬性的進(jìn)行了分析。
同時,我們簡要介紹了Rancher的Overlay網(wǎng)絡(luò)和運(yùn)行在Network Agent中的輔助服務(wù)進(jìn)程,我們通過上面實(shí)踐中收集的信息構(gòu)建了Rancher集群中網(wǎng)絡(luò)通信的概覽圖。
與此同時,還特別介紹了使用IPSec實(shí)現(xiàn)主機(jī)間的安全通信。
接下來......Rancher中即將到來的幾點(diǎn)對于網(wǎng)絡(luò)的改進(jìn):
采用CNI/libnetwork 接口目前網(wǎng)路中由于給每個容器引入了第二個IP地址,對于一些只能使用網(wǎng)卡第一個IP地址的應(yīng)用帶來了一些問題。我們打算改用CNI/libnetwork的方案,這樣可以保證容器只有的默認(rèn)網(wǎng)絡(luò)接口只有一個IP地址。于此同時,用戶也可以方便的使用社區(qū)中很多其他的網(wǎng)絡(luò)技術(shù)。
VXLAN支持對于Rancher原生網(wǎng)絡(luò),我們打算除了IPSec外添加對VXLAN的支持。
多網(wǎng)絡(luò)在接下來的發(fā)行版中,我們打算為每一個Rancher支持的環(huán)境提供多個相互之間隔離的網(wǎng)絡(luò)。
期待您的反饋!希望這篇文章可以對您深入了解Rancher的網(wǎng)絡(luò)提供有價值的信息。一如既往,您的任何問題和困惑都可以通過論壇 https://forums.rancher.com 或者微信公眾號(@RancherLabs )聯(lián)系我們,我們的社區(qū)有里一群優(yōu)秀和充滿激情的小伙伴期待與您的溝通!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26770.html
摘要:在之前的版本上,用戶時常抱怨的網(wǎng)絡(luò)只有,沒有其他選擇。而容器社區(qū)的發(fā)展是十分迅猛的,各種容器網(wǎng)絡(luò)插件風(fēng)起云涌,欲在江湖中一爭高下。同樣是基于,使用提供的,網(wǎng)絡(luò)配置信息以方式注入。 在之前的Rancher版本上,用戶時常抱怨Rancher的網(wǎng)絡(luò)只有IPsec,沒有其他選擇。而容器社區(qū)的發(fā)展是十分迅猛的,各種容器網(wǎng)絡(luò)插件風(fēng)起云涌,欲在江湖中一爭高下。Rancher v1.2版本中與時俱進(jìn),...
摘要:在之前的版本上,用戶時常抱怨的網(wǎng)絡(luò)只有,沒有其他選擇。而容器社區(qū)的發(fā)展是十分迅猛的,各種容器網(wǎng)絡(luò)插件風(fēng)起云涌,欲在江湖中一爭高下。同樣是基于,使用提供的,網(wǎng)絡(luò)配置信息以方式注入。 在之前的Rancher版本上,用戶時常抱怨Rancher的網(wǎng)絡(luò)只有IPsec,沒有其他選擇。而容器社區(qū)的發(fā)展是十分迅猛的,各種容器網(wǎng)絡(luò)插件風(fēng)起云涌,欲在江湖中一爭高下。Rancher v1.2版本中與時俱進(jìn),...
摘要:元數(shù)據(jù)性能增強(qiáng)通過緩存元數(shù)據(jù)信息,我們大大增強(qiáng)了的元數(shù)據(jù)服務(wù)。這減少了數(shù)據(jù)庫抖動,也減少了傳遞到每個元數(shù)據(jù)服務(wù)的元數(shù)據(jù)需要占用的空間。由于許多服務(wù)都依賴于元數(shù)據(jù),當(dāng)然這也取決于用戶具體的實(shí)現(xiàn)方式您應(yīng)該可以明顯感受得到性能的整體提升。 Rancher容器管理平臺1.5版已正式與大家見面了。此版本中的各項(xiàng)增強(qiáng)功能,均旨在讓Rancher能夠更好地支持企業(yè)級生產(chǎn)環(huán)境中的使用。 在新版本中,額...
摘要:三私有代碼庫阿里云使用引言使用肯定離不開和代碼的集成。本著代碼可靠性,服務(wù)器穩(wěn)定性,功能擴(kuò)展性綜合對比,我們選擇使用阿里云的庫。 來自用戶的DevOps實(shí)踐分享,分享從開發(fā)代碼到生產(chǎn)環(huán)境部署的一條龍操作的實(shí)踐及經(jīng)驗(yàn), 包含工具技術(shù)的選型及考量、私有代碼庫與私有鏡像庫的應(yīng)用等。 (一)容器服務(wù)的Rancher選型 1、為什么說是下一代核心技術(shù) 從互聯(lián)網(wǎng)的多次變革說起,早期的C/S架構(gòu),到...
摘要:近期,儀表盤和外部代理接連被發(fā)現(xiàn)存在安全問題。本文將更深入解讀這兩個安全漏洞的原理會對您的部署造成的影響以及相應(yīng)的應(yīng)對之策。在中,儀表盤作為每個集群環(huán)境的一部分包含在內(nèi)但是,部署不受影響,因?yàn)槌洚?dāng)了儀表盤的身份驗(yàn)證授權(quán)和代理。 近期,Kubernetes儀表盤和外部IP代理接連被發(fā)現(xiàn)存在安全問題。針對這兩個漏洞,Kubernetes發(fā)布了相應(yīng)的補(bǔ)丁版本供會受漏洞影響的用戶解決問題。本文...
閱讀 1969·2021-11-24 09:39
閱讀 3357·2021-09-22 14:58
閱讀 1198·2019-08-30 15:54
閱讀 3349·2019-08-29 11:33
閱讀 1817·2019-08-26 13:54
閱讀 1628·2019-08-26 13:35
閱讀 2497·2019-08-23 18:14
閱讀 801·2019-08-23 17:04