云原生Istio基础

一.Service Mesh 架构

Service Mesh(服务网格)是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来,放到一个独立的层中进行管理。传统的微服务架构中,服务之间的通信、安全、监控等功能往往是和业务逻辑代码混合在一起的。而 Service Mesh 架构则是在每个微服务实例旁边部署一个代理(通常称为 Sidecar 代理),这些代理组成了服务网格,负责处理服务之间的通信和相关治理功能。

Service Mesh最核心的设计逻辑——通过Sidecar的方式代理微服务进行服务治理逻辑(数据面),通过控制面感知外界环境的变化并通过xDS协议支持各种微服务治理策略规则的集中管理和下发

主要组件

Sidecar代理:

这是 Service Mesh 架构的核心组件之一。Sidecar 代理与微服务实例部署在同一主机或容器中,它和微服务实例是一对一的关系。例如,在一个 Kubernetes 集群中,每个微服务的 Pod 内除了有微服务本身,还会有一个 Sidecar 代理。

它主要负责拦截微服务的入站和出站通信流量。对于入站流量,它可以进行请求验证、限流等操作;对于出站流量,它可以处理服务发现、负载均衡、路由选择等功能。以一个简单的 Web 服务请求为例,当客户端请求到达微服务时,Sidecar 代理会先接收这个请求,进行安全检查等操作后,再将请求转发给微服务本身。

控制平面(Control Plane):

控制平面是 Service Mesh 架构中的管理中心。它主要负责管理和配置所有的 Sidecar 代理。它包含多个组件,如配置管理、服务发现、证书管理等功能组件。

配置管理组件负责向 Sidecar 代理推送各种配置规则,比如流量路由规则、安全策略等。服务发现组件则用于维护服务的注册信息,帮助 Sidecar 代理找到目标服务的位置。证书管理组件负责为服务间通信提供安全证书,用于身份验证和加密通信。

二.Istio是什么

Istio由Google、IBM和Lyft在2017年5月合作推出,它的初始设计目标是在Kubernetes的基础上,以非侵入的方式为运行在集群中的微服务提供流量管理、安全加固、服务监控和策略管理等功能。

Istio是 Service Mesh 架构的一种实现,服务之间的通信会通过代理(默认是 Envoy,面向Service Mesh的高性能网络代理服务)来进行。中间的网络协议支持 HTTP/1.1,HTTP/2,gRPC 或者 TCP,可以说覆盖了主流的通信协议。代理这一层,称之为数据平面。

控制平面做了进一步的细分,分成了 Pilot、Citadel 和 Galley,它们的各自功能如下:

Pilot:为 Envoy 提供了服务发现,流量管理和智能路由,以及错误处理功能。

Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。

Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。数据平面会和控制平面通信,一方面可以获取需要的服务之间的信息,另一方面也可以汇报服务调用的 Metrics 数据。

istio 适用于容器或虚拟机环境(特别是 k8s),兼容异构架构。

istio 使用 sidecar(边车模式)代理服务的网络,不需要对业务代码本身做任何的改动。

HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。

istio 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制;支持访问控制、速率限制和配额。

istio 对出入集群入口和出口中所有流量的自动度量指标、日志记录和跟踪。

Istio功能:

连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和红黑部署等功能

安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。

控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。

观察(Observe):查看服务运行期间的各种数据,了解服务的运行情况。

Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动。

Istio有助于降低部署的复杂性,并减轻开发团队的压力。它是一个完全开放源代码的服务网格,透明地分层到现有的分布式应用程序上。它也是一个平台,包括允许它集成到任何日志平台、遥测或策略系统中的api。Istio的多种功能集使我们能够成功、高效地运行分布式微服务体系结构,并提供一种统一的方式来保护、连接和监视微服务。

Istio 确保云原生和分布式系统具有弹性,帮助现代企业跨不同平台维护其工作负载,同时保持连接和保护。它支持安全和监管控制,包括 mTLS 加密、策略管理和访问控制,为 Canary 部署、A/B 测试、负载均衡、故障恢复等网络功能提供支持,并增加对整个资产中流量的可观察性。Istio 并不局限于单个集群、网络或运行时的边界,即在 Kubernetes 或 VM、多云、混合或本地上运行的服务

三.Istio的应用场景

在传统的服务部署中,通常为单个节点搭建一整套服务的架构,例如单节点搭建web服务,数据库服务,但这样就出现了单节点潜在的问题,随着应用的访问量增加,单台服务器的资源(如 CPU 处理能力、内存容量、网络带宽等)会成为限制应用性能的因素。原来的单个应用拆分成了许多分散的微服务,它们之间相互调用才能完成一个任务,而一旦某个过程出错(组件越多,出错的概率也就越大),就非常难以排查。

用户请求出现问题无外乎两个问题:错误和响应慢。如果请求错误,那么我们需要知道那个步骤出错了,这么多的微服务之间的调用怎么确定哪个有调用成功?哪个没有调用成功呢?

如果是请求响应太慢,我们就需要知道到底哪些地方比较慢?整个链路的调用各阶段耗时是多少?这些问题需要我们能非常清楚整个集群的调用以及流量情况。并且微服务拆分成这么多组件,如果单个组件出错的概率不变,那么整体有地方出错的概率就会增大。服务调用的时候如果没有错误处理机制,那么会导致非常多的问题。如果某些节点异常(比如网络中断,或者负载很高),也会导致应用整体的响应时间变长,集群服务应该能自动避开这些节点上的应用。

为了保证整个系统的安全性每个应用都需要实现一套相似的认证、授权、HTTPS、限流等功能。

四.Istio的功能

1.连接

对网格内部的服务之间的调用所产生的流量进行智能管理,并以此为基础,为微服务的部署、测试和升级等操作提供有力保障。微服务错综复杂,要完成其业务目标,连接问题是首要问题。连接存在于所有服务的整个生命周期中,用于维持服务的运行,算得上重中之重。

  1. 相对于传统的单体应用,微服务的端点数量会急剧增加,现代的应用系统在部分或者全部生命周期中,都存在同一服务的不同版本,为不同的客户、场景或者业务提供不同的服务。同时,同一服务的不同版本也可能有不同的访问要求,甚至产生了在生产环境中进行测试的新方法论。错综复杂的服务关系对开发者来说都是很严峻的考验。

从不同的外部用户的角度来看,他们访问的都是同一服务端口,但实际上会因为不同的用户识别,分别访问服务A的不同版本;在网格内部,服务A的版本1可能会访问服务B的两个版本,服务A的版本2则只会访问服务B的版本2;服务B的版本2需要访问外部的云服务,版本1则无此需求。

在这个简化的模型中,包含了以下诉求:

◎ 网格内部的调用(服务A→服务B);

◎ 出站连接(服务B→外部云服务);

◎ 入站连接(用户→服务A);

◎ 流量分割(A服务跟B服务只负责与自己相关流量请求);

◎ 按调用方的服务版本进行路由(服务A的版本1分别调用了服务B的版本1和版本2);

◎ 按用户身份进行路由。

这里除了这些问题,还存在一些潜在需求,如下所述。

(1)在网格内部的服务之间如何根据实际需要对服务间调用进行路由,条件可能包括:

    ◎ 调用的源和目的服务;

    ◎ 调用内容;

    ◎ 认证身份。

(2)如何应对网络故障或者服务故障。

(3)如何处理不同服务不同版本之间的关系。

(4)怎样对出站连接进行控制。

(5)怎样接收入站连接来启动后续的整个服务链条。

连接是服务网格应用过程中从无到有的最重要的一个环节。

2.安全

为网格内部的服务之间的调用提供认证、加密和鉴权支持,在不侵入代码的情况下,加固现有服务,提高其安全性。Istio 提供了底层的安全通信通道,并为大规模的服务通信管理认证、授权和加密。有了 Istio,服务通信在默认情况下就是受保护的,可以让您在跨不同协议和运行时的情况下实施一致的策略——而所有这些都只需要很少甚至不需要修改应用程序。Istio 是独立于平台的,可以与 Kubernetes的网络策略一起使用。但它更强大,能够在网络和应用层面保护pod到 pod 或者服务到服务之间的通信。

安全问题在以前并不被经常提及,但容器云时代之后,以下问题出现了。

(1)有大量容器漂浮在容器云中,采用传统的网络策略应对这种浮动的应用是比较吃力的。

(2)在由不同的语言、平台所实现的微服务之间,实施一致的访问控制也经常会因为实现的不一致而困难重重。

(3)如果是共享集群,则服务的认证和加密变得尤为重要,比如:

  1.  服务之间的通信要防止被其他服务监听;
  2.  只有提供有效身份的客户端才可以访问指定的服务;
  3.  服务之间的相互访问应该提供更细粒度的控制功能。

要提供网格内部的安全保障,就应具备服务通信加密、服务身份认证和服务访问控制(授权和鉴权)功能。上述功能通常需要数字证书的支持,这就隐藏了对CA的需求,即需要完成证书的签发、传播和更新业务。除了上述核心要求,还存在对认证失败的处理、外部证书(统一 CA)的接入等相关支撑内容。

3.策略

在控制平面定制策略,并在服务中实施。

Mixer: Mixer 在整个服务网格中执行访问控制和策略执行,并从 Envoy 代理和其他服务收集遥测数据。

Envoy: 在istio框架中使用Envoy作为代理,面向Service Mesh的高性能网络代理服务,用于为服务网格中的所有服务提供所有的入站和出站流量,唯一一个与数据平面打交道的

  1. Istio 通过可动态插拔、可扩展的策略实现访问控制、速率限制、配额管理等功能使得资源在消费者之间公平分配在Istio中使用Mixer作为策略的执行者,Envoy的每次调用,在逻辑上都会通过Mixer进行事先预检和事后报告,这样Mixer就拥有了对流量的部分控制能力;在Istio中还有为数众多的内部适配器及进程外适配器,可以和外部软件设施一起完成策略的制定和执行。

4.观察

对服务之间的调用进行跟踪和测量,获取服务的状态信息。

随着廉价服务器(相对于传统小型机)的数量越来越多,服务器发生故障的频率也越来越高,人们开始产生争论:我们应该将服务器视为家畜还是宠物?家畜的特点:是有功能、无个性、可替换;而宠物的特点:是有功能、有个性、难替换。

随着时代发展,越来越倾向于将服务器视为无个性、可替换的基础设施,如果主机发生故障,那么直接将其替换即可;并且,我们更加关注的是服务的总体质量。因此,微服务系统监控,除了有传统的主机监控,还更加重视高层次的服务健康监控。

服务的健康情况往往不是非黑即白的离散值,而是一系列连续状态,例如我们经常需要关注服务的调用成功率、响应时间、调用量、传输量等表现。

而且,面对数量众多的服务,能对各种级别和层次的指标进行采样、采集及汇总,获取较为精密、翔实的运行数据,最终通过一定的方法进行归纳总结和展示。服务网格还应提供分布式跟踪功能,对服务的调用链路进行跟踪。

观察性:动态获取服务运行数据和输出,提供强大的调用链、监控和调用日志收集输出的能力。配合可视化工具,可方便运维人员了解服务的运行状况,发现并解决问题。

五.Istio与kubernetes

从场景来看,Kubernetes已经提供了非常强大的应用负载的部署、升级、扩容等运行管理能力。Kubernetes 中的 Service 机制也已经可以做服务注册、服务发现和负载均衡,支持通过服务名访问到服务实例。从微服务的工具集观点来看,Kubernetes本身是支持微服务的架构,在Pod中部署微服务很合适,也已经解决了微服务的互访互通问题,但对服务间访问的管理如服务的熔断、限流、动态路由、调用链追踪等都不在Kubernetes的能力范围内。Istio最大化地利用了Kubernetes这个基础设施,与之叠加在一起形成了一个更强大的用于进行服务运行和治理的基础设施,充分利用了Kubernetes的优点实现Istio的功能

  1. 数据面Sidecar运行在Kubernetes的Pod里,作为一个Proxy和业务容器部署在一起。在服务网格的定义中要求应用程序在运行的时感知不到Sidecar的存在。而基于Kubernetes的一个 Pod 多个容器的优秀设计使得部署运维对用户透明,用户甚至感知不到部署 Sidecar的过程。用户还是用原有的方式创建负载,通过 Istio 的自动注入服务,可以自动给指定的负载注入Proxy。如果在另一种环境下部署和使用Proxy,则不会有这样的便利。
  1. Istio的服务发现机制非常完美地基于Kubernetes的域名访问机制构建而成,避免了在 Kubernetes 上运行时服务发现数据不一致的问题。
  1. Istio的所有路由规则和控制策略都是通过 Kubernetes CRD实现的,因此各种规则策略对应的数据也被存储在 Kube-apiserver 中,不需要另外一个单独的 APIServer 和后端的配置管理。所以,可以说Istio的APIServer就是Kubernetes的APIServer,数据也自然地被存在了对应Kubernetes的etcd中。Kubernetes里已经有的,绝不再自己搞一套,避免了数据不一致和用户使用体验的问题。

Istio和Kubernetes架构的关系,Istio不仅数据面Envoy跑在Kubernetes的Pod里,其控制面也运行在Kubernetes集群中,其控制面组件本身存在的形式也是以Kubernetes Deployment和Service,基于Kubernetes扩展和构建。

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

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

相关文章

Android -- 调用系统相册之图片裁剪保存

前言 最近线上反馈,部分vivo手机更换头像时调用系统相册保存图片失败,经本人测试,确实有问题。 经修复后,贴出这块的代码供小伙伴们参考使用。 功能 更换头像选择图片: 调用系统相机拍照,调用系统图片…

【Linux刷题练习】

题目 1 题目:Linux 文件权限 -rwxr-xr-x 是什么意思,怎样变更文件夹以及下面所有文件的拥有者? 正确答案:A 知识点: 文件权限: -rwxr-xr-x 表示文件权限: 第一个 - 表示文件类型,…

Android:ViewPaper动态添加移除第一页

问题: 动态改变itemList之后,调用notifyDataSetChanged();没有作用。 原因: 原因是PagerAdapter内部的getItemPosition方法获取的值是固定POSITION_UNCHANGED,表示未改变,所以不更新。 解决: 要更新则…

嵌入式——STM32外设应用

STM32 微控制器以其高性能、低功耗和丰富的外设资源,在嵌入式系统设计中得到了广泛应用。以下将详细介绍 STM32 的主要外设及其典型应用,帮助开发者更好地理解和应用这些功能。 1. GPIO(通用输入输出端口) 功能:GPIO…

【网页布局技术】项目五 使用CSS设置导航栏

《CSSDIV网页样式与布局案例教程》 徐琴 目录 任务一 制作简单纵向导航栏支撑知识点1.合理利用display:block属性2.利用margin-bottom设置间隔效果3.利用border设置特殊边框 任务二 制作简单横向导航栏任务三 制作带图片效果的横向导航栏任务…

C++集合运算函数总结-

集合必须是有序的, merge:将两个有序范围合并到一个新的有序范围中。 set_union:将两个有序集合的并集存储到第三个集合中。 set_difference:将第一个有序集合中不在第二个有序集合中的元素存储到第三个集合中。 set_symmetri…

LeetCode20:有效的括号

原题地址:. - 力扣(LeetCode) 题目描述 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合…

架构师之路-学渣到学霸历程-33

Nginx的常用命令 nginx的重点在于配置文件,但是我们也得懂得这些命令怎么使用的; 先了解一下nginx的命令;如下面笔记~! 1、Nginx命令 Nginx的命令: 如果用yum安装的话,默认会添加到PATH路径如果用源码安…

银河麒麟v10 xrdp安装

为了解决科技被卡脖子的问题,国家正在大力推进软硬件系统的信创替代,对于一些平时对Linux操作系统不太熟练的用户来讲提出了更高的挑战和要求。本文以银河麒麟v10 24.03为例带领大家配置kylin v10的远程桌面。 最近公司为了配置信创开发新购了几台银河麒…

什么是x86架构,什么是arm架构

什么是 x86 架构? x86 架构是一种经典的指令集架构(ISA),最早由英特尔在 1978 年推出,主要用于 PC、服务器等领域。 它是一种复杂指令集计算(CISC)架构,支持大量的复杂指令和操作&…

客户的奇葩要求—在CAN网络的基础上加入了CAN_FD的节点

1:客户的奇葩要求 最近的工作中,遇到了一个有点奇葩的事,客户需要开发一个系统,我们负责其中的一个ECU,这个系统采取的是经典11bit ID的CAN网络。 今天突然提了一个要求,说要在网络中,加入支持…

uniapp 实现本地二维码 二维码中间增加图片不显示(显示白块)

使用 uni.getImageInfo({ }) 转化 将 图片地址转化成本地预览地址 initUrqCode(){// let logo http://mujiachaoshi.kiss55.com/78aca7812fd801f8e6d4d4482af70d38uni.getImageInfo({src: this.user.photo,success: (res) > {// 获取uQRCode实例var qr new UQRCode();// …

4G 模组的 FTP 应用:技术科普

众所周知FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端,今天我将为大家带来一场4G 模组的 FTP 应用技术科普: 以低功耗模组Air780E核心板为例。 1、FTP 概述 FTP(File Transfer Protocol,文件…

PAT甲级-1074 Reversing Linked List

题目 题目大意 给一个链表的头结点和总节点个数,以及k。每k个节点的链表都要翻转。 思路 链表可以用一个结构体数组来存储,先遍历一遍,过滤掉不在链表中的节点。然后将过滤好的节点放入res数组中,每k个元素用一次reverse()&…

go语言gin框架平滑关闭——思悟项目技术2

目录 前言 直接关闭的缺陷 平滑关闭的使用场景 例子 思悟项目: golang qq邮件发送验证码——思悟项目技术1 前言 平滑关闭(graceful shutdown)是指在停止服务时,能够让现有的连接、任务或者操作优雅地完成,而不是…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中,已经识别到了camera sensor ID,并且可以拿到raw图和isp处理后的图像,但是isp处理后的图像偏绿,来看查看后台服务发现rkaiq_3A_server没有运行,然后单独运行rkaiq_3A_s…

Python 变量在函数中的作用域

什么是局部变量? 作用范围在函数内部,在函数外部无法使用 什么是全局变量? 在函数内部和外部均可使用 如何将函数内定义的变量声明为全局变量? 使用global关键字, global变量 练习: 演示局部变量 #…

【jvm】jvm对象都分配在堆上吗

目录 1. 说明2. 堆上分配3. 栈上分配(逃逸分析和标量替换)4. 方法区分配5. 直接内存(非堆内存) 1. 说明 1.JVM的对象并不总是分配在堆上。2.堆是JVM用于存储对象实例的主要内存区域,存在一些特殊情况,对象…

百数功能更新——表单提交支持跳转到外部链接并支持传参

百数的表单外链功能允许用户将表单以链接的形式分享给外部用户,外部用户无需登录或加入团队即可访问并填写表单。 本次更新的表单提交后跳转指定链接的功能,在支持跳转内部链接的基础上,支持用户在完成表单填写并提交后,自动跳转…

C++笔记---可变参数模板

1. 简单介绍与基本语法 可变参数模板是指模板的类型参数列表的的参数个数可变。 C11支持可变参数模板,也就是说支持可变数量参数的函数模板和类模板,可变数目的参数被称为参数包,存在两种参数包: 模板参数包:表示零或…