docker之docker容器flannel模式多网段跨主机通信

一、简介
flannel是为实现多网段通信的第三方的解决方案, 是 CoreOS 开发的容器网络解决方案。flannel 为每个 host 分配一个 subnet,容器从此 subnet 中分配 IP,这些 IP 可以在 host 间路由,容器间无需 NAT 和 port mapping 就可以跨主机通信。每个 subnet 都是从一个更大的 IP 池中划分的,flannel 会在每个主机上运行一个叫 flanneld 的 agent,其职责就是从池子中分配 subnet。为了在各个主机间共享信息,flannel 用 etcd(与 consul 类似的 key-value 分布式数据库)存放网络配置、已分配的 subnet、host 的 IP 等信息。数据包如何在主机间转发是由 backend 实现的。flannel 提供了多种 backend,最常用的有 vxlan 和 host-gw。其他 backend 请参考 https://github.com/coreos/flannel。 flannel支持多种的backend:目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式,默认使用的是udp的方式。
二、准备工作
三台VM虚拟机
一台用于etcd的部署
另两台用于flannel的部署
系统环境:centOS7.2
docker版本:docker-ce 19.3.5
etcd版本:etcd-3.3.11-2.el7.centos.x86_64
flannel版本:flannel-0.7.1-4.el7.x86_64
三、安装与配置及故障处理
1、部署etcd服务

1.1 安装
[[email protected] ~]# yum install -y etcd #安装etcd

1.2 修改etcd.conf文件
[[email protected] ~]# cd /etc/etcd/
[[email protected] etcd]# cp -p etcd.conf etcd.conf.bak #备份配置文件,回退使用。
[[email protected] etcd]# vim etcd.conf
将以下几项:
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
修改为:
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://172.16.41.251:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.41.251:2379"
[[email protected] ~]# grep ^[A-Z] /etc/etcd/etcd.conf #查看文件内容

--name :方便理解的节点名称,默认为 default ,在集群中应该保持唯一,可以使用 hostname。
--data-dir :服务运行数据保存的路径,默认为 ${name}.etcd。
--listen-client-urls :对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互。
--advertise-client-urls :对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点。

1.3 新建etcd.sh文件并添加相应内容
在根目录创建etcd.sh文件
[[email protected] ~# vim etcd.sh
在etcd.sh文件中添加以下内容:

{"Network":"10.2.0.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"}}

Network:定义host主机的IP地址池为10.2.0.0/16,注:由于etcd并不是动态保存host上flannel网络的,比如:当有节点被删除后,etcd中的关于这个节点的subnet网络并不会被删除,所以使用10.X.X.X的网络,保证有足够的网络可用
SubnetLen:指定每个主机分配的subnet大小为24位,即10.2.x.0/24
Backend为vxlan,即主机之间通过vxlan通信,backend分为vxlan和host-gw这两种方式

1.4 新建network/config文件及添加内容
[[email protected] ~]# cd /usr/local/bin/
[[email protected] bin]# mkdir network
[[email protected] network]# etcdctl --endpoints=http://172.16.41.251:2379 set /usr/local/bin/network/config </root/etcd.sh #将etcd.sh的文件内容输入config中
[[email protected] network]# etcdctl --endpoints=http://172.16.41.251:2379 get /usr/local/bin/network/config

--endpoints=http://192.168.7.222:2379 指定etcd的url
/usr/local/bin/network/config 保存key的地方,flanneld会读取这个配置,保证自己能获取到subnet,这个key可以任意指定,当host主机分配到subnet后,key会修改docker的启动参数
[[email protected] network]# systemctl restart etcd #重启etcd服务

etcd服务配置完成!!!!!

2、flannel安装与配置
[[email protected] ~]# yum install -y flannel #安装flannel
[[email protected] ~]# cd /etc/sysconfig/
[[email protected] sysconfig]# cp -p flanneld flanneld.bak #备份flanneld文件
[[email protected] sysconfig]# vim flanneld
修改以下内容:
FLANNEL_ETCD_ENDPOINTS="http://172.16.41.251:2379" #连接etcd的地址
FLANNEL_ETCD_PREFIX="/usr/local/bin/network" #etcd的key的地址

[root[email protected] sysconfig]# systemctl start flanneld
[[email protected] etc]# ifconfig flannel.1 #查看flannel.1网络
在两台flannel主机上都安装启动完flannel,就可以看见每个主机上起了一个flannel.1的网络


两台flannel主机都会出现一个flannel.1的路由,路由都是10.2.0.0的
[[email protected] etc]# route

[[email protected] system]# mkdir docker.service.d
[[email protected] system]# cd docker.service.d/
[[email protected] docker.service.d]# vim 10-machine.conf
添加以下内容:
Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pe --tlskey /etc/docker/server-key.pem --label provider=generic --bip=10.2.31.1/24 --mtu=1450
Environment=
注:--bip为flannel.1的分配段地址

这个参数要与/run/flannel/subnet.env中保持一致
[[email protected] sysconfig]# cat /run/flannel/subnet.env

修改/usr/lib/systemd/system/docker.service文件,添加以下内容:
在ExecStart=/usr/bin/dockerd后添加$DOCKER_NETWORK_OPTIONS

EnvironmentFile=/run/flannel/docker

如果不添加这两条会出现,docker启动后查看下启动的docker0不是被flannel托管了

注:另一台同样的操作。
重启docker
[[email protected] sysconfig]# systemctl daemon-reload
[[email protected] sysconfig]# systemctl restart docker
[[email protected] etc]# ifconfig

[[email protected] docker.service.d]# docker run -dit --name b1 busybox
[[email protected] docker.service.d]# docker exec b1 ifconfig

[[email protected] sysconfig]# docker run -dit --name b2 busybox
[[email protected] sysconfig]# docker exec b2 ifconfig

ping测试

[[email protected] docker.service.d]# docker exec b1 ping -c 2 10.2.67.2

[[email protected] sysconfig]# docker exec b2 ping -c 2 10.2.31.2

第三方flannel实现docker多网段通信测试成功!!!

原文地址:https://blog.51cto.com/3001441/2467337

时间: 2024-10-12 19:14:31

docker之docker容器flannel模式多网段跨主机通信的相关文章

docker之docker容器flannel模式多网段跨主机通信所遇问题集

问题一:docker无法启动错误提示:[[email protected] docker.service.d]# systemctl status docker.service ● docker.service - Docker Application Container EngineLoaded: error (Reason: Invalid argument)Drop-In: /usr/lib/systemd/system/docker.service.d└─flannel.confActi

Docker:macvlan实现容器跨主机通信 [十四]

一.什么是macvlan 1.macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址, 2.即多个 interface,每个 interface 可以配置自己的 IP. 3.macvlan 本质上是一种网卡虚拟化技术 二.跨主机通信 1.创建macvlan 1.主机luoahong [[email protected] ~]# docker network create --driver macvlan --subnet 10.0.0.0/2

Docker容器跨主机通信之:直接路由方式

概述 就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要.再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题.本文就来尝试一下. 方案原理分析 由于使用容器的IP进行路由,就

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ping bbox1: 可见 overlay 网络中的容器可以直接通信,同时 docker 也实现了 DNS 服务. 下面我们讨论一下 overlay 网络的具体实现: docker 会为每个 overlay 网络创建一个独立的 network namespace,其中会有一个 linux brid

docker之跨主机通信

本地workstations虚拟机server1和server2环境为centOS7.7,安装软件为docker-ce,docker版本为19.03.05docker安装就不介绍了,直接进主题.一.准备工作跨主机需要两个独立的网卡:server1和server2添加网卡 [[email protected] ~]# ip addr show 查看网卡是否添加成功 添加成功. macvlan本身是linxu kernel的模块,本质上是一种网卡虚拟化技术.其功能是允许在同一个物理网卡上虚拟出多个网

Docker跨主机通信网络

Docker跨主机通信网络 跨主机网络方案包括: docker原生的 overlay 和 macvlan.第三方方案:常用的包括flannel.weave 和 calico. (1)准备 Overlay 网络实验环境 [[email protected] ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap [[email protected] ~]# netstat -

Docker跨主机通信:桥接方式和路由方式

1.直接路由 通过在主机中添加静态路由来实现跨主机通信.如果有两台主机host1和host2,两主机上的docker容器是两个独立的二层网络,将con1发往con2的数据流先转发到主机host2上,再由host2转发到其上的docker容器中,反之亦然. 由于使用容器的IP进行路由,就需要避免不同主机上的docker容器使用相同冲突的IP,所有应该为不同的主机分配不同的IP子网. #主机A上:192.168.187.143,主机B:192.168.187.144 #S1:添加网卡docker0,

Docker容器跨主机通信之:OVS+GRE

一.概述 由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案 OVS OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使用. OpenVSwich OpenVSwich是一种开源软件,通过软件的方式实现二层交换机功能,专门管理多租赁云计算网络环境,提供虚拟网络中的访问策略.网络隔离.流量监控等. 既然是虚拟交换机,自然与传统的物理交换机有着相同的特性,操作中可以按照理解物理交换机的方式去操作,有助于对虚拟交换机的认识

Docker跨主机通信之路由

一.实验环境: 主机名 主机IP Docker0_IP Docker1 192.168.88.130 172.17.0.1 Docker2 192.168.88.131 172.18.0.1 二.实验操作 设定指定的dokcer0的IP #vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/docker daemon --bip=172.18.42.1/16 -H fd:// -H=unix:///var/run/docke