当前位置: 首页 > news >正文

Flannel解读

概念

由我上篇博文Docker网络解读可知,flannel主要用来解决容器的跨主机通信问题,同时也是kubernetes主要实现网络互通的方式,那么flannel是如何实现容器间跨主机通信的呢,下面我们引入flannel github上的一张原理图来解读:
图片描述
要完整解读此图,在此之前,我们首先要了解下flannel关联的一个重要组件"Etcd”的概念。

什么是Etcd?

我们引用下Etcd的基本概念:etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。

在上面这一大段话中,我们可以了解到etcd是一个基于服务发现的系统。服务发现可理解为在一个Cluster集群内记录各node信息的数据库,其他node可通过该数据库获取该Cluster集群内各node的信息。

Flannel实现原理

了解了以上概念之后,我们就能说明flannel的实现原理了,为了解释清楚,我们把实现原理分为以下几个步骤:

  1. 数据从Web App Frontend1这个容器发出经veth0网桥转发到宿主机的docker0网桥上
  2. docker0网桥根据数据包的目的地址进行转发,若为非本机容器地址则转发给Flannel0网卡处理
  3. Flannel0网卡交给flanneld这个进程处理,flanneld通过查询etcd,找到目的容器地址,并进行转发
  4. 数据包到达目的主机,经flanneld解包,最后由docker0转发到目的容器

这样整个数据包发送过程就解释完成了。

当然仅仅是这样还不够,flannel为每个在它管理下的容器赋予了一个独立的不会重复的ip地址,这样跨主机容器的ip地址就不会重复了,在这个前提下才能实现以上步骤的精确转发。

总结

flannel为集群内每个容器分配一个独立的ip地址,通过etcd的服务发现功能存储各node容器的ip信息,实现数据包的精确转发,解决了各容器间的跨主机通信问题。

相关文章:

  • JAVA入门到精通-第36讲-事件监听-坦克大战4
  • 进程与线程 thread (二)——线程概念
  • 常用命令lsof netstat 介绍
  • 神经网络定义
  • ssm整合详解
  • const的用法,特别是用在函数前面与后面的区别
  • React源代码解析(3):组件的生命周期
  • C++17 并行排序初体验
  • Oracle DataGuard常用管理命令
  • SSH远程管理常用的几种配置
  • Nuxt 开发 - 项目初始化
  • 赖世雄:新中考英语听说满分冲刺 笔记
  • MariaDB数据基础应用
  • 百度小程序遇到的问题
  • 【总结整理】房产类---转自人人都是产品经理
  • .pyc 想到的一些问题
  • 【刷算法】求1+2+3+...+n
  • es6(二):字符串的扩展
  • Git的一些常用操作
  • Java比较器对数组,集合排序
  • Java多态
  • Laravel 实践之路: 数据库迁移与数据填充
  • markdown编辑器简评
  • Redux 中间件分析
  • 创建一种深思熟虑的文化
  • 分享几个不错的工具
  • 回顾 Swift 多平台移植进度 #2
  • 记录:CentOS7.2配置LNMP环境记录
  • 如何学习JavaEE,项目又该如何做?
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 组复制官方翻译九、Group Replication Technical Details
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #QT(智能家居界面-界面切换)
  • (12)Linux 常见的三种进程状态
  • (2)MFC+openGL单文档框架glFrame
  • (AngularJS)Angular 控制器之间通信初探
  • (day 12)JavaScript学习笔记(数组3)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十五)使用Nexus创建Maven私服
  • (一)Linux+Windows下安装ffmpeg
  • (转)JAVA中的堆栈
  • ..回顾17,展望18
  • .bat批处理(一):@echo off
  • .net mvc部分视图
  • .sys文件乱码_python vscode输出乱码
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ??myeclipse+tomcat
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [asp.net core]project.json(2)
  • [C puzzle book] types
  • [C#][DevPress]事件委托的使用
  • [CF482B]Interesting Array