flannel网络插件介绍

插件介绍

flannel项目本身只是一个框架 真正为用户提供容器网络功能的是后端实现 目前支持三种方式

1.VXLAN

2.host-gw

3.UDP

flannel会在宿主机上创建一个flannel0设备和创建一系列的路由表规则

flannel0设备介绍

负责在操作系统内核和用户应用程序之间传递IP包
   1.内核态向用户态流动
      当操作系统将一个IP包发送给flannel0设备后,flannel0设备就会把这个IP包交给
      创建这个设备的应用程序也就是flanneld进程
   2.用户态向内核态流动
      flanneld进程向flannel0设备发送了一个IP包 这个IP包就会出现在宿主机的网络栈中 然后根据宿主机上的路由表规则处理

flannel子网

每台宿主机都会被flannel分配一个单独的子网段
     每台宿主机上的所有容器地址都是这个子网段中的一个IP地址
     子网信息和宿主机的对应关系都保存在etcd中
     必须把docker0网桥的地址范围设置成flannel为宿主机分配的子网
     dockderd --bip=flannel_subnet

UDP模式

UDP数据包封装模式
         容器进程     ->     docker0    >内核                        用户态到内核态
         内核      >  flannel0        > flanneld进程                 内核态到用户态
         flanneld进程  >  内核 >  eth0物理机网卡发出        用户态到内核态
         由于UDP模式在内核态和用户态切换次数过多     所以性能比较差

系统级别编程的优化原则就是要减少用户态到内核态的切换次数 并且把核心的处理逻辑都放在内核态进行

数据包流程分析

UDP包的源地址和目标地址都是物理机地址 目标主机的flanneld进程在收到UDP包后
       1.flanneld进程解析UDP包里的容器源IP和目标容器IP然后把解析后的包发给flannel0设备
       2.操作系统自动接收flannel0中的数据 根据宿主机路由表转发到docker0设备
       3.docker0通过自身的端口找到目标容器

VXLAN模式

VXLAN本身是Linux内核自带的模块 完全可以在内核态实现封装和解封装的操作

VXLAN的设计思想
        在现有的三层网络上 构建一个虚拟的 由内核VXLAN模块负责维护的二层网络
        使得连接在这个VXLAN二层网络中的虚拟机或者容器可以像在一个LAN中自由通信
        在一个LAN中的所有主机相当于连接在一个交换机上 通过交换机就可以找到目标机

VTEP虚拟隧道端点设备 在宿主机上创建的设备叫flannel1
         VTEP设备既有自己的IP地址 也有自己的MAC地址
         VTEP设备和flannel0设备的作用相同 区别在于VTEP设备封装和解封装的对象是二层数据帧
         flannel0设备封装和解封装的对象是UDP数据包

通过每个宿主机上的VTEP设备组成了一个虚拟的二层网络 通过二层数据帧进行通信
  二层通信需要封装源MAC地址和目标MAC地址
  根据目标IP来查找目标的MAC地址 是通过ARP表来实现的
  flanneld进程会在每个节点上自动维护VTEP的IP和MAC地址的对应关系
  ip neigh show dev flannel.1
  flanneld进程
      1.维护主机路由表 记录网段 网关 处理网卡设备信息
         根据路由记录找到目标设备的IP地址
      2.维护VTEP设备的ARP表 记录VTEP的IP和MAC地址的对应关系
         根据目标设备的IP地址找到目标设备的MAC地址
      3.维护FDB 网桥转发规则 记录VTEP的MAC地址和宿主机IP对应关系

4.flannel子网和宿主机之间的对应关系

flanneld做为宿主机上的一个用户进程 它们之间只要宿主机能相互通信
     那么每个宿主机上的flanneld进程是可以通过宿主机网络相互传递数据包的

最新版本的 Flannel 并不依赖 L3 MISS 事件和 ARP 学习,而会在每台节点启动时把它的 VTEP 设备对应的 ARP 记录,直接下放到其他每台宿主机上

封装好VTEP设备的MAC地址(内部数据帧),对于宿主机网络来说并没有什么实际意义所以上面封装出来的这个数据帧,并不能在我们的宿主机二层网络里传输
   所以接下来,Linux 内核还需要再把“内部数据帧”进一步封装成为宿主机网络里的一个普通的数据帧,好让它“载着”“内部数据帧”,通过宿主机的eth0网卡进行传输

VNI机制
      Linux 内核会在“内部数据帧”前面,加上一个特殊的 VXLAN 头,用来表示这个“乘客”实际上是一个 VXLAN 要使用的数据帧。而这个 VXLAN 头里有一个重要的标志叫作 VNI,它        是 VTEP 设备识别某个数据帧是不是应该归自己处理的重要标识。而在Flannel中,VNI 的默认值是1,这也是为何宿主机上的 VTEP 设备都叫作flannel.1 的原因,这里的“1”,其 实就是 VNI 的值

VXLAN模式组建的覆盖网络,其实就是一个由不同宿主机上的VTEP设备,也就是 flannel.1 设备组成的虚拟二层网络.对于VTEP设备来说,它发出的“内部数据帧”就仿佛是一直在这个虚拟的二层网络上流动.这,也正是覆盖网络的含义

原文地址:https://www.cnblogs.com/yxh168/p/12206368.html

时间: 2024-08-30 15:47:57

flannel网络插件介绍的相关文章

kubernetes使用flannel网络插件服务状态显示CrashLoopBackOff

使用Kubeadm安装K8s集群,在安装flannel网络插件后,发现pod: kube-flannel-ds 一直是CrashLoopBackOff 报错内容如下: log is DEPRECATED and will be removed in a future version. Use logs instead. I0823 03:28:21.342352 1 main.go:514] Determining IP address of default interface I0823 03

kubernetes之Flannel网络插件部署

Kubernetes系统上Pod网络的实现依赖于第三方插件,而Flannel是由CoreOS主推的目前比较主流的容器网络解决方案,CNI插件有两种功能:网络配置和网络策略,由于flannel比较简单,并不支持网络策略,flannel项目自身只是一个框架,真正提供网络功能的是它的后端实现,目前,Flannel支持三种不同后端实现,分别是: UDP VXLAN host-gw UDP是Flannel项目最早支持的一种方式,是性能最差的方式,目前已被废弃. 用的最多的是VXLAN和host-gw模式的

k8s的flannel网络插件配置

flannel的网络插件配置 Kubernetes网络通信需要解决以下问题:            (1)容器间通信:同一个Pod内的多个容器间的通信,lo            (2)Pod通信:Pod IP  <-直达->  Pod IP            (3)Pod与Service通信:Pod IP  <-->  Cluster IP            (4)Service与集群外部客户端的通信:(ingress.nodeport.loadbalancer)   k

K8S 之 Flannel网络插件安装

一.flannel的作用 1.CNI网络插件最主要的功能就是实现POD资源能够跨宿主机是进行能信 #test-nodes1主机无法ping通test-nodes2主机的pod容器 [[email protected] ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ds1-qg45q 1/1 Running 0 2d12h 172.7.

Kubernetes Flannel网络部署

之前的博客已经介绍了部署一个简单的Kubernetes集群,但是这个集群环境没有一个合理的网络配置.在实际生产中要实现集群中各个组件的通信,就需要使用第三方提供的网络插件. Flannel 二进制安装 1.下载fannel组件 wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz 2.安装Flannel 网络组件 tar xf flannel-v0.1

Gulp构建前端自动化工作流之:常用插件介绍及使用

在对Gulp有了一个初步的了解之后,我们开始构建一个较为完整的Gulp开发环境. 本文主要分为6个段落: 1. 构建项目目录结构(Directory Structure Build) 2. 插件介绍及使用方法(Tasks and dependencies) 3. 扩展优化(Extend & Optimize Task) 4. 其他插件介绍(Other plug-ins) 5. 匹配规则(Match Files) 6. 注意事项(Attention) 关于Gulp的入门介绍及安装方法,可先去 <

CSDN开源夏令营 基于Compiz的switcher插件设计与实现之compiz特效插件介绍及特效实现

compiz自带的特效插件不够多,也不够强大,为了更好的体验compiz的特效,我们可以安装特效插件,在终端输入命令:sudo apt-get install compiz-plugins就可以下载特效插件安装了. 一.安装compiz特效插件 在此过程中可能会出现一些问题,比如说依赖问题,我们需要把源更新一下.对于更新源,我们需要注意以下几点: 1.设置软件更新 注意:这里要选主服务器 2.更新源 在终端输入命令:sudo apt-get update来更新源,一般情况下,这样是可以的,但是,

AngularJS Cordova插件介绍

ngCordova是在Cordova Api基础上封装的一系列开源的AngularJs服务和扩展,让开发者可以方便的在HybridApp开发中调用设备能力,即可以在AngularJs代码中访问设备能力Api. 根据我的经验,在cordova插件的sucess和error js回调方法中,是无法使用 angularjs的$scope对象和注入的方法的,只能访问全局的方法和变量,这样会导致很多麻烦,必须使用传统的js方法写很多难看的代码.使用ngCordova应该可以解决这个问题. 目前ngCord

Flannel网络组件部署

在部署K8S之前,需要在集群服务器上部署CNI容器网络组件,从而实现集群的网络互联互通.目前可选的组件比较多,例如flannel.calico.weave等,各容器网络组件对比可参考文档:http://dockone.io/article/2599 本文介绍flannel网络组件的部署,配置环境在完成前文etcd集群和tls认证配置后.一.生成flannel证书文件 # mkdir flanneld # cd flanneld # cat flanneld-csr.json { "CN"