K8S Flannel

2023-05-16

1. 简介

flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具。它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。

Flannel 是一种“覆盖网络(overlay network)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信方式是UDP转发。

  • 集群中的不同节点上,创建的Pod具有全集群唯一的虚拟IP地址。
  • 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。
  • 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
  • etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。

2. Vxlan 模式

2.1 部署

$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ vi kube-flannel.yml
 "Network": "10.244.0.0/16",

$ kubectl apply -f kube-flannel.yml

$ kubectl get pod -n kube-system
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-8qnnx   1/1     Running   0          10s
kube-flannel-ds-979lc   1/1     Running   0          16m
kube-flannel-ds-kgmgg   1/1     Running   0          16m

2.2 通信流程

在这里插入图片描述

不同node上的pod通信流程:

  1. pod中的数据,根据pod的路由信息,发送到网桥 cni0
  2. cni0 根据节点路由表,将数据发送到隧道设备flannel.1
  3. flannel.1 查看数据包的目的ip,从flanneld获取对端隧道设备的必要信息,封装数据包
  4. flannel.1 将数据包发送到对端设备。对端节点的网卡接收到数据包,发现数据包为overlay数据包,解开外层封装,并发送内层封装到flannel.1 设备
  5. Flannel.1 设备查看数据包,根据路由表匹配,将数据发送给cni0设备
  6. cni0匹配路由表,发送数据到网桥

集群节点上网络分配:

$ ip addr
6: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
    link/ether b6:95:2a:cd:01:c3 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.0/32 brd 10.244.0.0 scope global flannel.1
       valid_lft forever preferred_lft forever
    inet6 fe80::b495:2aff:fecd:1c3/64 scope link
       valid_lft forever preferred_lft forever
7: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether 16:ac:e9:68:a4:c0 brd ff:ff:ff:ff:ff:ff
    inet 10.244.0.1/24 brd 10.244.0.255 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::14ac:e9ff:fe68:a4c0/64 scope link
       valid_lft forever preferred_lft forever

$ ethtool -i cni0
driver: bridge

$ ethtoo -i flannel.1
driver: vxlan

$ ps -ef | grep flanneld
root       15300   15275  0 10:21 ?        00:00:19 /opt/bin/flanneld --ip-masq --kube-subnet-mgr

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.80.2    0.0.0.0         UG    0      0        0 ens33
10.244.0.0      10.244.0.0      255.255.255.0   UG    0      0        0 flannel.1
10.244.1.0      10.244.1.0      255.255.255.0   UG    0      0        0 flannel.1
10.244.2.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0
192.168.80.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33

$ brctl show
bridge name     bridge id               STP enabled     interfaces
cni0            8000.e2ee89678398       no              veth28b04daf
                                                        vethe6d4a6b8

cni0: 网桥设备,每创建一个pod都会创建一对 veth pair。其中一段是pod中的eth0,另一端是cni0网桥中的端口。

flannel.1: vxlan网关设备,用户 vxlan 报文的解包和封包。不同的 pod 数据流量都从overlay设备以隧道的形式发送到对端。flannel.1不会发送arp请求去获取目标IP的mac地址,而是由Linux kernel将一个"L3 Miss"事件请求发送到用户空间的flanneld程序,flanneld程序收到内核的请求事件后,从etcd中查找能够匹配该地址的子网flannel.1设备的mac地址,即目标pod所在host中flannel.1设备的mac地址。

flanneld: 在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。同时Flanneld监听K8s集群数据库,为flannel.1设备提供封装数据时必要的mac,ip等网络数据信息。

VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),采用L2 over L4(MAC-in-UDP)的报文封装模式,将二层报文用三层协议进行封装,可实现二层网络在三层范围内进行扩展,同时满足数据中心大二层虚拟迁移和多租户的需求。

flannel只使用了vxlan的部分功能,VNI被固定为1。容器跨网络通信解决方案:如果集群的主机在同一个子网内,则通过路由转发过去;若不在一个子网内,就通过隧道转发过去。

2.3 相关配置

$ cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cbr0",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

$ cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

# Bridge CNI 插件
$ cat /var/lib/cni/flannel/462cf658ef71d558b36884dfb6d068e100a3209d36ba2602ad04dd9445e63684 | python3 -m json.tool
{
    "cniVersion": "0.3.1",
    "hairpinMode": true,
    "ipMasq": false,
    "ipam": {
        "routes": [
            {
                "dst": "10.244.0.0/16"
            }
        ],
        "subnet": "10.244.2.0/24",
        "type": "host-local"
    },
    "isDefaultGateway": true,
    "isGateway": true,
    "mtu": 1450,
    "name": "cbr0",
    "type": "bridge"
}

3. Host-GW 模式

3.1 清理

kubectl delete -f kube-flannel.yml

ip link set cni0 down
ip link set flannel.1 down

ip link delete cni0
ip link delete flannel.1

rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*

3.2 部署

$ vi kube-flannel.yml
      "Backend": {
        "Type": "host-gw"
      }

$ kubectl apply -f kube-flannel.yml

$ kubectl get pod -n kube-system
NAMESPACE     NAME                    READY   STATUS    RESTARTS   AGE
kube-system   kube-flannel-ds-l2dg7   1/1     Running   0          7s
kube-system   kube-flannel-ds-tj2vg   1/1     Running   0          7s
kube-system   kube-flannel-ds-xxhfm   1/1     Running   0          7s

3.3 通信流程

img

host-gw采用纯静态路由的方式,要求所有宿主机都在一个局域网内,跨局域网无法进行路由。如果需要进行跨局域网路由,需要在其他设备上添加路由,但已超出flannel的能力范围。可选择calico等使用动态路由技术,通过广播路由的方式将本机路由公告出去,从而实现跨局域网路由学习。

所有的子网和主机的信息,都保存在Etcd中,flanneld只需要watch这些数据的变化 ,实时更新路由表。
核心是IP包在封装成桢的时候,使用路由表的“下一跳”设置上的MAC地址,这样可以经过二层网络到达目的宿主机。

集群节点上网络分配:

$ ip addr
7: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 2a:00:05:23:3f:5e brd ff:ff:ff:ff:ff:ff
    inet 10.244.2.1/24 brd 10.244.2.255 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::2800:5ff:fe23:3f5e/64 scope link
       valid_lft forever preferred_lft forever

$ kubectl logs kube-flannel-ds-l2dg7 -n kube-system
I1227 12:09:56.991787       1 route_network.go:86] Subnet added: 10.244.2.0/24 via 192.168.80.240
I1227 12:09:56.992305       1 route_network.go:86] Subnet added: 10.244.0.0/24 via 192.168.80.241

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.80.2    0.0.0.0         UG    0      0        0 ens33
10.244.0.0      192.168.80.241  255.255.255.0   UG    0      0        0 ens33
10.244.1.0      192.168.80.242  255.255.255.0   UG    0      0        0 ens33
10.244.2.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0
192.168.80.0    0.0.0.0         255.255.255.0   U     0      0        0 ens33

3.4 相关配置

与 VxLan 一致

4. 总结

4.1 Flanneld

Flanneld 收到 EventAdded 事件后,从 etcd 将其他主机上报的各种信息,在本机上进行配置,主要分下列三种信息:

  • ARP: IP和MAC的对应关系
  • FDB: MAC+VLAN和PORT的对应关系.
  • Routing Table: 通往目标地址的封包,通过网关方式发送出去

补充:

  • ARP是三层转发;FDB是二层转发,即使两个设备不在同一网段或者没配置IP,只要两者之间的链路层是连通的,就可以通过FDB表进行数据转发
  • FDB表的作用就在于告诉设备从某个端口出去就可以到某个目的MAC。

4.2 各种模式

  • udp模式:使用设备flannel.0进行封包解包,不是内核原生支持,上下文切换较大,性能非常差
  • vxlan模式:使用flannel.1进行封包解包,内核原生支持,性能损失在20%~30%左右
  • host-gw模式:无需flannel.1这样的中间设备,直接宿主机当作子网的下一跳地址,性能损失大约在10%左右

4.3 CNI 网络调度

Kubelet、Container Runtime 和 CNI 插件交互:
在这里插入图片描述

Containerd CRI 插件和 CNI 插件之间的交互:

img

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8S Flannel 的相关文章

  • K8s中的Deployment

    Deployment是kubernetes在1 2版本中引入的新概念 用于更好的解决Pod的编排问题 为此 Deployment在内部使用了ReplicaSet来实现目的 我们可以把Deployment理解为ReplicaSet的一次升 级
  • CNI Plugin 介绍

    CNI 插件包括两种类型 CNI Plugin 和 IPAM IP Address Management Plugin CNI Plugin 负责为容器配置网络资源 IPAM Plugin 负责对容器的 IP 地址进行分配和管理 IPAM
  • k8s优雅停服

    在应用程序的整个生命周期中 正在运行的 pod 会由于多种原因而终止 在某些情况下 Kubernetes 会因用户输入 例如更新或删除 Deployment 时 而终止 pod 在其他情况下 Kubernetes 需要释放给定节点上的资源时
  • Harbor镜像仓库搭建

    1 安装docker comprose docker comprose是docker容器批量管理工具 curl L https get daocloud io docker compose releases download 1 25 0
  • minikube单机安装nfs服务

    1 安装 nfs server sudo apt get update sudo apt get install y nfs kernel server 2 创建目录 配置 IP 共享目录绑定 vim etc exports 新增 data
  • kubernetes08(kubernetes的资源对象)

    文章目录 kubernetes08 kubernetes的资源对象 一 引子 二 kubernetes资源 一 kubernetes的资源对象作用 二 kubernetes的资源对象分类 三 kubernetes资源清单 一 kubenet
  • k8s删除Terminating 的命名空间等资源

    背景 在k8s中执行删除命名空间后 命名空间没有被删除而是处于Terminating状态 此时再执行删除仍然删除不掉 解决 将要删除的命名空间信息导出为json数据 下面traefik v2 替换成你需要删除的命名空间名称 kubectl
  • kubernetes集群更新证书(kubeadm方式)

    一 kubernets证书详情 1 查看证书 tree etc kubernetes pki etc kubernetes pki apiserver crt apiserver etcd client crt apiserver etcd
  • k8s部署之ETCD集群

    k8s部署之ETCD集群 1 etcd下载 etcd下载地址 https github com coreos etcd releases 从github etcd的发布页面选取相应的版本用 wget url 来下载 如 wget https
  • k8s中Endpoint是什么

    在Kubernetes K8s 中 Endpoint是一种资源对象 用于表示一个Service所依赖的真实后端节点的Pod信息 它存储了一组IP地址和端口号的列表 这些IP地址和端口号对应着提供相同服务的Pod实例 主要作用 Endpoin
  • CentOS 7 下 minikube 部署 && 配置

    CentOS 7 下 minikube 部署 配置 文章目录 CentOS 7 下 minikube 部署 配置 下载 安装 下载安装脚本 安装 minikube 启动 minikube 环境 安装 kubectl 工具 启动 miniku
  • IDEA远程调试

    1 概述 原理 本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信 传递调试指令和调试信息 被调试程序的远程虚拟机 作为 Debug 服务端 监听 Debug 调试指令 jdwp是Java Debug Wire
  • k8s基本命令

    k8s命令 https kubernetes io zh docs tutorials kubernetes basics 官网地址 基本命令 查看节点服务器 kubectl get nodes 查看命名空间 kubectl get ns
  • Rancher 图形化管理K8S

    题外话 之前我们一直都是使用命令行来管理K8S的 这种做法虽然对程序员来说看起来很炫酷 但有时候用起来还是挺麻烦的 今天我们来介绍一个K8S可视化管理工具Rancher 使用它可以大大减少我们管理K8S的工作量 希望对大家有所帮助 简介 R
  • kubectl常用命令

    alias k kubectl alias kc k create f alias kgp k get pods alias kdp k describe pods alias kdep k delete pods alias kl k l
  • 十二. Kubernetes Pod 与 探针

    目录 一 Pod Pod 中的多容器协同 Pod 的组成与paush 重要 Pod 的生命周期 Pod状态与重启策略 静态Pod 二 探针 1 livenessProbe存活探针 2 readinessProbe就绪探针 3 startup
  • Kubernets原理分解

    主节点 master 快速介绍 master也要装kubelet和kubeproxy 前端访问 UI CLI kube apiserver scheduler controller manager etcd kubelet kubeprox
  • kubeadm 安装k8s

    关于k8s集群化部署 以下均是个人一步一步的完成部署 并且会罗列出在部署过程中遇到的各种问题及其解决方式 一 环境准备 环境准备阶段试用与master节点部署与work节点部署 即master和work节点全部都需要执行这些步骤 1 关闭防
  • 使用 192.168.0.0/16 或其他 iprange 作为 kubernetes + flannel 的 pod cidr

    在教程中https kubernetes io docs setup independent create cluster kubeadm https kubernetes io docs setup independent create
  • flannel和calico区别

    k8s网络模式 Flannel数据包在主机间转发是由backend实现的 目前已经支持UDP VxLAN host gw等多种模式 VxLAN 使用内核中的VxLAN模块进行封装报文 也是flannel推荐的方式 host gw虽然VXLA

随机推荐

  • 【Spark入门项目】词频统计

    项目要求 要求统计txt英文文件中每个单词出现的次数 txt文件内随机拷贝英文内容 xff0c 如下 The scientists re analysed a sample collected by NASA astronauts duri
  • 【jieba】中文分词

    span class token keyword import span jieba words span class token operator 61 span jieba span class token punctuation sp
  • 【Python】读取中文

    fn span class token operator 61 span span class token builtin open span span class token punctuation span path span clas
  • 【WordCloud】生成词云

    generate from frequencies xff1a 从频率字典中生成词云 该方法传入统计好的词频字典 xff0c 例如 39 Python 39 5 39 Hadoop 39 10 39 Spark 39 20 39 大数据 3
  • 【Spark入门项目】统计男女生身高的平均值、最大、最小值

    项目要求 分别统计男女生身高的平均值 最大 最小值 xff0c 数据格式为 xff08 ID xff0c sex xff0c height xff09 xff0c 如下 xff1a 1 M 174 2 F 165 3 M 180 4 M 1
  • 【Spark入门项目】关键词统计

    项目描述 统计txt文件中出现频率前10的关键词 xff0c 内如如下 实现流程 初始化spark配置通过textFile方法读取txt文件通过flatMap将RDD中的每一个元素调用split方法分词 xff0c split中使用jieb
  • 【二叉搜索树】面试题 17.12. BiNode

    题目 二叉树数据结构TreeNode可用来表示单向链表 xff08 其中left置空 xff0c right为下一个链表节点 xff09 实现一个方法 xff0c 把二叉搜索树转换为单向链表 xff0c 要求依然符合二叉搜索树的性质 xff
  • 【二叉搜索树】1305. 两棵二叉搜索树中的所有元素(非递归中序遍历)

    题目 给你 root1 和 root2 这两棵二叉搜索树 请你返回一个列表 xff0c 其中包含 两棵树 中的所有整数并按 升序 排序 示例 1 xff1a 输入 xff1a root1 span class token operator
  • 51单片机的RFID门禁系统

    一 硬件方案 本RFID系统设计可分为硬件部分和软件部分 硬件部分以MFRC522射频识别模块为核心 xff0c 结合主控模块STC89C52设计系统的外围硬件电路 xff0c 实现对射频卡的控制与MCU之间的互通 软件部分采用C语言进行系
  • 【win10 Kafka基本操作】启动、创建topic、发送信息

    1 启动Zookeeper Kafka依赖于zookeeper xff0c 因此需要先启动zookeeper xff0c 使用kafka内置的zookeeper xff0c cd到kafka的bin windows目录下 xff0c 运行如
  • java.lang.IllegalArgumentException: Unsupported class file major version 58

    使用scala编写代码 xff0c 程序报错 java lang IllegalArgumentException Unsupported class file major version 58 改错误为jdk版本和scala不兼容 xff
  • 【跳表】

    跳表原理 跳变是一种高效的搜索结构 xff0c 是对链表的一种优化 xff0c 如下图所示 xff0c 以下图片均摘自博客 xff0c 原始的链表结构如下图 xff0c 实现查找 删除和插入复杂度都为O n xff0c 因为需要遍历链表 而
  • 【Union联合】

    C 43 43 的联合是一个特殊的类 xff0c 联合中可以有多个数据成员 xff0c 但是在任意时刻只能有一个数据成员有值 xff0c 例如下列联合中有三个数据成员 xff0c 其中占位最大的是a xff0c 因此该联合的所占的大小为32
  • 【拼凑硬币】腾讯机试题

    拼凑硬币 时间限制 xff08 每个case xff09 2s 空间限制 xff1a 128MB 小Q十分富有 xff0c 拥有非常多的硬币 xff0c 小Q拥有的硬币是有规律的 xff0c 对于所有的非负整数K xff0c 小Q恰好各有两
  • 【python】glob标准库使用,提取满足条件的目录或文件

    glob 文件名模式匹配 xff0c 不用遍历整个目录判断每个文件是不是符合 例子 xff1a 文件结构如下 xff0c 使用glob读取files下vgg开头且后面为单个数字的文件 代码如下 xff0c 表示匹配单个字符 span cla
  • 【ERROR】Failed to get convolution algorithm. This is probably because cuDNN failed to initialize

    1 有可能是显存不足 xff0c 尝试减小batchsize 2 os environ 39 TF FORCE GPU ALLOW GROWTH 39 61 39 true 39 这个语句的意思是 xff0c TensorFlow 在分配显
  • 【tensorboard】可视化模型

    关键使用tf summary trace on graph 61 True profiler 61 True 跟踪张量的流动 xff0c tf summary trace export导出图的结构 span class token keyw
  • 【python】画三维散点图Axes3D

    span class token keyword import span numpy span class token keyword as span np span class token keyword import span matp
  • 【python】输出当前时间

    span class token keyword import span time span class token keyword print span span class token punctuation span time spa
  • K8S Flannel

    1 简介 flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具 它的主要思路是 xff1a 预先留出一个网段 xff0c 每个主机使用其中一部分 xff0c 然后每个容器被分配不同的ip xff1b 让所有的容器