k8s網絡主題系列:html
K8s網絡設計與實現是在學習k8s網絡過程當中總結的內容。在學習k8s網絡各類插件以前我以爲有必要先搞清楚其設計思路是怎樣的,在知道其規範的狀況下確定能跟深入理解k8s網絡的各類插件。就像擁有指南針的船,纔不會跑偏。 spa
1.每一個Pod都擁有一個獨立IP地址,Pod內全部容器共享一個網絡命名空間插件
2.集羣內全部Pod都在一個直接連通的扁平網絡中,可經過IP直接訪問設計
(1) 全部容器之間無需NAT就能夠直接互相訪問htm
(2) 全部Node和全部容器之間無需NAT就能夠直接互相訪問blog
(3) 容器本身看到的IP跟其餘容器看到的同樣接口
K8s對網絡的要求總的來說主要有兩個最基本的要求,分別是:
CNI是由CoreOS提出的一個容器網絡規範。已採納規範的包括Apache Mesos, Cloud Foundry, Kubernetes, Kurma 和 rkt。另外 Contiv Networking, Project Calico 和 Weave這些項目也爲CNI提供插件。
CNI 的規範比較小巧。它規定了一個容器runtime和網絡插件之間的簡單的契約。這個契約經過JSON的語法定義了CNI插件所須要提供的輸入和輸出。一個容器能夠被加入到被不一樣插件所驅動的多個網絡之中。一個網絡有本身對應的插件和惟一的名稱。CNI 插件須要提供兩個命令:一個用來將網絡接口加入到指定網絡,另外一個用來將其移除。這兩個接口分別在容器被建立和銷燬的時候被調用。
容器runtime首先須要分配一個網絡命名空間以及一個容器ID。而後連同一些CNI配置參數傳給網絡驅動。接着網絡驅動會將該容器鏈接到網絡並將分配的IP地址以JSON的格式返回給容器runtime。
隧道方案
隧道方案在IaaS層的網絡中應用也比較多,將pod分佈在一個大二層的網絡規模下。網絡拓撲簡單,但隨着節點規模的增加複雜度會提高。
Weave:UDP廣播,本機創建新的BR,經過PCAP互通
Open vSwitch(OVS):基於VxLan和GRE協議,可是性能方面損失比較嚴重
Flannel:UDP廣播,VxLan
Racher:IPsec
路由方案
路由方案通常是從3層或者2層實現隔離和跨主機容器互通的,出了問題也很容易排查。
Calico:基於BGP協議的路由方案,支持很細緻的ACL控制,對混合雲親和度比較高。
Macvlan:從邏輯和Kernel層來看隔離性和性能最優的方案,基於二層隔離,因此須要二層路由器支持,大多數雲服務商不支持,因此混合雲上比較難以實現。
1.每一個Pod除了建立時指定的容器外,都有一個kubelet啓動時指定的基礎容器
2.kubelet建立基礎容器,生成network namespace
3.kubelet調用網絡CNI driver,由它根據配置調用具體的CNI 插件
4.CNI 插件給基礎容器配置網絡
5.Pod 中其餘的容器共享使用基礎容器的網絡
以上內容主要來自博客文章。