應(yīng)用集群組件由于其特性,會(huì)部署到容器、虛擬機(jī)中,那么組件間的通信就會(huì)跨多平臺(tái)。虛擬機(jī)是通過(guò)ArStack管理維護(hù),K8s則由AKE組件管理維護(hù),兩者屬于不同的平臺(tái)。當(dāng)虛擬機(jī)和容器需要相互“交談”的時(shí)候,我們需要以某種方式實(shí)現(xiàn)兩個(gè)獨(dú)立集群之間的通信。本文將介紹通過(guò)ArSDN如何實(shí)現(xiàn)容器和虛擬機(jī)的互通。
實(shí)現(xiàn)思路
單個(gè)可用區(qū)中部署ArSDN組件,可用區(qū)中的AKE、ArStack都接入ArSDN,由ArSDN接管網(wǎng)絡(luò)平臺(tái)的控制和數(shù)據(jù)面流量轉(zhuǎn)發(fā)。
當(dāng)數(shù)據(jù)面統(tǒng)一由ArSDN接管后,則可以將容器、虛擬機(jī)統(tǒng)一到一個(gè)平臺(tái)來(lái)管理,可以借助虛擬網(wǎng)絡(luò)的隔離實(shí)現(xiàn)集群間的隔離,通過(guò)三層路由器、策略等功能實(shí)現(xiàn)跨集群間的通信。
可以自由控制容器、虛擬機(jī)和裸機(jī)的流量。
容器和虛擬機(jī)互通的實(shí)現(xiàn)方式
容器集群通過(guò)CNI插件實(shí)現(xiàn)容器的網(wǎng)絡(luò)功能。CNI插件的實(shí)現(xiàn)有很多種,本文介紹的是華云數(shù)據(jù)自研的ArSDN CNI。
在容器集群接入ArSDN時(shí),ArSDN CNI會(huì)在ArSDN執(zhí)行一些初始化的操作,比如為每個(gè)容器集群創(chuàng)建一個(gè)Pod網(wǎng)絡(luò)和一個(gè)Service網(wǎng)絡(luò)、創(chuàng)建安全策略、網(wǎng)絡(luò)策略等等,容器的IP地址分配以及安全策略都由ArSDN來(lái)管理。
Pod創(chuàng)建流程:
CNI組件watch到有新的Pod創(chuàng)建,會(huì)在Pod網(wǎng)絡(luò)中創(chuàng)建對(duì)應(yīng)的網(wǎng)卡并分配IP地址
Pod在調(diào)度完成后,kubelet會(huì)調(diào)用CNI插件創(chuàng)建Pod網(wǎng)卡
CNI插件調(diào)用ArSDN組件獲取Pod網(wǎng)卡信息并完成網(wǎng)卡的創(chuàng)建
容器集群內(nèi)部通信存在幾種場(chǎng)景:
Pod和ApiServer通信:類似coredns這類Pod需要訪問(wèn)k8s apiserver獲取對(duì)應(yīng)的資源并生成域名信息
容器節(jié)點(diǎn)和Pod通信:部分組件會(huì)通過(guò)域名來(lái)訪問(wèn)Service,最終訪問(wèn)pod
Pod訪問(wèn)外網(wǎng):Pod部分頁(yè)面需要訪問(wèn)公網(wǎng)資源,有出外網(wǎng)的需求??梢酝ㄟ^(guò)將pod網(wǎng)絡(luò)加入路由器來(lái)實(shí)現(xiàn)
CNI如何獲取pod網(wǎng)卡信息:cni插件獲取容器網(wǎng)卡信息用來(lái)創(chuàng)建虛擬網(wǎng)卡
下面我們通過(guò)區(qū)分部署模式來(lái)具體介紹每個(gè)場(chǎng)景的實(shí)現(xiàn)方式
嵌套部署
容器集群如果部署到ArStack的虛擬機(jī)中我們稱為嵌套部署場(chǎng)景。嵌套場(chǎng)景中ArSDN本身會(huì)負(fù)責(zé)虛擬機(jī)的流量,還需要負(fù)責(zé)轉(zhuǎn)發(fā)虛擬機(jī)內(nèi)部的容器流量。
在vrouter組件中會(huì)為每個(gè)容器網(wǎng)卡創(chuàng)建一個(gè)獨(dú)立的子接口(sub interface),對(duì)應(yīng)的父接口是虛擬機(jī)的網(wǎng)卡。通過(guò)這種實(shí)現(xiàn),我們可以將容器網(wǎng)卡和虛擬機(jī)網(wǎng)卡抽象到同一個(gè)平面來(lái)管理,他們?cè)跀?shù)據(jù)庫(kù)中都對(duì)應(yīng)一個(gè)virtual-machine-interface只是其中的sub-interface屬性值不同
Pod和ApiServer通信
Pod訪問(wèn)ApiServer是通過(guò)訪問(wèn)K8S對(duì)應(yīng)的Service IP來(lái)實(shí)現(xiàn)的,Service的后端對(duì)應(yīng)集群的管理節(jié)點(diǎn)IP。嵌套場(chǎng)景中虛擬機(jī)有兩種網(wǎng)絡(luò):管理網(wǎng)、數(shù)據(jù)網(wǎng),且都是虛擬網(wǎng)絡(luò)。我們通過(guò)networkpolicy或者路由器將這兩個(gè)虛擬網(wǎng)絡(luò)打通,實(shí)現(xiàn)三層通信。這樣Pod在訪問(wèn)k8s service IP時(shí),流量會(huì)轉(zhuǎn)發(fā)到管理ip,此時(shí)由于管理網(wǎng)和pod網(wǎng)絡(luò)已經(jīng)三層打通,可以直接通信。
節(jié)點(diǎn)和Pod通信
節(jié)點(diǎn)訪問(wèn)Pod實(shí)際是從管理網(wǎng)訪問(wèn)Pod網(wǎng)絡(luò),類似上面的做法,管理網(wǎng)和pod網(wǎng)絡(luò)都是虛擬網(wǎng)絡(luò)且已經(jīng)三層打通,可以直接通信
CNI如何獲取Pod網(wǎng)卡信息
由于cni獲取Pod網(wǎng)卡信息的時(shí)候,Pod已經(jīng)完成了調(diào)度,也就是說(shuō)CNI可以直接訪問(wèn)當(dāng)前節(jié)點(diǎn)的Vrouter組件獲取網(wǎng)卡信息。嵌套場(chǎng)景中CNI是在虛擬機(jī)內(nèi)部的,需要通過(guò)某種方式來(lái)訪問(wèn)物理節(jié)點(diǎn)上的Vrouter服務(wù)。
這里我們通過(guò)link-local來(lái)實(shí)現(xiàn)流量轉(zhuǎn)發(fā),在訪問(wèn)某個(gè)固定IP和端口的時(shí)候,流量在到達(dá)物理節(jié)點(diǎn)時(shí)直接轉(zhuǎn)換成訪問(wèn)當(dāng)前節(jié)點(diǎn)IP+端口。這里也就是直接訪問(wèn)127.0.0.1:9096
非嵌套部署
容器集群部署到ArStack外部虛擬機(jī)或者物理裸機(jī)中我們稱為非嵌套部署場(chǎng)景。非嵌套場(chǎng)景中容器節(jié)點(diǎn)類似一個(gè)計(jì)算節(jié)點(diǎn),會(huì)在上面運(yùn)行Vrouter組件實(shí)現(xiàn)跨節(jié)點(diǎn)的數(shù)據(jù)通信。
Pod和ApiServer通信
非嵌套場(chǎng)景中管理網(wǎng)絡(luò)正常都是物理網(wǎng)絡(luò),我們無(wú)法通過(guò)networkpolicy或者路由器將它和Pod網(wǎng)路打通。在pod訪問(wèn)k8s service ip時(shí),流量轉(zhuǎn)換成訪問(wèn)管理IP,但是由于pod網(wǎng)絡(luò)是一個(gè)私有網(wǎng)絡(luò),和物理網(wǎng)絡(luò)是隔離的。這里通過(guò)link-local將訪問(wèn)的數(shù)據(jù)包執(zhí)行snat,使得源地址改成Vhost0 IP。此時(shí)只需要在物理設(shè)備里將數(shù)據(jù)網(wǎng)絡(luò)和管理網(wǎng)打通,就可以通過(guò)vhost0 IP來(lái)訪問(wèn)apiserver了
節(jié)點(diǎn)和Pod通信
節(jié)點(diǎn)訪問(wèn)pod網(wǎng)絡(luò),默認(rèn)情況下pod網(wǎng)絡(luò)是私有網(wǎng)絡(luò),從節(jié)點(diǎn)來(lái)訪問(wèn)根據(jù)節(jié)點(diǎn)上的路由規(guī)則,會(huì)走默認(rèn)路由到外部網(wǎng)絡(luò)中,是無(wú)法通信的。這里我們通過(guò)將pod網(wǎng)絡(luò)開啟ip-fabric功能,在物理節(jié)點(diǎn)上會(huì)動(dòng)態(tài)創(chuàng)建訪問(wèn)pod網(wǎng)絡(luò)的路由規(guī)則,使得在訪問(wèn)pod網(wǎng)絡(luò)時(shí)流量轉(zhuǎn)到vhost0中
CNI如何獲取Pod網(wǎng)卡信息
由于在裸機(jī)上會(huì)直接部署Vrouter,所以CNI可以直接訪問(wèn)當(dāng)前節(jié)點(diǎn)的Vrouter。相對(duì)于嵌套模式不需要進(jìn)行流量轉(zhuǎn)發(fā)。
K8S有自己的網(wǎng)絡(luò)模型,有service/ingress實(shí)現(xiàn)四層和七層負(fù)載均衡功能,通過(guò)networkpolicy實(shí)現(xiàn)安全功能,還有其他的qos、端口轉(zhuǎn)發(fā)等。ArSDN CNI則將K8S資源模型轉(zhuǎn)換成ArSDN資源模型。
容器和ArStack資源模型對(duì)比:
總結(jié)
ArSDN cni將k8s資源模型和ArSDN資源進(jìn)行轉(zhuǎn)換,打通了兩者之間的架構(gòu)差異。
虛擬機(jī)通過(guò)加入Pod虛擬網(wǎng)絡(luò)可以實(shí)現(xiàn)和容器的二層通信。通過(guò)路由器可以實(shí)現(xiàn)和容器的三層通信。容器集群間也可以通過(guò)網(wǎng)絡(luò)策略或者路由器打通,為多集群網(wǎng)絡(luò)通信提供支持。
轉(zhuǎn)自:砍柴網(wǎng)
【版權(quán)及免責(zé)聲明】凡本網(wǎng)所屬版權(quán)作品,轉(zhuǎn)載時(shí)須獲得授權(quán)并注明來(lái)源“中國(guó)產(chǎn)業(yè)經(jīng)濟(jì)信息網(wǎng)”,違者本網(wǎng)將保留追究其相關(guān)法律責(zé)任的權(quán)力。凡轉(zhuǎn)載文章及企業(yè)宣傳資訊,僅代表作者個(gè)人觀點(diǎn),不代表本網(wǎng)觀點(diǎn)和立場(chǎng)。版權(quán)事宜請(qǐng)聯(lián)系:010-65363056。
延伸閱讀
版權(quán)所有:中國(guó)產(chǎn)業(yè)經(jīng)濟(jì)信息網(wǎng)京ICP備11041399號(hào)-2京公網(wǎng)安備11010502035964