各位晚上好,我是數(shù)人云的褚向陽,接下來要跟大家分享的主題是《容器網(wǎng)絡Calico進階實踐》.
距離上次聊 Calico 已經(jīng)過去快半年的時間了,數(shù)人云也一直在努力將容器網(wǎng)絡方案應用到企業(yè)客戶的環(huán)境中,Calico v2.0 也馬上就要發(fā)布了,這次跟大家一起感受下新版.
需要說明下,本人跟 Calico 沒有任何直接關系,也只是個"吃瓜群眾",做為使用者,想跟大家聊聊心得而已。
這次分享的內(nèi)容主要包括:
- 簡單總結下作為使用者我看到的 Calico 的變化,包括組件,文檔和 calicoctl ;
- Demo 一些簡單的例子,會和 MacVLAN 做一下對比說明原理;
- 最后總結下適合 Calico 的使用場景;
Calico 簡介回顧
首先,還是簡單的回顧下 Calico 的架構和關鍵組件,方便大家理解。
Calico 架構
Calico 是一個三層的數(shù)據(jù)中心網(wǎng)絡方案,而且方便集成 OpenStack 這種 IaaS 云架構,能夠提供高效可控的 VM、容器、裸機之間的通信。
結合上面這張圖,我們來過一遍 Calico 的核心組件:
- Felix,Calico agent,跑在每臺需要運行 workload 的節(jié)點上,主要負責配置路由及 ACLs 等信息來確保 endpoint 的連通狀態(tài);
- etcd,分布式鍵值存儲,主要負責網(wǎng)絡元數(shù)據(jù)一致性,確保 Calico 網(wǎng)絡狀態(tài)的準確性;
- BGP Client(BIRD), 主要負責把 Felix 寫入 kernel 的路由信息分發(fā)到當前 Calico 網(wǎng)絡,確保 workload 間的通信的有效性;
- BGP Route Reflector(BIRD), 大規(guī)模部署時使用,摒棄所有節(jié)點互聯(lián)的 mesh 模式,通過一個或者多個 BGP Route Reflector 來完成集中式的路由分發(fā);
通過將整個互聯(lián)網(wǎng)的可擴展 IP 網(wǎng)絡原則壓縮到數(shù)據(jù)中心級別,Calico 在每一個計算節(jié)點利用 Linux kernel 實現(xiàn)了一個高效的 vRouter 來負責數(shù)據(jù)轉發(fā) 而每個 vRouter 通過 BGP 協(xié)議負責把自己上運行的 workload 的路由信息像整個 Calico 網(wǎng)絡內(nèi)傳播 - 小規(guī)模部署可以直接互聯(lián),大規(guī)模下可通過指定的 BGP route reflector 來完成。
這樣保證最終所有的 workload 之間的數(shù)據(jù)流量都是通過 IP 包的方式完成互聯(lián)的。
Calico 節(jié)點組網(wǎng)可以直接利用數(shù)據(jù)中心的網(wǎng)絡結構(支持 L2 或者 L3),不需要額外的 NAT,隧道或者 VXLAN overlay network。
如上圖所示,這樣保證這個方案的簡單可控,而且沒有封包解包,節(jié)約 CPU 計算資源的同時,提高了整個網(wǎng)絡的性能。
此外,Calico 基于 iptables 還提供了豐富而靈活的網(wǎng)絡 policy, 保證通過各個節(jié)點上的 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 或者之前的版本:
可以看到組件層面 Calico 也發(fā)生了比較大的變化,其中新增:
- 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 重寫了; 順便說一下,這也和數(shù)人云的語言棧從 Python Golang 統(tǒng)一到 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 網(wǎng)絡的用戶的好消息,這樣大家就可以像在 k8s 中定義 資源模型一樣通過 YAML 文件來定義 Calico 中的 Pool,Policy 這些模型了,同時也支持 label&selector 模式,保證了使用上的一致性。 具體的 Calico 定義資源模型的例子在后面的 Demo 中會有體現(xiàn)。
Calico CNI 及 Canal
還有一個變化,就是 Canal 的出現(xiàn),面向 CNI 的基于訪問控制的容器網(wǎng)絡方案。
Container Network Interface CNI 容器網(wǎng)絡 spec 是由 CoreOS 提出的,被 Mesos, Kubernetes 以及 rkt 等接受引入 使用。
Calico 在對 Docker 家的 CNM 和 libnetwork 提供更好的支持的同時,為了更親和 Kubernetes ,和更好的對 CNI 的支持,Metaswitch 和 CoreOS 一起組建了 新的公司 TiGERA(https://www.tigera.io/),主推 Canal 將 Calico 的 policy 功能加入到 Flannel 的網(wǎng)絡中,為和 k8s 的網(wǎng)絡提供更好的 ACL 控制。 Calico 組件原理 Demo
為了理解 Calico 工作原理,順便體驗新版 Calico,我們準備了兩套 Demo 環(huán)境,一套是新版 Calico,另一套是對比環(huán)境 MacVLAN。
這里默認已經(jīng)有了兩套 Docker Demo 集群:
- Calico 網(wǎng)絡的集群,分別是:10.1.1.103(calico01) 和 10.1.1.104(calico02)
- MacVLAN 集群,分別是:10.1.1.105 和 10.1.1.106
Demo 1: Calico 三層互聯(lián)
calicoctl node status 截圖:
同時,已經(jīng)有 IP Pool 創(chuàng)建好,是:192.168.0.0/16
calicoctl get pool 截圖:
當前集群也已經(jīng)通過使用 calico driver 和 IPAM 創(chuàng)建了不同的 docker network,本次 demo 只需要使用 net1
docker network ls 截圖:
calicoctl get profile 截圖:
下面我們使用 net1 這個網(wǎng)絡,在兩臺機器上各啟動一個容器:
在 calico01 上:
docker run --net net1 --name workload-A -tid busybox
在 calico02 上:
docker run --net net1 --name workload-B -tid busybox
容器連通性測試截圖:
Demo 2: MacVLAN 二層互聯(lián)
創(chuàng)建 MacVLAN 網(wǎng)絡,分別在兩臺主機上使用相同命令
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
創(chuàng)建容器:
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
測試網(wǎng)絡連通性:
docker exec test01 ping -c 4 192.168.1.188
Calico IP 路由實現(xiàn)及 Wireshark 抓包
根據(jù)上面這個 Calico 數(shù)據(jù)平面概念圖,結合我們的例子,我們來看看 Calico 是如何實現(xiàn)跨主機互通的:
兩臺 slave route 截圖:
對照兩臺主機的路由表,我們就知道,如果主機 1 上的容器(192.168.147.195)想要發(fā)送數(shù)據(jù)到主機 2 上的容器(192.168.38.195), 那它就會 match 到響應的路由規(guī)則 192.168.38.192/26 via 10.1.1.104,將數(shù)據(jù)包轉發(fā)給主機 2,主機 2 在根據(jù) 192.168.38.195 dev cali2f648c3dc3f 把數(shù)據(jù)包發(fā)到對應的 veth pair 上,交給 kernel。
那整個數(shù)據(jù)流就是:
container -> calico01 -> one or more hops -> calico02 -> container
最后,讓我們來看看 Wireshark 抓包的截圖對比:
Calico:
MacVLAN:
從上圖對比中也能看出,不同于 MacVLAN,Calico 網(wǎng)絡中容器的通信的數(shù)據(jù)包在節(jié)點之間使用節(jié)點的 MAC 地址,這樣沒有額外的 ARP 廣播的,這是 Calico 作為三層方案的特點之一。
但這同時也表明了,節(jié)點之間網(wǎng)絡部分如果想對于容器間通信在二層做 filter 或者控制在 Calico 方案中是不起作用的。
這樣,一個簡單的跨主機的 Calico 容期間三層通信就 Demo 完了,其他的 Calico 特性這里就一一介紹了,鼓勵大家可以自己使用 VMs 搭起來親自試試,遇到問題隨時到 Slack 去聊聊。
Calico 使用場景
Calico 既可以用在公有云,也可以部署在私有環(huán)境,我們接下來主要集中討論下 Calico 在私有云中的使用場景2。
二層網(wǎng)絡
Calico 適用于二層網(wǎng)絡,原因首先就是不會因為容器數(shù)量的變化帶來 ARP 廣播風暴,上面的 Demo 中,我們已經(jīng)看出了,Calico 中容器間的相關通信在二層使用的是節(jié)點的 MAC 地址, 這樣也就是說,廣播上的增長只是主機層上的增減,這在數(shù)據(jù)中心本來就是可控的;其次,就是網(wǎng)絡擾動,同樣的道理,使用 Calico 也不用擔心因為容器的頻繁啟動停止所帶來的網(wǎng)絡擾動; 最后,Calico 的 IP 空間使用是相對自由的,這樣保證足夠的 IP 資源使用。
當然,任何事情都是兩面,使用 Calico 要理解,Calico 的 IP 是集群內(nèi),也就是說如果需要使用容器 IP 和 外部互聯(lián)網(wǎng)進行通訊,還需要進行相應的配置。 比如:如果有對外通訊需求,則要開啟 nat-outgoing;如果需要對內(nèi)可達,需要配置和維護對應的路由規(guī)則或者通過支持 BGP 的外部交換/路由設備,具體可以參考3。
此外,上面的 Demo 也說明了,如果有需求對容器間通信二層數(shù)據(jù)包有分析和控制的化,Calico 也是沒辦法的,這樣也就是說如果 DC 已經(jīng)集成了一些商業(yè)網(wǎng)絡控制模塊或者 SDN,則要通盤考慮, 是否合適引入 Calico。
最后,提一個小點,Calico 的數(shù)據(jù)存儲,需要對每個 calico node 指定唯一標示,默認需要使用 hostname ,也可以在 calicoctl node run 時通過 --name 指定, 如果使用默認的 hostname,就要求在初始化 Calico 集群之前,規(guī)劃好各個主機的 hostname。
三層網(wǎng)絡
總結:
隨著容器網(wǎng)絡的發(fā)展,數(shù)人云會越來越多的關注如何把先進的容器網(wǎng)絡技術更好的"落地"企業(yè),數(shù)人云年底新版本也會加入了適配數(shù)人云的 Calico 安裝配置手冊給最終用戶。
我們會一直關注開源,包括 Calico, Cisco Contiv, DPDK等,相信后面各個開源方案都會在易用性、易維護性上繼續(xù)提升,同時也一定會加強對各個容器編排方案的支持。
回過頭看 Calico 的新版本發(fā)展,也印證了這些要求:
易用性,兼容 k8s 的 calicoctl UX;
易維護性,Golang 重寫;Calico 本身為三層方案,而且Calico 能夠兼容二層和三層的網(wǎng)絡設計,可以和現(xiàn)有 DC 網(wǎng)絡的整合和維護;
更好的和現(xiàn)有方案的集成,包括 OpenStack,CNI/Canal,Mesos 等,Calico 在網(wǎng)絡方案的適用性方案還是很有競爭力的;
2016年馬上就要過去了,作為容器網(wǎng)絡的愛好者使用者,個人希望在 2017 年數(shù)人云能將真正成熟穩(wěn)定的容器網(wǎng)絡方案帶給大家。
能力所限,文中難免有錯誤,隨時歡迎指正。謝謝!
問答環(huán)節(jié)
問題1:畫網(wǎng)絡拓撲圖,有什么好用的開源工具么?最好是免費的,開源的(來自:中生代技術(成渝一家)@鄒晨-佳網(wǎng))
答:其實我個人不怎么畫網(wǎng)絡拓撲圖的,不過如果是 windows 以前就是用 Visio,最近畫圖都用 Gliffy,Chrome 有插件的。如果是放在頁面中的動態(tài)生成圖,建議看看 D3.
問題2:calico有具體的性能數(shù)據(jù)嗎?(來自:中生代技術(西安)- @李釗-ZTE-研發(fā))
答:之前做過簡單的性能對比測試,總體來看還是很不錯的,具體見圖:
問題3:遇到問題隨時到 Slack 去聊聊,想請教下這個跟slack有什么關系?(來自:中生代技術(成渝一家)@鄒晨-佳網(wǎng))