【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式

2024-02-02 08:12

本文主要是介绍【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 1 Pod的IP地址的分配
      • 2 CNI
      • 3 Flannel
        • 3.1 Flannel的安装
        • 3.2 VxLan
        • 3.3 Host-GW
      • 4 总结

1 Pod的IP地址的分配

当节点上只安装了docker,则会用veth pair+docker0实现单个节点上容器之间的通信,并且这些容器都在同一个IP段,如果不修改,则默认为172.17.0.0/16,此时,docker0的ip就是网段的网关地址:172.17.0.1/16。那么,多个节点上的容器都在同一个网段,跨节点通信肯定会出现问题。

因此,在k8s集群中,对于网络而言,需要有以下准则:

集群中的每个Pod都有独立的IP地址,且不能出现冲突

集群中的Pod之间可以直接通过Pod IP进行通信,且不需要做地址转换

总的来说就是,集群中的Pod都会有自己的IP地址,且能够通过这个IP地址进行通信,就好像所有Pod都在同一个网络。

因此,第一个问题就是,如何给每个Pod分配一个不冲突的IP地址。

k8s的策略是:

整个集群在一个大的网段中,通常是一个16位的网段,kube-controller-manager的参数–cluster-cidr就是该网段

每个节点从集群的网段中取一个小的网段作为这个节点上所有Pod所在的网段,通常是一个24位的网段,node.spec.podCIDR可以看到该节点的Pod网段

每个Pod则从节点得到的网段中获取一个IP地址

这样就保证了所有Pod的IP都在一个大的网段中,并且不会冲突。

但是,如何让Pod之间可以通过Pod IP进行通信呢?这些IP毕竟是虚拟的,需要有一种机制能够实现Pod IP的相互通信。

2 CNI

CNI是容器网络接口的缩写,是K8S安装Pod网络的接口。

当kubelet创建Pod时,需要调用CNI接口为Pod安装网络:

分配Pod的IP

设置Pod的网络命名空间

配置Pod的路由

3 Flannel

Flannel是最简单也比较容易理解的一个网络插件。它的主要思想是将宿主机的网络作为隧道,将Pod之间通信的网络数据包封装为可以直接在宿主机上传输的数据包。由于Pod之间传输的数据包经过了底层网络的再封装和再解封装,可以知道,这种方式存在一定的性能损耗,不过,这种损耗在大部分场景下都是可以接受的,除非对性能要求非常高。

3.1 Flannel的安装

Flannel的yaml可以从官网直接下载安装,需要注意的有两个地方:

使用的flannel镜像如果无法下载,可以将镜像仓库修改为quay.mirrors.ustc.edu.cn

如果有需要可以调整Pod网段,默认的网段是10.244.0.0/16

3.2 VxLan

VxLan是一项用于在三层网络传输二层网络数据包的技术,只要底层的三层网络可达,就可以在三层网络之上建立二层网络,从而构建逻辑上的大二层网络。

在这里插入图片描述

上图就是两个node上的Pod之间通信的流程。

  • node0的网段是10.244.0.0/24,node1的网段是10.244.1.0/24
  • cni0是个网桥,网桥的IP地址是网段的网关,Pod中的容器通过veth pair接入到cni0,而机器上可以看到以veth开头的网卡
  • 当node0上的container1发送数据给node1上的container1时,发送端是知道目的端的IP地址的,由于目的IP不在当前网段,因此,会发送给cni0网桥
  • cni0网桥收到数据后,根据路由表将数据转发给flannel.1
  • flannel.1是一个vxlan的设备,VNI是1,本地地址是172.16.16.202,本地设备是eth0,目的端口是8472,也就是说,当flannel.1收到数据包后,就会将数据包封装到UDP数据包中,然后发送到对端的8472端口,问题是,flannel.1怎么知道目的IP在哪个宿主机上呢?不然,发出去的数据包如何根据宿主机网络路由到目的IP所在的宿主机呢?按照k8s的机制,是可以通过查询etcd根据目的IP的网段知道宿主机网络中的目的IP。
  • 由于目的端的网络子系统会监听8472,当node1收到数据后,flannel.1就会收到数据,然后将数据解封装后,根据路由交给cni0
  • cni0收到数据后,根据目的IP的mac地址转发给对应的容器
3.3 Host-GW

host-gw是直接走宿主机的网络,将对方的宿主机当做路由器进行转发。

在这里插入图片描述

  • Pod1向Pod3发送数据时,同样的,会通过veth pair将数据发送给cni0
  • cni0根据路由表将数据发送给Pod3所在的宿主机
  • Pod3所在的宿主机收到数据后,根据路由表将数据发送给cni0
  • cni0再根据目的IP转发给Pod3

这里指导数据包流向的就是宿主机上面的路由,对于我们这里的场景,宿主机上面的路由可能是:

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

第二条路由就是当前集群中的另一个节点,该节点的宿主机IP是192.168.80.241,网段是10.2440.0./24,因此,当cni0收到发往10.244.0.0/24网段的Pod的数据包时,会根据该路由将数据包发送给192.168.80.241,发出去的接口是ens33。

第四条路由就是当前节点的网段,当本机收到发往当前节点的Pod的数据包时,会根据该条路由将数据包发送给cni0,然后cni0就可以将数据包发送给目的Pod。

这种方式是直接将目的Pod的宿主机作为网关,不会对数据包进行额外的封装解封装,因此,这种模式的性能比较高,它的缺点是,宿主机必须在同一个网段中,所以,在云环境中可能需要其他的组件支持。

4 总结

Flannel作为k8s中广泛使用的网络插件,它的实现相对容易理解,它还提供了不同的模式,常用的是VxLan和Host-GW,由于Host-GW要求宿主机在同一个网段,使用受限,因此,最常用的还是VxLan。

这篇关于【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为