1、安装etcd

yum install etcd

systemctl stop etcd
systemctl start etcd
systemctl status etcd
systemctl enable etcd ##开机自启动

查看etcd是否启动成功,etcd默认端口为2379
$ lsof -i:2379

测试etcd可用性
$ etcd --version
$ etcdctl mkdir /test
$ etcdctl ls /

2、安装flannel
$ wget https://github.com/coreos/flannel/releases/download/v0.5.5/flannel-0.5.5-linux-amd64.tar.gz
$ tar xvf flannel-0.5.5-linux-amd64.tar.gz
$ cd flannel-0.5.5
$ mv flanneld /usr/bin
$ mv mk-docker-opts.sh /usr/bin

启动flannel方法一:
$ flanneld &

查看flannel是否启动
$ ps -ef|grep flannel

启动flannel方法二(推荐):添加到systemd服务中
a、创建配置/etc/flannel/flanneld.conf
$ mkdir -p /etc/flannel/
$ vim /etc/flannel/flanneld.conf

# Flanneld configuration options

# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="-etcd-endpoints=http://localhost:2379"
# etcd集群配置
FLANNEL_ETCD_ENDPOINTS="-etcd-endpoints=http://172.16.0.6:2379,http://172.16.0.7:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="-etcd-prefix=/coreos.com/network" # Any additional options that you want to pass
#FLANNEL_OPTIONS=""

创建flanneld服务文件/usr/lib/systemd/system/flanneld.service

$ vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service [Service]
Type=notify
EnvironmentFile=-/etc/flannel/flanneld.conf
ExecStart=/usr/bin/flanneld $FLANNEL_ETCD_ENDPOINTS $FLANNEL_ETCD_PREFIX $FLANNEL_OPTIONS
Restart=on-failure [Install]
WantedBy=multi-user.target
RequiredBy=docker.service

启动flanneld
$ systemctl daemon-reload
$ systemctl start flanneld
$ systemctl restart flanneld

$ systemctl enable flanneld ##开机自启动

查看启动日志:
$ systemctl status flanneld -l
发现报错了:Couldn't fetch network config: 100: Key not found

想起来etcd里还没写入网络配置信息呢;

flanneld网络配置
docker默认用172.17.0.0/16这个网段,我想换个网段,以明确知道是在使用flanneld提供的网络,于是就用了172.10.0.0/16。

$ etcdctl mk /coreos.com/network/config '{"Network":"172.10.0.0/16", "SubnetLen": 24, "SubnetMin": "172.10.1.0", "SubnetMax": "172.10.254.0", "Backend": {"Type": "vxlan"}}'
$ etcdctl get /coreos.com/network/config
{"Network":"172.10.0.0/16", "SubnetLen": 24, "SubnetMin": "172.10.1.0", "SubnetMax": "172.10.254.0", "Backend": {"Type": "vxlan"}}

因为flannel一直在尝试从etcd读配置信息,所以不需要重启flanneld,再看启动日志,flanneld已经获取到想要的子网地址了;

此时,在/run/flannel/subnet.env位置会生成这个host所分配到的子网信息:

FLANNEL_NETWORK=172.10.0.0/
FLANNEL_SUBNET=172.10.60.1/
FLANNEL_MTU=
FLANNEL_IPMASQ=false

正常情况下,执行ifconfig或ip a可以看到flannel0桥接网卡了,etcd上执行etcdctl ls /coreos.com/network/subnets也能够看到flannel申请的网段。

而这个文件正是mk-docker-opts.sh脚本的输入文件:
$ /usr/bin/mk-docker-opts.sh -c
$ cat /run/docker_opts.env
DOCKER_OPTS=" --bip=172.10.60.1/24 --ip-masq=true --mtu=1450 "

这时看一下etcd,多了一条信息:
$ etcdctl get /coreos.com/network/subnets/172.10.60.0-24
{"PublicIP":"172.16.92.255","BackendType":"vxlan","BackendData":{"VtepMAC":"1e:36:0a:72:6b:c7"}}

看一下主机网卡
$ ip a |grep flannel
2036: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
inet 172.10.60.0/16 scope global flannel.1

看一下网卡详情
$ ip -d link show dev flannel.1
2036: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/ether 1e:36:0a:72:6b:c7 brd ff:ff:ff:ff:ff:ff promiscuity 0
vxlan id 1 local 172.16.92.255 dev eth0 srcport 0 0 dstport 8472 nolearning ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

3、Docker使用flannel网络

再重新生成一次docker_opts.env:

# /usr/bin/mk-docker-opts.sh -c
# cat /run/docker_opts.env
DOCKER_OPTS=" --bip=172.10.60.1/24 --ip-masq=true --mtu=1450 "

修改vim /lib/systemd/system/docker.service:

EnvironmentFile=/run/docker_opts.env # 在ExecStart参数之前新增这句话
ExecStart=/usr/bin/dockerd $DOCKER_OPTS #在ExecStart末尾添加$DOCKER_OPTS,$DOCKER_OPTS添加网桥的参数

重启docker服务:
# systemctl daemon-reload
# systemctl restart docker

查看bridge网络的信息:
# docker network ls |grep bridge
8d4e33066eb0 bridge bridge local
db61b72ccaa7 metabase_default bridge local

# docker network inspect 8d4e33066eb0 | grep Subnet
"Subnet": "172.18.0.0/16"
这就已经是在flannel提供的网段内了;

测试
然后在另一台主机上也照做一遍,分别启动一个container,互ping一下,测试通过。

docker run -itd --name mycentos  docker.io/centos  /bin/bash

4、flannel生成的vxlan设备的删除方法

停止flanneld服务并确认
# systemctl stop flanneld
# status flanneld

使用ifconfig将设备停止
# ip addr s flannel.1
# ifconfig flannel.1 down

使用ip link del删除vxlan设备
# ip link del flannel.1
# ip addr s flannel.1

==========================================================================
温馨提示:
如上面操作后,发现各容器内分配的ip之间相互ping不通,基本就是由于防火墙问题引起的!
可是明明已经在前面部署的时候,通过"systemctl stop firewalld.service"关闭了防火墙,为什么还有防火墙问题??
这是因为linux还有底层的iptables,所以解决办法是在各节点上执行下面操作:

$ systemctl stop firewalld.service ##只关闭一次防火墙
$ systemctl disable firewalld.service ##永久关闭一次防火墙
[root@node- ~]# iptables -P INPUT ACCEPT
[root@node- ~]# iptables -P FORWARD ACCEPT
[root@node- ~]# iptables -F

执行上面操作后,基本各容器间就能相互ping通了。

docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信。

如果服务器重启,这时docker是基于flannel网络的,docker自启动会失败,此时我们可以把etcd、flannel设置自启动,然后执行如下命令进行docker重启:

/usr/bin/mk-docker-opts.sh -c
systemctl daemon-reload
systemctl restart docker

CentOS安装etcd和flannel实现Docker跨物理机通信的更多相关文章

  1. etcd和flannel实现docker跨物理机通信

    实验目标 跨物理机的容器之间能直接访问docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信 实验环境 192.168.3.50 //etcd.flann ...

  2. hadoop学习;安装jdk,workstation虚拟机v2v迁移;虚拟机之间和跨物理机之间ping网络通信;virtualbox的centos中关闭防火墙和检查服务启动

    JDK 在Ubuntu下的安装 与 环境变量的配置 前期准备工作: 找到  JDK 和 配置TXT文件  并拷贝到桌面下  不是目录 而是文件拷贝到桌面下 以下的命令部分就直接复制粘贴就能够了 1.配 ...

  3. Centos安装Git、DotNet、Docker

    1.安装Git yum install git 可通过下面的命令查看Git版本 git --version 2.安装Dotnet sudo yum install libunwind libicu 导 ...

  4. docker应用-5(使用overlay 网络进行容器间跨物理主机通信)

    同一个主机上的Docker容器之间通信 docker 引擎会在主机上增加一个docker0网卡,该网卡具有双重身份: 1.从容器视角,网桥(交换机)身份docker0 对于运行在同一个主机上的各个容器 ...

  5. 【转】centos安装memcached+php多服务器共享+session多机共享问题

    参考博文: centos安装memcached 源码安装 Yum安装Memcache Memcached内存分配优化及使用问题 <转>php+memcached 实现session共享 P ...

  6. virtual box虚拟机跨物理机迁移

    VirtualBox保存虚机数据的是vdi文件,但是直接拷贝在新的VirtualBox中不能打开,因为每个vdi文件都包含了一个uuid的数据,如果直接拷贝,uuid在新的VirtualBox中是不能 ...

  7. centos7 install k8s centos 安装 kubernetes 详细

    参考: http://blog.opskumu.com/k8s-cluster-centos7.html https://ylinux.org/note/article/1207 http://mub ...

  8. 安装docker跨主机网络flannel

    一.实验环境 机器 操作系统 安装服务 172.16.4.36 centos7 docker etcd flannel 172.16.4.37 centos7 docker etcd flanne ( ...

  9. Docker Centos安装Redis以及问题处理

    之前一篇文章 Redis安装及主从配置 介绍了redis的安装配置,另一篇文件介绍了 Docker Centos安装Openssh .今天将两篇文件结合一下——在Docker Centos环境下搭建r ...

随机推荐

  1. Ubuntu桌面版安装小记

    之前一直是用Ubuntu的桌面版装docker,桌面版本身用起来比较方便,但开销较大,如果建立多个虚拟机就比较费劲了.今天试了一下server版的Ubuntu,发现还是比较方便的,相比桌面版,有如下好 ...

  2. java基础(12):构造方法、this、super

    1. 构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方 ...

  3. Java的23种设计模式,详细讲解(一)

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  4. Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理

    Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务 ...

  5. 爬虫框架-selenium

    selenium介绍: selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟 ...

  6. SpringBoot(一):构建第一个SpringBoot工程

    1.项目格式如下: 1.启动类: package com.monkey01.springbootstart; import org.springframework.boot.SpringApplica ...

  7. Javase之集合体系(4)之Map集合

    集合体系之Map集合 ##Map<K,V>( 接口 ) 特点:将键映射到值对象,一个映射不能包含重复的键:每个键只能映射一个值 Map集合与Collection集合的区别 ​ Map集合存 ...

  8. 剑指offer 19:二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像.   输入描述:   解题思路 这一问题明显,在进行递归遍历节点时,将根节点的左右子树进行交换,因此完成树的遍历即可.   C++实现代码 /* ...

  9. Ubuntu个人使用笔记整理

    Ubuntu笔记 Ubuntu使用过程中整理的一些常用或关键操作整理,以备不时之需, 另外自己可以对界面做一些美化,这部分自行百度去配置,我的界面如图 ##################Ubuntu ...

  10. emmet的用法

    emmet 是一个提高前端开发效率的一个工具.emmet允许在html.xml.和css等文档中输入缩写,然后按tab键自动展开为完整的代码片段. 一.Sublime Text 3 安装插件Emmet ...