天天看點

容器網絡Calico進階實踐 | 褚向陽

各位晚上好,我是數人雲的褚向陽,接下來要跟大家分享的主題是《容器網絡calico進階實踐》.

距離上次聊 calico 已經過去快半年的時間了,數人雲也一直在努力将容器網絡方案應用到企業客戶的環境中,calico v2.0 也馬上就要釋出了,這次跟大家一起感受下新版.

需要說明下,本人跟 calico 沒有任何直接關系,也隻是個"吃瓜群衆",做為使用者,想跟大家聊聊心得而已。

這次分享的内容主要包括:

簡單總結下作為使用者我看到的 calico 的變化,包括元件,文檔和 calicoctl ;

demo 一些簡單的例子,會和 macvlan 做一下對比說明原理;

最後總結下适合 calico 的使用場景;

calico 簡介回顧

首先,還是簡單的回顧下 calico 的架構和關鍵元件,友善大家了解。

calico 架構

calico 是一個三層的資料中心網絡方案,而且友善內建 openstack 這種 iaas 雲架構,能夠提供高效可控的 vm、容器、裸機之間的通信。

容器網絡Calico進階實踐 | 褚向陽

結合上面這張圖,我們來過一遍 calico 的核心元件:

felix,calico agent,跑在每台需要運作 workload 的節點上,主要負責配置路由及 acls 等資訊來確定 endpoint 的連通狀态;

etcd,分布式鍵值存儲,主要負責網絡中繼資料一緻性,確定 calico 網絡狀态的準确性;

bgp client(bird), 主要負責把 felix 寫入 kernel 的路由資訊分發到目前 calico 網絡,確定 workload 間的通信的有效性;

bgp route reflector(bird), 大規模部署時使用,摒棄所有節點互聯的 mesh 模式,通過一個或者多個 bgp route reflector 來完成集中式的路由分發;

通過将整個網際網路的可擴充 ip 網絡原則壓縮到資料中心級别,calico 在每一個計算節點利用 linux kernel 實作了一個高效的 vrouter 來負責資料轉發 而每個 vrouter 通過 bgp 協定負責把自己上運作的 workload 的路由資訊像整個 calico 網絡内傳播 - 小規模部署可以直接互聯,大規模下可通過指定的 bgp route reflector 來完成。

這樣保證最終所有的 workload 之間的資料流量都是通過 ip 包的方式完成互聯的。

容器網絡Calico進階實踐 | 褚向陽

calico 節點組網可以直接利用資料中心的網絡結構(支援 l2 或者 l3),不需要額外的 nat,隧道或者 vxlan overlay network。

容器網絡Calico進階實踐 | 褚向陽

如上圖所示,這樣保證這個方案的簡單可控,而且沒有封包解包,節約 cpu 計算資源的同時,提高了整個網絡的性能。

此外,calico 基于 iptables 還提供了豐富而靈活的網絡 policy, 保證通過各個節點上的 acls 來提供 workload 的多租戶隔離、安全組以及其他可達性限制等功能。

更詳細的介紹大家可以參考之前的分享:

http://edgedef.com/docker-networking.html 

或者 

http://dockone.io/article/1489

calico 的新版變化

接下來簡單介紹下 calico 新版帶來了哪些變化

元件層面:

先看一下 v2.0.0-rc2 中包含的元件清單:

v2.0.0-rc2

felix 2.0.0-rc4

calicoctl v1.0.0-rc2

calico/node v1.0.0-rc2

calico/cni v1.5.3

libcalico v0.19.0

libcalico-go v1.0.0-rc4

calico-bird v0.2.0-rc1

calico-bgp-daemon v0.1.1-rc2

libnetwork-plugin v1.0.0-rc3

calico/kube-policy-controller v0.5.1

networking-calico 889cfff

對比下 v1.5 或者之前的版本:

v1.5.0

felix v1.4.1b2

calicoctl v0.22.0

calico/node v0.22.0

calico/node-libnetwork v0.9.0

calico/cni v1.4.2

ibcalico v0.17.0

calico-bird v0.1.0

calico/kube-policy-controller v0.3.0

可以看到元件層面 calico 也發生了比較大的變化,其中新增:

libcalico-go (golang calico library function, used by both calicoctl, calico-cni and felix)

calico-bgp-daemon (gobgp based calico bgp daemon,alternative to bird)

libnetwork-plugin (docker libnetwork plugin for project calico, integrated with the calico/node image)

networking-calico (openstack/neutron integration for calico networking)

總結來看,就是元件語言棧轉向 golang,包括原來 python 的 calicoctl 也用 golang 重寫了; 順便說一下,這也和數人雲的語言棧從 python golang 統一到 golang 是差不多的周期,可以看出 golang 在容器圈的影響力之大; 同時面向開源,給使用者提供更好的擴充性(相容 gobgp)和內建能力(openstack/neutron)。

使用層面:

更好的文檔和積極響應的 slack:

http://docs.projectcalico.org/v2.0/introduction/

開源軟體的文檔對于使用者來說很重要,calico 的文檔正在變的越來越好,盡量保證每種使用場景(docker,mesos, coreos, k8s, openstack 等) 都能找到可用的參考。

除此之外,calico 還維護了一個很快響應的 slack,有問題可以随時到裡邊提問,這種互動對開源的使用者來說也是很好的體驗。

重新面向 kubernetes 改寫的 calicoctl ux 模型

毫無疑問,這是 calico 為了更好的內建到 kubernetes 所做出的努力和改變,也是對越來越多使用 k8s 同時又想嘗試 calico 網絡的使用者的好消息,這樣大家就可以像在 k8s 中定義 資源模型一樣通過 yaml 檔案來定義 calico 中的 pool,policy 這些模型了,同時也支援 label&selector 模式,保證了使用上的一緻性。 具體的 calico 定義資源模型的例子在後面的 demo 中會有展現。

calico cni 及 canal

還有一個變化,就是 canal 的出現,面向 cni 的基于通路控制的容器網絡方案。

container network interface cni 容器網絡 spec 是由 coreos 提出的,被 mesos, kubernetes 以及 rkt 等接受引入 使用。

calico 在對 docker 家的 cnm 和 libnetwork 提供更好的支援的同時,為了更親和 kubernetes ,和更好的對 cni 的支援,metaswitch 和 coreos 一起組建了 新的公司 tigera(https://www.tigera.io/),主推 canal 将 calico 的 policy 功能加入到 flannel 的網絡中,為和 k8s 的網絡提供更好的 acl 控制。

calico 元件原理 demo

為了了解 calico 工作原理,順便體驗新版 calico,我們準備了兩套 demo 環境,一套是新版 calico,另一套是對比環境 macvlan。

calico 以測試為目的叢集搭建,步驟很簡單,這裡不展開了, 大家可以直接參考 http://docs.projectcalico.org/master/getting-started/docker/installation/manual

macvlan 的叢集搭建,步驟也相對簡單, 參考:https://github.com/alfredhuang211/study-docker-doc/blob/master/docker跨主機macvlan網絡配置.md

這裡預設已經有了兩套 docker demo 叢集:

calico 網絡的叢集,分别是:10.1.1.103(calico01) 和 10.1.1.104(calico02)

macvlan 叢集,分别是:10.1.1.105 和 10.1.1.106

demo 1: calico 三層互聯

calicoctl node status 截圖: 

同時,已經有 ip pool 建立好,是:192.168.0.0/16

容器網絡Calico進階實踐 | 褚向陽

calicoctl get pool 截圖:

目前叢集也已經通過使用 calico driver 和 ipam 建立了不同的 docker network,本次 demo 隻需要使用 net1

容器網絡Calico進階實踐 | 褚向陽

docker network ls 截圖: 

容器網絡Calico進階實踐 | 褚向陽

calicoctl get profile 截圖: 

容器網絡Calico進階實踐 | 褚向陽

下面我們使用 net1 這個網絡,在兩台機器上各啟動一個容器:

在 calico01 上:

docker run --net net1 --name workload-a -tid busybox

在 calico02 上:

docker run --net net1 --name workload-b -tid busybox

容器連通性測試截圖:

容器網絡Calico進階實踐 | 褚向陽
容器網絡Calico進階實踐 | 褚向陽

demo 2: macvlan 二層互聯

建立 macvlan 網絡,分别在兩台主機上使用相同指令

docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=enp0s3 -o macvlan_mode=bridge 192_1

建立容器:

10.1.1.105:

docker run --net=192_1 --ip=192.168.1.168 -id --name test01 busybox sh

10.1.1.106:

docker run --net=192_1 --ip=192.168.1.188 -id --name test11 busybox sh

測試網絡連通性:

docker exec test01 ping -c 4 192.168.1.188

容器網絡Calico進階實踐 | 褚向陽

calico ip 路由實作及 wireshark 抓包

容器網絡Calico進階實踐 | 褚向陽

根據上面這個 calico 資料平面概念圖,結合我們的例子,我們來看看 calico 是如何實作跨主機互通的:

兩台 slave route 截圖: 

容器網絡Calico進階實踐 | 褚向陽
容器網絡Calico進階實踐 | 褚向陽

對照兩台主機的路由表,我們就知道,如果主機 1 上的容器(192.168.147.195)想要發送資料到主機 2 上的容器(192.168.38.195), 那它就會 match 到響應的路由規則 192.168.38.192/26 via 10.1.1.104,将資料包轉發給主機 2,主機 2 在根據 192.168.38.195 dev cali2f648c3dc3f 把資料包發到對應的 veth pair 上,交給 kernel。

那整個資料流就是:

container -> calico01 -> one or more hops -> calico02 -> container

最後,讓我們來看看 wireshark 抓包的截圖對比:

calico: 

容器網絡Calico進階實踐 | 褚向陽
容器網絡Calico進階實踐 | 褚向陽

macvlan: 

容器網絡Calico進階實踐 | 褚向陽

從上圖對比中也能看出,不同于 macvlan,calico 網絡中容器的通信的資料包在節點之間使用節點的 mac 位址,這樣沒有額外的 arp 廣播的,這是 calico 作為三層方案的特點之一。

但這同時也表明了,節點之間網絡部分如果想對于容器間通信在二層做 filter 或者控制在 calico 方案中是不起作用的。

這樣,一個簡單的跨主機的 calico 容期間三層通信就 demo 完了,其他的 calico 特性這裡就一一介紹了,鼓勵大家可以自己使用 vms 搭起來親自試試,遇到問題随時到 slack 去聊聊。

calico 使用場景

calico 既可以用在公有雲,也可以部署在私有環境,我們接下來主要集中讨論下 calico 在私有雲中的使用場景2。

二層網絡

calico 适用于二層網絡,原因首先就是不會因為容器數量的變化帶來 arp 廣播風暴,上面的 demo 中,我們已經看出了,calico 中容器間的相關通信在二層使用的是節點的 mac 位址, 這樣也就是說,廣播上的增長隻是主機層上的增減,這在資料中心本來就是可控的;其次,就是網絡擾動,同樣的道理,使用 calico 也不用擔心因為容器的頻繁啟動停止所帶來的網絡擾動; 最後,calico 的 ip 空間使用是相對自由的,這樣保證足夠的 ip 資源使用。

當然,任何事情都是兩面,使用 calico 要了解,calico 的 ip 是叢集内,也就是說如果需要使用容器 ip 和 外部網際網路進行通訊,還需要進行相應的配置。 比如:如果有對外通訊需求,則要開啟 nat-outgoing;如果需要對内可達,需要配置和維護對應的路由規則或者通過支援 bgp 的外部交換/路由裝置,具體可以參考3。

此外,上面的 demo 也說明了,如果有需求對容器間通信二層資料包有分析和控制的化,calico 也是沒辦法的,這樣也就是說如果 dc 已經內建了一些商業網絡控制子產品或者 sdn,則要通盤考慮, 是否合适引入 calico。

最後,提一個小點,calico 的資料存儲,需要對每個 calico node 指定唯一标示,預設需要使用 hostname ,也可以在 calicoctl node run 時通過 --name 指定, 如果使用預設的 hostname,就要求在初始化 calico 叢集之前,規劃好各個主機的 hostname。

三層網絡

calico 也能使用在三層的網絡中,但是相比二層是要複雜,需要更多的 net-eng 介入,個人水準有限,就不展開說了,有興趣的可以直接參考: http://docs.projectcalico.org/master/reference/private-cloud/l3-interconnect-fabric

總結:

随着容器網絡的發展,數人雲會越來越多的關注如何把先進的容器網絡技術更好的"落地"企業,數人雲年底新版本也會加入了适配數人雲的 calico 安裝配置手冊給最終使用者。

我們會一直關注開源,包括 calico, cisco contiv, dpdk等,相信後面各個開源方案都會在易用性、易維護性上繼續提升,同時也一定會加強對各個容器編排方案的支援。

回過頭看 calico 的新版本發展,也印證了這些要求:

易用性,相容 k8s 的 calicoctl ux;

易維護性,golang 重寫;calico 本身為三層方案,而且calico 能夠相容二層和三層的網絡設計,可以和現有 dc 網絡的整合和維護;

更好的和現有方案的內建,包括 openstack,cni/canal,mesos 等,calico 在網絡方案的适用性方案還是很有競争力的;

2016年馬上就要過去了,作為容器網絡的愛好者使用者,個人希望在 2017 年數人雲能将真正成熟穩定的容器網絡方案帶給大家。

能力所限,文中難免有錯誤,随時歡迎指正。謝謝!

問答環節

問題1:畫網絡拓撲圖,有什麼好用的開源工具麼?最好是免費的,開源的(來自:中生代技術(成渝一家)@鄒晨-佳網)

答:其實我個人不怎麼畫網絡拓撲圖的,不過如果是 windows 以前就是用 visio,最近畫圖都用 gliffy,chrome 有插件的。如果是放在頁面中的動态生成圖,建議看看 d3.

問題2:calico有具體的性能資料嗎?(來自:中生代技術(西安)- @李钊-zte-研發)

答:之前做過簡單的性能對比測試,總體來看還是很不錯的,具體見圖:

容器網絡Calico進階實踐 | 褚向陽
容器網絡Calico進階實踐 | 褚向陽

問題3:遇到問題随時到 slack 去聊聊,想請教下這個跟slack有什麼關系?(來自:中生代技術(成渝一家)@鄒晨-佳網)

答:這裡指的是 calico 的 slack:https://slack.projectcalico.org/ ,

中生代技術群分享第四十七期

講師:褚向陽,數人雲研發工程師,接觸開源及openstack比較早,曾在紅帽pnt(原hss)部門負責紅帽内部工具鍊的開發及維護工作。現負責數人雲的研發工作,對docker,mesos有所研究,熟悉和熱愛雲計算、分布式、sdn等領域相關技術。