一,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.7二、10.11.150.74 (我這裏是Centos)
2,Calico-node image兩個方法得到:
4,一個有ping命令的image,什麼均可以,最簡單如busybox,我這裏使用iperf的鏡像
四,運行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。node
而後在10.11.150.74上運行etcd,組成cluster,兩臺機子都輸出published name後暫時沒有新的輸出就算是etcd cluster組建完成。
測試一下:
本機:
curl -L 127.0.0.1:2379/version
集羣:linux
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的containergit
下面爲咱們的calico網絡添加可用的ip pool(在72或者74一臺主機上運行便可):
./calicoctl pool add 172.1.0.0/16 --nat-outgoing
這裏因爲個人兩個主機72和74自己就在同一個子網下,主機相互之間不須要L2 switch。若是是跨子網、跨機房、跨公網就須要加上--ipip選項,或者你有權限直接修改路由器的BGP協議,將兩個不一樣子網的主機鏈接爲BGP peer。github
六,Container開始吧
在主機72上面新建兩個container:
docker run --net=none --name worker-1 -tid iperf
docker run --net=none --name worker-2 -tid iperf
在74上也新建兩個docker
docker run --net=none --name worker-3 -tid iperf
docker run --net=none --name worker-4 -tid iperf
爲container在calico中註冊一個獨立的IP:centos
./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內。app
七,測試一下吧
測試一下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.