本系列文章將介紹 Docker的相關知識:html
(1)Docker 安裝及基本用法linux
(2)Docker 鏡像nginx
(3)Docker 容器的隔離性 - 使用 Linux namespace 隔離容器的運行環境docker
(4)Docker 容器的隔離性 - 使用 cgroups 限制容器使用的資源後端
(5)Docker 網絡api
(6)若干企業生產環境中的容器網絡方案安全
Docker 在早期只有單機上的網絡解決方案,在 1.19 版本引入了原生的 overlay 網絡解決方案,可是它的性能損耗較大,可能沒法適應一些生產環境的要求。除了Docker 提供的解決方案外,還有其它一些開源的解決方案。本文首先會簡介各類已有的方案,而後根據公開分享的資料,總結一下部分企業在生產環境中對容器網絡的選型和考量。服務器
Flannel 是由 CoreOS 主導的解決方案。Flannel 爲每個主機的 Docker daemon 分配一個IP段,經過 etcd 維護一個跨主機的路由表,容器之間 IP 是能夠互相連通的,當兩個跨主機的容器要通訊的時候,會在主機上修改數據包的 header,修改目的地址和源地址,通過路由表發送到目標主機後解包。封包的方式,能夠支持udp、vxlan、host-gw等,可是若是一個容器要暴露服務,仍是須要映射IP到主機側的。網絡
Calico 是個年輕的項目,基於BGP協議,徹底經過三層路由實現。Calico 能夠應用在虛機,物理機,容器環境中。在Calico運行的主機上能夠看到大量由 linux 路由組成的路由表,這是calico經過自有組件動態生成和管理的。這種實現並無使用隧道,沒有NAT,致使沒有性能的損耗,性能很好,從技術上來看是一種很優越的方案。這樣作的好處在於,容器的IP能夠直接對外部訪問,能夠直接分配到業務IP,並且若是網絡設備支持BGP的話,能夠用它實現大規模的容器網絡。但BGP帶給它的好處的同時也帶給他的劣勢,BGP協議在企業內部還不多被接受,企業網管不太願意在跨網絡的路由器上開啓BGP協議。架構
跨主機的容器網絡解決方案不外乎三大類:
來源:https://www.douban.com/note/530365327/
結論:
方案 | 結論 | 優點 | 劣勢 |
weave(udp) | 真是慘,生產環境就別考慮了。看了下他們的架構,以爲即使是 fast-data-path 也沒多大意義。 | 無 | 就是個渣渣,概念好毛用都沒 |
calico | calico 的 2 個方案都有不錯的表現,其中 ipip 的方案在 big msg size 上表現更好,但蹊蹺是在 128 字節的時候表現異常,屢次測試如此。bgp 方案比較穩定,CPU 消耗並無 ipip 的大,固然帶寬表現也稍微差點。不過總體上來講,不管是 bgp 仍是 ipip tunnel,calico 這套 overlay sdn 的解決方案成熟度和可用度都至關不錯,爲雲上第一選擇。 | 性能衰減小,可控性高,隔離性棒 | 操做起來仍是比較複雜,好比對 iptables 的依賴什麼的 |
flannel | flannel 的 2 個方案表現也湊合,其中 vxlan 方案是由於無法開 udp offload 致使性能偏低,其餘的測試報告來看,一旦讓網卡自行解 udp 包拿到 mac 地址什麼的,性能基本上能夠達到無損,同時 cpu 佔用率至關漂亮。udp 方案受限於 user space 的解包,僅僅比 weave(udp) 要好一點點。好的這一點就是在實現方面更加高效。 | 部署簡單,性能還行,能夠兼容老版本 docker 的啓動分配行爲,避免 launcher | 無法實現固定 IP 的容器漂移,無法多子網隔離,對上層設計依賴度高,沒有 IPAM,對 docker 啓動方法有綁定 |
docker 原生 overlay 方案 | 其實也是基於 vxlan 實現的。受限於 cloud 上不必定會開的網卡 udp offload,vxlan 方案的性能上限就是裸機的 55% 左右了。大致表現上與 flannel vxlan 方案几乎一致。 | docker 原生,性能湊合 | 對內核要求高(>3.16),對 docker daemon 有依賴需求 ( consul / etcd ),自己驅動實現仍是略差點,能夠看到對 cpu 利用率和帶寬比一樣基於 vxlan 的 flannel 要差一些,雖然有 api 但對 network 以及多子網隔離局部交叉這種需求仍是比較麻煩,IPAM 就是個渣 |
綜上,雲上能用 BGP 就果斷上 calico bgp 方案,不能用 BGP 也能夠考慮 calico ipip tunnel 方案,若是是 coreos 系又能開 udp offload,flannel 是不錯的選擇。Docker overlay network 還有很長一段路要走,weave 就不用考慮了。
(0)PPTV 容器雲架構
(1)網絡需求
(2)選中的方案
最終 PPTV 選中基於docker的bridge模式,將默認的docker bridge網橋替換爲 linuxbridge,把 linuxbridge 網段的 ip 加入到容器裏,實現容器與傳統環境應用的互通。
docker network create --gateway10.199.45.200 --subnet 10.199.45.0/24 -o com.docker.network.bridge.name=br-oak--aux-address "DefaultGatewayIPv4=10.199.45.1" oak-net
(3)問題及解決方案
經過網橋的方式解決容器網絡有兩個問題:
(1)網絡需求
讓每一個容器擁有本身的網絡棧,特別是獨立的 IP 地址
可以進行跨服務器的容器間通信,同時不依賴特定的網絡設備
有訪問控制機制,不一樣應用之間互相隔離,有調用關係的可以通信
(2)調研過程和最終的選擇
調研了幾個主流的網絡模型:
Docker 原生的 Bridge 模型:NAT 機制致使沒法使用容器 IP 進行跨服務器通信(後來發現自定義網橋能夠解決通信問題,可是以爲方案比較複雜)
Docker 原生的 Host 模型:你們都使用和服務器相同的 IP,端口衝突問題很麻煩
Weave OVS 等基於隧道的模型:因爲是基於隧道的技術,在用戶態進行封包解包,性能折損比較大,同時出現問題時網絡抓包調試會很蛋疼
各類方案的限制:
Weave:它的思路是共享IP而非綁定。在傳輸層先找到目標地址,而後把包發到對端,節點之間互相經過協議共享信息。Flannel和Weave的特色是相似的,都用的是UDP或者是VxLAN的技術。事實上使用UDP性能是不好的,VxLAN和UDP差很少,它有一個網絡切隔,並且在裏面能夠跑二層協議。還有一種是IPIP封包,直接把一個IP包封裝在一個IP包裏面。以上不難看出,原生網絡性能比較差,使用UDP的時候性能損失在50%以上,使用VxLAN也會有20%~30%的損耗。因此我要在內核上封包,使用硬件來解決這些問題。並且容器和容器之間出現通信故障,調試的時候很是困難
(3)Calico 使用總結
根據 2016 北京容器大會 《魅族雲容器化建設》 文檔的一些總結:
(1)使用 OVS port 替代 OVS veth 能夠帶來較大的性能提高
(2)使用 SR-IOV
(3)使用 DPDK
上面的幾個生產環境中的網絡解決方案,它們的目的都是爲了把容器看成虛機用,所以都有共同的需求,好比:
要知足以上要求,可能 OVS/Linux-bridge + VLAN 方案應用的比較多,同時看起來 Calico 方案看起來前景不錯。
參考連接: