返回顶部
首页 > 资讯 > 精选 >深入解读Service Mesh 背后的技术细节
  • 805
分享到

深入解读Service Mesh 背后的技术细节

2023-06-04 17:06:30 805人浏览 八月长安
摘要

【本文转自微信公众号:刘超的通俗云计算】在kubernetes称为容器编排的标准之后,Service Mesh开始火了起来,但是很多文章讲概念的多,讲技术细节的少,所以专门写一篇文章,来解析Service Mesh背后的技术细节。  一、S

【本文转自微信公众号:刘超的通俗云计算
kubernetes称为容器编排的标准之后,Service Mesh开始火了起来,但是很多文章讲概念的多,讲技术细节的少,所以专门写一篇文章,来解析Service Mesh背后的技术细节。

  一、Service Mesh是Kubernetes支撑微服务能力拼图的最后一块

  在上一篇文章为什么 kubernetes 天然适合微服务中我们提到,Kubernetes是一个奇葩所在,他的组件复杂,概念复杂,在没有实施微服务之前,你可能会觉得为什么Kubernetes要设计的这么复杂,但是一旦你要实施微服务,你会发现Kubernetes中的所有概念,都是有用的。

深入解读Service Mesh 背后的技术细节

  在我们微服务设计的是个要点中,我们会发现Kubernetes都能够有相应的组件和概念,提供相应的支持。

  其中最后的一块拼图就是服务发现,与熔断限流降级。

  众所周知,Kubernetes的服务发现是通过Service来实现的,服务之间的转发是通过kube-proxy下发iptables规则来实现的,这个只能实现最基本的服务发现和转发能力,不能满足高并发应用下的高级的服务特性,比较SpringClouddubbo有一定的差距,于是Service Mesh诞生了,他期望讲熔断,限流,降级等特性,从应用层,下沉到基础设施层去实现,从而使得Kubernetes和容器全面接管微服务。

  二、以Istio为例讲述Service Mesh中的技术关键点

深入解读Service Mesh 背后的技术细节

  就如SDN一样,Service Mesh将服务请求的转发分为控制面和数据面,因而分析他,也是从数据面先分析转发的能力,然后再分析控制面如何下发命令。今天这篇文章重点讲述两个组件Envoy和Pilot

  一切从Envoy开始

  我们首先来看,如果没有融入Service Mesh,Envoy本身能够做什么事情呢?

  Envoy是一个高性能的c++写的proxy转发器,那Envoy如何转发请求呢?需要定一些规则,然后按照这些规则进行转发。

  规则可以是静态的,放在配置文件中的,启动的时候加载,要想重新加载,一般需要重新启动,但是Envoy支持热加载和热重启,一定程度上缓解了这个问题。

  当然最好的方式是规则设置为动态的,放在统一的地方维护,这个统一的地方在Envoy眼中看来称为Discovery Service,过一段时间去这里拿一下配置,就修改了转发策略。

  无论是静态的,还是动态的,在配置里面往往会配置四个东西。

深入解读Service Mesh 背后的技术细节

  一是listener,也即envoy既然是proxy,专门做转发,就得监听一个端口,接入请求,然后才能够根据策略转发,这个监听的端口称为listener

  二是endpoint,是目标的ip地址和端口,这个是proxy最终将请求转发到的地方。

  三是cluster,一个cluster是具有完全相同行为的多个endpoint,也即如果有三个容器在运行,就会有三个IP和端口,但是部署的是完全相同的三个服务,他们组成一个Cluster,从cluster到endpoint的过程称为负载均衡,可以轮询等。

  四是route,有时候多个cluster具有类似的功能,但是是不同的版本号,可以通过route规则,选择将请求路由到某一个版本号,也即某一个cluster。

  这四个的静态配置的例子如下:

深入解读Service Mesh 背后的技术细节

  如图所示,listener被配置为监听本地127.0.0.1的10000接口,route配置为某个url的前缀转发到哪个cluster,cluster里面配置负载均衡策略,hosts里面是所有的endpoint。

  如果你想简单的将envoy使用起来,不用什么service mesh,一个进程,加上这个配置文件,就可以了,就能够转发请求了。

  对于动态配置,也应该配置发现中心,也即Discovery Service,对于上述四种配置,各对应相应的DS,所以有LDS, RDS, CDS, EDS。

  动态配置的例子如下:

深入解读Service Mesh 背后的技术细节

  控制面Pilot的工作模式

  数据面envoy可以通过加装静态配置文件的方式运行,而动态信息,需要从Discovery Service去拿。

  Discovery Service就是部署在控制面的,在Istio中,是Pilot。

深入解读Service Mesh 背后的技术细节

  如图为Pilot的架构,最下面一层是envoy的api,就是提供Discovery Service的API,这个API的规则由envoy定,但是不是Pilot调用Envoy,而是Envoy去主动调用Pilot的这个API。

  Pilot最上面一层称为PlatfORM Adapter,这一层是干什么的呢?这一层不是Kubernetes, Mesos调用Pilot,而是Pilot通过调用Kubernetes来发现服务之间的关系。

  这是理解Istio比较绕的一个点。也即pilot使用Kubernetes的Service,仅仅使用它的服务发现功能,而不使用它的转发功能,pilot通过在kubernetes里面注册一个controller来监听事件,从而获取Service和Kubernetes的Endpoint以及Pod的关系,但是在转发层面,就不会再使用kube-proxy根据service下发的iptables规则进行转发了,而是将这些映射关系转换成为pilot自己的转发模型,下发到envoy进行转发,envoy不会使用kube-proxy的那些iptables规则。这样就把控制面和数据面彻底分离开来,服务之间的相互关系是管理面的事情,不要和真正的转发绑定在一起,而是绕到pilot后方。

  Pilot另外一个对外的接口是Rules API,这是给管理员的接口,管理员通过这个接口设定一些规则,这些规则往往是应用于Routes, Clusters, Endpoints的,而都有哪些Clusters和Endpoints,是由Platform Adapter这面通过服务发现得到的。

  自动发现的这些Clusters和Endpoints,外加管理员设置的规则,形成了Pilot的数据模型,其实就是他自己定义的一系列数据结构,然后通过envoy API暴露出去,等待envoy去拉取这些规则。

深入解读Service Mesh 背后的技术细节

  常见的一种人工规则是Routes,通过服务发现,Pilot可以从Kubernetes那里知道Service B有两个版本,一般是两个Deployment,属于同一个Service,管理员通过调用Pilot的Rules API,来设置两个版本之间的Route规则,一个占99%的流量,一个占1%的流量,这两方面信息形成Pilot的数据结构模型,然后通过Envoy API下发,Envoy就会根据这个规则设置转发策略了。

深入解读Service Mesh 背后的技术细节

  另一个常用的场景就是负载均衡,Pilot通过Kubernetes的Service发现Service B包含一个Deployment,但是有三个副本,于是通过Envoy API下发规则,使得Envoy在这三个副本之间进行负载均衡,而非通过Kubernetes本身Service的负载均衡机制。

  三、以Istio为例解析Service Mesh的技术细节

  了解了Service Mesh的大概原理,接下来我们通过一个例子来解析其中的技术细节。

  凡是试验过Istio的同学都应该尝试过下面这个BookInfo的例子,不很复杂,但是麻雀虽小五脏俱全。

深入解读Service Mesh 背后的技术细节

  在这个例子中,我们重点关注ProductPage这个服务,对Reviews服务的调用,这里涉及到路由策略和负载均衡。

  Productpage就是个python程序

  productpage是一个简单的用Python写的提供restful API的程序。

深入解读Service Mesh 背后的技术细节

  在里面定义了很多的route,来接收API请求,并做相应的操作。

  在需要请求其他服务,例如reviews, ratings的时候,则需要向后方发起restful调用。

深入解读Service Mesh 背后的技术细节

  从代码可以看出,productpage对于后端的调用,都是通过域名来的。

  对于productpage这个程序来讲,他觉得很简单,通过这个域名就可以调用了,既不需要通过服务发现系统获取这个域名,也不需要关心转发,更意识不到自己是部署在kubernetes上的,是否用了service mesh,所以服务之间的通信完全交给了基础设施层。

  通过Kubernetes编排productpage

  有了productpage程序,接下来就是将他部署到kubernetes上,这里没有什么特殊的,用的就是kubernetes默认的编排文件。

深入解读Service Mesh 背后的技术细节

  首先定义了一个Deployment,使用bookinfo的容器镜像,然后定义一个Service,用于这个Deployment的服务发现。

  通过Kubernetes编排reviews

深入解读Service Mesh 背后的技术细节

  这个稍微有些复杂,定义了三个Deployment,但是版本号分别为V1, V2, V3,但是label都是app: reviews。

  最后定义了一个Service,对应的label是app: reviews,作为这三个Deployment的服务发现。

  istioctl对productpage进行定制化之一:嵌入proxy_init作为InitContainer到目前为止,一切正常,接下来就是见证奇迹的时刻,也即istio有个工具istioctl可以对于yaml文件进行定制化

  定制化的第一项就是添加了一个initContainer,这种类型的container可以做一些初始化的工作后,成功退出,kubernetes不会保持他长期运行。

深入解读Service Mesh 背后的技术细节

  在这个InitContainer里面做什么事情呢?

  我们登录进去发现,在这个InitContainer里面运行了一个shell脚本。

深入解读Service Mesh 背后的技术细节

  就是这个shell脚本在容器里面写入了大量的iptables规则。

  首先定义的一条规则是ISTIO_REDIRECT转发链,这条链不分三七二十一,都将网络包转发给envoy的15000端口。

  但是一开始这条链没有被挂到iptables默认的几条链中,所以不起作用。

  接下来就是在PREROUTING规则中,使用这个转发链,从而进入容器的所有流量,都被先转发到envoy的15000端口。

  envoy作为一个代理,已经被配置好了,将请求转发给productpage程序。

  productpage程序接受到请求,会转向调用外部的reviews或者ratings,从上面的分析我们知道,productpage只是做普通的域名调用。

  当productpage往后端进行调用的时候,就碰到了output链,这个链会使用转发链,将所有出容器的请求都转发到envoy的15000端口。

  这样无论是入口的流量,还是出口的流量,全部用envoy做成了汉堡包。

  envoy根据服务发现的配置,知道reviews或者ratings如何访问,于是做最终的对外调用。

  这个时候iptables规则会对从envoy出去的流量做一个特殊处理,允许他发出去,不再使用上面的output规则。

  istioctl对productpage进行定制化之二:嵌入proxy容器作为sidecar

  istioctl做的第二项定制化是,嵌入proxy容器作为sidecar。

深入解读Service Mesh 背后的技术细节

  这个似乎看起来更加复杂,但是进入容器我们可以看到,启动了两个进程。

深入解读Service Mesh 背后的技术细节

  一个是我们熟悉的envoy,他有一个配置文件是/etc/istio/proxy/envoy-rev0.JSON

  我们再前面讲述envoy的时候说过,有了配置文件,envoy就能够转发了,我们先来看看配置文件里面都有啥。

深入解读Service Mesh 背后的技术细节

  在这里面配置了envoy的管理端口,等一下我们会通过这个端口查看envoy被pilot下发了哪些转发策略。

  然后就是动态资源,也即从各种discovery service去拿转发策略。

  还有就是静态资源,也即静态配置的,需要重启才能加载的。

深入解读Service Mesh 背后的技术细节

  这就是pilot-agent的作用,他是envoy的一个简单的管理器,因为有些静态资源,如果TLS的证书,envoy还不支持动态下发,因而需要重新静态配置,然后pilot-agent负责将envoy进行热重启加载。

  好在envoy有良好的热重启机制,重启的时候,会先启动一个备用进程,将转发的统计数据通过shared memory在两个进程间共享。

  深入解析pilot的工作机制

深入解读Service Mesh 背后的技术细节

  Pilot的工作机制展开后如图所示。

  istio config是管理员通过管理接口下发的转发规则。

  Service Discovery模块对于Kubernetes来讲,就是创建了一个controller来监听Service创建和删除的事件,当service有变化时,会通知pilot,pilot会根据变化更新下发给envoy的规则。

  pilot将管理员输入的转发策略配置和服务发现的当前状态,变成pilot自己的数据结构模型,然后暴露成envoy的api,由于是envoy来调用,因而要实现一个服务端,这里有lds, rds, cds, eds。

  接下来我们看,在pilot上配置route之后会发生什么?

深入解读Service Mesh 背后的技术细节

  如图,我们将所有的流量都发给版本1。

深入解读Service Mesh 背后的技术细节

  我们查看envoy的管理端口,可以看到只配置了reviews的v1。

深入解读Service Mesh 背后的技术细节

  当我们修改路由为v1和v3比例是五十比五十。

深入解读Service Mesh 背后的技术细节

  可以看到envoy的管理端口,路由有了两个版本的配置,也对应后端的两个ip地址。

--结束END--

本文标题: 深入解读Service Mesh 背后的技术细节

本文链接: https://lsjlt.com/news/238687.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 深入解读Service Mesh 背后的技术细节
    【本文转自微信公众号:刘超的通俗云计算】在Kubernetes称为容器编排的标准之后,Service Mesh开始火了起来,但是很多文章讲概念的多,讲技术细节的少,所以专门写一篇文章,来解析Service Mesh背后的技术细节。  一、S...
    99+
    2023-06-04
  • PHP Mail 详细解读:深入了解邮件发送的技术细节
    PHP是一种流行的服务器端脚本语言,广泛用于Web开发。邮件发送是Web应用程序中常见的功能之一,如何使用PHP来发送邮件是开发人员需要掌握的技能。本文将深入解读PHP中的邮件发送功能...
    99+
    2024-04-02
  • 深挖谷歌 DeepMind 和它背后的技术
    作者 | James Murphy译者 | 天道酬勤 责编 | Carol出品 | AI科技大本营(ID:rgznai100)人工智能(AI)的子集已经成倍增长,并完成了只有人类才能完成的各种任务。像...
    99+
    2023-06-05
  • HTML 列表标签背后的技术:深入了解其工作原理
    HTML 列表标签是用来组织和显示不同类型内容的强大工具。其工作原理涉及使用标记语言将数据结构转化为可视化的格式,从而在网页上呈现清晰有序的信息。 有序列表 元素 有序列表()由数字或字母标记的项目组成。每个项目由 元素表示,其中列表...
    99+
    2024-04-02
  • 深入研究:Go语言项目开发的技术细节
    深入研究:Go语言项目开发的技术细节Go语言(又称Golang)是谷歌公司推出的一种编程语言,它以简洁高效、并发安全、内存管理自动化等特点受到广泛关注和使用。在近年来,Go语言在用户界面开发、网络编程、分布式系统等领域都呈现出强大的优势。本...
    99+
    2023-11-02
    Go语言 项目开发 技术细节
  • 深入探索Go语言项目开发的技术细节
    深入探索Go语言项目开发的技术细节引言:随着互联网的迅速发展,Go语言作为一门新兴的编程语言,越来越受到开发者的关注和喜爱。Go语言以其简洁、高效、并发安全的特性,成为了众多开发者的首选。在本文中,我们将深入探索Go语言项目开发的技术细节,...
    99+
    2023-11-04
    技术细节 深入探索 Go语言项目开发
  • HTML5 多媒体解析:深入了解视频和音频 API 的技术细节
    元素:用于在 HTML 文档中嵌入视频,提供播放、暂停、音量控制和全屏等功能。 Video API:提供对 元素的 JavaScript 控制,允许开发人员访问播放状态、时间、视频尺寸和字幕。 Web Media Extension...
    99+
    2024-03-14
    视频与音频API
  • JavaScript throw 语句:深度解析背后的艺术
    简介 JavaScript 中的 throw 语句是一种强有力的工具,可用于抛出异常。掌握 throw 语句的艺术可以显著提高代码的可靠性和健壮性。本文将深入探讨 throw 语句,分享最佳实践和演示代码示例,帮助开发者充分利用其优势。 ...
    99+
    2024-03-01
    JavaScript、throw、异常处理、错误处理
  • PHP GraphQL 深度解析:探究它的工作原理和技术细节
    GraphQL 的工作原理 GraphQL 的工作原理可以概括为以下几个步骤: 客户端发送一个 GraphQL 查询请求到服务器。 服务器接收请求并解析查询。 服务器执行查询并从后端数据源中获取数据。 服务器将查询结果以 JSON 格式...
    99+
    2024-02-07
    GraphQL PHP GraphQL PHP API 查询语言 数据查询
  • 【社区图书馆】《深入理解高并发编程:JDK核心技术》读后感
    作者简介         首先要隆重介绍的肯定是《深入理解高并发编程:JDK核心技术》的作者:冰河,作为互联网资深技术专家、数据库技术专家、分布式与微服务架构专家。他多年来一直致力于分布式系统架构、微服务、分布式数据库、分布式事务与大数据技...
    99+
    2023-08-31
    java sdkman 极限编程
  • Java深入理解代码块的使用细节
    目录1.基本介绍基本语法快速入门2.代码块细节类的调用顺序实例代码块细节2实例代码块细节2实例1.基本介绍 代码块又称为初始化块,属于类中的成员(类的一部分),类似于方法,讲逻辑语句...
    99+
    2024-04-02
  • PHP 多语言支持的幕后故事:了解背后的技术
    PHP 是一种服务器端脚本语言,广泛用于构建动态网站和网络应用程序。为了满足跨语言和文化环境的需求,PHP 提供了强大的多语言支持功能。 gettext:国际化和本地化框架 PHP 使用 gettext 框架来实现多语言支持。gettex...
    99+
    2024-04-02
  • 你需要了解的 Go 函数开发技术细节!
    Go 作为一种高效、可靠和简单的编程语言,已经成为了许多开发人员的首选。在 Go 中,函数是编写代码的基本单元,因此,熟悉 Go 函数开发技术细节对于开发人员来说非常重要。在本文中,我们将深入探讨 Go 函数的一些重要技术细节,并提供一些演...
    99+
    2023-08-19
    函数 开发技术 学习笔记
  • Mysql技术内幕之InnoDB锁的深入讲解
    前言 自7月份换工作以来,期间一直在学习MySQL的相关知识,听了一些视频课,但是一直好奇那些讲师的知识是从哪里学习的。于是想着从书籍中找答案。毕竟一直 看视频也不是办法,不能形成自己的知识。于是想着看书汲取知识,看...
    99+
    2022-05-10
    mysql innodb锁 mysql查innodb
  • 深入理解框架背后的原理及源码分析
    目录问题1问题2总结近期团队中同学遇到几个问题,想在这儿跟大家分享一波,虽说不是很有难度,但是背后也折射出一些问题,值得思考。 开始之前先简单介绍一下我所在团队的技术栈,基于这个背景...
    99+
    2024-04-02
  • 深入理解 PHP 防抖技术的工作原理
    防抖(Debouncing)是一种常用于前端开发中的优化技术,它可以避免频繁触发某一事件时的反复执行,而只在事件停止后的一段时间内执行一次。这种技术在一些需要处理用户输入、页面滚动、窗口大小调整等情况下非常实用。在本文中,我们将深入理解 P...
    99+
    2023-10-21
    PHP 工作原理 防抖
  • 如何深入理解MySQL的存储引擎技术?
    如何深入理解MySQL的存储引擎技术?一、引言MySQL是一种功能强大的关系型数据库管理系统,它支持多种存储引擎技术。存储引擎是MySQL的核心组件之一,它负责将数据存储在硬盘上,并提供数据的读取和写入功能。了解和理解MySQL的存储引擎技...
    99+
    2023-10-22
    技术 MySQL 存储引擎
  • 购物车背后的故事:CMS购物车功能的技术解密
    购物车系统是电子商务网站必不可少的组成部分,它可以帮助用户快速、方便地完成购物流程。CMS购物车系统是一种基于内容管理系统(CMS)的购物车系统,它具有强大的功能和易于使用的界面,深受广大电子商务网站的青睐。 CMS购物车系统一般由以下...
    99+
    2024-02-23
    购物车系统 电子商务网站 CMS 技术解密
  • 深入解读命令执行:基本概念、攻击技术和防范应对
    数据来源 部分数据来源:ChatGPT  命令执行简介 01 命令执行漏洞产生原因         命令执行漏洞的产生原因主要是输入验证不严格、代码逻辑错误、应用程序或系统中缺少安全机制等。攻击者可以通过构造特定的输入向应用程序或系统注入恶...
    99+
    2023-10-26
    安全
  • 带你深入了解PHP和Django的重定向技术
    PHP和Django都是流行的Web开发框架,它们提供了许多有用的功能,例如重定向技术。本文将带您深入了解PHP和Django的重定向技术,包括其背后的工作原理以及如何在您的Web应用程序中使用它。 一、重定向技术简介 重定向是将一个URL...
    99+
    2023-11-12
    django 教程 重定向
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作