導航:首頁 > 網路營銷 > 容器網路插件有哪些

容器網路插件有哪些

發布時間:2023-05-13 15:40:59

Ⅰ 虛擬化運維--容器網路--Flannel(十三)

  Flannel是CoreOS開源的CNI網路插件,Flannel是一個專為kubernetes定製的三層網路解決方案,主要用於解決容器的跨主機通信問題。
  首先,flannel利用Kubernetes API或者etcd用於存儲整個集群的網路配置,其中最主要的內容為設置集群的網路地址空間。例如,設定整個集群內所有容器的IP都取自網段「10.1.0.0/畢拿16」。
  接著,flannel在每個主機中運行flanneld作為agent,它會為所在主機從集群的網路地址空間中,獲取一個小的網段subnet,本主機內所有容器的IP地址都將從中分配。
  然後,flanneld再將本主機獲取的subnet以及用於主機間通信的Public IP,同樣通過kubernetes API或者etcd存儲起來。
  最後,flannel利用各種backend mechanism,例如udp,vxlan等等,跨主機轉發容器間的網路流量,完成容器間的跨主機通信。

ETCD監聽的服務埠碰數歷默認是2379 、2380。
設置分配給docker網路的網段

Flannel默認採用vxlan作為backend,使用kernel vxlan默認的udp 8742埠。Flannel還支持udp的backend,使用udp 8285埠。

啟動後查看下啟動的docker是不是被flannel託管了:
如果有--bip=172.17.28.1/24(xxxx) ,說明Flannel管理了Docker。
可以看到docker啟動後被加上了flanneld的相關配置項了(bip, ip-masq 和 mtu)

重啟後的docker服務和flanned關聯了,網路會隨著flanned自動配置而變化。

在每個Node上啟動flannelid
flannel在每個Node上啟動了一個flanneld的服務,在flanneld啟動後,將從etcd中讀取配置信息,並請求獲取子網的租約。所有Node上的flanneld都依賴etcd cluster來做集中配置服務,etcd保證了所有node上flanned所看到的配置是一致的。同時每個node上的flanned監聽etcd上的數據變化,實時感知集群中node的變化。flanneld一旦獲取子網租約、配置後端後,會將一些信息寫入/run/flannel/subnet.env文件。

三台機器都配置好了之後,我們在三台機器上分別開啟一個docker容器,測試它們的網路是不是通的。

node1主機容器:

node1:

在實際的生產環境總,最常用的還是vxlan模式笑搜。

常見問題:

Ⅱ Kubernetes之NetworkPolicy,Flannel和Calico

Pod是Kubernetes調度的最小單元。一個Pod可以包含一個或多個容器,因此它可以被看作是內部容器的邏輯宿主機。Pod的設計理念是為了支持多個容器在一個Pod中共享網路和文件系統。那麼為什麼Pod內的容器能夠共享網路,IPC和PID命名空間?

原因:Kubernetes在每個Pod啟動時,會自動創建一個鏡像為gcr.io/google_containers/pause:version的容器,所有處於該Pod中的容器在啟動時都會添加諸如--net=container:pause --ipc=contianer:pause --pid=container:pause的啟動參數,因此Pod內所有容器共用pause容器的network,IPC和PID命名空間。所有容器共享pause容器的IP地址,也被稱為Pod IP。因此處於同一個Pod內的容器,可以通過localhost進行相互訪問。

在講K8s Pod間通信前,我們先復習一下Docker容器間的網路通信。默認情況下,Docker使用一種名為bridge的網路模型。如下圖所示:

Docker引擎在啟動時,會在宿主機上創建一個名為docker0的虛擬網橋,這個虛擬網橋負責給所有容器分配不重復的ip地址以及容器間的網路通信。首先,Docker在創建一個容器時,會執行以下操作:

通過這個docker0網橋,同一宿主機上的容器可以互相通信。然而由於宿主機的IP地址與容器veth pair的 IP地址均不在同一個網段,故僅僅依靠veth pair和namespace的技術,還不足以使宿主機以外的網路主動發現容器的存在。為了使外界可以訪問容器中的進程,docker採用了埠綁定的方式,也就是通過iptables的NAT,將宿主機上的埠埠流量轉發到容器內的埠上。

K8s 默認不提供網路功能,所有Pod的網路功能,都依賴於宿主機上的Docker。因此,Pod IP即是依靠docker0網橋分配給pause容器的虛擬IP。

同一個Node內,不同的Pod都有一個docker0網橋分配的IP,可以直接通過這個IP進行通信。Pod IP和docker0在同一個網段。因此,當同節點上的Pod-A發包給Pod-B時,包傳送路線如下:

不同的Node之間,Node的IP相當於外網IP,可以直接訪問,而Node內的docker0和Pod的IP則是內網IP,無法直接跨Node訪問。因此,不同Node上的Pod間需要通信,需要滿足以下兩個條件:

因此,為了實現以上兩個需求,K8s提供了CNI(Container Network Interface)供第三方實現從而進行網路管理。由此出現了一系列開源渣陵的Kubernetes中的網路插件與方案,包括:flannel,calico,cilium等等。這些網路插件集中解決了以下需求:

CNI的介紹請參考這篇文章: https://jimmysong.io/kubernetes-handbook/concepts/cni.html

在默認的Docker配置中,每個節點上的Docker服務會分別負責所在節點容器的IP分配。這樣導致的一個問題是,不同節點上容器可能獲得相同的內外沖梁高IP地址。

Flannel的設計目的就是為集群中的所有節點重新規劃IP地址的使用規則,從而使散尺得不同節點上的容器能夠獲得「同屬一個內網」且」不重復的」IP地址,並讓屬於不同節點上的容器能夠直接通過內網IP通信。

Flannel實質上是一種「覆蓋網路(overlay network)」,也就是將TCP數據包裝在另一種網路包裡面進行路由轉發和通信,目前已經支持UDP、VxLAN、AWS VPC和GCE路由等數據轉發方式,默認的節點間數據通信方式是UDP轉發。下圖展示了數據包在flannel中的流轉:

Flannel是一種典型的Overlay網路,它將已有的物理網路(Underlay網路)作為基礎,在其上建立疊加的邏輯網路,實現網路資源的虛擬化。Overlay網路有一定額外的封包和解包等網路開銷,對網路通信的性能有一定損耗。

Calico是純三層的SDN 實現,它基於BPG 協議和Linux自身的路由轉發機制,不依賴特殊硬體,容器通信也不依賴iptables NAT或Tunnel 等技術。能夠方便的部署在物理伺服器、虛擬機(如 OpenStack)或者容器環境下。同時calico自帶的基於iptables的ACL管理組件非常靈活,能夠滿足比較復雜的安全隔離需求。

Calico 還基於 iptables 還提供了豐富而靈活的網路 policy, 保證通過各個節點上的 ACLs 來提供 workload 的多租戶隔離、安全組以及其他可達性限制等功能。

核心問題是,nodeA怎樣得知下一跳的地址?答案是node之間通過BGP協議交換路由信息。

每個node上運行一個軟路由軟體bird,並且被設置成BGP Speaker,與其它node通過BGP協議交換路由信息。

可以簡單理解為,每一個node都會向其它node通知這樣的信息:

我是X.X.X.X,某個IP或者網段在我這里,它們的下一跳地址是我。

通過這種方式每個node知曉了每個workload-endpoint的下一跳地址。

K8s NetworkPoclicy 用於實現Pod間的網路隔離。在使用Network Policy前,必須先安裝支持K8s NetworkPoclicy的網路插件,包括:Calico,Romana,Weave Net,Trireme,OpenContrail等。

在未使用NetworkPolicy前,K8s中所有的Pod並不存在網路隔離,他們能夠接收任何網路流量。一旦使用NetworkPolicy選中某個namespace下的某些Pod,那麼這些Pod只能接收特定來源的流量(由Ingress屬性定義),並且只能向特定出口發送網路請求(由Egress屬性定義)。其他未被這個NetworkPolicy選中的Pod,依然不具備網路隔離。

下面是一個NetworkPolicy的例子:

下面的例子表示默認禁止所有Pod間的Ingress流量:

默認拒絕所有 Pod 之間 Egress 通信的策略為:

而默認允許所有 Pod 之間 Ingress 通信的策略為:

默認允許所有 Pod 之間 Egress 通信的策略為:

以 calico 為例看一下 Network Policy 的具體用法。首先配置 kubelet 使用 CNI 網路插件:

安裝 calio 網路插件:

首先部署一個 nginx 服務,此時,通過其他 Pod 是可以訪問 nginx 服務的:

開啟 default namespace 的 DefaultDeny Network Policy 後,其他 Pod(包括 namespace 外部)不能訪問 nginx 了:

最後再創建一個運行帶有 access=true label的 Pod 訪問的網路策略:

閱讀全文

與容器網路插件有哪些相關的資料

熱點內容
電視電腦怎麼共用一個網路 瀏覽:725
電信手機卡為什麼網路波動大 瀏覽:760
國內如何使用國際網路 瀏覽:926
密碼在網路空間中省份識別 瀏覽:609
經常網路錯誤怎麼回事 瀏覽:911
網路線怎麼看多少兆 瀏覽:853
四會網路營銷網路推廣系統 瀏覽:295
室內無線網路規劃流程實驗報告 瀏覽:798
手機卡2g網路嗎 瀏覽:762
4g手機遇上5g網路怎麼辦 瀏覽:446
換網線後路由器無法連接網路 瀏覽:423
網路營銷應注意的問題 瀏覽:604
蘋果手機網路設置怎麼修改 瀏覽:29
十大手機網路歌曲 瀏覽:782
戴爾游匣的無線網路開關 瀏覽:967
賬號信息驗證在哪個網路 瀏覽:69
手機軟體本地網路錯誤什麼意思 瀏覽:102
常用網路通信線路分幾類都有哪些 瀏覽:572
電腦不限速的網路怎麼設置 瀏覽:367
不帶蜂窩網路的蘋果手錶 瀏覽:573

友情鏈接