一,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. vim:用vim修改文件编码为utf-8

    命令是 :set fileencoding=utf-8如果用vim打开文件时里面有乱码,可能用上面的命令修改文件后无法保存.可以用其他软件打开文件,然后把内容拷贝到vim里再保存就行了.

  2. centos 7 DenyHosts 安装 防暴力破解ssh登陆

    为了减少软件扫描ssh登陆 还是用这个比较好点  默认端口号22 也要改 登陆密码也不要使用 弱口令 123456 这样的 Description DenyHosts is a python prog ...

  3. Effective Objective-C 2.0 — 第12条:理解消息转发机制

    11 条讲解了对象的消息传递机制 12条讲解对象在收到无法解读的消息之后会发生什么,就会启动“消息转发”(message forwarding)机制, 若对象无法响应某个选择子,则进入消息转发流程. ...

  4. safari 调用隐藏fileInput

    在safari上,用自定义按钮调用隐藏fileInput,注意点 1. event listener中,不要 return false2. 不要使用display:none,可使用 opacity:0 ...

  5. asp.net中使用单例

    摘要 有这样一个service,需要运行的asp.net站点上,但要保证这个实例是唯一的.单例用来启用聊天机器人,保证唯一,以免启动多个,造成客户端发送消息的时候,会造成每个机器人都发送消息,app收 ...

  6. 微信或移动端网页的meta

    针对微信: <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> ...

  7. Linux运维初级教程(四)shell简介

    查看系统可用的shell命令 cat /etc/shells shell是用于与内核进行交流的工具 管道和重定向(< < > > |) |为管道 标准输入的文件描述符为0,标准 ...

  8. [译]git push

    push就是把你本地仓储的commit传到远程仓储中去. 用法 git push <remote> <branch> push指定的分支到<remote>中去.   ...

  9. 安装cocopods

    http://www.tuicool.com/articles/7VvuAr3 OS 最新版 CocoaPods 的安装流程 1.移除现有Ruby默认源 $gem sources --remove h ...

  10. 在PHP中遍历数据库表中的数据

    数据库中的数据: //1.分别将每一行的每一列遍历出来 //mysql_fetch_row()函数在每一次遍历后会将指针向后自动移动一个单位 while($row=mysql_fetch_row($r ...