• 智匯華云 | ArSDN CNI 之容器和虛擬機的通信


    時間:2022-01-19





    應用集群組件由于其特性,會部署到容器、虛擬機中,那么組件間的通信就會跨多平臺。虛擬機是通過ArStack管理維護,K8s則由AKE組件管理維護,兩者屬于不同的平臺。當虛擬機和容器需要相互“交談”的時候,我們需要以某種方式實現兩個獨立集群之間的通信。本文將介紹通過ArSDN如何實現容器和虛擬機的互通。

    實現思路


    單個可用區中部署ArSDN組件,可用區中的AKE、ArStack都接入ArSDN,由ArSDN接管網絡平臺的控制和數據面流量轉發。

    當數據面統一由ArSDN接管后,則可以將容器、虛擬機統一到一個平臺來管理,可以借助虛擬網絡的隔離實現集群間的隔離,通過三層路由器、策略等功能實現跨集群間的通信。

    可以自由控制容器、虛擬機和裸機的流量。

    容器和虛擬機互通的實現方式


    容器集群通過CNI插件實現容器的網絡功能。CNI插件的實現有很多種,本文介紹的是華云數據自研的ArSDN CNI。

    在容器集群接入ArSDN時,ArSDN CNI會在ArSDN執行一些初始化的操作,比如為每個容器集群創建一個Pod網絡和一個Service網絡、創建安全策略、網絡策略等等,容器的IP地址分配以及安全策略都由ArSDN來管理。

    Pod創建流程:

    CNI組件watch到有新的Pod創建,會在Pod網絡中創建對應的網卡并分配IP地址

    Pod在調度完成后,kubelet會調用CNI插件創建Pod網卡

    CNI插件調用ArSDN組件獲取Pod網卡信息并完成網卡的創建

    容器集群內部通信存在幾種場景:

    Pod和ApiServer通信:類似coredns這類Pod需要訪問k8s apiserver獲取對應的資源并生成域名信息

    容器節點和Pod通信:部分組件會通過域名來訪問Service,最終訪問pod

    Pod訪問外網:Pod部分頁面需要訪問公網資源,有出外網的需求。可以通過將pod網絡加入路由器來實現

    CNI如何獲取pod網卡信息:cni插件獲取容器網卡信息用來創建虛擬網卡

    下面我們通過區分部署模式來具體介紹每個場景的實現方式

    嵌套部署


    容器集群如果部署到ArStack的虛擬機中我們稱為嵌套部署場景。嵌套場景中ArSDN本身會負責虛擬機的流量,還需要負責轉發虛擬機內部的容器流量。

    在vrouter組件中會為每個容器網卡創建一個獨立的子接口(sub interface),對應的父接口是虛擬機的網卡。通過這種實現,我們可以將容器網卡和虛擬機網卡抽象到同一個平面來管理,他們在數據庫中都對應一個virtual-machine-interface只是其中的sub-interface屬性值不同

    Pod和ApiServer通信

    Pod訪問ApiServer是通過訪問K8S對應的Service IP來實現的,Service的后端對應集群的管理節點IP。嵌套場景中虛擬機有兩種網絡:管理網、數據網,且都是虛擬網絡。我們通過networkpolicy或者路由器將這兩個虛擬網絡打通,實現三層通信。這樣Pod在訪問k8s service IP時,流量會轉發到管理ip,此時由于管理網和pod網絡已經三層打通,可以直接通信。

    節點和Pod通信

    節點訪問Pod實際是從管理網訪問Pod網絡,類似上面的做法,管理網和pod網絡都是虛擬網絡且已經三層打通,可以直接通信

    CNI如何獲取Pod網卡信息

    由于cni獲取Pod網卡信息的時候,Pod已經完成了調度,也就是說CNI可以直接訪問當前節點的Vrouter組件獲取網卡信息。嵌套場景中CNI是在虛擬機內部的,需要通過某種方式來訪問物理節點上的Vrouter服務。

    這里我們通過link-local來實現流量轉發,在訪問某個固定IP和端口的時候,流量在到達物理節點時直接轉換成訪問當前節點IP+端口。這里也就是直接訪問127.0.0.1:9096

    非嵌套部署


    容器集群部署到ArStack外部虛擬機或者物理裸機中我們稱為非嵌套部署場景。非嵌套場景中容器節點類似一個計算節點,會在上面運行Vrouter組件實現跨節點的數據通信。

    Pod和ApiServer通信

    非嵌套場景中管理網絡正常都是物理網絡,我們無法通過networkpolicy或者路由器將它和Pod網路打通。在pod訪問k8s service ip時,流量轉換成訪問管理IP,但是由于pod網絡是一個私有網絡,和物理網絡是隔離的。這里通過link-local將訪問的數據包執行snat,使得源地址改成Vhost0 IP。此時只需要在物理設備里將數據網絡和管理網打通,就可以通過vhost0 IP來訪問apiserver了

    節點和Pod通信

    節點訪問pod網絡,默認情況下pod網絡是私有網絡,從節點來訪問根據節點上的路由規則,會走默認路由到外部網絡中,是無法通信的。這里我們通過將pod網絡開啟ip-fabric功能,在物理節點上會動態創建訪問pod網絡的路由規則,使得在訪問pod網絡時流量轉到vhost0中

    CNI如何獲取Pod網卡信息

    由于在裸機上會直接部署Vrouter,所以CNI可以直接訪問當前節點的Vrouter。相對于嵌套模式不需要進行流量轉發。

    K8S有自己的網絡模型,有service/ingress實現四層和七層負載均衡功能,通過networkpolicy實現安全功能,還有其他的qos、端口轉發等。ArSDN CNI則將K8S資源模型轉換成ArSDN資源模型。

    容器和ArStack資源模型對比:


    總結

    ArSDN cni將k8s資源模型和ArSDN資源進行轉換,打通了兩者之間的架構差異。

    虛擬機通過加入Pod虛擬網絡可以實現和容器的二層通信。通過路由器可以實現和容器的三層通信。容器集群間也可以通過網絡策略或者路由器打通,為多集群網絡通信提供支持。

    轉自:砍柴網

      【版權及免責聲明】凡本網所屬版權作品,轉載時須獲得授權并注明來源“中國產業經濟信息網”,違者本網將保留追究其相關法律責任的權力。凡轉載文章及企業宣傳資訊,僅代表作者個人觀點,不代表本網觀點和立場。版權事宜請聯系:010-65363056。

    延伸閱讀

    ?

    版權所有:中國產業經濟信息網京ICP備11041399號-2京公網安備11010502035964

    www.色五月.com