目錄
k8s網絡CNI之flannel
k8s網絡通信模型
常見CNI插件(Container,Network,Interface)
插件通信一般的解決方案
網絡插件的應用
Flannel插件
flannel原理說明
flannel配置參數
flannel初始配置
flannel後端實作原理flannel支援的後端
host-gw
VxLAN
k8s網絡政策之canal
canal安裝
NetworkPolicy相關術語kubectl explain networkpolicy.spec講解:
實驗
建立兩個namespace
建立pod并啟動pod
管理入站流量詳解
拒絕所有入站流量的規則:測試拒絕所有入站流量:
允許所有入站流量的規則及測試:
放入特定入站流量
管理出站流量
拒絕所有出站流量
放行特定的出站流量一般網絡政策:
隔離名稱空間
Container to Container:同一pod内的多容器通信,lo
Pod to Pod:Pod IP <--> Pod IP
Service to Pod: PodIP <--> ClusterIP,跨網段的,依靠iptables或ipvs實作的
叢集外部用戶端 與 Service:例如ingress
Flannel,提供疊加網絡,基于linux TUN/TAP,使用UDP封裝IP報
文來建立疊加網絡,并借助etcd維護網絡配置設定情況,要注意,flannel不支援網絡政策的制定,是以如需網絡政策制定需采用Calico插件
Calico,基于BGP的三層網絡,支援網絡政策實作網絡的通路控制。在每台機器上運作一個vRouter,利用核心轉發資料包,并借助iptables實作防火牆等功能
Canal,由Flannel和Calico聯合釋出的一個統一網絡插件,支援網絡政策
Weave Net,多主機容器的網絡方案,支援去中心化的控制平面,資料平面上,通過UDP封裝實作L2 Overlay
Contiv,思科方案,直接提供多租戶網絡,支援L2(VLAN)、L3(BGP)、Overlay(VXLAN)
OpenContrail,Juniper開源
kube-router,K8s網絡一體化解決方案,可取代kube-proxy實作基于ipvs的Service,支援網絡政策、完美相容BGP的進階特性
重點了解Flannel, Calico, Canal, kube-router
虛拟網橋:
多路複用:MacVLAN
硬體交換:SR-IOV ,在硬體上虛拟出多個網卡,供容器使用,性能最好
放至主控端/etc/cni/net.d/下,即可加載使用
VxLAN:
host-gw:
UDP:
如上圖所示,當主機B加入flannel網絡時,和其他所有backend一樣,它會将自己的subnet 10.1.16.0/24和Public IP 192.168.0.101寫入etcd中,和其他backend不一樣的是,它還會将vtep裝置flannel.1的mac位址也寫入etcd中。
之後,主機A會得到EventAdded事件,并從中擷取上文中B添加至etcd的各種資訊。這個時候,它會在本機上添加三條資訊:
路由資訊:所有通往目的位址10.1.16.0/24的封包都通過vtep裝置flannel.1裝置發出,發往的網關位址為10.1.16.0,即主機B中的flannel.1裝置。
fdb資訊:MAC位址為MAC B的封包,都将通過vxlan首先發往目的位址192.168.0.101,即主機B
arp資訊:網關位址10.1.16.0的位址為MAC B
虛拟網絡資料幀添加到VxLAN首部後,封裝在實體網絡UDP封包中,到達目地主機後,去掉實體網絡封包頭部及VxLAN首部,再将封包傳遞給目的終端
VxLAN後端使用隧道網絡轉發會導緻一定和流量開銷,VxLAN DirectRouting模式,通過添加必要的路由資訊使用節點的二層網絡直接發送Pod通信封包,僅在跨IP網絡時,才啟用隧道方式。這樣,在不跨IP網絡時,性能基本接近二層實體網絡
egress 出站流量規則 可以根據ports和to去定義規則。ports下可以指定目标端口和協定。to(目标位址):目标位址分為ip位址段、pod、namespace
ingress 入站流量規則 可以根據ports和from。ports下可以指定目标端口和協定。from(來自那個位址可以進來):位址分為ip位址段、pod、namespace
podSelector 定義NetworkPolicy的限制範圍。直白的說就是規則應用到那個pod上。podSelector: {},留白就是定義對目前namespace下的所有pod生效。沒有定義白名單的話 預設就是Deny ALL (拒絕所有)
policyTypes 指定那個規則 那個規則生效,不指定就是預設規則。
名稱空間:
拒絕所有出站,入站
放行所有出站目标為本名稱空間内的Pod
隔離名稱空間,應該放行與kube-system名稱空間中Pod的通信,以實作監控和名稱解析等各種管理功能