當前位置:
首頁 > 最新 > DockOne微信分享:PaaS網路模型設計

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