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

2023-08-18 10:43:01

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

  • Kubernetes 支持服务间通信的 3 个原生 k8s 对象分别为:ClusterIP Service、DNS 和 Kube-Proxy:

在这里插入图片描述

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

在这里插入图片描述

二、Kubernetes 网络模型

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

在这里插入图片描述

  • 根据 Kubernetes 网络模型:
    • 集群中的每个 pod 都有自己唯一的集群范围 IP 地址;
    • 所有 pod 都可以与集群内的每个 pod 通信;
    • 通信在没有 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 对象)。
  • 当节点上运行的 pod 向 ClusterIP 服务发出请求时,kube-proxy 会拦截它,通过查看目的 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 可用的地址。
更多推荐

前端JavaScript中requestAnimationFrame:优化动画和渲染的利器

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录引言1.requestAnimationFrame简介2.requestAnimationFrame的属性3.requestAnimationFrame的应用场景3.1动画效果3.2游戏开发3.3数据可视化3.

SpringBoot结合Vue.js+axios框架实现增删改查功能+网页端实时显示数据库数据(包括删除多条数据)

本文适用对象:已有基础的同学,知道基础的SpringBoot配置和Vue操作。在此基础上本文实现基于SpringBoot和Vue.js基础上的增删改查和数据回显、刷新等。一、实时显示数据库数据实现步骤:第1步:编写动态请求响应类:在启动类同父目录下创建controller包,在包下创建DataController类,添

Compose的一些小Tips - 可组合项的绘制

系列文章Compose的一些小Tips-可组合项的生命周期Compose的一些小Tips-可组合项的绘制(本文)Compose的一些小Tips-列表的优化前言本系列介绍Compose的一些常识,了解这些tips并不会让人摇身一变成为大佬,但可以帮助到一些学习Compose的安卓开发者避免一些误区,也是对Compose入

惯性动捕+数据手套,让“虚拟”触手可及

当今,虚拟现实技术已经从科幻电影走进现实生活。在数字化时代,惯性动作捕捉系统与数据手套的结合使用,带给我们全新的虚拟互动体验,使虚拟世界更能够“触手可及”。01惯性动作捕捉系统FOHEARTMAGIC是一款高性能的惯性动作捕捉系统。它由17个惯性传感器和数据接收器组成。每个惯性传感器都内置了三轴加速度计、三轴磁力计和三

【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

🤣爆笑教程👉《看表情包学Linux》👈猛戳订阅🔥💭写在前面:上一章我们讲解了inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困难。但我们讲完了文件系统再去理解软硬链接,你就会发现没有那么难,因为我们是从底

MyBatis 高级使用

文章目录动态SQL语句ifchoosetrimforeach批量操作批量插入批量更新批量删除BatchExecutor关联查询嵌套查询延迟加载分页操作逻辑分页物理分页MyBatisGenerator添加配置文件添加插件生成通用Mapper方式一方式二MyBatis-Plus动态SQL语句动态SQL是MyBatis的强大

DSI及DPHY的学习知识点

目录1.DPHY的输出差分clk是双沿有效2.LP和Escape这些低功耗传输是单端的3.ContentionDetection(竞争检测)4.双向data-lane,可以选择只支持双向HS或Escape5.传输数据和命令只能在HS和Esc的LPDT6.正向Esc必须支持ULPS和Triggers7.ULPS是什么样的

Unity——模拟AI视觉

人类的视觉系统有以下几个特点:距离有限。近处看得清,远处看不清容易被遮挡。不能穿过任何不透明的障碍物视野范围大约为90度。实现正前方信息丰富,具有色彩和细节;实现外侧的部分只有轮廓和运动信息注意力有限。当关注某个具体的方位或物体时,其他部分被忽略,如魔术中的障眼法总是能骗过观众对AI视觉的模拟就是基于以上这些基本特点,

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(三)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.数据预处理2.数据增强3.模型构建4.模型训练及保存1)模型训练2)模型保存5.模型评估相关其它博客工程源代码下载其它资料下载前言本项目依赖于Keras深度学习模型,旨在对手语进行分类和实时识别。为了实现这一目标,项目结合了OpenCV库的相关算法,用于捕捉手

c#扩展包-Stateless

准备Stateless是一个有限状态机扩展包。在c#项目中可以直接通过NuGet安装。使用他需要先用枚举写好你所有可能的状态和子状态。例如移动,下蹲,空闲,跳跃,游泳,奔跑,走路。其中,奔跑和走路是移动的子状态。然后需要写触发器。所有状态转换必须要一个触发器。所以你需要把所有的时机都精确描述,并且哪怕只有一个地方用到也

详细介绍Webpack5中的Plugin

Plugin的作用插件Plugin可以扩展webpack,加入自定义的构建行为,使webpack可以执行更广泛的任务,拥有更强的构建能力。Plugin的工作原理webpack就像一条生产线,要经过一系列处理流程后才能将源文件转换成输出结果。这条生产线上的每个处理流程的职责都是单一的,多个流程之间有存在依赖关系,只有完成

热文推荐