一,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. 网络框架 & 云端

    Scut 傲瑞组件开发手册(02) -- 轻量级的通信引擎 StriveEngine http://blog.oraycn.com/StriveEngine.aspx

  2. sqlserver下载

    https://msdn.microsoft.com/zh-cn/sqlserver/default.aspx

  3. DIOCP 运作核心探密

    来自网友天地弦的DIOCP早已经广为人知了,有很多的同学都用上了它,甚至各种变异.修改版本也出了不少.我最近也在学习DIOCP,打算将它用于自己的服务端,今天让我们来一起探密它(DIOCP)的运作核心 ...

  4. Java多线程编程核心技术--定时器

    Timer类主要负责计划任务,也就是在指定的时间开始执行某一个任务. 方法schedule(TimerTask task, Date time) public class Task { private ...

  5. maven 错误解决办法集

    一.mavenFailed to execute goal org.apache.maven.plugins:maven-surefire-plugin解决方法 1.测试代码没有获得通过,可以尝重命名 ...

  6. org.hibernate.QueryException: could not resolve property

    org.hibernate.QueryException: could not resolve property HibernateSQLXML  org.hibernate.QueryExcepti ...

  7. 新浪微博客户端(36)-自定义带placeholder的TextView

    iOS 上自带的UITextView竟然不能设置placeholder,但是UITextView却可以,我也真是醉了.没办法了,自己写一个 DJTextView.h #import <UIKit ...

  8. bootstrapValidator.js 做表单验证

    有这样的一个场景,我们在提交form表单的时候 可能要做一些验证,比如判断是不是为空,电话的格式验证,邮箱的格式验证等等,手写起来也是可以得. 但是今天我介绍一个bootstrap插件简化开发.就是b ...

  9. 如何在html结构标签中使用js 变量 生成可变化的 title标题?

    如果form的action不写, 或 action="", 那么就表示 将数据发送到 本文件 当前文件自身... 1. 在jquery的选择器中, $()括号中的内容是一个 exp ...

  10. thinkphp-3

    有两种创建项目的方式: 一是用多个单入口文件, 一个入口文件对应着一个项目, 如前台/后台/会员中心等 二是用一个单入口, 创建项目分组 对于有多个入口文件的 情况, 配置文件的共享问题? 不管是前台 ...