Docker- 7.3、跨主机网络-flannel

news2024/11/18 5:37:59
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。
 

一、准备flannel实验环境

etcd部署在host3上,host1与host2上运行flaneld
hosts3上安装配置etcd: Releases · etcd-io/etcd (github.com)
wget https://github.com/coreos/etcd/releases/download/v3.4.23/etcd-v3.4.23-linux-amd64.tar.gz
tar -xzvf etcd-v3.4.23-linux-amd64.tar.gz
cd etcd-v3.4.23-linux-amd64
cp etcd* /usr/local/bin/

该脚本从github下载etcd的可执行文件并保存到/usr/local/bin/。

启动etcd并打开2379监听端口:
ETCDCTL_API=3 etcd -name etcd1 -data-dir /var/lib/etcd --advertise-client-urls http://192.168.11.83:2379 --listen-client-urls http://192.168.11.83:2379,http://127.0.0.1:2379
  • -name:取名
  • -data-dir:定义数据路径
  • --advertise-client-urls:建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信,即服务的url
  • --listen-client-urls:监听的用于客户端通信的url,对外提供服务的地址,客户端会连接到这里和 etcd 交互,同样可以监听多个
 
重新打开一个终端,etcdctl  是一个客户端连接工具:
可以看到,etcd3.4.23的api版本使用3。
配置开放端口:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 2379 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 2380 -j ACCEPT
测试 etcd 是否可用:
 

二、安装配置flannel

2.1、flannel下载地址

https://github.com/coreos/flannel/releases
flannel/running.md at master · flannel-io/flannel · GitHub
  a、host1上执行:wget https://github.com/flannel-io/flannel/releases/download/v0.20.2/flanneld-amd64 && chmod +x flanneld-amd64
   b、cp flanneld-amd64 /usr/local/bin/flanneld
   c、host2重复上述步骤。

2.2、host3上添加flannel网络配置信息到etcd

ETCDCTL_API=3 etcdctl --endpoints http://192.168.11.83:2379 put /coreos.com/network/config '{"Network": "10.2.0.0/16", "SubnetLen": 24, "SubnetMin": "10.2.1.0","SubnetMax": "10.2.20.0", "Backend": {"Type": "vxlan"}}'
  • Network:用于指定Flannel地址池10.2.0.0/16;
  • SubnetLen:用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度,即10.2.X.0/24;
  • SubnetMin:用于指定最小能够分配的ip段;
  • SudbnetMax:用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.2.1.0/24到10.2.20.0/24,也就意味着在这个网段中,最多只能有20台宿主机;
  • Backend:用于指定数据包以什么方式转发,默认为udp模式,host-gw模式性能最好,但不能跨宿主机网络;
  • /coreos.com/network/config:是etcd数据项的key,value是{"Network": "10.2.0.0/16", "SubnetLen": 24, "SubnetMin": "10.2.1.0","SubnetMax": "10.2.20.0", "Backend": {"Type": "vxlan"}}。这个key后面会作为flanneld的一个启动参数。
  
执行ETCDCTL_API=3 etcdctl --endpoints http://192.168.11.83:2379 get /coreos.com/network/config 确保设置成功。

2.3、启动flannel

在host1与host2上执行命令:
​flanneld -etcd-endpoints=http://192.168.11.83:2379 -iface=ens33 -etcd-prefix=/coreos.com/network &
  • -etcd-endpoints;指定etcd url;
  • -iface:指定主机间数据传输使用的interface;
  • -etcd-prefix:指定etcd存放flannel网络配置信息的key。
host1上输出如下:
① ens33 被选作与外部主机通信的 interface。
② 识别 flannel 网络池 10.2.20.0/24。
③ 分配的 subnet 为 10.2.20.0/24。
flanneld 启动后,host1 内部网络会发生一些变化:
  • 一个新的 interface flannel.1 被创建,而且配置上 subnet 的第一个 IP 10.2.20.0。     
  • host1 添加了一条路由:目的地址为 flannel 网络 10.2.0.0/16 的数据包都由 flannel.1 转发。    
host2 输出类似,主要区别是 host2 的 subnet 为 10.2.12.0/24:
当前网络环境拓扑图:
 

三、在Docker中使用flannel

3.1、配置Docker连接flannel

编辑 host1 的 Docker 配置文件 /usr/lib/systemd/system/docker.service,设置 --bip 和 --mtu:
这两个参数值必须与/run/flannel/subnet.env中FLANNEL_SUBNET和FLANNEL_MTU一致:
重启docker daemon:
systemctl daemon-reload
systemctl restart docker.service
Docker会将10.2.20.1配置到Linux bridge docker0上,并添加10.2.20.0/24的路由(之前是172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown):
host2配置类似:--bip=10.2.12.1/24  --mtu=1450
当前网络环境拓扑图:
可见,flannel没有创建新的docker网络,而是直接使用默认的bridge网络。同一主机的容器通过docker0连接,跨主机流量通过flannel.1转发。

3.2、将容器连接到flannel网络

host1上运行容器bbox1:
docker run -itd --name bbox1 busybox
host2上运行容器bbox2:
docker run -itd --name bbox2 busybox
bbox1 和 bbox2的IP分别为10.2.20.2 和 10.2.12.2:
 

四、flannel网络连通性

测试bbox1与bbox2的连通性:
bbox1能ping通位于不通subnet的bbox2,通过traceroute分析一下bbox1到bbox2的路径:
    1、bbox1与bbox2不是一个subnet,数据包发送给默认网关10.2.20.1(docker0);
    2、根据host1的路由表,数据包会发往flannel.1。
    
    3、flannel.1将数据包封装成VxLAN,通过ens33发送给host2;
   4、host2收到包解封装,发现数据包目的地址为10.2.12.2,根据路由表将数据包发送给flannel.1,并通过docker0达到bbox2。
    
 
数据流向如图:
 

五、flannel网络隔离

flannel为每个主机分配了独立的subnet,但flannel.1将这些subnet连接起来了,相互之间可以路由。
本质上,flannel将各主机上相互独立的docker0容器网络组成了一个互通的大网络,实现了容器跨主机通信。
flannel没有提供隔离。
 

六、flannel与外网连通性

因为 flannel 网络利用的是默认的 bridge 网络,所以容器与外网的连通方式与 bridge 网络一样,即:
1. 容器通过 docker0 NAT 访问外网
2. 通过主机端口映射,外网可以访问容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自学Java】Java语言HelloWorld

Java语言HelloWorld详解 Java语言HelloWorld详解教程 我们使用 java 编辑器,新建一个 Helloworld.java 文件,输入如下内容: package com.haicoder;public class HelloWorld {public static void main(String[] args) {System.out.println("嗨客网…

KubeSphere两种安装方式

目录 🧡KubeSphere简介 🧡KubeSphere安装 🧡前置环境 🧡基于K8S 🧡KubeKey一键安装 💟这里是CS大白话专场,让枯燥的学习变得有趣! 💟没有对象不要怕,我们…

CSS——过渡与动画

1. 缓动效果 给过渡和动画加上缓动效果(比如具有回弹效果的过渡过程) 回弹效果是指当一个过渡达到最终值时,往回倒一点,然后再次回到最终值,如此往复一次或多次,并逐渐收敛,最终稳定在最终值。…

报表开发工具FastReport.NET的十大常见问题及解决方法

Fastreport是目前世界上主流的图表控件,具有超高性价比,以更具成本优势的价格,便能提供功能齐全的报表解决方案,连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.NET官方版下载(qun&#x…

Redis基础篇——SQL和NoSQL区别

文章目录认识 NoSQLSQL 和 NoSQL 的区别认识 NoSQL NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多…

熵及其相关概念

文章目录一、什么是熵?二、相对熵(KL散度)三、交叉熵四、条件熵,联合熵,互信息一、什么是熵? 熵,entropy,一个简简单单的字却撑起了机器学习的半壁江山,熵起源于热力学&a…

怎么做3D可视化?NebulaGraph Explorer 的图数据库可视化实践告诉你答案

前言 图数据可视化是现代 Web 可视化技术中比较常见的一种展示方式,NebulaGraph Explorer 作为基于 NebulaGraph 的可视化产品,在可视化图数据领域积累了许多经验,尤其是在图形渲染性能等领域。本文将系统性分享下 NebulaGraph Explorer 在 …

串口通信协议

同步通信和异步通信 同步通信:需要时钟信号的约束,在时钟信号的驱动下两方进行数据交换,一般会选择在上升沿或者下降沿进行数据的采样,以及时钟极性和时钟相位【eg.SPI,IIC】。 异步通信:不需要时钟信号的同步,通过(…

只根据\r、\n、\r\n三种分隔符分割字符串splitlines()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 只根据\r、\n、\r\n三种 分隔符分割字符串 splitlines()方法 选择题 对于以下python代码表述错误的一项是? s字符串1\n字符串2\r字符串3\r\n字符串4\n\r字符串5 print("【执行】s字符串…

移植FreeRTOS到STM32

移植FreeRTOS到STM32单片机上引言介绍什么是 RTOS?为什么嵌入式设备往往使用RTOS?FreeRTOS具体步骤总结引言 本文详细介绍如何移植FreeRTOS到STM32单片机上。移植操作系统是嵌入式开发的入门基础,单片机和嵌入式在物理上其实是一摸一样的&am…

二、MySQL 介绍及 MySQL 安装与配置

文章目录一、新手如何学习 MySQL二、MySQL 介绍2.1 百科定义2.2 创始人简历2.3 历史背景2.4 MySQL 的优势2.5 MySQL 版本2.6 MySQL 特性2.7 MySQL 的应用环境2.8 数据库专业术语2.9 MySQL 客户端和服务器架构(C/S架构)2.10 MySQL 内部结构三、MySQL 服务…

免费分享一个SpringBoot鲜花商城管理系统,很漂亮的

大家好,我是锋哥,看到一个不错的SpringBoot鲜花商城管理系统,分享下哈。 项目介绍 这是基于主流SpringBoot框架开发的项目,thymeleaf模版引擎,Mysql数据库,druid连接池,界面美观大方&#xff…

spring动态数据源,多数据源

Spring是如何支持多数据源的 Spring提供了一个AbstractRoutingDataSource类,用来实现对多个DataSource的按需路由,本文介绍的就是基于此方式实现的多数据源实践。 一、什么是AbstractRoutingDataSource 先看类上的注释: Abstract {link jav…

Goby安装与使用

Goby安装与使用1.Goby简介1.1.Goby介绍1.2.Goby下载2.Goby使用2.1.切换语言2.2.新建扫描2.2.1.设置扫描地址2.2.2.设置端口2.2.2.1.选中默认端口2.2.2.2.自定义端口2.2.3.漏洞2.2.3.1.通用Poc2.2.3.2.暴力破解2.2.3.3.全部漏洞2.2.3.4.自定义Poc2.2.4.开始扫描2.3.扫描情况2.3.…

【Eureka】如何实现注册,续约,剔除,服务发现

文章目录前言服务注册服务续约服务剔除(服务端去剔除过期服务)被动下线服务下线(主动下线)client发起的服务发现集群同步信息Work下载前言 Eureka是SpringCloud的具体实现之一,提供了服务注册,发现,续约,撤…

[ Linux Audio 篇 ] Type-C 转 3.5mm音频接口介绍

简介 常见的Type-C 转3.5mm 线有两种: 模拟Type-C转3.5mm音频线数字Type-C转3.5mm 音频线,也就是带DAC芯片的转换线 当使用Type-C转换3.5mm音频接口时,使用到的是这里面的SBU1、D-、D、CC四个针脚,手机会通过这四个针脚输出模拟…

信贷--------

定义 信贷:一切以实现承诺为条件的价值运动方式,如贷款、担保、承诺、赊欠等 信贷业务:本外币贷款、贴现、透支、押汇(表内信贷);票据承兑、信用证、保函、贷款承诺、信贷证明等(表外信贷&…

卷积神经网络硬件加速——INT8数据精度加速

卷积神经网络硬件加速——INT8数据精度加速 上一专题已介绍了一种通用的卷积神经网络硬件加速方法——Supertile,本文将介绍一种特殊的硬件加速方案,一种INT8数据精度下的双倍算力提升方案。 目前大部分卷积神经网络模型的数据类型都是32-bits单精度浮点…

android开发笔记002

ListView控件 <ListViewandroid:id"id/main_iv"android:layout_width"match_parent"android:layout_height"match_parent"android:layout_below"id/main_top_layout"android:padding"10dp"android:divider"null&qu…

TCP三次握手详解

三次握手是 TCP 连接的建立过程。在握手之前&#xff0c;主动打开连接的客户端结束 CLOSE 阶段&#xff0c;被动打开的服务器也结束 CLOSE 阶段&#xff0c;并进入 LISTEN 阶段。随后进入三次握手阶段&#xff1a; ① 首先客户端向服务器发送一个 SYN 包&#xff0c;并等待服务…