Service Mesh之Istio基础入门

news2024/10/9 12:26:40

技术背景

  分布式服务治理

  所谓分布式服务治理就是对服务不断增长的复杂度的管控和管理;管控及管理包含网络拓扑变动、网络延时、通信安全、API网关、服务注册和发现、服务熔断容错、服务超时重试、服务部署、数据调用、分布式链路追踪等等;

  服务治理历程

  第一代服务治理(内嵌应用程序中)

  提示:第一代服务治理能力的代码是内嵌在业务代码中,即所有的服务治理功能需要程序员自己编写;典型技术:SOA、ESB;这种服务治理的优势就是简单使用依赖少;劣势是代码耦合,重复性较高,运维复杂,解耦差,开发要求高;

  第二代服务治理(统一抽象成SDK)

  提示:第二代服务治理是把服务治理能力抽象到统一SDK实现,开发人员可以根据SDK中的api来写业务代码,从而使对应业务具有服务治理的功能;典型技术:Spring Cloud、Dubbo等;这种服务治理的优势是代码重复少,治理逻辑代码和业务代码分开;劣势是SDK语言绑定,代码侵入;基于SDK开发学习门槛较高;系统改造代价大,治理能力升级影响用户业务(即SDK升级,会导致业务代码的升级);

  第三代服务治理(统一到Sidecar)

  提示:第三代服务治理能力统一到服务网格上;即服务治理的能力,通过在业务代码周边运行一个独立的sidecar来完成;程序员只需要关注自己的业务代码的开发,服务治理能力就交给sidecar服务网格来完成;第三代服务治理的优势是独立进程,用户业务非侵入,开发和语言无关(只要能够完成对应的业务功能,用什么语言都可以);治理逻辑升级对业务没有影响;可以渐进的微服务化;劣势就是性能和资源的开销;

  服务网格(Service Mesh)

  服务网格概念源于Buoyant公司的CEO Willian Morgan的文章“What's a service mesh? And do I need one?”;是指专注于处理服务间通信的基础设施,它负责在现代云原生应用组成的复杂拓扑中可靠地传递请求;治理模式除了处理业务逻辑的相关功能外,每个微服务还必须实现此前单体应用模型中用于网络间通信的基础功能,甚至还包括分布式应用程序之间的通信环境中应该实现的其它网络功能,例如熔断、限流、应用跟踪、指标采集、服务发现和负载均衡等;

  服务网格的基本功能

  控制服务间通信: 熔断、重试、超时、故障注入、负载均衡和故障转移等;  服务发现:通过专用的服务总线发现服务端点;  可观测:指标数据采集、监控、分布式日志记录和分布式追踪;  安全性:TLS/SSL通信和密钥管理;  身份认证和授权检查:身份认证,以及基于黑白名单或RBAC的访问控制功能;  部署:对容器技术的原生支持,例如Docker和Kubernetes等;  服务间的通信协议:HTTP 1.1、HTTP 2.0和gRPC等;

  健康状态检测:监测上游服务的健康状态;

  Service Mesh的雏形

  提示:在微服务体系架构中,我们为每个服务都使用一个专用的代理Sidecar来完成高级网络功能;各服务间仅通过Sidecar代理互相通信,各个代理代理之间形成一个网状网络,2017年,William为其创建一个专用的定义,并称之为Service Mesh;

  提示:新一代服务网格架构分为控制平面和数据平面两个部分;数据平面触及系统中的每个数据包或请求,负责服务发现、健康检查、路由、负载均衡、身份验证/授权和可观测性等;控制平面主要为网格中的所有正在运行的数据平面提供策略和配置,从而将所有数据平面联合构建为分布式系统,它不接触系统中的任何数据包或请求;控制平面负责的任务包括例如确定两个服务Service X到Sevice Y之间的路由,Service Y相关集群的负载均衡机制、断路策略、流量转移机制等,并将决策下发给Service X和Service Y的Sidecar;

  控制平面组件

  工作负载调度程序:借助于底层的基础设施(例如kubernetes)完成服务及其Sidecar运行位置的调度决策;  服务发现:服务网格中的服务发现;  Sidecar代理配置API:各Sidecar代理以最终一致的方式从各种系统组件获取配置;

  控制平面UI:管理人员的操作接口,用于配置全局级别的设置,例如部署、身份认证和授权、路由及负载均衡等;

  Service Mesh解决方案极大降低了业务逻辑与网络功能之间的耦合度,能够快捷、方便地集成到现有的业务环境中,并提供了多语言、多协议支持,运维和管理成本被大大压缩,且开发人员能够将精力集中于业务逻辑本身,而无须再关注业务代码以外的其它功能;一旦启用Service Mesh,服务间的通信将遵循以下通信逻辑;

  1、微服务彼此间不会直接进行通信,而是由各服务前端的称为Service Mesh的代理程序进行;

  2、Service Mesh内置支持服务发现、熔断、负载均衡等网络相关的用于控制服务间通信的各种高级功能;

  3、Service Mesh与编程语言无关,开发人员可以使用任何编程语言编写微服务的业务逻辑,各服务之间也可以使用不同的编程语言开发;

  4、服务间的通信的局部故障可由Service Mesh自动处理;

  5、Service Mesh中的各服务的代理程序由控制平面(Control Plane)集中管理;各代理程序之间的通信网络也称为数据平面(Data Plane);

  6、部署于容器编排平台时,各代理程序会以微服务容器的Sidecar模式运行;

  服务网格和K8S间的关系

  提示:k8s主要负责解决容器编排与调度的问题,本质上是应用程序生命周期工具,为服务网格提供基础支撑;Service Mesh 主要解决分布式应用间的通信问题,本质上服务通信治理工具,是k8s在网络功能方面的扩展和延伸;

  Istio是什么?

  Istio是Envoy Data Plane的控制平面实现之一,Istio是一个开源的独立服务网格,可为用户成功运行分布式微服务架构提供所需的基础设施;Istio可以轻松创建带有负载均衡、service-to-service的身份认证、细粒度的可观测性等功能的服务网格,而应用程序代码却无须或很少为些而作出改变;通过在整个服务环境中为每一个应用部署一个特殊的Sidecar形式的Proxy拦截各服务之间的所有网络通信,并由控制平面Istio进行配置和管理,进而为服务无侵入式添加如下功能;

  1、HTTP、gRPC、WebSocket和TCP通信的自动负载均衡;

  2、通过丰富的路由规则、重试、故障转移和故障注入对流量进行细粒度控制;

  3、支持访问控制、速率限制和配额的可插拔的策略层及配置API;

  4、集群内所有流量的自动度量、记录日志和分布式跟踪跟踪,包括集群的入口和出口;

  5、强大身份验证和授权,以及在群集中进行安全的服务间通信;

  在kubernetes环境中,服务网格就像一个仪表板,用于解决问题、执行流量策略、分配限制和测试代码,它允许一个中央节点来监视、跟踪和控制所有服务之间的交互;

  Istio系统架构

  提示:Istio服务网格主要有两部分组成,控制平面和数据平面;控制平面核心程序istiod,主要是用于管控数据平面envoy proxy;数据平面envoy proxy主要管控主容器的进出流量;envoy proxy由控制平面istiod下发配置实现流量管控,同时它还能够发现服务网格中的其他配置和服务,也能够收集对应的指标数据;

  istio体验环境部署

  环境说明

  kubernetes:v1.26.3

  docker :23.0.1

  cri-dockerd:0.3.0

  istio:1.17.1

  下载istio客户端程序包

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

root@k8s-master01:/usr/local# curl -L https://istio.io/downloadIstio | sh -

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100   102  100   102    0     0    100      0  0:00:01  0:00:01 --:--:--   100

100  4856  100  4856    0     0   2347      0  0:00:02  0:00:02 --:--:--  9429

Downloading istio-1.17.1 from https://github.com/istio/istio/releases/download/1.17.1/istio-1.17.1-linux-amd64.tar.gz ...

Istio 1.17.1 Download Complete!

Istio has been successfully downloaded into the istio-1.17.1 folder on your system.

Next Steps:

See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.

To configure the istioctl client tool for your workstation,

add the /usr/local/istio-1.17.1/bin directory to your environment path variable with:

         export PATH="$PATH:/usr/local/istio-1.17.1/bin"

Begin the Istio pre-installation check by running:

         istioctl x precheck

Need more information? Visit https://istio.io/latest/docs/setup/install/

root@k8s-master01:/usr/local#

  提示:使用上述命令,请先确定你的终端是否能够正常连接到istio的官方网站;

  创建链接,将istioctl命令链接至/usr/bin/目录下

1

2

3

4

5

6

7

8

9

10

11

12

root@k8s-master01:/usr/local# ls

bin  etc  games  include  istio-1.17.1  lib  man  sbin  share  src

root@k8s-master01:/usr/local# ln -sv istio-1.17.1 istio

'istio' -> 'istio-1.17.1'

root@k8s-master01:/usr/local# ls

bin  etc  games  include  istio  istio-1.17.1  lib  man  sbin  share  src

root@k8s-master01:/usr/local# cd istio

root@k8s-master01:/usr/local/istio# ls

bin  LICENSE  manifests  manifest.yaml  README.md  samples  tools

root@k8s-master01:/usr/local/istio# ln -sv /usr/local/istio/bin/istioctl /usr/bin/

'/usr/bin/istioctl' -> '/usr/local/istio/bin/istioctl'

root@k8s-master01:/usr/local/istio#

  提示:链接至/usr/bin/目录下是因为后续方便istioctl命令的使用;

  列出profile

1

2

3

4

5

6

7

8

9

10

11

12

13

root@k8s-master01:/usr/local/istio# cd

root@k8s-master01:~# istioctl profile list

Istio configuration profiles:

    ambient

    default

    demo

    empty

    external

    minimal

    openshift

    preview

    remote

root@k8s-master01:~#

  提示:测试环境我们使用demo即可,生产环境使用default;

  安装istio

1

2

3

4

5

6

7

8

9

root@k8s-master01:~# istioctl install --set profile=demo -y

✔ Istio core installed                                                                                                                    

✔ Istiod installed                                                                                                                        

✔ Egress gateways installed                                                                                                               

✔ Ingress gateways installed                                                                                                              

✔ Installation complete                                                                                                                   

Making this installation the default for injection and validation.

Thank you for installing Istio 1.17.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/hMHGiwZHPU7UQRWe9

  验证:istio-system名称空间中是否有pod running?

1

2

3

4

5

6

root@k8s-master01:~# kubectl get pods -n istio-system

NAME                                   READY   STATUS    RESTARTS   AGE

istio-egressgateway-774d6846df-fv97t   1/1     Running   0          21m

istio-ingressgateway-69499dc-pdgld     1/1     Running   0          21m

istiod-65dcb8497-9skn9                 1/1     Running   0          26m

root@k8s-master01:~#

  验证:istio 版本信息

1

2

3

4

5

root@k8s-master01:~# istioctl version

client version: 1.17.1

control plane version: 1.17.1

data plane version: 1.17.1 (2 proxies)

root@k8s-master01:~#

  提示:可以看到现在数据平面有两个代理,这是因为我们安装istio时,在istio-system名称空间下运行了一个ingressgateway和egressgateway pod,这两个pod就是istio的数据平面,istiod是控制平面;

  查看istio-system名称空间下创建的服务资源

  提示:可以看到ingressgateway 处于pending状态,这是因为没有设置外部IP地址;

  修改ingressgateway网关地址

1

~# kubectl edit svc istio-ingressgateway -n istio-system

  提示:在spec字段下,找一个位置加上externalIPs字段,来指定一个IP地址即可;这个IP地址必须是集群节点空余IP地址;

  验证:查看istio-system名称空间下的svc 看看对应ingressgateway 外部IP地址是否修改?

1

2

3

4

5

6

root@k8s-master01:~# kubectl get svc -n istio-system                     

NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                                                      AGE

istio-egressgateway    ClusterIP      10.106.179.126   <none>          80/TCP,443/TCP                                                               34m

istio-ingressgateway   LoadBalancer   10.102.211.120   192.168.0.252   15021:32639/TCP,80:31338/TCP,443:30597/TCP,31400:31714/TCP,15443:32154/TCP   34m

istiod                 ClusterIP      10.96.6.69       <none>          15010/TCP,15012/TCP,443/TCP,15014/TCP                                        39m

root@k8s-master01:~#

  提示:可以看到ingressgateway 对应外部IP地址就修改成我们刚才指定的IP地址了;

  为default名称空间打标签,允许istio注入envoy sidecar

1

2

3

4

5

6

7

8

9

10

root@k8s-master01:~# kubectl label namespace default istio-injection=enabled

namespace/default labeled

root@k8s-master01:~# kubectl get ns --show-labels

NAME              STATUS   AGE   LABELS

default           Active   14h   istio-injection=enabled,kubernetes.io/metadata.name=default

istio-system      Active   47m   kubernetes.io/metadata.name=istio-system

kube-node-lease   Active   14h   kubernetes.io/metadata.name=kube-node-lease

kube-public       Active   14h   kubernetes.io/metadata.name=kube-public

kube-system       Active   14h   kubernetes.io/metadata.name=kube-system

root@k8s-master01:~#

  提示:这个名称空间可以根据自己的环境来;我们在给那个名称空间打上上述标签,对应在那个名称空间下部署pod都会注入一个sidecar而实现service mesh功能;

  测试:在defuault名称空间下,部署一个pod,看看对应是否会给注入一个sidecar呢?

1

2

3

4

5

6

root@k8s-master01:~# kubectl run test --image=nginx --restart=Never

pod/test created

root@k8s-master01:~# kubectl get pods

NAME   READY   STATUS    RESTARTS   AGE

test   2/2     Running   0          37s

root@k8s-master01:~#

  提示:可以看到我们在default名称空间下跑了一个nginx pod,对应pod里有两个容器;

  验证:查看pod的详细信息,是否注入了envoy proxy容器?

  提示:我们可以看到pod里除了有nginx镜像,还有一个istio/proxy,这个容器就是istiod注入至nginx  pod中,从而实现高级流量管理;至此istio的部署就基本完成;

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

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

相关文章

JMeter(八):响应断言详解

响应断言 :对服务器的响应进行断言校验 (1)应用范围: main sample and sub sample, main sample only , sub-sample only , jmeter variable 关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,…

Linux6.14 Docker Compose容器编排

文章目录 计算机系统5G云计算第四章 LINUX Docker Compose容器编排一、Compose概述1.Docker Compose 的概述2.Docker Compose 三大的概念 二、部署过程1.Docker Compose 环境安装2.YAML 文件格式及编写注意事项3.Docker Compose配置常用字段4.Docker Compose 常用命令5.Docker …

【C语言】常见的内存操作函数

目录 前言&#xff1a;1.memcpymemcpy函数介绍memcpy函数的模拟实现 2.memmovememmove函数介绍memmove函数的模拟实现 3.memcmp4.memset 前言&#xff1a; 紧接字符串函数&#xff0c;接下来介绍内存函数~~ ———————————————————— 1.memcpy memcpy函数介…

索尼移动硬盘数据丢失怎么办?索尼移动硬盘如何恢复数据

咨询案例&#xff1a;“我刚买的索尼移动硬盘&#xff0c;里面存了超多我的宝贝照片和视频。突然有一天&#xff0c;我发现这些数据全都不见了&#xff01;心凉了半截&#xff0c;我该怎么办&#xff1f;” ——索尼移动硬盘是一种常用的存储设备&#xff0c;它具有大容量、便携…

微软亚研院提出模型基础架构RetNet或将成为Transformer有力继承者

作为全新的神经网络架构&#xff0c;RetNet 同时实现了良好的扩展结果、并行训练、低成本部署和高效推理。这些特性将使 RetNet 有可能成为继 Transformer 之后大语言模型基础网络架构的有力继承者。实验数据也显示&#xff0c;在语言建模任务上&#xff1a; RetNet 可以达到与…

视频内存过大如何压缩变小?这个压缩方法了解一下

在日常生活中&#xff0c;不管是日常随手拍的视频还是在工作中遇到的视频文件&#xff0c;在编辑处理的时候&#xff0c;如果视频的内存过大&#xff0c;不仅会占用很大的内存&#xff0c;在传送的时候也会花费很长时间&#xff0c;这时候将视频给压缩一下就可以很好的解决这一…

直播程序源码开发建设:洞察全局,数据统计与分析功能

在信息时代的浪潮席卷下&#xff0c;直播程序源码平台成为了信息时代下的优秀产物之一&#xff0c;通过直播程序源码平台&#xff0c;人们既可以去获取信息、收获快乐&#xff1b;又可以开启一个随时随地&#xff0c;一台智能手机就可以做的工作&#xff0c;直播工作&#xff0…

ResMLP:具有数据效率训练的图像分类前馈网络

文章目录 ResMLP: Feedforward networks for image classification with data-efficient training摘要本文方法代码实验结果 ResMLP: Feedforward networks for image classification with data-efficient training 摘要 我们提出了ResMLP&#xff0c;一个完全建立在多层感知…

Windows系统创建新用户

1、以管理员身份启动cmd 2、开启administrator管理员账户 输入命令&#xff1a; net user Administrator /active:yes 3、切换到administrator用户 点击账户头像可以看见 4、创建新用户 WinR 键打开dos窗口输入&#xff1a;control userpasswords2 在弹出的“用户账户”中点…

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…

MFC CList 类的使用

MFC提供CList 类&#xff1b; 类CList支持可按顺序或按值访问的非唯一对象的有序列表&#xff1b;CList 列表与双链接列表行为相似&#xff1b; 类型POSITION的变量是列表的关键字&#xff1b;可使用POSITION变量作为循环因子来顺序遍历列表&#xff0c;作为书签来保存位置&am…

深度学习推理和训练

优化和泛化 深度学习的根本问题是优化和泛化之间的对立。 • 优化&#xff08;optimization&#xff09;是指调节模型以在 训练数据 上得到最佳性能&#xff08;即机器学习中的学习&#xff09;。 • 泛化&#xff08;generalization&#xff09;是指训练好的模型在 前所未…

Python 面向对象(一)(成员方法、类和对象)

初识对象 生活中数据的组织 学校开学&#xff0c;要求学生填写自己的基础信息&#xff0c;一人发一张白纸&#xff0c;让学生自己填 改为登记表&#xff0c;打印出来让学生自行填写&#xff1a; 程序中数据的组织 在程序中简单使用变量来记录学生信息 使用变量记录数据太乱了…

Python怎么将图片转换成base64编码

目录 什么是base64编码 Base64编码的特点 Base64编码的应用 Python怎么将图片转换成base64编码 什么是base64编码 Base64编码是一种将二进制数据转换为ASCII字符的编码方式。它是由MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;规范定义的&#xff0…

CAD转PDF怎么从彩色变成黑白?这个小技巧要掌握

CAD文件&#xff0c;也被称为CAD文档或CAD绘图文件&#xff0c;是一种专用的计算机辅助设计文件格式。它通常用于表示二维或三维设计图形和相关的几何属性。CAD文件可以在计算机辅助设计软件中打开和编辑。 通常由一个或多个图层组成&#xff0c;每个图层可以包含不同的颜色、线…

day37回溯算法

1.什么是回溯算法 回溯就是递归问题&#xff1a; 解决组合问题&#xff08;无顺序&#xff09;&#xff0c;切割问题&#xff0c;子集问题&#xff0c;排列问题&#xff08;顺序&#xff09; 所有的回溯可以抽象为一棵树&#xff1a;树 宽度就是for循环大小 树深度就是回溯 vo…

HCIP——OSPF基础

OSPF基础 一、OSPF基础二、OSPF的区域划分三、OSPF的数据包hello包数据库描述包DBD包链路状态请求包LSR包链路状态更新包LSU包链路状态确认包LSAck包 四、OSPF的状态机五、OSPF的工作过程六、链路状态型的路由生成过程七、条件匹配五、OSPF数据包头部八、OSPF的接口网络类型 一…

C++的六大“天选之子“之“构造“与“析构“

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

【LeetCode】64.最小路径和

题目 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输出&#…

离多态更近一步

在面向对象的语言里面,封装,继承,多态可谓是在熟悉不过了,当我们每次再去重新认识它们的时候总会有新的发现,为此我也经常感到疑惑,所以在这里和大家一起探讨三个问题,让我们在向多态靠近一点点。 虚表是否真的存在静态区 经常我们都会看见一个问题&#xff0c;虚表到底是存放…