k8s笔记25--k8s 跨主机网络flannel

news2024/10/6 0:29:24

k8s笔记25-- k8s 跨主机网络flannel

  • 简介
  • 不同机器上网络设备区别
  • flannel 网络常见三大后端模式
    • UDP
    • VXLAN
    • host-gw
  • 如何查看集群用哪种网络模式
  • 阿里云flannel容器网络 alloc
  • 参考文档

简介

在单机环境下,容器间可以通过 docker0 网桥来通信,但其无法实现不同主机容器之间的通信问题,为了解决不同主机之间容器的通信问题,跨主机网络方案便诞生了。
当前社区提供了近20种网络方案,具体见 Kubernetes 文档/概念/集群管理/安装扩展(Addon);其中,Flannel 是最经典的几种网络方案之一,它是 CoreOS 公司主推的容器网络方案。当前Flannel可以支持很多网络后端, UDP、VXLAN、host-gw是最为经典的3种后端,本文主要通过这3种后端来了解、熟悉K8S跨主机网络方案。

不同机器上网络设备区别

  1. 有docker无k8s
    [图片]

  2. 单节点master k8s 节点
    [图片]

    注意: master节点pod ip 为 10.244.0.0/24,当新增一个节点后(节点podip为 10.224.1.0/24),master 节点多了一条路由, 它表明访问 10.224.1.0/24 pod 都会从 flannel.1 网络设备出去
    在这里插入图片描述

  3. k8s node 节点
    在这里插入图片描述

    加入集群后,多了一条 flannel.1 的路由,表明访问其它节点上的pod是会从该虚拟网络设备出去;
    后续每新加一个节点,现有集群都会多一条相应路由。
    3节点的集群,node01核心路由如下:

    10.244.0.0      10.244.0.0      255.255.255.0   UG    0      0        0 flannel.1
    10.244.1.0      0.0.0.0         255.255.255.0   U     0      0        0 cni0
    10.244.2.0      10.244.2.0      255.255.255.0   UG    0      0        0 flannel.1
    
  4. 除了了解上述设备和路由信息外,还可以通过 brctl show (需要 apt install bridge-utils) 查看当前的机器上的网桥信息;如下图,发现cni0下有3个veth设备,docker0下有1个veth设备,它表明通过K8S起了3个pod,通过docker run起了一个容器。
    在这里插入图片描述

flannel 网络常见三大后端模式

UDP

flannel官文说明: Use UDP only for debugging if your network and kernel prevent you from using VXLAN or host-gw.

使用udp后端的节点会创建一个 flannel0的TUN设备(Tunnel设备)。
在 Linux 中,TUN 设备是一种工作在三层(Network Layer)的虚拟网络设备。TUN 设备的功能非常简单,即:在操作系统内核和用户应用程序之间传递 IP 包。

安装flannel udp 后端的时候,需要修改kube-flannel.yaml 中的 net-conf.json 和 pod securityContext.privileged: true

......
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "udp",
        "Port": 7890
      }
    }
......
        securityContext:
          privileged: true
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
......

注意: 不设置privileged: true 会导致flannel pod无法拉起,报如下错误
E0429 02:31:36.131167       1 main.go:317] Error registering network: failed to open TUN device: open /dev/net/tun: no such file or directory
I0429 02:31:36.131328       1 main.go:434] Stopping shutdownHandler...

安装udp后端的单节点 master 设备网络接口和路由如下:
从路由可以看到, 10.224.0.0/24 网段都会经过 cni0, 同一主机网段的pod之间的访问都会从容器网络到 cni0 设备,然后再转发到目标容器中。
pod网段中非本机的网段 10.224.0.0/16 都会经过 flannel0 设备,然后通过flanneld进程封包后抓发到目标机器的udp端口。
在这里插入图片描述

基于UDP后端,假设Node1 上的 100.96.1.2 访问Node2上的100.96.2.3 pod, 其通信原理图如下:
在这里插入图片描述

Node1 容器->cni0设备->flannel0设备->flanneld 进程将数据封装在UDP包->Node1 eth0->Node2 eth0(8285 udp端口)->flanneld 进程解析出原始数据->flannel0设备->cni0设备->Node 2容器。

和两台主机直接通信相比,Flannel UDP模式多了一个 flanneld 进程的处理,该处理会导致数据多次在用户态和内核态传递。如下图所示:
第一次,用户态的容器进程发出的 IP 包经过 cni0 网桥进入内核态;
第二次,IP 包根据路由表进入 TUN(flannel0)设备,从而回到用户态的 flanneld 进程;
第三次,flanneld 进行 UDP 封包之后重新进入内核态,将 UDP 包通过宿主机的 eth0 发出去。
在这里插入图片描述

在 Linux 操作系统中,上述这些上下文切换和用户态操作的代价其实是比较高的,这也正是造成 Flannel UDP 模式性能不好的主要原因。
Flannel 的VXLAN后端使用Linux 内核本身支持的VXLAN网络虚拟化技术,可以完全在内核态实现上述封装和解封装的工作,能明显提高网络性能,这也是Flannel支持的VXLAN网络成为主流容器网络方案的原因。

VXLAN

flannel官文说明: Use in-kernel VXLAN to encapsulate the packets.
Virtual eXtensible Local Area Networking documentation
What Is VXLAN

vxlan 基础:
VXLAN协议是一种隧道协议,旨在解决IEEE 802.1q中限制VLAN ID(4096)的问题。 使用 VXLAN,标识符的大小扩展到 24 位 (16777216)。
VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输。 在三层网络上构建一个逻辑的二层网络。
VXLAN本质上是一种隧道技术,在源网络设备与目的网络设备之间的IP网络上,建立一条逻辑隧道,将用户侧报文经过特定的封装后通过这条隧道转发。

使用flannel后设备路由表、设备信息、fdb转发数据库信息如下:
在这里插入图片描述

[图片]
在这里插入图片描述

使用vxlan 后数据包传输过程:
假设 kmaster 节点上的pod1 需要访问 knode01 节点上的pod2

  1. 容器路由
    根据容器路由表,数据从容器的 eth0 发出
  2. 主机路由
    数据包接入到主机网络设备 cni0后, 根据主机路由到 flannel.1 设备,即隧道入口。
  3. vxlan 封装
    加上 vxlan 相关的header,封装成一个普通的数据帧
  4. 封装为udp包转发到目的机器
    从FDB获取目标设备对应的 ip 和 mac,形成一个UDP包并转发出去。
  5. 数据到达目标机器
    数据包到达knode01节点,在内核解封装发现是VXLAN数据包,把它交给flannel.1设备。flannel.1设备则会进一步拆包,取出原始IP包(源容器IP和目标容器IP),通过cni0网桥转发给容器。
    在这里插入图片描述

host-gw

flannel官文说明: Use host-gw to create IP routes to subnets via remote machine IPs. Requires direct layer2 connectivity between hosts running flannel.

假设Node 1 上的 Infra-container-1,要访问 Node 2 上的 Infra-container-2, 其数据流项图如下所示:
在这里插入图片描述

host-gw 模式的工作原理,其实就是将每个 Flannel 子网(Flannel Subnet,比如:10.244.1.0/24)的“下一跳”,设置成了该子网对应的宿主机的 IP 地址;从而让这台主机充当容器网络的网关角色。

如何查看集群用哪种网络模式

以ds 的形式部署在每个节点上
在这里插入图片描述
挂载项目:

          volumeMounts:
            - mountPath: /etc/cni/net.d
              name: cni
            - mountPath: /etc/kube-flannel/
              name: flannel-cfg # configmap
            - mountPath: /var/lib/cni
              name: ipam

查看方式:

自搭k8s
# kubectl -n kube-flannel get cm kube-flannel-cfg -oyaml
apiVersion: v1
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
kind: ConfigMap


阿里云k8s
# kubectl -n kube-system get cm kube-flannel-cfg -oyaml
apiVersion: v1
data:
  cni-conf.json: |
    {
      "name": "cb0",
      "cniVersion":"0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "isDefaultGateway": true,
            "hairpinMode": true
           },
           "dataDir": "/var/run/cni/flannel",
           "ipam": {
             "type": "host-local",
             "dataDir": "/var/run/cni/networks"
           }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          },
          "externalSetMarkChain": "KUBE-MARK-MASQ"
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.251.0.0/16",
      "Backend": {
        "Type": "alloc"
      }
    }
kind: ConfigMap
......

/run/cni/networks/cb0 下面会记录各个节点非ds pod 的ip情况
/run/cni/networks/cb0 # ls
10.251.7.164        10.251.7.165        last_reserved_ip.0  lock

阿里云使用的是 alloc(腾讯使用 tencent-vpc): Alloc performs subnet allocation with no forwarding of data packets.

阿里云flannel容器网络 alloc

阿里云ecs 节点网络设备如下:,
节点上没有 flannel.x 设备,可见不是直接通过vxlan构建大二层网络
在这里插入图片描述

节点内pod访问模式:
数据链路 ECS1 Pod1 eth0 -> vethxxx1 -> cni0 -> vethxxx2 -> ECS1 Pod2 eth0
在这里插入图片描述

不同节点间pod访问模式:
数据链路 ECS1 pod1 eth0 … -> ECS1 eth0-> 交换机->ECS2 eth0->…> ECS2 pod2 eth0
在这里插入图片描述

阿里云每个VPC都会有一个路由表,路由表绑定到该VPC对应的交换机上, 如下图每创建一个交换机的时候都会新增一条路由
在这里插入图片描述

集群每次新增一个节点时候,都会在自定义路由中加一条访问该节点上pod的路由
在这里插入图片描述

阿里云 flannel 模式缺点:
每加一个节点到集群都会在VPC路由表中加一条路由,导致需要经常让阿里云的同学调整VPC路由条数,目前阿里云最多能支持1500条路由;当改VPC的节点数量达到上限(阿里云也不愿意调整)的时候,只能新建VPC并将新集群部署在新VPC下。
如下图,该VPC下最多能新增78个节点
在这里插入图片描述

参考文档

github.com/flannel-io/flannel
扁平网络 Flannel
Documentation/backends.md
k8s(十六): VXLAN和Flannel
KUbernetes Flannel:VXLAN模式
k8s 网络四篇文章
03-K8S网络模型
ACK容器网络数据链路(Flannel)
Virtual eXtensible Local Area Networking documentation
What Is VXLAN
Flannel Networking Demystify

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

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

相关文章

QT QGridLayout网格布局控件

本文详细的介绍了QHBoxLayout控件的各种操作,例如:新建界面、控件布局、获取行、获取列、某行伸缩系数、某列伸缩系数、某列最小宽度、某行最小宽度、总单元格数、移除布局条目、移动布局条目、其它文章等操作。 实际开发中,一个界面上可能包…

【小程序】 键盘和表情同时存在时候,输入框上移问题

键盘和表情 效果图实现方法引入的js文件&#xff0c;文件名emoji.js&#xff0c;存放在untils路径下 效果图 实现过程&#xff0c;监听键盘高度的同时&#xff0c;判断是否获取到焦点样式上&#xff0c;swiper实现左右按页滑动效果 实现方法 <template><view class&…

IDEA常用配置及使用技巧

文章目录 下载插件JRebel and XRebelChinese Language PackMybatis XEasyCodeTranslationAuto filling Java call argumentsCodota AI Autocomplete for Java and JavaScriptAlibaba Java Coding GuidelinesEasyYapiGenerateAllSetterGit Commit TemplateGitToolBoxSQL Params …

基于YOLOv5的儿童睡眠检测

注意&#xff1a; 由于SOPHGO SE5微服务器的CPU是基于ARM架构&#xff0c;部分步骤将在 基于x86架构CPU的开发环境中完成 一、初始化开发环境(基于x86架构CPU的开发环境中完成) 二、模型转换 (基于x86架构CPU的开发环境中完成) 三、YOLOv5模型部署测试&#xff08;在SOPHGO SE5…

FT2000+ qemu kvm 64C64G 通过频繁设置CPU online 状态导致虚拟机openEuler 操作系统假死测试用例2

前文&#xff1a; https://hknaruto.blog.csdn.net/article/details/130408240 测试程序 /** tcti.cpp参考&#xff1a; https://www.cnblogs.com/organic/p/17321523.htmlg -stdc11 -lpthread trigger_cgroup_timer_inactive.cpp -o inactive_timer ./inactive_timer 100000…

linux内核网络子系统初探---概述

linux内核网络子系统初探—概述 一、网络模型 简单介绍 学习网络时&#xff0c;必定能在各种教材资料里见到以下三种网络模型&#xff1a; 三种模型间的差异&#xff1a; OSI七层模型是理论上的网络模型&#xff0c;从功能方面分成了相对独立的7个层次&#xff0c;由于太复…

如何通过 Rancher 轻松实现多云部署

“多云”通过不同的云厂商分发应用程序提高了弹性&#xff0c;能够帮助企业强化自身的竞争力。此外&#xff0c;多云还降低了被云厂商锁定的可能性&#xff0c;让企业避免过于依赖某个云厂商。 虽然多云的优势很多&#xff0c;但是管理多云 Kubernetes 的困难还是让人望而却步…

MCU自动化测量单元—峟思工程仪器仪表的智能助力

随着科技的不断发展&#xff0c;峟思工程仪器仪表在工程测量领域不断创新&#xff0c;其中MCU自动化测量单元作为一项颇具潜力的技术&#xff0c;正逐渐引起行业的广泛关注。MCU自动化测量单元作为峟思工程仪器仪表的重要组成部分&#xff0c;其应用带来了许多正面影响&#xf…

用右雅克比对旋转矩阵进行求导

考虑一个向量 a \bold{a} a对其进行旋转, 旋转用旋转矩阵 R \bold{R} R表示, 用朴素的倒数定义进行求导而不是用扰动模型, 我得到了这个过程与结果 和高博的新书结果 − R J r a ∧ -\bold{R}\bold{J}_{r}\bold{a}^{\wedge} −RJr​a∧结果不一样, 雅克比矩阵位置不同, 是不是…

神经网络结构搜索NAS

推荐课程&#xff1a;神经网络结构搜索 感谢博主ShusenWang提供的课程讲解&#xff01; 目录 1. 为什么要学习神经网络结构搜索NAS&#xff1f; 2. 什么是神经网络结构搜索NAS&#xff1f; &#xff08;1&#xff09;随机搜素Random Search 1. 为什么要学习神经网络结构搜…

位图的简单实现和使用

文章目录 1. 什么是位图2. 位图的简单实现3. 测试位图代码 1. 什么是位图 位图, 是一种非常常见的结构, 它使用每个二进制位来存放一个值的状态, 就类似于 Java 当中 HashSet 存储元素的功能. 在 Java 当中, 可以使用HashSet完成如下操作: add(T v): 添加一个元素到 HashSet…

算法:递归启蒙-汉诺塔

基本所有的讲递归的书和视频都会以汉诺塔作为开始&#xff0c;因为它足够经典 汉诺塔问题要求整个挪动的过程中都符合小压大的原则&#xff0c;就是如果同一个柱子上有超过1个的话&#xff0c;那必须下面是最大的&#xff0c;上面依次变小&#xff0c;不能出现大盘压小盘的情况…

Element Plus的Pagination 组件用法

5.2 Pagination 组件 分页组件通常与表格组件一同使用&#xff0c;在数据量很大的时候&#xff0c;通常不会在表格中一次性显示所有的数据&#xff0c;因为如果所有数据都展示在一个页面&#xff0c;数据量庞大&#xff0c;容易造成浏览器崩溃&#xff0c;就算数据可以完全展…

【CV2NLP】Chinese-Vicuna 中文小羊驼

学习一个短语&#xff01; gain proficiency in 熟练掌握 &#xff08;用我最爱的文心一言造个句子&#xff09; 最近羊驼家族百花齐放&#xff0c;赶紧学习一下 ChatBot 的背后细节。Chinese-Vicuna 中文小羊驼是基于 Vicuna 模型使用中文数据 LORA 方案来微调的一种中文对…

数值分析-牛顿-柯特斯公式的概念、推导与应用

目录 一、引言 二、牛顿-柯特斯公式的基本概念 三、牛顿-柯特斯公式的推导 四、牛顿-柯特斯公式的应用 五、牛顿-柯特斯公式的优缺点 六、总结 一、引言 数值分析是数学中的一个重要分支&#xff0c;它研究如何利用数值方法来解决实际问题。在数值分析中&#xff0c;牛顿…

Redux 学习系列(一) —— 基础概念入门篇

简介 Redux 是一个可预测的 JavaScript 应用状态管理容器&#xff0c;也可以说是一个应用数据流框架。 作用 Redux 主要是用作应用状态的管理。它抽离所有组件的状态&#xff0c;构造一个中心化的单独常量状态树&#xff08;对象&#xff09;来保存这一整个应用的状态。这棵…

Java经典笔试题—day02

Java经典笔试题—day02 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;排序子序列&#x1f95d;倒置字符串 &#x1f50e;结尾 &#x1f50e;选择题 (1)A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; A a0new A(…

HTTPS协议介绍

文章目录 一、HTTPS协议的认识二、常见的加密方式1.对称加密2.非对称加密 三、数据摘要四、HTTPS的工作过程探究1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密对称加密5.中间人攻击6.引入证书7.非对称加密对称加密证书认证 一、HTTPS协议的认识 HTTP…

【数据库】面试高频问题汇总及详细解答

【C语言部分】面试高频问题汇总及详细解答 【操作系统(Linux)】面试高频问题汇总及详细解答 【计算机网络】面试高频问题汇总及详细解答 本文目录 1. SQL1.1 介绍一下数据库分页1.2 介绍一下SQL中的聚合函数1.3 表跟表是怎么关联的1.4 说一说你对外连接的了解1.5 说说SQL中怎么…

VM虚拟机安装Ubuntu server 22.04网络问题

在使用vm虚拟机安装ubuntu server 22.04的时候会遇到一些网络问题&#xff0c;例如虚拟机内的Ubuntu不能上网&#xff0c;ping www.baidu.com不通&#xff0c;主机使用远程工具不能建立远程连接&#xff0c;Ubuntu ping本地主机不通&#xff0c;本地主机ping虚拟机也不通的问题…