1. CNM模型
DOCKER公司提出,主要通過如下三個組件實現:
1.1 Network Sandbox
- 作用: 容器內部網絡棧,包括網絡接口、路由表、DNS等配置的管理。
- 實現:可用 linux網絡命名空間、FreeBSD Jail等機制實現
- 說明:一個Sandbox可以包含多個Endpoint。
1.2 Endpoint
- 作用:用于將容器內部Sandbox與外部網絡相連的網絡接口。
- 實現:可用veth對、Open vSwitch內部port等技術實現。
- 說明:一個Endpoint僅可加入一個Network
1.3 Network
- 作用:可以直接相互連接的Endpoint的集合。
- 實現:可用linux網橋、VLAN等技術實現。
- 說明:一個Network包含多個Endpoint
2. CNI模型
由CoreOS公司提出的一種容器網絡規范。被kubernetes等項目采納。
其對容器網絡的設置和操作都通過插件完成,有如下兩種類型:
2.1 CNI Plugin
作用:負責為容器配置網絡資源。
包括如下3個基本接口的定義:
- ADD:將容器添加到某個網絡
- DELETE:容器銷毀時將容器從某個網絡中刪除
- CHECK:檢查容器網絡是否正確
- VERSION:查詢網絡插件支持的CNI規范版本號
2.2 IPAM Plugin
作用:負責對容器的IP地址進行分配和管理。如:為容器分配IP、網關、路由、DNS。
下邊介紹集中常用的網絡組件
3. Flannel
3.1 實現原理
1) 協助kubernetes,給每個node上的容器分配互不沖突的IP地址
2)建立一個覆蓋網絡(Overlay Network),通過該網絡將數據原封不動的傳給目標容器。
3.2 網絡架構
flannel0的網橋一端諒解docker0,一端連接flanneld 服務進程
flanneld進程連接etcd
利用etcd管理可分配的IP地址網段資源
監控etcd中每個Pod的實際地址,并在內存中建立一個Pod節點的路由表flanneld進程下連docker0和物理網絡
使用內存中的Pod路由表,將docker0發來的數據包包裝起來,利用物理網絡投遞到目標flanneld上。
目標flanneld解包,發送給docker0(因此daocker0得到的是原始數據)
4. calico-BGP模式
4.1 實現原理
一個基于BGP的純三層網絡方案
在每個計算節點上由一個vRouter 來負責轉發,每個vRouter通過BGP1協議把本節點上運行的容器路由信息向整個Calico網絡廣播,并自動設置到達其他節點的路由轉發規則
4.2網絡架構
4.3 calico 組件
Felix:
是一個Calico Agent,運行在每個node上,負責為容器設置網絡資源(如IP地址、路由規則、iptables規則等),保證跨主機容器網絡互通etcd:后端存儲
BGP Client
負責把Felix在各Node上設置的路由信息通過BGP協議廣播到Calico網絡Route Reflector:
通過一個或多個BGP Reflector 來完成大規模集群的分級路由分發CalicoCtl
Calico的命令行管理工具。
4.4 IP Pool 的兩種模式
-
IPIP模式
將各Node的路由之間做一個tunnel,再把兩個網絡連接起來。如圖所示:
BGP模式
直接使用物理機作為虛擬路由器(vRouter),不再創建額外的tunnel設置方法
calico-node的容器中變量設置為:
ipip模式:CALICO_IPV4POOL_IPIP="always"
BGP模式:CALICO_IPV4POOL_IPIP="off"