一,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. BloomFilter 与 Cuckoo Filter

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

  2. Python 线程、进程和协程

    python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...

  3. Effective Objective-C 2.0 — 第二条:类的头文件中尽量少引入其他头文件

    第二条:类的头文件中尽量少引入其他头文件 使用向前声明(forward declaring) @class EOCEmployer 1, 将引入头文件的实际尽量延后,只在确有需要时才引入,这样就可以减 ...

  4. struts2基础篇(1)

    一.Struts2简介Struts2以WebWork优秀的设计思想为核心,吸收了Struts1的部分优点,建立了一个基于WebWork和Struts1的MVC框架. 二.搭建Struts2开发环境2. ...

  5. Java面试笔记

    1.&和&& if(str != null& !str.equals("")){ System.out.println("ok" ...

  6. [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

    我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子 ...

  7. 分布式缓存之 memcache 实现分布式缓存

    最近想搞点分布式,但是不知道整点什么,来点简单的吧. 今天讲下memcache的分布式缓存 首先下载memcache的服务器端 百度下可以找到 然后执行安装和开启(关闭服务器)命令(还有其他的命令 可 ...

  8. fedora 23如何实现 让root用户自动登录?

    没想到很简单: 只是修改一个文件的一个地方: 修改: /etc/gdm/custom.conf文件, 将自动登录 启用为true, 然后自动登录的名字设为root 即可:

  9. Linux下的一个图形管理工具webmin

    这个工具其实我在两年前的小白时期还是经常用的,因为那时候对Linux比较陌生在为数server的时候帮了我很多工作,现在周末外面下雨,闲来无事莫名其妙的想起他来. 工具优点:最大特点是他是脚本安装 不 ...

  10. iOS 字符转换

    字典或者数组转化为nsstring NSArray *arr = [NSArray arrayWithObject:@"1"]; NSString *str = [arr JSON ...