Calico在Docker中的搭建


一,Multi-host網絡需求

開始之前推薦兩篇文章
http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=400983139&idx=1&sn=f033e3dca32ca9f0b7c9779528523e7e&scene=1&srcid=1101jklWCo9jNFjdnUum85PG&from=singlemessage&isappinstalled=0#wechat_redirect
Docker在1.9中libnetwork團隊提供了multi-host網絡功能,能完成overlay網絡。但是網絡功能需要linux主機的內核在3.16以上。對於使用centos或者mint之類的用戶痛苦不堪,很多系統的內核還處於3.16以下。
隨着SDN概念的到來、雲平台的規模越來越大,Docker本身只能single host的問題嚴重限制了Docker的未來,雖然它相比VM有着數不盡的優勢。
 
其實在docker1.9之前就可以通過一些方式實現multi-host功能,比如使用OpenVSwitch、Flannel、Calico、Weave等這些機制。
OVS和Flannel、Weave底層都是用了Vxlan的方式(包括Docker1.9本身也是使用了Vxlan的實現),都是能夠完成Overlay的網絡。
OVS和Flannel和Weave再細分就是就是實現的具體方式的不同了。OVS是比較成熟的技術,做的很多年功能也很強大, 但是配置復雜,對於大規模配置和項目遷移、擴容會有很大的麻煩。Flannel、Calico、Weave、Docker1.9具體的區別看我上面給出的這個github博客,博主很贊。
 

二,Calico介紹

Calico是一個純3層協議,支持VM、Docker、Rocket、OpenStack、Kubernetes、或者直接在物理機上使用。官網上給出可以支持上萬個主機、上百萬的工作負載(container),由於它是純三層協議,使用BGP協議(基於IP),更易於調試,支持IPv6,支持靈活的安全策略。
附上一個Calico官方給出的Calico與物理網絡、OVS的性能對比:
覺得文章中有些“誇張了自己的效果”,我自己的測試結果與這個文章中的結果的差別有些大,雖然確實Calico在網絡本身較好的情況下TCP有着絕對優勢,但是它的UDP性能並不算很突出,在非ipip模式時能保持一點領先,但是在ipip模式時候,與Flannel基本等同,甚至更差。
 
這里推薦兩篇Calico在Docker中使用的教程:
一個博客:http://xelatex.github.io/2015/09/06/calico-docker/
 

三,准備

1,兩台主機:10.11.150.72、10.11.150.74 (我這里是Centos)
2,Calico-node image兩個方法獲得:
    1,自己從Calico官方github上下載編譯: https://github.com/projectcalico/calico-docker 
    2,直接從Docker hub上下載現成的,不過版本可能沒那么新: https://hub.docker.com/search/?q=calico&page=1&isAutomated=0&isOfficial=0&starCount=0&pullCount=0
3,Etcd: http://pan.baidu.com/s/1mgIqn4O 這里版本是2.2.1
4,一個有ping命令的image,什么都可以,最簡單如busybox,我這里使用iperf的鏡像
5,calicoctl :自己找個版本,盡量最新版本,但是注意更新的內容。目前最新的是0.12.0: https://github.com/projectcalico/calico-docker/releases
 

四,運行ETCD集群

Calico要求擁有一個etcd cluster作為k-v存儲,來存放自己的配置內容。
在10.11.150.72上運行:
#!/bin/sh
export localip=10.11.150.72
export name=calico0
export port1=2381
export port2=2379
export port3=4002
 
sudo ./etcd \
-name $name \
-initial-advertise-peer-urls http://$localip:$port1 \
-listen-peer-urls http://0.0.0.0:$port1 \
-listen-client-urls http://0.0.0.0:$port2,http://0.0.0.0:$port3 \
-advertise-client-urls http://$localip:$port2,http://$localip:$port3\
-initial-cluster-token etcd-cluster \
-initial-cluster calico0=http://$localip:$port1,calico1=http://10.11.150.74:$port1 -initial-cluster-state new &

注意我這里的端口和localip的配置,另外-initial-cluster一定要包含-initial-advertise-peer-urls。

然后在10.11.150.74上運行etcd,組成cluster,兩台機子都輸出published name后暫時沒有新的輸出就算是etcd cluster組建完成。
測試一下:
本機: 
curl -L 127.0.0.1:2379/version

集群:

curl -L 10.11.150.74:2379/version

五,Calico Service

Calico在每個主機上通過一個自己的container與其他主機或者網絡通訊,即calico-node的container,這個container里面包含了Bird路由管理、Felix協議等。
在兩台主機上分別運行,后面的ip是主機ip
./calicoctl node --ip=10.11.150.72

運行后在兩個主機用docker ps可以看到正在運行calico-node的container

下面為我們的calico網絡添加可用的ip pool(在72或者74一台主機上運行即可):
./calicoctl pool add 172.1.0.0/16 --nat-outgoing

這里由於我的兩個主機72和74本身就在同一個子網下,主機相互之間不需要L2 switch。如果是跨子網、跨機房、跨公網就需要加上--ipip選項,或者你有權限直接修改路由器的BGP協議,將兩個不同子網的主機連接為BGP peer。

 

六,Container開始吧

在主機72上面新建兩個container:
docker run --net=none --name worker-1 -tid iperf
docker run --net=none --name worker-2 -tid iperf

在74上也新建兩個

docker run --net=none --name worker-3 -tid iperf
docker run --net=none --name worker-4 -tid iperf

為container在calico中注冊一個獨立的IP:

./calicoctl container add worker-1 172.1.0.1
./calicoctl container add worker-2 172.1.0.2

 

./calicoctl container add worker-3 172.1.0.3
./calicoctl container add worker-4 172.1.0.4

Calico通過profile的形式來控制ACL,也以此來完成安全策略。

添加兩個profile(72或者74均可):
./calicoctl profile add PROF_1
./calicoctl profile add PROF_2

為container添加策略:

./calicoctl container worker-1 profile append PROF_1
./calicoctl container worker-2 profile append PROF_1
./calicoctl container worker-3 profile append PROF_1
./calicoctl container worker-4 profile append PROF_2

這樣worker 1 2 3同在profile內,worker-4單獨在PROF_2內。

 

七,測試一下吧

測試一下worker-1和worker-3之間可以通:
docker exec worker-1 ping -c 4 172.1.0.3
測試一下worker-1和worker-4之間不在同一個profile下面不能通:
docker exec worker-1 ping -c 4 172.1.0.4

八,性能測試:

推薦使用iperf、qperf、scp、ping等常見命令測試。
 

九,Calico缺陷

  • Calico only supports TCP, UDP, ICMP and ICMPv6 protocol. If you want to use other L4 protocols, you need to choose Flannel, Weave or Docker Overlay Network.
  • Calico doesn’t have encryption data path. It’s not safe to build overlay network with Calico over untrusted network.
  • The performance of Calico with IP-over-IP option is quite bad, which --ipip option is a must in a public data center connected with IP network.(或者將兩主機通過BGP協議連接
  • No IP overlap support. Though Calico community is developing a experimental feature that put overlap IPv4 packages into IPv6 package. But this is only an auxiliary solution and doesn’t fully support IP overlap technically.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM