flannel介紹:
flannel項目是在三層物理網絡之上構建一個可跨節點通信容器網絡,負責為節點下發子網和路由等信息,為容器分發唯一IP,flannel只實現簡單的網絡通信,不支持網絡ACL。
flannel 支持vxlan、host-gw模式,udp模式已棄用。
在k8s中flannel作為標准CNI插件,每個節點都會運行一個flanneld的二進制代理程序,每個節點分配一個子網,集群網絡狀態通過apiserver直接存儲在etcd當中。
假設pod網絡是10.64.0.0/16,當前k8s有兩個節點,下面研究一下這兩節點上的pod是怎么通信的
vxlan:
node-01
網卡 | eth0 | vethxxx | cni0 | flannel.1 |
作用 | 物理網卡 | kubelet創建pod時分配的虛擬網卡 | pod共用的網橋 | vxlan的VTEP設備,處理非本節點pod網絡通信 |
IP | 192.168.1.121 | 10.64.0.1/24 | 10.64.0.0/32 |
路由表:
node-02
網卡 | eth0 | vethxxx | cni0 | flannel.1 |
作用 | 物理網卡 | kubelet創建pod時分配的虛擬網卡 | pod共用的網橋 | vxlan的VTEP設備, 處理非本節點pod網絡通信 |
IP | 192.168.1.122 | 10.64.1.1/24 | 10.64.1.0/32 |
路由表:
本地pod通信:
pod的vethxxx網卡都連接到了網橋cni0上面,實際cni0就是pod的交換機
pod跨節點通信 :
通信流程:
- pod-a訪問pod-b 因為兩者IP不在同一個子網,首先數據會先到默認網關也就是cni010.64.0.1
- 節點上面的靜態路由可以看出來10.64.1.0/24 是指向flannel.1的
- flannel.1 會使用vxlan協議把原始IP包加上目的mac地址封裝成二層數據幀
- 原始vxlan數據幀無法在物理二層網絡中通信,flannel.1 (linux 內核支持vxlan,此步驟由內核完成)會把數據幀封裝成UDP報文經過物理網絡發送到node-02
- node-02收到UDP報文中帶有vxlan頭信息,會轉交給flannel.1解封裝得到原始數據
- flannel.1 根據直連路由轉發到cni0 上面
- cni0 轉發給pod-2
其實flannel的核心就是把已知的網絡信息存儲在etcd當中,並且在本地節點維護其他節點的網絡信息,具體網絡通信的實現依賴linux網橋、vxlan封裝。
- 步驟2本機路由需要靜態路由表由flanneld動態維護
- 步驟3vxlan協議封裝數據幀組成VTEP二層網絡,那么就必須知道對方VTEP設備 flannel.1的mac地址,ARP表也由flanneld動態維護,目的mac就是aa:93:00:62:7d:0f
- 步驟4封裝UDP報文時已知目的mac地址aa:93:00:62:7d:0f,但是卻不知道對方eth0的IP地址,FDB表也由flanneld動態維護
host-gw:
host-gw 相對vxlan模式相對比較簡單,直接把節點作為一個網關,比如節點node-02上的pod子網是10.64.1.0/24,那么集群中所有節點上都會增加一條路由指向node-02
很顯然host-gw模式對物理網絡有嚴格的要求,中間不能有額外路由,宿主機要求能在二層網絡下能直接通信
Calico介紹:
Calico是針對容器、虛擬機場景下提供跨宿主機互通的開源網絡和安全解決方案,支持復雜的網絡策略。
Calico的特點就是把每個宿主機當中一個虛擬路由器建立與物理網絡對等的虛擬網絡,該模式BGP協議在網絡中通告路由信息,巧妙的把二層網絡轉換成三層路由網絡,避免報文被二次封裝數據轉發效率很高,Pod IP可以在物理網絡中全局路由
當然Calico除了路由模式還是支持Overlay Network網絡模式比如vxlan
Calico的主要組件:
- Felix:每個節點都要運行的calico agent,負責配置節點上的路由信息和ACL;
- ETCD:配置中心,主要負責網絡元數據一致性,確保Calico網絡狀態的准確性
- BGP Client(BIRD):主要負責把Felix配置的路由信息分發到當前Calico網絡,確保節點間能夠進行三層通信
BGP路由:
路由表:
本地pod通信:
本節點pod間通信不在像flannel一樣使用網橋二層通信,而是每個pod的虛擬網卡都會有Pod IP的靜態路由指向
pod跨節點通信 :
節點上有路由指向Pod子網所屬的宿主機上,整個流程都是普通的三層路由轉發