docker with flannel

Posted 北极熊129

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker with flannel相关的知识,希望对你有一定的参考价值。

** 原创文章,请勿转载 **

    docker的单host,多container环境下,是使用host的docker0网桥进行通信的。如果跨host, container之间要通信怎么办呢?
答案是flannel(当然也有其它方案)。
    
    本文记录下实验过程。

1. 环境

          三个VM (都是CentOS 7.3 64位)
          192.168.1.120 etcd
          192.168.1.121 flannel, docker
          192.168.1.122 flannel, docker
   
   etcd, flannel, docker都是通过yum安装。 flannel是0.7.6版本, docker是17.09.0-ce版本
  

# yum install etcd
# yum install flannel
# yum install docker-ce

 

     如果是yum install docker, 应该安装的是1.12.6。


2. 向etcd添加配置项

   先在192.168.1.120上,用etcdctl向etcd添加一个flannel的配置项,名称任意。
   网上有/flannel/network/config, 有/coreos.com/network/config, ... 都行,无所谓。我用的是/flannel/network/config

# etcdctl set /flannel/network/config \'{"Network": "10.80.0.0/16"}\' 

     这个10.80.0.0也是随便写的,10.20.0.0也行,反正随便, 习惯上一般是10.x.x.x, 或172.x.x.x 或192.x.x.x。
     /16, 掩码。
  
3. 启动flannel
   在192.168.1.121, 192.168.1.122两个vm上做同样的工作:

   启动前,要对flannel进行配置
  

# vi /etc/sysconfig/flanneld
   
# 这个指定etcd集群的地址,多个地址用逗号分开
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.120:2379"
# 这个是etcd里配置项的key的前缀, flannel是通过这个key,从etcd查询网络配置信息的
FLANNEL_ETCD_PREFIX="/flannel/network"


   启动:

 # systemctl daemon-reload
 # systemctl start flanneld

 

   启动后,两个vm的docker0的ip,不再是172.17.0.1, 而是变成10.80.x.x,
   比如, 192.168.1.121的docker0的ip, 变成10.80.55.1
          192.168.1.122的docker0的ip, 变成10.80.17.1

  

   
   10.80.55.0/24, 10.80.17.0/24, 是10.80.0.0/16的子网, 这两个子网的网段就是flannel根据etcd里的配置,自动分配的。
   如果重新实验, 就不再是55和17,而是别的数字.

   那么在192.168.1.121这台vm上, docker container分配的地址就是
   10.80.55.2, 10.80.55.3, ... 依此类推
   在192.168.1.122这个vm上, docker container的ip就是
   10.80.17.2, 10.80.17.3, ...

4. 启动docker
 
   那么现在的问题是,docker怎么就那么听话,使用你指定的子网呢? 默认docker是使用172.17.0.0段
   这个是通过dockerd的--bip参数指定的。

   就是启动docker的时候要这样

# /usr/bin/dockerd --bip="10.80.55.1/24"

   但这样是hardcode, 也就是ip是写死的,不能够啊。

   flannel在安装时,会生成几个配置文件,具体是哪几个记不住不写了,网上都有。

   经过参数化后,docker启动变成这个样子:
  

# vi /usr/lib/systemd/system/docker.service
   将    
   ExecStart=/usr/bin/dockerd
   
   改成
   ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPOTIONS
   
   就OK了。 (DOCKER_NETWOKR_OPTIONS就是配置文件里的变量, 会映射到docker.service里)

 

   启动

# systemctl daemon-reload
# systemctl start docker

 


5. 启用ip转发

    如果不启用这个,跨host的容器间是不能通信的, 即使关掉selinux, firewalld也不行。

# iptables -P FORWARD ACCEPT

 

6. 测试
   测试使用alpine,或busybox,它们都有ping命令,这里以alpine为例 
   
   192.168.1.121:

  

  192.168.1.122

  
  

   如果不启动ip转发,可以ping通10.80.17.0, 10.80.17.1, 但ping不通10.80.17.2。

   至此,实验成功!

 

7. 再补充一点

    docker run 每启动一个container, host的主机上就会多出一个vethxxxxxx设备, 它对应着容器里的eth0.

 

以上是关于docker with flannel的主要内容,如果未能解决你的问题,请参考以下文章

在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)

Docker flannel网络

部署Flannel,实现跨主机Docker容器通信

在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)

DOCKER学习_005:Flannel网络配置

Docker 配置Flannel网络过程及原理