先來(lái)看看阿里云官方對(duì)Terway的介紹:
什么是Terway網(wǎng)絡(luò)插件
Terway是阿里云開(kāi)源的基于專有網(wǎng)絡(luò)VPC的容器網(wǎng)絡(luò)接口CNI(Container Network Interface)插件,支持基于Kubernetes標(biāo)準(zhǔn)的網(wǎng)絡(luò)策略來(lái)定義容器間的訪問(wèn)策略。您可以通過(guò)使用Terway網(wǎng)絡(luò)插件實(shí)現(xiàn)Kubernetes集群內(nèi)部的網(wǎng)絡(luò)互通。本文介紹如何使用阿里云容器服務(wù)Kubernetes版ACK集群的Terway網(wǎng)絡(luò)插件。
Terway網(wǎng)絡(luò)插件是ACK自研的網(wǎng)絡(luò)插件,將原生的彈性網(wǎng)卡分配給Pod實(shí)現(xiàn)Pod網(wǎng)絡(luò),支持基于Kubernetes標(biāo)準(zhǔn)的網(wǎng)絡(luò)策略(Network Policy)來(lái)定義容器間的訪問(wèn)策略,并兼容Calico的網(wǎng)絡(luò)策略。
在Terway網(wǎng)絡(luò)插件中,每個(gè)Pod都擁有自己網(wǎng)絡(luò)棧和IP地址。同一臺(tái)ECS內(nèi)的Pod之間通信,直接通過(guò)機(jī)器內(nèi)部的轉(zhuǎn)發(fā),跨ECS的Pod通信、報(bào)文通過(guò)VPC的彈性網(wǎng)卡直接轉(zhuǎn)發(fā)。由于不需要使用VxLAN等的隧道技術(shù)封裝報(bào)文,因此Terway模式網(wǎng)絡(luò)具有較高的通信性能。
Terway網(wǎng)絡(luò)模式圖:
Terway與Flannel對(duì)比
在創(chuàng)建集群時(shí),ACK提供Terway和Flannel兩種網(wǎng)絡(luò)插件:
Terway:是阿里云容器服務(wù)ACK自研的網(wǎng)絡(luò)插件。Terway將阿里云的彈性網(wǎng)卡分配給容器,支持基于Kubernetes標(biāo)準(zhǔn)的網(wǎng)絡(luò)策略來(lái)定義容器間的訪問(wèn)策略,支持對(duì)單個(gè)容器做帶寬的限流。Terway擁有更為靈活的IPAM(容器地址分配)策略,避免地址浪費(fèi)。如果您不需要使用網(wǎng)絡(luò)策略(Network Policy),可以選擇Flannel,其他情況建議選擇Terway。
Flannel:使用的是簡(jiǎn)單穩(wěn)定的社區(qū)Flannel CNI插件。配合阿里云的VPC的高速網(wǎng)絡(luò),能給集群高性能和穩(wěn)定的容器網(wǎng)絡(luò)體驗(yàn)。Flannel功能偏簡(jiǎn)單,支持的特性少。例如,不支持基于Kubernetes標(biāo)準(zhǔn)的網(wǎng)絡(luò)策略(Network Policy)。
我們的kubernetes集群一直使用社區(qū)的Flannel CNI網(wǎng)絡(luò)插件,其實(shí)在第一次遷移的時(shí)候也考慮過(guò)使用阿里云自研的Terway,但是考慮成本原因和第一次遷移不想使用一個(gè)未使用過(guò)的網(wǎng)絡(luò)插件,最后還是選項(xiàng)了Flannel 。
使用Terway網(wǎng)絡(luò)插件以后,單節(jié)點(diǎn)所支持的最大Pod數(shù)取決于該節(jié)點(diǎn)的彈性網(wǎng)卡(ENI)數(shù),而阿里云低配服務(wù)器,支持的彈性網(wǎng)卡都比較少。
POD公式:
共享ENI支持的最大Pod數(shù)=(ECS支持的ENI數(shù)-1)×單個(gè)ENI支持的私有IP數(shù)
獨(dú)占ENI支持的最大Pod數(shù)=ECS支持的ENI數(shù)-1
由于這個(gè)原因,特別不適用于非生產(chǎn)環(huán)境。
最近剛好生產(chǎn)服務(wù)器快到期了,所以決定把生產(chǎn)環(huán)境更換為網(wǎng)絡(luò)性能無(wú)損、更安全并且支持網(wǎng)絡(luò)策略的Terway。
遷移之前也做了各項(xiàng)評(píng)估,做好了遷移方案,因?yàn)檫w移不涉及數(shù)據(jù)庫(kù)、MQ等這些中間件,也不涉及代碼更新,所以直接采用藍(lán)綠方式平滑遷移。
先創(chuàng)建一個(gè)Terway的集群,把所有的服務(wù)部署成功,然后再通過(guò)本地host或者本地DNS解析的方式,測(cè)試一下新的集群各種功能,正常以后修改網(wǎng)關(guān)的解析,然后兩個(gè)集群并行運(yùn)一段時(shí)間,等解析完全生效以后,停掉原來(lái)的集群就可以了。
遷移以后踩到了第一個(gè)Terway網(wǎng)絡(luò)插件的坑,這個(gè)坑也是排查了一些時(shí)間。
A服務(wù)器上面的kubernetes容器內(nèi)部,無(wú)法訪問(wèn)A服務(wù)器上面采用docker運(yùn)行容器的端口(直接docker run 或者 docker-compose方式運(yùn)行),采用kubernetes編排啟動(dòng)在A服務(wù)器上面的容器不影響,但是可以正常ping 通。
但是B服務(wù)器上面的kubernetes容器內(nèi)部,可以訪問(wèn)A服務(wù)器上面采用docker運(yùn)行容器的端口(直接docker run 或者 docker-compose方式運(yùn)行)。
由于我們剛好有個(gè)組件還未遷移到kubernetes,所以暫時(shí)采用的docker-compose方式手動(dòng)編排在了其中兩臺(tái)服務(wù)器上面。這導(dǎo)致了這兩臺(tái)服務(wù)器上面的kubernetes容器,都訪問(wèn)不了當(dāng)前服務(wù)器上面的這個(gè)組件,但是可以訪問(wèn)另外一臺(tái)服務(wù)器的組件。
雖然也可以使用,但是有大量的警告日志,訪問(wèn)超時(shí)。
我當(dāng)時(shí)也很費(fèi)解,怎么會(huì)出現(xiàn)這樣的問(wèn)題,帶著疑問(wèn)提交了一個(gè)工單咨詢,得到的結(jié)果是Terway網(wǎng)絡(luò)插件不支持這樣的場(chǎng)景。
沒(méi)辦法只能暫時(shí)部署在其他服務(wù)器,后面有時(shí)間了遷移到kubernetes集群。
踩的第二個(gè)Terway網(wǎng)絡(luò)插件的坑,就比較慘了,是我已經(jīng)修改解析以后才爆出來(lái)的。
我在看鏈路追蹤的時(shí)候發(fā)現(xiàn)了大量調(diào)用高德API超時(shí)的請(qǐng)求,當(dāng)時(shí)也引起了我的注意,然后馬上問(wèn)相關(guān)服務(wù)的開(kāi)發(fā),高德那邊是不是配置了IP白名單之類的。
經(jīng)過(guò)排查,高德那邊沒(méi)有開(kāi)啟白名單,然后開(kāi)發(fā)本地測(cè)試一切正常。
我馬上復(fù)制高德API本地ping了一下,可以ping通,然后馬上遠(yuǎn)程到集群的其中一個(gè)節(jié)點(diǎn),ping也可以ping通,但是exec進(jìn)入容器內(nèi)部再ping的時(shí)候,發(fā)現(xiàn)不通。
一開(kāi)始我以為是高德API的CDN節(jié)點(diǎn)故障,但是我復(fù)制IP到本地ping卻沒(méi)問(wèn)題。
此時(shí)我有點(diǎn)方了,容器內(nèi)部難道無(wú)法訪問(wèn)外網(wǎng),于是馬上ping www.baidu.com 和 ping 114.114.114.114果然都不通。
驗(yàn)證了我的推論以后,我更方了,服務(wù)器都可以上網(wǎng),容器內(nèi)部為啥不能上網(wǎng)?我又進(jìn)入測(cè)試環(huán)境集群中的一個(gè)容器,ping測(cè)試了一下,訪問(wèn)外網(wǎng)正常。
這兩個(gè)集群唯一不同的就是kubernetes的網(wǎng)絡(luò)插件,現(xiàn)在這個(gè)使用的Terway,難道插件的問(wèn)題?馬上又提交工單咨詢。
結(jié)果工單磨磨唧唧,半個(gè)小時(shí)以后就問(wèn)了我句集群節(jié)點(diǎn)可不可以訪問(wèn)公網(wǎng)。
還好提交工單以后我在他們的文檔 容器網(wǎng)絡(luò)FAQ找到了答案。
Terway網(wǎng)絡(luò)模式下增加了虛擬交換機(jī)后,集群無(wú)法訪問(wèn)公網(wǎng)怎么辦?
問(wèn)題現(xiàn)象:在Terway網(wǎng)絡(luò)下,因Pod沒(méi)有IP資源而手動(dòng)增加虛擬交換機(jī),在增加虛擬交換機(jī)后,發(fā)現(xiàn)集群不能正常訪問(wèn)公網(wǎng)。
問(wèn)題原因:Pod IP所屬的虛擬交換機(jī)不具備公網(wǎng)訪問(wèn)的能力。
解決方法:您可以通過(guò)NAT網(wǎng)關(guān)的SNAT功能,為Pod IP所屬的虛擬交換機(jī)配置公網(wǎng)SNAT規(guī)則。
然后按照文檔創(chuàng)建了一個(gè)SNAT規(guī)則以后正常了,到此第二個(gè)坑就算解決了。
為什么這次我創(chuàng)建集群的時(shí)候沒(méi)有勾選SNAT呢?因?yàn)楫?dāng)初提交工單咨詢過(guò),給我的答復(fù)是只要節(jié)點(diǎn)有公網(wǎng)IP能上網(wǎng),容器里面就能上網(wǎng)。
而本身這個(gè)SNAT一年也不便宜,服務(wù)器不多的時(shí)候每個(gè)節(jié)點(diǎn)配置一個(gè)公網(wǎng)IP更劃算,小公司總要考慮一下成本問(wèn)題。
你以為這樣就結(jié)束了,其實(shí)并沒(méi)有,因?yàn)檫@個(gè)事情被阿里的“領(lǐng)導(dǎo)”上了一課,感受了一次阿里的企業(yè)文化。
感興趣的可以訪問(wèn)《被阿里”領(lǐng)導(dǎo)”上了一課,感受了一次阿里文化》娛樂(lè)娛樂(lè)。