Docker 容器跨主机通信 - Flannel

image-20220909094036787

Author:rab


目录

    • 前言
    • 一、架构及环境
    • 二、服务部署
      • 2.1 Etcd 部署
      • 2.2 Flannel 部署
      • 2.3 Docker 网络配置
    • 三、容器通信验证及路由分析
      • 3.1 通信验证
      • 3.2 路由转发分析
      • 3.3 数据分发分析
    • 总结


前言

今天是中秋佳节,首先在此祝大家“中秋快乐,阖家团圆”。

今天我们要讲的一个内容就是 Docker 容器跨主机的通信方案,我们都知道,在 Docker Swarm、K8s 领域中均涉及到了容器间的通信问题。而 Docker 容器跨主机通信本身就有很多方式,其中就包括了其原生网络 Overlay 和 MacVlan 方案及第三方网络方案,如 Flannel、Calico 和 Weave 等网络通信方案,今天我们就来看看 Flannel 是到底是如何实现通信的(重点是掌握原理)。

一、架构及环境

1、容器通信架构

Etcd-Flannel-Docker

2、实验环境

Hostserverversion备注
192.168.56.120Docker、Flannel23.0.6、0.22.3Docker 服务、Flannel 网络
192.168.56.121Docker、Flannel23.0.6、0.22.3Docker 服务、Flannel 网络
192.168.56.122Etcd3.4.27Etcd 服务

这里为了快速实验,我们的 Etcd 采用单节点的方式部署。

二、服务部署

2.1 Etcd 部署

二进制包下载地址:https://github.com/coreos/etcd/releases

除了二进制方式安装外,还可通过 Docker 方式安装

1、二进制部署

# 复制至shell终端并执行
ETCD_VER=v3.4.27
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz# 配置环境变量
cp /tmp/etcd-download-test/etcd* /usr/bin/# 版本验证
etcd --version
etcdctl version

image-20230920160207562

2、编写配置文件

mkdir /data/etcd/data && mkdir /etc/etcd && vim /etc/etcd/etcd.conf
#[member]
ETCD_NAME="etcd"
ETCD_DATA_DIR="/data/etcd/data"
ETCD_LISTEN_CLIENT_URLS="http://192.168.56.122:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.122:2379,http://127.0.0.1:2379"

参数说明:

# ETCD_NAME 节点名称
# ETCD_DATA_DIR 数据目录
# ETCD_LISTEN_CLIENT_URLS 客户端访问监听地址
# ETCD_ADVERTISE_CLIENT_URLS 客户端通告地址
# ETCD_ENABLE_V2
# 在 ETCD v3.4 版本中 ETCDCTL_API=3 和 --enable-v2=false 成为了默认配置
# 如要使用 ETCD v2 版本, 需要 ETCD_ENABLE_V2=true,否则会报错“404 page not found”

3、配置 systemd 管理

vim /lib/systemd/system/etcd.service
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service[Service]
Type=notify
ExecStart=/usr/bin/etcd
EnvironmentFile=/etc/etcd/etcd.conf
Restart=on-failure
RestartSec=10
LimitNOFILE=65536[Install]
WantedBy=multi-user.target

启动并设置开机自启动

systemctl start etcd.service
systemctl enable etcd.service
systemctl status etcd.service

image-20230920162318703

可正常数据读写!

4、Etcd 添加网段

vim /data/etcd/flannel-config.json
----------------------------------------------
{
"Network": "10.2.0.0/16",
"SubnetLen": 24,
"SubnetMin": "10.2.1.0",
"SubnetMax": "10.2.254.0",
"Backend":{"Type": "vxlan"}
}
----------------------------------------------
# 参数说明:
# Network(字符串):CIDR格式的IPv4网络,用于整个flannel网络。(这是唯一的强制密钥。)
# SubnetLen(整数):分配给每个主机的子网大小,除非Network小于24,否则默认为24(即/24)。
# SubnetMin(字符串):子网分配应从哪个IP范围开始,默认为第一个子网Network。
# SubnetMax(字符串):子网分配应结束的IP范围的结尾,默认为最后一个子网Network。
# Backend(后端):要使用的后端类型和该后端的特定配置。
etcdctl --endpoints http://192.168.56.122:2379 put /docker/network/config < /data/etcd/flannel-config.json# 如果你在Etcd本地,可以不指定endpoints(远程则需指定,与连接MySQL、Redis一个道理)
etcdctl put /docker/network/config < /data/etcd/flannel-config.json

5、数据验证

etcdctl get /docker/network/config

image-20230921103528805

Etcd 部署完成,第4、5步也验证了读写没问题!

2.2 Flannel 部署

分别在 20、21 上分别进行以下 5 步来部署

1、部署

# 下载二进制包,解压并配置环境变量
tar xzf flannel-v0.22.3-linux-amd64.tar.gz# 配置环境变量
cp flanneld mk-docker-opts.sh /usr/bin/

2、配置 systemd 管理

mk-docker-opts.sh:运行后会将 flannel 获取的网络参数写入 /run/flannel/subnet.env 文件

vim /lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld
Documentation=https://github.com/coreos/flannel
After=network.target
Before=docker.service[Service]
User=root
ExecStartPost=/usr/bin/mk-docker-opts.sh
ExecStart=/usr/bin/flanneld \
-etcd-endpoints=http://192.168.56.122:2379 \
-iface=ens33 \
-ip-masq=true \
-etcd-prefix=/docker/network
Restart=on-failure
Type=notify
LimitNOFILE=65536[Install]
WantedBy=multi-user.target

3、启动 flannel

必须先提前保证 etcd 启动正常,才能使 flannel 获取正确地址段,docker 容器才能从 flannel 获取唯一地址。

systemctl daemon-reload
systemctl start flanneld.service
systemctl enable flanneld.service
systemctl status flanneld.service

2.3 Docker 网络配置

120服务器的 Docker 启动参数添加:--bip=10.2.23.1/24 --mtu=1450

121服务器的 Docker 启动参数添加:--bip=10.2.79.1/24 --mtu=1450

注意启动顺序,Etcd => flannel => Docker

注意的是,要先启动 flannel,这样的话才能根据 flannel 分配到的 IP 来修改 Docker 的启动参数。

1、修改 docker 启动参数

vim /lib/systemd/system/docker.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.2.23.1/24 --mtu=1450
...
...

2、启动 Docker

systemctl daemon-reload
systemctl start docker.service
systemctl enable docker.service
systemctl status docker.service

3、此时看看服务器就多了一个 flannel 的虚拟网卡

其 IP 正是我们 flannel 配置文件中指定的 IP 段,此时 docker0 的 IP 也发生了变化,因为上面我们修改了 docker 服务的启动参数。

image-20230921104106895

三、容器通信验证及路由分析

3.1 通信验证

1、120 服务器运行测试容器

docker run -it --rm --name test120 busybox

image-20230921110641057

2、121 服务器运行测试容器

docker run -it --rm --name test121 busybox

image-20230921110710154

3、互 Ping 连通性验证

# 120 Ping 121
ping 10.2.79.2
PING 10.2.79.2 (10.2.79.2): 56 data bytes
64 bytes from 10.2.79.2: seq=0 ttl=62 time=1.021 ms
64 bytes from 10.2.79.2: seq=1 ttl=62 time=1.897 ms
64 bytes from 10.2.79.2: seq=2 ttl=62 time=2.176 ms
64 bytes from 10.2.79.2: seq=3 ttl=62 time=1.082 ms# 121 Ping 120
ping 10.2.23.3
PING 10.2.23.3 (10.2.23.3): 56 data bytes
64 bytes from 10.2.23.3: seq=0 ttl=62 time=2.494 ms
64 bytes from 10.2.23.3: seq=1 ttl=62 time=1.734 ms
64 bytes from 10.2.23.3: seq=2 ttl=62 time=2.074 ms
64 bytes from 10.2.23.3: seq=3 ttl=62 time=1.913 ms

当然也能正常访问外网(如百度、京东等)!

3.2 路由转发分析

我们以 120 上的路由规则来讲解。

image-20230921115939498

  1. default via 192.168.56.2 dev ens33 proto static metric 100

    默认路由,将所有不在本地子网范围内的数据包发送到网关 192.168.56.2,通过 ens33 网卡进行传输,路由优先级为 100。

  2. 10.2.23.0/24 dev docker0 proto kernel scope link src 10.2.23.1

    将目标网段 10.2.23.0/24 的数据包通过 docker0 网卡传输,源IP地址为10.2.23.1

  3. 10.2.79.0/24 via 10.2.79.0 dev flannel.1 onlink

    将目标网段 10.2.79.0/24 的数据包通过 flannel.1 网卡传输,网关为 10.2.79.0onlink 表示网关是直接可达的,也就是在同一子网内。

  4. 192.168.56.0/24 dev ens33 proto kernel scope link src 192.168.56.120 metric 100

    将目标网段 192.168.56.0/24 的数据包通过 ens33 网卡传输,源IP地址为 192.168.56.120,路由优先级为100。

字段解释:

  • proto:表示路由协议;
  • dev:表示出接口;
  • src:表示源IP地址;
  • metric:表示路由优先级(值越小优先级越高);
  • onlink:表示网关直接可达;
  • scope link:表示本地链路,即在同一子网内。

3.3 数据分发分析

  1. 容器直接使用目标容器的 ip 访问,默认通过容器内部的eth0发送出去。
  2. 报文通过 veth pair 被发送到 vethXXX。
  3. vethXXX 直接连接到虚拟交换机 docker0 的,报文通过虚拟 bridge docker0 发送出去。
  4. 查找路由表,外部容器 ip 的报文都会转发到 flannel0 虚拟网卡,这是一个 P2P 的虚拟网卡,然后报文就被转发到监听在另一端的 flanneld。
  5. flanneld 通过 etcd 维护了各个节点之间的路由表,把原来的报文 UDP 封装一层,通过配置的 iface 发送出去。
  6. 报文通过主机之间的网络找到目标主机。
  7. 报文继续往上,到传输层,交给监听在 8285 端口的 flanneld 程序处理。
  8. 数据被解包,然后发送给 flannel0 虚拟网卡。
  9. 查找路由表,发现对应容器的报文要交给 docker0。
  10. docker0 找到连到自己的容器,把报文发送过去。

总结

过程其实很简单,重点是掌握理论,如路由转发、数据分发的过程,Flannel 依赖三层 IP 转发,但不会对数据包进行封装,属于 underlay 网络。还有就是实验过程中注意 Docker、Flannel 的启动顺序。

—END

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDMA技术(解决主从数据库数据不一致问题)

优质博文&#xff1a;IT-BLOG-CN 一、简介 RDMA(remote direct memory access)即远端直接内存访问&#xff0c;是一种高性能网络通信技术&#xff0c;具有高带宽、低延迟、无CPU消耗等优点。 主要解决网络传输中服务器端数据处理的延迟问题。 Remote&#xff1a;数据通过网络…

机器人过程自动化(RPA)入门 3. 顺序、流程图和控制流程

到目前为止&#xff0c;我们已经了解了RPA是什么&#xff0c;并且我们已经看到了通过记录任务的活动并运行它来训练UiPath机器人是多么简单。使用记录器的UiPath可以很容易地自动化日常任务。在我们开始自动化复杂的任务之前&#xff0c;让我们学习如何控制从一个到另一个的活动…

传统遗产与技术相遇,古彝文的数字化与保护

古彝文是中国彝族的传统文字&#xff0c;具有悠久的历史和文化价值。然而&#xff0c;由于古彝文的形状复杂且没有标准化的字符集&#xff0c;对其进行文字识别一直是一项具有挑战性的任务。本文介绍了古彝文合合信息的文字识别技术&#xff0c;旨在提高古彝文的自动识别准确性…

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测

分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测 目录 分类预测 | MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结合支持向量机分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现WOA-FS-SVM鲸鱼算法同步优化特征选择结…

Pikachu靶场——XXE 漏洞

文章目录 1. XXE1.1 查看系统文件内容1.2 查看PHP源代码1.3 查看开放端口1.4 探测内网主机 1. XXE 漏洞描述 XXE&#xff08;XML External Entity&#xff09;攻击是一种利用XML解析器漏洞的攻击。在这种攻击中&#xff0c;攻击者通过在XML文件中插入恶意实体来触发解析器加载…

直播软件开发技巧:7个实时视频传输和弹幕功能的关键步骤

近年来&#xff0c;随着直播行业的快速崛起&#xff0c;直播软件的开发变得越来越重要。直播软件的成功不仅依赖于稳定的实时视频传输&#xff0c;还需要强大的弹幕功能来提升用户体验。作为直播软件开发领域的专家&#xff0c;我将与您分享七个关键步骤&#xff0c;帮助您掌握…

用友移动管理系统任意文件上传漏洞

一、漏洞描述 用友移动管理系统 uploadApk.do 文件存在任意文件上传 二、fofa查询 body"../js/jslib/jquery.blockUI.js" 三、漏洞利用 poc POST /maportal/appmanager/uploadApk.dopk_obj HTTP/1.1 Host: ip:port Cache-Control: max-age0 Upgrade-Insecure-Req…

Android 使用kotlin+注解+反射+泛型实现MVP架构

一&#xff0c;MVP模式的定义 ①Model&#xff1a;用于存储数据。它负责处理领域逻辑以及与数据库或网络层的通信。 ②View&#xff1a;UI层&#xff0c;提供数据可视化界面&#xff0c;并跟踪用户的操作&#xff0c;以便通知presenter。 ③Presenter&#xff1a;从Model层获…

HTML - input type=file 允许用户选择多个文件

效果 示例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><!-- When the multiple Boolean attribute is specified, the file input allows the user to select more than o…

No150.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【项目】在线音乐播放器测试报告

目录 项目背景 项目功能 测试计划 功能测试 登录页面的测试 测试用例 测试结果 注册页面的测试 测试用例 测试结果 音乐列表页面的测试 测试用例 测试结果 出现的bug 搜索功能的bug 问题解决 删除功能的bug 问题解决 喜欢列表页面的测试 测试用例 测试结果…

电脑开机慢问题的简单处理

电脑用久了&#xff0c;开机时间要10-20分钟特别慢&#xff0c;一下介绍两种简单有效处理方式&#xff0c;这两种方式经测试不会影响原系统软件的使用&#xff1a; 方式一&#xff1a;禁用非必要启动项【效果不是很明显】 利用360里面的优化加速禁用启动项【禁用启动项还有其…

大数据分布式处理框架Hadoop

大数据是什么 大数据容量常以TB、PB、甚至EB为单位&#xff0c;远超传统数据库的承载能力&#xff0c;无论入库还是查询都出现性能瓶颈。 Hadoop是什么 Hadoop是开源的分布式计算技术框架&#xff0c;用于处理大规模数据和实现分布式存储。 Hadoop核心组件 HDFS&#xff08;…

【5G PHY】物理层逻辑和物理天线的映射

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

估计、偏差和方差

一、介绍 统计领域为我们提供了很多工具来实现机器学习目标&#xff0c;不仅可以解决训练集上的任务&#xff0c;还可以泛化。基本的概念&#xff0c;例如参数估计、偏差和方差&#xff0c;对于正式地刻画泛化、欠拟合和过拟合都非常有帮助。 二、参数估计 参数估计 是统计学…

公司新产品上线如何打出知名度?

任何一个新产品上线时都需要进行推广打出知名度&#xff0c;软文作为一种成本低效果留存时间长的营销方式能够让公司的新产品打出知名度&#xff0c;向潜在用户展示新产品的独特优势以及特性&#xff0c;下面就让媒介盒子告诉大家&#xff0c;新产品上线时&#xff0c;公司应该…

电脑技巧:笔记本电脑升级固态硬盘的注意事项,看完你就懂了

目录 1、接口类型 2、接口速率 3、固态硬盘的尺寸 4、发热情况 5、总结 如今的固态硬盘价格越来越便宜了&#xff0c;甚至某品牌4TB的PCIe4.0 M.2还爆出过不到900元的“报恩价”&#xff0c;让不少小伙伴都动了扩容甚至囤货的心思。但对于笔记本电脑用户来说&#xff0c;升…

小波变换学习笔记【1】

【声明】本博客为学习B站视频小波分解与重构所做笔记&#xff0c;供自己和大家查阅学习&#xff0c;想查看 up 原视频请移步 B 站&#xff0c;侵删。 1.1 小波变换的由来 傅里叶变换基本思想&#xff1a;将信号分解成一系列不同频率的连续正弦波的叠加。 其缺点是&#xff0c;…

华为鸿蒙4,3,2禁用Google谷歌服务框架,使用最新谷歌Google play服务

华为鸿蒙4,鸿蒙3,鸿蒙2有一些应用或者游戏尤其是游戏需要最新版的谷歌play服务支持才可以使用。但是华为的鸿蒙系统解决完”设备未经 play 保护机制认证”之后,最稳定的谷歌play服务是20这个版本&#xff0c;一旦升级到最新的Google谷歌play服务&#xff0c;目前是最新版本23这…

MySQL到TiDB:Hive Metastore横向扩展之路

作者&#xff1a;vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程&#xff0c;由实际面临的问题出发&#xff0c;对当前主流的横向扩展方案进行了调研及对比测试&#xff0c;通过多方面对比数据择优选择TiDB方案。其次分享了整…