Kubernetes基础(十五)-k8s网络通信

1 k8s网络类型

2 Pod网络

2.1 同一pod内不同容器通信 

Pod是Kubernetes中最小的可部署单元,它是一个或多个紧密关联的容器的组合,这些容器共享同一个网络命名空间和存储卷,因此Pod中的所有容器都共享相同的网络命名空间和IP地址——PodIP,所以在同一个Pod内的容器间通信可以通过localhost直接通信

k8s创建Pod时永远都是首先创建Infra 容器,也可以被称为pause容器。这个容器为其他容器提供了一个共享的基础设施,包括网络和存储功能,其他业务容器共享pause容器的网络栈和Volume挂载卷。

pause 容器被创建后会初始化Network Namespace网络栈,之后其他容器就可以加入到pause 容器中共享Infra容器的网络了。而对于同一个 Pod 里面的所有用户容器来说,它们的进出流量,认为都是通过 pause 容器完成的。

pause 容器会创建并管理虚拟以太网(veth)接口。在容器启动之前,pause 容器会为每个容器创建一个虚拟以太网接口,一个保留在宿主机上(称为 vethxxx),另一个保留在容器网络命名空间内并重命名为 eth0,如下图所示。这两个虚拟接口的两端是连接在一起的,从一端进入的数据会从另一端出来。

pause容器主要为每个业务容器提供以下功能:

  • IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信。
  • 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围。
  • PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID。
  • UTS命名空间:Pod中的多个容器共享一个主机名;
  • Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volum

2.2 同一节点不同pod间相互通信

同一节点不同POD之间的通信是通过将容器网络接口(CNI)与主机网络命名空间中的虚拟以太网(veth)接口相连来实现的。 每生成一个新的Pod,那么在Node上都会根据插件来生成一个新的虚拟网卡如vethxxxx或者calixxxx,这个网卡会对应到Pod里的eth0。

如图,veth接口则被保留在主机的网络命名空间中,并被连接到CNI插件(如Flannel或Calico等)创建的虚拟网桥(如cni0或flannel0等)上。一旦这些veth接口被正确地连接起来,它们就可以进行通信了。当一个POD发送数据包时,数据包会通过其veth接口被发送到主机网络命名空间中的veth接口,然后该veth接口会将数据包发送到虚拟网桥上。虚拟网桥又会将数据包路由到目标POD的veth接口,最终将数据包发送到目标POD。

如图所示的ip地址与网桥网段,同一节点的不同POD的IP地址通常属于同一网段,并通过CNI插件连接到同一个虚拟网桥(如cni0)上。虚拟网桥会管理其IP地址空间和分配,确保不同POD的IP地址不会冲突。

具体的IP地址和网段取决于所使用的CNI插件和网络方案。例如Flannel插件默认使用10.244.x.0/24的网段,其中x是随机分配给每个POD的。这意味着不同POD的IP地址将位于10.244.x.0/24的网段中,其中x是不同的值。

CNI介绍见:Kubernetes基础(十一)-CNI网络插件用法和对比_k8s网络组件对比-CSDN博客 

2.3 不同节点pod相互通信

若不同节点pod想要相互通信,在cni0网桥外还有一层CNI插件配置的网络隧道,如上图新的虚拟网卡flannel0接收cni0网桥的数据,并通过维护路由表,对接收到的数据进行封包和转发(vxlan隧道)。

  • cni0:网桥设备,每创建一个pod都会创建一对 veth pair。其中一段是pod中的eth0,另一端是cni0网桥中的端口。
  • VTEP设备:、VXLAN Tunnel End Point(虚拟隧道端点),在Flannel中 VNI的默认值是1,这也是为什么宿主机的VTEP设备都叫flannel.1的原因。VTEP设备之间通过二层数据帧进行通信,源VTEP设备收到原始IP包后,在上面加上一个目的MAC地址,封装成一个内部数据帧,发送给目的VTEP设备。
  • flannel.1:vxlan网关设备,用户 vxlan 报文的解包和封包。不同的 pod 数据流量都从overlay设备以隧道的形式发送到对端。flannel.1不会发送arp请求去获取目标IP的mac地址,而是由Linuxkernel将一个"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。
  • 内部数据桢:并不能在宿主机的二层网络传输,Linux内核还需要把它进一步封装成为宿主机的一个普通的数据帧,承载着内部数据帧通过宿主机的eth0进行传输。
  • 容器跨网络通信解决方案:如果集群的主机在同一个子网内,则跳过flannel.1隧道,而是直接通过路由eth0转发过去;若不在一个子网内,就通过隧道转发过去。

3 Service网络

3.1 ClusterIp

在Kubernetes中,Pod是非持久性的资源,可以按照需要创建和销毁。当使用Deployment来运行应用时,可以根据需要动态地创建或销毁Pod,实现水平扩缩容。

当引入Deployment,并为Pod设置多个副本时,那么某一个服务就会有多个pod及多个podIp,此时即使知道了这些Pod的IP,那访问起来也并不方便。此外,Pod的IP地址是动态分配的,可能发生变化,所以在实际通信中,直接使用Pod的IP地址进行通信会有一些问题。为了解决这个问题,Kubernetes引入了Service的概念。

所以,这里需要有一个统一入口,其它Pod通过这个统一入口去请求该服务(Nginx)对应的所有Pod。这时就有了Service这个资源对象,它主要作用就是用来提供统一入口,也就是说只需要一个IP就能访问所有的Pod,而这个入口IP就是ClusterIP,也就是Service的IP。

Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,但Cluster IP是一个完全虚拟的IP,没有网络设备与其对应。

  • Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配P地址
  • Cluster IP无法被ping,他没有一个“实体网络对象”来响应
  • Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。
  • 虚拟 ip 是固定的,这也是service可以解决pod动态ip的原因

Service是一种持久性资源,它可以提供一个或多个端点(Endpoint),并通过标签选择器选择指向集群中的一组Pod。Service使用ClusterIP来提供内部集群的网络连接,ClusterIP是固定的虚拟ip,这样就可以通过Service来访问Pod,而不需要直接使用Pod的动态IP地址。当创建一个Deployment并运行应用时,通常会创建一个或多个Service来提供访问Pod的接口。这样,即使Pod的IP地址发生变化,通过Service的端点仍然可以访问到Pod,以确保集群内的可靠通信,并避免因Pod的动态变化而引起的问题。

K8s通过在引入一层Service抽象,还能解决以下问题:

  • 服务发现:Service提供统一的ClusterIP来解决服务发现问题,Client只需通过ClusterIP就可以访问App的Pod集群,不需要关心集群中的具体Pod数量和PodIP,即使是PodIP发生变化也会被ClusterIP所屏蔽。注意,这里的ClusterIP实际是个虚拟IP,也称Virtual IP(VIP)。
  • 负载均衡:Service抽象层具有负载均衡的能力,支持以不同策略去访问App集群中的不同Pod实例,以实现负载分摊和HA高可用。K8s中默认的负载均衡策略是RoundRobin,也可以定制其它复杂策略。

Service在上述K8s集群中被画成一个独立组件,实际是没有独立Service这样一个组件的,只是一个抽象概念。

4 外部访问内部集群

参考:Kubernetes基础(三)-Service外部网络访问方式_k8s网络访问外部网络-CSDN博客 

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

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

相关文章

web 前端实现一个根据域名的判断 来显示不同的logo 和不同的标题

1.需求 有可能我做一个后台 web端 我想实现一套代码的逻辑 显示不同的公司主题logo以及内容,但是实际上 业务逻辑一样 2.实现 建一个store oem.ts 这个名为是 oem系统 oem.ts import { defineStore } from pinia;import { store } from /store;const oemDataLis…

Vue中v-on 可以监听多个方法吗

当然可以!Vue.js是一款非常强大的JavaScript库,它提供了很多方便的方法和指令,使我们可以更容易地构建交互式的Web应用程序。其中,v-on指令是Vue.js中一个非常重要也非常常用的指令,它用于监听DOM事件,并在…

质数基础筛法

文章目录 埃氏筛线性筛 埃氏筛 埃氏筛是一种筛素数的方法&#xff0c;埃氏筛的思想很重要&#xff0c;主要是时间复杂度 朴素的埃氏筛的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn) 这个复杂度是调和级数 vector<int>p; int vis[N];void solve() {rep(i,2,n){if(…

07-Java桥接模式 ( Bridge Pattern )

Java桥接模式 摘要实现范例 桥接模式&#xff08;Bridge Pattern&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化 桥接模式涉及到一个作为桥接的接口&#xff0c;使得实体类的功能独立于接口实现类&#xff0c;这两种类型的类可被结构化改变而互不影…

【知识整理】管理即服务,识人、识己

1. 背景 一个人的力量是有限的&#xff0c;如何规模化生产&#xff0c;人员的规模化组织&#xff0c;如何提升合作的规模和效率。 管理的本质&#xff1a; 1、服务他人&#xff1f; 2、激发主动性&#xff1f; 3、氛围宽松&#xff1f; 上面是理念&#xff0c; 1、那如何…

计划任务功能优化,应用商店上架软件超过100款,1Panel开源面板v1.9.6发布

2024年2月7日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.6版本。 在v1.9.5和v1.9.6这两个小版本中&#xff0c;1Panel针对计划任务等功能进行了多项优化和Bug修复。此外&#xff0c;1Panel应用商店新增了3款应用&#xff0c;上架精选软件应用超过1…

Python解决SSL不可用问题

参考&#xff1a;https://blog.csdn.net/weixin_44894162/article/details/126342591 一、问题描述&#xff1a; 报错概述&#xff1a; WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. ## 警告:pip配…

酷开科技AIGC技术:重塑多媒体内容与交互体验

在当今数字媒体时代&#xff0c;酷开科技以其智能的AIGC技术&#xff0c;正在引领一场多媒体内容与交互体验的革新。AIGC&#xff0c;即人工智能、物联网、云计算和大数据的结合&#xff0c;是酷开科技的核心技术&#xff0c;为各类终端设备提供了强大的智能化支持。 酷开科技…

编码技巧——在项目中使用Alibaba Cloud Toolkit远程部署

背景 在新公司项目开发&#xff0c;当前项目为自建项目&#xff0c;意思是从开发到运维都需要自己负责&#xff0c;远程的服务器也是自己搭建的win操作系统&#xff1b; 之前在大厂工作时&#xff0c;一般提交代码之后&#xff0c;CICD流水线会自动的执行最新代码的拉取、构建打…

【Java多线程案例】单例模式

1. 单例模式概念 设计模式&#xff1a;谈到单例模式&#xff0c;我们首先需要知道什么是设计模式&#xff0c;设计模式是软件工程中的一大重要概念&#xff0c;是被广泛认可并使用于解决特定实际问题的代码设计经验&#xff0c;校招中常考的设计模式有单例模式、工厂模式 等&a…

asp.net core 依赖注入 实例化对象实例

在面向对象编程中&#xff0c;推荐使用面向接口编程&#xff0c;这样我们的代码就依赖于服务接口&#xff0c;而不是依赖于实现类&#xff0c;可以实现代码解耦。 名称解释&#xff1a; 我们把负责提供对象的注册和 获取功能的框架叫作“容器”&#xff0c; 注册到容器中的对象…

CMS 检测神器:CMSeek 保姆级教程(附链接)

一、介绍 CMSeek&#xff08;Content Management System Exploitation and Enumeration Toolkit&#xff09;是一款用于检测和利用网站上可能存在的内容管理系统&#xff08;CMS&#xff09;漏洞的开源工具。它旨在帮助安全研究人员和渗透测试人员识别目标网站所使用的CMS&…

服务器安装Docker (centOS)

1. 卸载旧版本的Docker&#xff08;如果有&#xff09; 首先&#xff0c;如果您的系统上安装了旧版本的Docker&#xff0c;需要将其卸载。Docker的旧版本称为docker或docker-engine。使用以下命令来卸载旧版本&#xff1a; sudo yum remove docker \ docker-client \ docker-…

2024牛客寒假算法基础集训营2部分题解

Tokitsukaze and Bracelet 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 《绯染天空》是一款由 key 社与飞机社共同开发的角色扮演游戏&#xff0c;剧情内容由著名的剧本作家麻枝准编写。它是一款氪金手游&#xff0c;但也有 st…

成为CSDN博客优质创作者或者博客专家吧

成为CSDN博客优质创作者或者博客专家吧 文章目录 成为CSDN博客优质创作者或者博客专家吧一、前言二、如何成为CSDN的博客专家1、2009年的要求和申请方式2、最新的CSDN博客专家要求和申请方式3、创作者身份认证4、CSDN所有认证的介绍 三、写博客的好处1、比较官方的说法&#xf…

Nacos1.X源码解读(待完善)

目录 下载源码 注册服务 客户端注册流程 注册接口API 服务端处理注册请求 设计亮点 服务端流程图 下载源码 1. 克隆git地址到本地 # 下载nacos源码 git clone https://github.com/alibaba/nacos.git 2. 切换分支到1.4.7, maven编译(3.5.1) 3. 找到启动类com.alibaba.na…

波卡 2023 四季度报告:开发者数量位列加密生态前三,五项新技术将于今年发布

作者&#xff1a;Nicholas Garcia&#xff5c;Messari 研究分析师 编译&#xff1a;OneBlock 原文&#xff1a;https://messari.io/report/state-of-polkadot-q4-2023?utm_mediumorganic_social&utm_sourcetwitter_messari&utm_campaignstate_of_polkadot_q4_2023 …

RabbitMQ的延迟队列实现[死信队列](笔记二)

上一篇已经讲述了实现死信队列的rabbitMQ服务配置&#xff0c;可以点击: RabbitMQ的延迟队列实现(笔记一) 目录 搭建一个新的springboot项目模仿订单延迟支付过期操作启动项目进行测试 搭建一个新的springboot项目 1.相关核心依赖如下 <dependency><groupId>org.…

13. UE5 RPG限制Attribute的值的范围以及生成结构体

前面几章&#xff0c;我们实现了通过GameplayEffect对Attribute值的修改&#xff0c;比如血量和蓝量&#xff0c;我们都是有一个最大血量和最大蓝量去限制它的最大值&#xff0c;而且血量和蓝量最小值不会小于零。之前我们是没有实现相关限制的&#xff0c;接下来&#xff0c;我…

小白水平理解面试经典题目LeetCode 71. Simplify Path【Stack类】

71. 简化路径 小白渣翻译 给定一个字符串 path &#xff0c;它是 Unix 风格文件系统中文件或目录的绝对路径&#xff08;以斜杠 ‘/’ 开头&#xff09;&#xff0c;将其转换为简化的规范路径。 在 Unix 风格的文件系统中&#xff0c;句点 ‘.’ 指的是当前目录&#xff0c;…