一,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=
export port2=
export port3= 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:/version

集群:

curl -L 10.11.150.74:/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/ --nat-outgoing

这里由于我的两个主机72和74本身就在同一个子网下,主机相互之间不需要L2 switch。如果是跨子网、跨机房、跨公网就需要加上--ipip选项,或者你有权限直接修改路由器的BGP协议,将两个不同子网的主机连接为BGP peer。

 

六,Container开始吧

在主机72上面新建两个container:
docker run --net=none --name worker- -tid iperf
docker run --net=none --name worker- -tid iperf

在74上也新建两个

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

为container在calico中注册一个独立的IP:

./calicoctl container add worker- 172.1.0.1
./calicoctl container add worker- 172.1.0.2
./calicoctl container add worker- 172.1.0.3
./calicoctl container add worker- 172.1.0.4

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

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

为container添加策略:

./calicoctl container worker- profile append PROF_1
./calicoctl container worker- profile append PROF_1
./calicoctl container worker- profile append PROF_1
./calicoctl container worker- 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.

Calico在Docker中的搭建的更多相关文章

  1. Calico在Kubernetes中的搭建

    一,需求 Kubernetes官方推荐的是Flannel,但是Flannel是一个overlay的网络,对性能会有一定的影响.Calico恰好能解决一下overlay网络的不足. Calico在Kub ...

  2. Docker中自动化搭建Hadoop2.6完全分布式集群

    这一节将在<Dockerfile完成Hadoop2.6的伪分布式搭建>的基础上搭建一个完全分布式的Hadoop集群. 1. 搭建集群中需要用到的文件 [root@centos-docker ...

  3. docker 中搭建tomcat

    关于docker中tomcat的搭建,没有什么多说的,直接下载官方镜像 docker pull tomcat  (可能会下载到好几个镜像,就是tag不同,有知道为什么的可以告诉我) 然后我看的  ht ...

  4. docker中搭建jenkins环境

    想在docker中搭建一个jenkins环境.开始的时候我想在先pull centos,然后在里面自己搭建环境,搭建后的环境可以运行,但是不知道挂载哪的数据,这也是我不熟悉jenkins的原因. 同事 ...

  5. Docker - Docker中搭建MySQL主从

    1.pull完centos7纯净版的镜像后,创建容器,然后将宿主机上下载的MySQL文件 (MySQL下载地址:http://mysql.mirror.kangaroot.net/Downloads/ ...

  6. docker中使用源码方式搭建SRS流媒体服务

    一.背景 搭建流媒体服务的方式一般会采用nginx+rtmp和srs服务两种,前者是nginx加上插件所用,而后者是专门为了为了流媒体而生,在这一节中我们将从头搭建srs流媒体服务 二. 运行环境 为 ...

  7. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

  8. 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践

    [点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...

  9. 在docker 中配置hadoop1.2.1 cluser

    最近一直在找工作,比较空闲,就没事研究一下hadoop,网上的视频及书,讲的差不多都是1.2.1这个版本,然后就试着在docker中搭建了一个hadoop集群, 项目已经放到了github上面了,供新 ...

随机推荐

  1. 服务器后台TCP连接存活问题

    0. 背景 公司的服务器后台部署在某一个地方,接入的是用户的APP,而该地方的网络信号较差,导致了服务器后台在运行一段时间后用户无法接入,那边的同事反馈使用netstat查看系统,存在较多的TCP连接 ...

  2. BloomFilter 与 Cuckoo Filter

    BloomFilter 与 CuckooFilter Bloom Filter 原理 Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个相互独立的H ...

  3. Java并发编程核心方法与框架-CyclicBarrier的使用

    CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程数达到了Cyc ...

  4. 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库

      最近在编写的一个Apache  kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a    静态库编译的,,,而我们这 ...

  5. 今天依然是 JQ点击事件之“点击淡入淡出事件”

    废话不多说,先贴代码,再解释 <script> $(document).ready(function(){ $("button").click(function(){ ...

  6. org.apache.commons.lang.StringUtils中常用的方法

    org.apache.commons.lang.StringUtils中常用的方法,这里主要列举String中没有,且比较有用的方法: 1. 检查字符串是否为空: static boolean isB ...

  7. hdu3729 I'm Telling the Truth (二分图的最大匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS (Java/ ...

  8. Gulp实现web服务器

    Gulp实现web服务器 阅读目录 一:gulp实现web服务器配置: 二:添加实时刷新(livereload)支持 回到顶部 一:gulp实现web服务器配置: 对于前端开发而言,需要在本地搭建一个 ...

  9. 国内SEO如何过滤掉不良网络信息

    对于站长们来说,首要任务就是和搜索引擎战斗,面对搜索引擎算法的不断更新,站长们也更加头疼.站长们都觉得,搜索引擎才是网站优化的"统治者",和谷歌优化相比,中国的SEO优化要复杂的多 ...

  10. [译]Mongoose指南 - Connection

    使用mongoose.connect()方法创建连接 mongoose.conect('mongodb://localhost/myapp'); 上面的代码是通过默认端口27017链接到mongodb ...