k8s网络模型

news2024/11/26 8:34:36

前言

通过《Linux网络原理》我们已据备了一定的理论知识。k8s是怎么构建网络模型的呢?

基础知识

交换机和路由器都是网络中常见的设备,它们在网络通信中扮演不同的角色。

  • 交换机(Switch)是一种用于构建局域网(LAN)的网络设备,它可以将数据包从一个端口复制到另一个端口,以便在局域网上进行通信。交换机通常使用 MAC 地址来识别目标设备,并且在自己的 MAC 地址表中维护每个端口的 MAC 地址和对应的目标端口。交换机通过查找 MAC 地址表来确定数据包的最终目的地,并将其直接发送到该目的地,从而提高了局域网上的通信效率。

  • 路由器(Router)是一种用于连接多个网络(WAN/LAN)的网络设备,它可以将数据包从一个网络路由到另一个网络。路由器通常使用 IP 地址来识别目标网络,并且维护一个路由表,用于决定哪些数据包应该被路由到哪个网络。当路由器收到一个数据包时,它会根据目标 IP 地址和路由表将该数据包转发到正确的下一跳路由器或目标网络。

> route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.30.142.1    0.0.0.0         UG    0      0        0 eth0
172.30.128.0    172.30.142.1    255.255.240.0   UG    0      0        0 eth0
172.30.142.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

根据以上路由表的输出,可以得到以下信息:

  1. 没有明确的本地网络地址,因此默认路由(Destination 为 default)被设置为 172.30.142.1,并且标志为 UG,表示该路由为默认网关。
  2. 目标网络 172.30.128.0 和掩码 255.255.240.0 被设置为通过网关 172.30.142.1 访问(路由器)。
  3. 本地网络 172.30.142.0 和掩码 255.255.255.0 可以直接访问,无需使用网关(交换机)。
  1. 第二条通过网关走的基本上是路由器, 第三条直连接的是交换机
  2. 交换机是使用 MAC 地址来识别和转发数据包的。但是,如果要访问连接到交换机的主机,则需要使用 IP 地址来确定目标主机,并在本地网络配置中指定正确的 VLAN(虚拟局域网)或子网。具体来说,当计算机发送一个数据包时,它会将该数据包的目标 IP 地址封装在数据包的 IP 头部中。交换机会查看该数据包的目标 MAC 地址,并根据其 MAC 地址表来确定数据包应转发到哪个端口。当数据包到达目标端口时,目标主机会解开数据包并检查其 IP 头部中的目标 IP 地址。如果该 IP 地址与目标主机的 IP 地址匹配,则目标主机会接受该数据包并进行相应的处理。
  3. 路由表的构建,可以是手动,或者动态

路由转发模型

常见的路由三种转发模式 :

  1. NAT 地址转换模式:
    主机维护(私有IP+端口)(公有IP+ 端口)的映射关系,发送和接收数据包的时候转换
    通常用于将一个私有网络中的 IP 地址映射到公共网络中的单个公共 IP 地址

  2. DR 直接路由模式:
    创建一张虚拟网卡,和主机的交换机直接相连接
    当虚拟机发送数据包时,它会将源地址设置为虚拟网络适配器的私有 IP 地址,并将目标地址设置为目标计算机的公共 IP 地址。主机上的网络驱动程序将数据包从虚拟网络适配器读取并直接发送到外部网络,而无需进行额外的转发和映射。

  3. TUN 隧道模式
    在原来的IP数据包上面再根据自己的协议另一个IP数据包, 当送达到目标地址的时候,再解包处理。
    此方式安全性较高,相当建立一条点对点的隧道

单机容器网络模型

docker的默认网络模型,即veth pair设备 + 宿主机网桥
在这里插入图片描述

  1. docker0 可是网桥(交换机)
  2. vether 对设备, 可理解成网线直连接

如图,从Container1发送到Container2的数据包

  • 经过Container1中的eth0,到达docker0网桥,
  • docker0网桥经过二层转发,将数据包发送到Container2对应的端口

K8S网络模型

K8S有Flannel和Calico两种网络模型。

Flannel 网络模型

Flannel 是一个开源的网络解决方案,旨在为 Kubernetes 集群中的容器提供网络互通。它使用虚拟化技术来创建一个覆盖整个 Kubernetes 集群的扁平化网络,并支持多种后端驱动程序,如 VXLAN、Host-gw 和 UDP。

Flannel-UDP

与单机容器网络相比,这里新增了一个flannel0设备和flanneld进程。flannel0设备是一个TUN设备,它的作用非常简单,就是在系统内核和用户应用程序之间传包;flanneld进程的职责,就是封装和解封装。
在这里插入图片描述

  1. 数据包从Container-1,来到了网桥docker0上,由于数据包的目的地址不属于网桥的网段,所以数据包经由docker0网桥,出现在宿主机上。
  2. 在宿主机的路由表中,去往100.96.0.0/16网段的包经由flannel0处理。flannel0收到数据包之后,将数据包送到flanneld进程,flanneld进程会对数据包封装成一个UDP数据包,src和dst地址分别为两个容器对应的宿主机的地址。这样,数据包就可以到达Node2了。
  3. 数据包到达Node2的8285端口,即Node2上的flanneld进程,会被执行解封装操作,之后数据包被发送到TUN设备,即flannel0设备。剩下的事情就简单了,数据包经过docker0网桥到达Container-2。

Flannel-VXLAN

Flannel-UDP效率太低了,因为数据包每次经过flannel0设备,都会经过内核态-用户态-内核态的这一顿折腾。Flannel-VXLAN方案就解决了这个问题。Flannel-VXLAN方案用VXLAN技术替代了flannel0设备,让数据包能够在内核态上实现数据包的封装和解封装。
在这里插入图片描述

Flannel-host-gw

Flannel-VXLAN虽然效率提高了,但是还是用到了隧道技术,效率还是会受到影响。接下来我们继续探索Flannel-host-gw网络模型
在这里插入图片描述

  1. 后台有个flanneld进程,一直同步etcd的数据(主机等网络)到路由表中
  2. 当数据包从Container1到了cni0网桥之后,通过Host网络栈的路由表,发现去Container2的路已经指明,经由eth0,达到Node2(10.168.0.3/24)即可。
  3. 当数据包到了Node2之后,通过Host网络栈的路由表,找到cni0网桥,Container2自然也就找到了。

Calico模型

Calico 则是一种基于路由的网络模型。它利用 BGP 协议来自动管理节点之间的网络路由,并使用 IP 路由表来进行容器之间的通信。

Calico(非IPIP模式)

实际上Calico网络模型的解决方案,几乎和Flannel-host-gw是一样的。不同的是Flannel-host-gw使用etcd来维护主机的路由表,而Calico则使用BGP(边界网关协议)来维护主机的路由表。除了BGP之外,Calico另外一个不同之处就在于它不需要维护一个网桥
在这里插入图片描述

Calico(IPIP模式)

Calico(非IPIP)听着挺强大的,实则和Flannel-host-gw一样,只支持宿主机二层联通的情况。假设Container1和Container3的宿主机在不同的子网,那通过二层网络是无法将数据包传到下一跳的地址的。Calico的IPIP模式解决了上述问题,在每一台宿主机上,都会增加一个tunl0设备
在这里插入图片描述
Container1去往Container3的数据包就会经过tunl0设备的处理,tunl0设备会在源IP报头之外新增一个外部IP报头,拿本例来说,这个外部IP报头的src和dst分别为Node1和Node2的IP,这样,数据包就伪装成了从Node1发到Node2的数据包。当数据包到达Node2之后,Node2上的tunl0会把外部IP报头拿掉,从而拿到原始的IP包。

CNI网络插件

CNI(Container Network Interface)顾名思义,是K8S的网络接口。这个接口的作用就是当K8S的 kubelet创建Pod时,dockershim会预先调用Docker API创建并启动Infra容器,执行SetUpPod的方法。

就是当Pod创建时,需要对网络进行一些设置,包括前边的提到的创建对设备,把对设备的一端挂载到网桥上,添加Pod以及主机的Network Namespace的路由规则等

Flannel和Calico各自都有专门的CNI插件

主要参考

《深入剖析kubernetes》
《Linux 命令(120)—— route 命令》
《网络通信原理(三)路由转发模式NAT、DR和TUN》
《二十分钟了解K8S网络模型原理》

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

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

相关文章

11 - 守护进程深度分析

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录 1. 会话与终端的关联1.1 思考1.2 新会话关联控制终端的方法1.3 一些相关推论1.4 一些想法1.5 编程实验:会话与终端 2. 守护进程…

SpringSecurity自定义认证

一. 前言 ​ 学习了SpringSecurity的使用,以及跟着源码分析了一遍认证流程,掌握了这个登录认证流程,才能更方便我们做自定义操作。 ​ 下面我们来学习下怎么实现多种登录方式,比如新增加一种邮箱验证码登录的形式,但…

chatgpt赋能python:用Python建立Pipeline-优化你的数据处理流程

用Python建立Pipeline - 优化你的数据处理流程 如果你是一位数据科学家或是数据工程师,那么你一定知道数据处理流程的重要性。数据流程不只是数据的处理和清洗,还包括数据来源的获取以及对数据进行可视化、建模和验证。这个流程可以十分复杂&#xff0c…

solr快速上手:实现从mysql定时自动同步数据(六)

0. 引言 上一章节我们讲解了从msyql同步数据到solr,但是我们每次同步都需要在solr-admin中点击同步按钮,这在生产环境中肯定是不可行的,那么solr是否支持自动化同步了,答案当然是可以,我们今天继续来探索如何实现solr…

虚拟机安装和配置红帽企业版 7.4 操作系统及相关设置

虚拟机安装和配置红帽企业版 7.4 操作系统及相关设置 当安装红帽企业版 7.4 操作系统时,可以按照以下步骤进行配置和设置: 使用 VM16.0 安装软件,打开虚拟机管理程序,并选择创建新的虚拟机。在创建虚拟机的过程中,选…

ChatGPT在线网页版和接口

chat gpt能写公众号文章吗 ChatGPT是一种强大的自然语言生成技术,它可以用来自动生成大量的、质量较高的文本。根据OpenAI官方的演示和使用案例,ChatGPT已经被用于文本摘要、对话生成、语言翻译、文本分类等多种应用场景。 然而,ChatGPT作为…

文本三剑客之 awk

awk Linux/UNIX 系统中,awk 是一个功能强大的编辑工具。逐行读取输入文本 以空格作为分割符,多个空格他会自动压缩成一个空格 AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理. 1按照命令找指定…

用户档案PDF报表

用户档案PDF报表 理解数据填充的两种方式熟练构造分组报表 熟练构造Chart图形报表实现个人档案的PDF输出 数据填充 我们介绍了如何使用JasperReport来生成简单的文本报表,正式企业开发中动态数据展示也是报表中最重要的一 环,接下来我们共同研究的就是填…

FastCorrect:语音识别快速纠错模型丨RTC Dev Meetup

前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自百度、寰宇科技和依图的技术专家,围绕该话题进行了相关分享。 本文基于微软亚洲研究院主管研究…

chatgpt赋能python:Python应用图标的SEO优化策略

Python应用图标的SEO优化策略 作为一门跨平台解释型编程语言,Python已经成为越来越多企业和开发者的首选语言之一。在Python应用的推广过程中,图标的设计和SEO优化也变得越来越重要。在本文中,我们将探讨Python应用图标的SEO优化策略&#x…

CCE集群切换OBS共享存储方案

目录 一、背景 二、创建PVC 三、同步nfs数据到OBS 四、变更无状态负载数据储存为OBS 五、卸载弹性文件服务SFS(nfs) 一、背景 生产环境CEE集群,每个K8s节点挂载同一个华为云弹性文件服务SFS(可以简单的理解为nfs)。无状态应用通过hostPath…

chatgpt赋能python:Python就业岗位:行业热门,前景广阔

Python 就业岗位:行业热门,前景广阔 作为其中一门最受欢迎的编程语言,Python 经常出现在各个行业的招聘需求中。无论是大企业、初创公司,还是政府机构和非营利组织,都需要 Python 专业人士来应对日益增长的数据和技术…

chatgpt赋能python:Python库使用指南

Python库使用指南 Python是一种高级编程语言,拥有丰富而强大的标准库和第三方库。在本文中,将介绍一些主要Python库的使用方法以及如何通过使用它们来提高SEO。 Requests库 Requests是一个流行的第三方库,用于HTTP请求和响应。可以使用它来…

【内网安全-隧道搭建】内网穿透_Spp上线(全双工通信)

目录 Spp(特殊协议上线) 1、简述: 2、用法: 1、准备 2、服务器 3、客户机 4、cs、msf Spp(特殊协议上线) 1、简述: 1)支持的协议:tcp、udp、rudp(可靠…

基于动力学模型的无人驾驶车辆MPC轨迹跟踪算法及carsim+matlab联合仿真学习笔记

目录 1 模型推导及算法分析 1.1 模型推导 1.1.1 车辆动力学模型 1.1.2 线性时变预测模型推导 1.2 模型预测控制器设计 1.2.1 目标函数设计 1.2.2 约束设计 2 代码解析 2.1 模板框架 2.1.1 S-Function 2.1.2 mdlInitializeSizes函数 2.1.3 mdlUpdates()函数 2.1.4 …

机器学习中的数学原理——分类的正则化

通过这篇博客,你将清晰的明白什么是分类的正则化。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言&#xff01…

Go异步任务解决方案 Asynq

今天为大家介绍一个Go处理异步任务的解决方案:Asynq,是一个 Go 库,用于排队任务并与 worker 异步处理它们。它由Redis提供支持,旨在实现可扩展且易于上手。 一、概述 Asynq 是一个 Go 库,用于对任务进行排队并与工作人…

Python爬虫学习-简单爬取网页数据

疫情宅家无事,就随便写一些随笔吧QwQ… 这是一篇介绍如何用Python实现简单爬取网页数据并导入MySQL中的数据库的文章。主要用到BeautifulSoup requests 和 pymysql。 以网页https://jbk.39.net/mxyy/jbzs/为例,假设我们要爬取的部分数据如下图所示&#…

【板栗糖GIS】——如何下载哔哩哔哩的视频CC字幕为不带时间节点的纯文字

【板栗糖GIS】——如何下载哔哩哔哩的视频CC字幕为不带时间节点的纯文字 目录 1. 打开edge浏览器或谷歌浏览器 2. 安装油猴插件 3. 安装字幕插件 4. 打开哔哩哔哩视频播放页面,点击字幕 首先在想要下载之前需要先判定视频是否有云字幕,如果有才可以…

xxl-job详解

什么是xxl-job? ​ xxl-job是一个分布式的任务调度平台,其核心设计目标是:学习简单、开发迅速、轻量级、易扩展,现在已经开放源代码并接入多家公司的线上产品线,开箱即用。xxl是xxl-job的开发者大众点评的许雪里名称的…