etcd & flannel 实现跨主机容器通信
准备工作
- 测试环境:vagrant + centos7.2 虚拟机
- 主机说明:
- ip:
192.168.12.101hostname:node1安装软件:etcd, flannel, docker - ip:
192.168.12.102hostname:node2安装软件:flannel, docker
- ip:
启动虚拟机
vagrant配置文件:
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
(1..2).each do |i|
config.vm.define "node#{i}" do |s|
s.vm.box = "bento/centos-7.2"
s.vm.hostname = "node#{i}"
n = 100 + i
s.vm.network "private_network", ip: "192.168.12.#{n}"
s.ssh.username = "vagrant"
s.ssh.password = "vagrant"
s.ssh.insert_key = false
s.vm.provider "virtualbox" do |v|
v.name = "node#{i}"
v.cpus = 1
v.memory = 1024
end
end
end
end在该配置文件的目录下执行vagrant up启动两台测试用虚拟机
通用配置
以下操作在 node1 和 node2 上都需要配置
关闭,禁用防火墙:
sudo systemctl stop firewalld sudo systemctl disable firewalld安装需要软件:
sudo yum install -y epel-release docker flannel
node1 配置
安装etcd:
sudo yum install -y etcd修改etcd的配置文件
/etc/etcd/etcd.conf为如下内容,修改前可以先备份原来的配置文件:ETCD_NAME=master ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.12.101:2379,http://192.168.12.101:4001"启动etcd,并设置开机自启动:
sudo systemctl start etcd sudo systemctl enable etcd测试etcd状态:
etcdctl -C http://192.168.12.101:2379 cluster-health etcdctl -C http://192.168.12.101:4001 cluster-health安装flannel:
sudo yum -y install flannel修改flannel的配置文件
/etc/sysconfig/flanneld为如下内容,修改前可以先备份原来的配置文件:FLANNEL_ETCD="http://192.168.12.101:2379" FLANNEL_ETCD_KEY="/atomic.io/network" FLANNEL_OPTIONS="--iface=enp0s8"注意,配置文件里的
--iface=enp0s8配置的是网卡,可以用ip addr命令查看,如果不配置网卡,可能会给不同主机的容器分配相同的ip地址在etcd中设置flannel的key,用来保证多个flannel实例间的配置一致性:
etcdctl mk /atomic.io/network/config '{"Network": "192.168.0.0/16"}'设置的key要和flannel配置的相同。
Network后的ip地址可以任意设定网段,容器ip会根据该网段自动分配。启动flannel,重启docker,使flannel分配的ip生效:
sudo systemctl start flannel sudo systemctl enable flannel sudo systemctl restart docker
node2 配置
修改flannel的配置文件
/etc/sysconfig/flanneld为如下内容,修改前可以先备份原来的配置文件:FLANNEL_ETCD="http://192.168.12.101:2379" FLANNEL_ETCD_KEY="/atomic.io/network" FLANNEL_OPTIONS="--iface=enp0s8"注意,配置文件里的
--iface=enp0s8配置的是网卡,可以用ip addr命令查看,如果不配置网卡,可能会给不同主机的容器分配相同的ip地址启动flannel,重启docker,使flannel分配的ip生效:
sudo systemctl start flannel sudo systemctl enable flannel sudo systemctl restart docker
启动容器进行测试
在node1和node2中分别运行一个容器:
sudo docker run -it ubuntu:14.04在两个容器中互相ping对方ip,如果配置成功,则应该能ping通。否则请检查配置是否有错误,尤其是flannel配置网卡。

