云原生之深入解析Kubernetes集群内的服务通信机制

news2024/10/2 22:22:33

一、传统的服务到服务通信

  • 先了解一下支持服务间通信的 3 个原生 K8s 对象:ClusterIP Service、DNS 和 Kube-Proxy:

  • 在进入 Kubernetes 生态系统之前,快速了解一下传统的服务到服务通信:通信是通过 IP 地址进行的,因此为了让服务 A 调用服务 B,一种方法是为服务 B 分配一个静态 IP 地址。现在,服务 A 已经知道该 IP 地址(这在处理极少数服务时可能会起作用)或服务 B 使用域名注册自己,并且服务 A 通过 DNS 查找获取服务 B 的联系地址。

二、Kubernetes 网络模型

  • 现在在 Kubernetes 集群中,我们拥有构成集群管理组件和一组工作机器(称为节点)的控制平面,这些节点托管 Pod,这些 Pod 将后端微服务作为容器化服务运行:

  • 根据 Kubernetes 网络模型:
  1. 集群中的每个 pod 都有自己唯一的集群范围 IP 地址;
  2. 所有 pod 都可以与集群内的每个 pod 通信;
  3. 通信在没有 NAT 的情况下发生,这意味着目标 pod 可以看到源 pod 的真实 IP 地址。Kubernetes 认为容器网络或在其上运行的应用程序是可信的,不需要在网络级别进行身份验证。

三、ClusterIP 服务:基于 Pod 的抽象​​​​​​​

  • 既然集群中的每个 pod 都有自己的 IP 地址,那么一个 pod 与另一个 pod 通信应该很容易吧?不,因为 Pod 是易变的,每次创建 pod 时都会获得一个新的 IP 地址,因此客户端服务必须以某种方式切换到下一个可用的 pod:

  • Pod 直接相互交谈的问题是另一个目标 Pod 的短暂性(随时可能销毁),其次是发现新 Pod IP 地址,因此 Kubernetes 可以在一组 Pod 之上创建一个层,该层可以为该组提供单个 IP 地址并可以提供基本的负载平衡。

  • 通过持久 IP 地址上的 ClusterIP 服务公开的 Pod,客户端与服务对话,而不是直接与 Pod 对话。这种抽象是由 Kubernetes 中一个名为ClusterIP service的服务对象提供的,它在多个节点上产生,从而在集群中创建单个服务,它可以接收任何端口上的请求并将其转发到 pod 上的任何端口。因此,当应用服务 A 需要与服务 B 对话时,它会调用服务 B 对象的 ClusterIP 服务,而不是运行该服务的单个 pod。
  • ClusterIP 使用 Kubernetes 中标签和选择器的标准模式来不断扫描匹配选择标准的 pod。Pod 有标签,服务有选择器来查找标签,使用它可以进行基本的流量拆分,其中新旧版本的微服务在同一个 clusterIP 服务后共存。

四、CoreDNS 集群内的服务发现

  • 现在服务 B 已经获得了一个持久的 IP 地址,服务 A 仍然需要知道这个 IP 地址是什么,然后才能与服务 B 通信。Kubernetes 支持使用 CoreDNS 进行名称解析,服务 A 应该知道它需要与之通信的 ClusterIP 的名称(和端口)。

  • CoreDNS 扫描集群,每当创建 ClusterIP 服务时,它的条目就会添加到 DNS 服务器(如果已配置,它还会为每个 pod 添加一个条目,但它与服务到服务的通信无关)。
  • 接下来,CoreDNS 将自己暴露为 cluster IP 服务(默认称为 kube-dns),并且该服务被配置为 pod 中的 nameserver。发起请求的 Pod 从 DNS 获取 ClusterIP 服务的 IP 地址,然后可以使用 IP 地址和端口发起请求。

五、Kube-proxy 打通 Service 和后端 Pod 之间(DNAT)​​​​​​​

  • 到目前为止,从本文来看,似乎是 ClusterIP 服务将请求调用转发到后端 Pod。但实际上,它是由 Kube-proxy 完成的。
  • Kube-proxy 在每个节点上运行,并监视 Service 及其选择的 Pod(实际上是 Endpoint 对象)。
  1. 当节点上运行的 pod 向 ClusterIP 服务发出请求时,kube-proxy 会拦截它。
  2. 通过查看目的 IP 地址和端口,可以识别目的 ClusterIP 服务。并将此请求的目的地替换为实际 Pod 所在的端点地址。
  • ClusterIP Service、CoreDNS、客户端 Pod、Kube-Proxy、EndPoint的交互,如下所示:

  • 目标的 ClusterIP 服务在 CoreDNS 中注册;
  • DNS 解析:每个 pod 都有一个 resolve.conf 文件,其中包含 CoreDNS 服务的 IP 地址,pod 执行 DNS 查找。
  • Pod 使用它从 DNS 收到的 IP 地址和它已经知道的端口来调用 clusterIP 服务。
  • 目标地址转换:Kube-proxy 将目标 IP 地址更新为服务 B 的 Pod 可用的地址。

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

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

相关文章

数组对象深拷贝

多层嵌套的数组对象使用扩展运算符原数组依然被修改: let arr [{name:a,num:1,children:[{name:a1,num:1,},{name:a2,num:2,},{name:a3,num:3,}]},{name:b,num:1,children:[{name:b1,num:1,},{name:b2,num:2,}]}] let arr2 [...arr] arr2[0].children.splice(1,1…

5.MySQL基本查询

个人主页:Lei宝啊 愿所有美好如期而遇 目录 表的增删改查 Create 单行数据 全列插入 多行数据 指定列插入 插入否则更新 替换 Retrieve SELECT 列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 WHERE 条件 结果排序 筛…

xhadmin多应用Saas框架之超级SEO应用介绍

xhadmin是什么? xhadmin 是一套基于最新技术的研发的多应用 Saas 框架,支持在线升级和安装模块及模板,拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能,助力企业发展、国家富强,致力于…

香飘飘的想象空间:全面创新驱动外延与内涵双增长,未来可期

面对时常会发生代际更替的消费者主力群体,创新已经成为一种商业上的必须。 日前,香飘飘发布了三季报,数据显示,第三季度,香飘飘营业收入8.08亿元,同比增长20.41%。前三季度,香飘飘营收19.79亿元…

制药企业固体制剂设备管理及维护要点

在制药企业的生产过程中,固体制剂设备是至关重要的一环。有效管理和维护这些设备对于确保生产质量、提高生产效率以及延长设备寿命至关重要。本文将从以下三个方面介绍制药企业固体制剂设备的主要类型、常见管理问题以及设备维护的关键要点。 制药企业固体制剂设备主…

基于蝴蝶算法的无人机航迹规划-附代码

基于蝴蝶算法的无人机航迹规划 文章目录 基于蝴蝶算法的无人机航迹规划1.蝴蝶搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用蝴蝶算法来优化无人机航迹规划。 1.蝴蝶搜索算法 …

C# Winform编程(9)网络编程

网络编程 HTTP网络编程IPAddress IP地址类WebClient类WebRequest类和WebResponse类 WebBrowser网页浏览器控件TCP网络编程TcpClient类TcpListener类NetworkStream类Socket类 HTTP网络编程 IPAddress IP地址类 IPAddress类代表IP地址,可在十进制表示法和实际的整数…

springMVC 文件上传和下载

文章目录 1、文件下载2、文件上传 1、文件下载 使用ResponseEntity实现下载文件的功能 RequestMapping("/testDown") public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {//获取ServletContext对象ServletContext …

《深入浅出OCR》第四章:OCR文字识别

✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 👨‍💻面向对象: 本篇前言知识主要介绍深度学习知识,全面总结知知识…

细谈MySQL的一下经典问题(一)

在MySQL中INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别&#xff1f; 在MySQL中&#xff0c;INNER JOIN、LEFT JOIN&#xff08;或LEFT OUTER JOIN&#xff09;、RIGHT JOIN&#xff08;或RIGHT OUTER JOIN&#xff09;和 FULL JOIN&#xff08;或FULL OUTER JOI…

论文关键算法复现:基于CEEMDAN和MPE联合小波阈值的振动信号降噪方法

论文简介&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​ 基于CEEMDAN、多尺度排列熵和小波阈值的信号降噪方法结合了多种技术手段&#xff0c;可有效降低信号中的噪声。以下是该方法的步骤&#xff1a; 1. 使用CEEMDAN将原始信号分解为…

MyBatisPlus的使用【详细】

目录 Mybatis MybatisPlus特性 MybatisPlus的使用 常见注解 TableName TableId TableField MP常见配置 条件查询器Wrapper QueryWrapper UpdateWrapper LambdaQueryWrapper 自定义SQL Service接口 批量添加数据 MP的代码生成 MP静态工具 MP扩展功能之逻辑删除…

EPPlus库的安装和使用 C# 中 Excel的导入和导出

安装 工具栏->NuGet 包管理器->管理解决方案的NuGet程序包 安装到当前项目中 使用 将 DataGridView 数据导出为Excel 首先&#xff0c;需要将数据DataGridView对象转换为DataTable private void btnExport_Click(object sender, EventArgs e) {// 1.将当前页面的data…

SpringMVC 资源状态转移RESTful

文章目录 1、RESTful简介a>资源b>资源的表述c>状态转移 2、RESTful的实现HiddenHttpMethodFilterRESTful案例 1、RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c…

C++栈、队列、优先级队列模拟+仿函数

目录 一、栈的模拟和deque容器 1.deque 1.1deque结构 1.2deque优缺点 2.stack模拟 二、队列的模拟 三、priority_queue优先级队列 1.优先级队列模拟 2.添加仿函数 一、栈的模拟和deque容器 在之前&#xff0c;我们学过了C语言版本的栈&#xff0c;可以看这篇文章 栈和…

Qt私有信号实现(private signal)

在使用Qt信号槽机制的时候&#xff0c;有时候我们需要一个信号只能由类内发出&#xff0c;而不允许使用该类对象的用户发出&#xff0c;此时就需要私有信号的支持&#xff0c;而信号的关键字 signals&#xff0c;点进去它的实现&#xff0c;大概如下&#xff1a; signals:再次…

推荐-25个开源软件

今天&#xff0c;我想让您对下一个 25 个出色的开源软件。您可以安装它&#xff0c;并且几乎开箱即用&#xff01; ⚠️使用软件前请检查是否安全️️ 1. Portmaster (Go) — 隐私保护者 Portmaster 由 Safing 开发&#xff0c;是一款开源软件&#xff0c;可帮助您保护在线活…

PyTorch基础(18)-- torch.stack()方法

一、方法详解 首先&#xff0c;看一下stack的直观解释&#xff0c;动词可以简单理解为&#xff1a;把……放成一堆、把……放成一摞。 有了对stack方法的直观感受&#xff0c;接下来&#xff0c;我们正式解析torch.stack方法。 PyTorch torch.stack() method joins (concaten…

cookie过大导致request 400 错误研究

问&#xff1a;get请求太长报400的错误&#xff0c;如何解决&#xff1f;生成系统中经常偶现此问题 问&#xff1a;get请求URL的长度是谁限制的&#xff1f; 问&#xff1a;每一个cookie的value的大小还是同域下cookie的个数做的限制&#xff1f; 现象&#xff1a;出现 400 Ba…