DockOne微信分享:PaaS網路模型設計
【編者的話】PAAS的抽象邏輯使得其網路模型與IAAS有所不通,本次通過重點說明kubernetes和docker的網路,從而來探究PAAS的網路模型設計。
PaaS和IaaS的網路需求
概念上來說,IaaS是基礎架構即服務,PaaS是平台即服務。從服務化角度來說兩者對於網路的需求有共同點:
(1)一台宿主機的網路隔離,一台宿主機要運行多個環境黑盒(VM或者容器),這時候每個環境黑盒的網路需要隔離。
(2)環境變更後的訪問一致性,比如VM或者容器遷移到其他宿主機的時候,如何保證外部訪問不感知,比較通用的解決方案網路代理層來解決。
實現上來說,IaaS是VM管理,PaaS是容器編排,兩者的網路也會有些不同:
(1)容器比VM輕量級,啟停更快,更方便遷移,所以PaaS的整個調度策略會更靈活,容器的遷移頻率是高於VM,當容器遷移的時候,PaaS需要更加快速的解決變化後的網路訪問。
(2)VM安全高於容器,IaaS這部分會更多在隔離和安全上有所考慮,當然這個可能是公有雲和私有雲的一個定位,個人認為IaaS比較適合公有雲,PaaS比較適合私有雲。
PaaS的網路模型設計
以上部分我們討論了PaaS網路需求,總結來說PaaS需要解決宿主機的網路隔離和環境變更後的訪問一致性問題,然後在靈活性上需要更加註重,私有雲的定位可以減少因為安全和隔離的代價,保證高性能。
(1)宿主機的網路隔離
網路隔離最基本問題就是要解決埠衝突,一種思路是容器通過埠映射訪問,宿主機的埠由系統分配避免埠衝突,這種方式對使用的便利性是有意義的,但並不理想,因為需要對各種埠進行映射,這會限制宿主機的能力,在容器編排上也增加了複雜度。
埠是個稀缺資源,這就需要解決埠衝突和動態分配埠問題。這不但使調度複雜化,而且應用程序的配置也將變得複雜,具體表現為埠衝突、重用和耗盡。
NAT將地址空間分段的做法引入了額外的複雜度。比如容器中應用所見的IP並不是對外暴露的IP,因為網路隔離,容器中的應用實際上只能檢測到容器的IP,但是需要對外宣稱的則是宿主機的IP,這種信息的不對稱將帶來諸如破壞自註冊機制等問題。
所以就要引入一層網路虛擬層來解決網路隔離,現在說的比較多的大二層網路,L2 over L3,比如OVS, Flannel, Calico等等。
(2)環境變更後的訪問一致性
一個通用方案來說通過代理層提供不變的訪問入口,像Openstack的網路節點就是一個L3(IP)的訪問入口,而PaaS更多的是提供L4(TCP, UDP)和L7(HTTP)的訪問,L4比較流行的開源方案有LVS,L7的是Nginx和Haproxy.
因此PaaS的網路結構有:
(1)物理網路
(2)虛擬層網路
(3)代理層網路
Kubernetes和Docker的網路說明
Kubernete Docker作為目前最流行的開源PaaS實現,通過其實現細節可以更加理解PaaS的網路模型實踐。
容器網路
Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP,同時Docker網橋是每個容器的默認網關。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的Container-IP直接通信。
Docker網橋是宿主機虛擬出來的,並不是真實存在的網路設備,外部網路是無法定址到的,這也意味著外部網路無法通過直接Container-IP訪問到容器。
Pod內部容器通信
Kubernetes中Pod是容器的集合,Pod包含的容器都運行在同一個宿主機上,這些容器將擁有同樣的網路空間,容器之間能夠互相通信,它們能夠在本地訪問其他容器的埠。
實際上Pod都包含一個網路容器,它不做任何事情,只是用來接管Pod的網路,業務容器通過加入網路容器的網路從而實現網路共享。
Pod的啟動方式類似於:
$ docker run -p 80:80 --name network-container -d $ docker run --net container:network-container -d
所以Pod的網路實際上就是Pod中網路容器的網路,所以往往就可以認為Pod網路就是容器網路,在理解Kubernetes網路的時候這是必須要需要清楚的,比如說Pod的Pod-IP就是網路容器的Container-IP。
Pod間通信
Kubernetes網路模型是一個扁平化網路平面,在這個網路平面內,Pod作為一個網路單元同Kubernetes Node的網路處於同一層級。
在這個網路拓撲中滿足以下條件:
? Pod間通信:Pod1和Pod2(同主機),Pod1和Pod3(跨主機)能夠通信
為此需要實現:
? Pod的Pod-IP是全局唯一的。其實做法也很簡單,因為Pod的Pod-IP是Docker網橋分配的,所以將不同Kubernetes Node的 Docker網橋配置成不同的IP網段即可。
? Node上的Pod/容器原生能通信,但是Node之間的Pod/容器如何通信的,這就需要對Docker進行增強,在容器集群中創建一個覆蓋網路(Overlay Network),聯通各個節點,目前可以通過第三方網路插件來創建覆蓋網路,比如Flannel和Open vSwitch等等。
Flannel由CoreOS團隊設計開發的一個覆蓋網路工具,Flannel 通過在集群中創建一個覆蓋網路,為主機設定一個子網,通過隧道協議封裝容器之間的通信報文,實現容器的跨主機通信。Flannel將會運行在所有的Node之上,Flannel實現的網路結構如圖所示:
代理層
Kubernetes中的Service就是在Pod之間起到服務代理的作用,對外表現為一個單一訪問介面,將請求轉發給Pod,Service的網路轉發是Kubernetes實現服務編排的關鍵一環。
Service都會生成一個虛擬IP,稱為Service-IP, Kuberenetes Porxy組件負責實現Service-IP路由和轉發,在容器覆蓋網路之上又實現了虛擬轉發網路。
Kubernetes Porxy實現了以下功能:
? 轉發訪問Service的Service-IP的請求到Endpoints(即Pod-IP)。
? 監控Service和Endpoints的變化,實時刷新轉發規則。
? 負載均衡能力。
Kubernetes Porxy是一種分布式L3代理轉發, 默認是居於Iptables實現,這從設計上很值得借鑒,但是性能部分有待驗證。
Kubernetes中的Ingress提供了一個統一的對外代理入口配置,比如HTTP的訪問配置,然後通過實現Ingress-Controller,Ingress-Controller的實現可以用Nginx,LVS等等,以Nginx來說,就Ingress-Controller監控Kubernetes API, 生成Nginx配置,然後載入生效,而Nginx跟Pod的通信,可以走Service,但是考慮到Kubernetes Porxy的性能問題,建議直接和Pod通信。下面就是一個實現圖:
整體來看的一個網路模型如下:
Q&A
Q: 有這麼多虛擬網路,覆蓋網路,會不會有網路延遲?
A: 網路虛擬會會帶來性能損耗,比如Flannel需要將報文封裝到UDP包中傳輸,這中間的封包解包就會帶來損耗。所以網路虛擬化的部分,軟體的實現還有待優化,其實更好的方式是硬體支持,比如現在很多提的SDN網路
Q: Pod為什麼要有個網路容器
A: 一方面這是解耦,通過網路容器來負責網路配置,這樣對於業務容器來說穩定性會更高,比如有多個業務容器中,某一個業務容器斷了,這樣就不會導致網路中斷。
Q: Calico默認全網是打通的,怎麼做基於網段之間的隔離?
A: 目前來說要做網段隔離,可能偏向安全性比較高的場景,我們目前是做私有雲場景,對隔離的要求沒那麼高。所以如果要做隔離的話,可以參考Openstack的OVS方案
Q 在某些應用場景下,Pod的IP需要固定,而不是重啟之後IP可能會變化,請問如何滿足這種場景的需求?
A Pod的Ip需要固定的話,一種方式是修改Docker的代碼,據我所知騰訊有實現過。
另外的方案就是做L3的代理,給Pod一個浮動IP,有點像Openstack的實現。
Q Ingress的流量默認是先走Service然後到Pod,還是直接到Pod?
A 取決你的實現,官方的實現是先走Sevice再到Pod, 我們是直接到Pod
Q Ingress-Controller實現除了使用LVS和Nginx外,能否採用商用負載設備來實現?實現是否取決於和k8s API的對接?
A 可以,只要有介面都可以實現,通過實現Ingress-Controller,比如對接F5的硬體設備,只要F5支持相關的API。
Q K8S 不同的Namespaces絡是如何做隔離的,overlay flannel沒有對應的網路策略,貴公司是如何做到的,關於k8s proxy性能問題在1.3版本之後得到了很大的改善這個有測試過嗎?
A : 目前K8S沒有做隔離,只要知道IP都可以通信。Flannel的部分沒有太多策略,如果要性能和定製化的需求,建議考慮OVS。K8S PROXY的性能沒有測試過。
Q: 代理入口上有哪些方法解決單點失效的問題呢?
A: 這個比較傳統了,軟體實現就keepalived之類的
Q: kube proxy在通過iptables分發請求到各個endpoint的時候,跨主機的連接是否做了SNAT?如果做了SNAT,在高並發請求下,是否會存在源埠枯竭問題?有無這方面實踐或者參考。謝謝。
A: 跨主機通信還是走L3 over L2, 比如flannel,只是在機器上做Iptable的NAT。但是Iptable的規則數目有限,所以比較有顧慮。
Q: Igress-Cntroller比較好的庫都有哪些,分別基於nginx haproxy lvs的
A: Github有蠻多實現的,其實還是比較簡單的,像go語言的話,直接套用官方提供的demo即可,其他語言可以對接K8S的API實現。
Q: 這麼多層的網路,多層轉發後網路性能怎麼樣?有沒有辦法實現高速數據轉發解決方案?
A: 代理層,虛擬層都會有損耗,這個就是要考慮管理成本和性能的權衡了。如何要實現高性能的話,就是要往SDN網路研究,通過硬體層的支持來實現虛


※代碼處理iOS的橫豎屏旋轉
※npx:npm 5.2.0 內置的包執行器
※滴滴插件化方案 VirtualApk 源碼解析
※深入探索JVM自動資源管理
※盤點國外多個APPStore應用屏幕截圖示例
TAG:推酷 |
※Coindesk也要發幣?|EOS矽谷測試網路完成搭建|Telegram放棄ICO計劃
※UNDEFEATED x Air Jordan 4 Sample 現身網路
※Azure虛擬網路整合MySQL、PostgreSQL服務
※OFF-WHITE × Vapor Street Flyknit 驚現網路!
※NSA網路武器DoublePulsar升級,Windows Embedded也淪陷了
※Kolla中配置OpenStac虛機網路vxlan和vlan共存
※Drake 未釋出的 OVO x Air Jordan 14 PE 現身網路!
※快思聰:新的Crestron DM XiODirector網路設備簡化DMNVX網路視音頻系統的部署
※還有彩虹配色?!OFF-WHITE x Blazer Mid 「Rainbow」 驚現網路
※Facebook,Twitter,Snapchat三大社交網路同時登陸GMIC!
※【網路研討會】通過PowerVR圖形內核引入PVRTune Complete進行性能分析
※語義分割網路DeepLab-v3的架構設計思想和TensorFlow實現
※IWC 萬國表 Pilot』s Watch Chronograph網路限定版
※Keepalived LVS-DR單網路雙活雙主配置模式
※TensorFlow 建立網路模型
※無人機開發商PrecisionHawk收購Droners、AirVid,建造行業專才網路
※Facebook透露內部Fabric Aggregator分散式網路系統設計
※Semtech與Comcast旗下的machineQ宣布已在美國的10座城市部署LoRaWAN網路
※BP神經網路模型:Matlab
※兩種網路通信架構:socket與RPC