istio介绍(一)

news2024/12/25 9:08:02

1. 概念

1.1 虚拟服务

虚拟服务提供流量路由功能,它基于 Istio 和平台提供的基本的连通性和服务发现能力,让您配置如何在服务网格内将请求路由到服务

示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts: # 向服务发送请求时使用的地址,不必是 Istio 服务注册的一部分,它只是虚拟的目标地址
  - reviews
  http: # 包含路由规则,描述匹配条件和路由行为
  - match:  # 匹配来自jason用户的所有请求
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews # 实际目的地址,必须是存在于 Istio 服务注册中心的实际目标地址
        subset: v2
  - route: # 默认目标,其他路由不满足时,使用该目标
    - destination:
        host: reviews
        subset: v3

1.2 目标规则

目标规则提供流量路由功能,虚拟服务是将流量如何路由到给定目标地址,目标规则用来配置该目标的流量

可以使用目标规则来指定命名的服务子集,例如按版本为所有给定服务的实例分组。然后可以在虚拟服务的路由规则中使用这些服务子集来控制到服务不同实例的流量。

示例:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-destination-rule
spec:
  host: my-svc
  trafficPolicy:
    loadBalancer:
      simple: RANDOM # 随机
  subsets:
  - name: v1
    labels:  # pod上label
      version: v1
  - name: v2
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN # 轮询,覆盖顶层的trafficPolicy
  - name: v3
    labels:
      version: v3

1.3 网关

使用网关为网格来管理入站和出站流量,能够指定要进入或离开网格的流量。网关配置被用于运行在网格边界的独立 Envoy 代理,而不是服务工作负载的 sidecar 代理。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ext-host-gwy
spec:
  selector:
    app: my-gateway-controller
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - ext-host.example.com
    tls:
      mode: SIMPLE
      serverCertificate: /tmp/tls.crt
      privateKey: /tmp/tls.key
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: virtual-svc
spec:
  hosts:
  - ext-host.example.com
  gateways:
    - ext-host-gwy

2. 架构

Istio 服务网格从逻辑上分为数据平面和控制平面

  • 数据平面

由一组智能代理(Envoy)组成,被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信,同时还收集和报告所有网格流量的遥测数据。

  • 控制平面

管理并配置代理来进行流量路由

架构图如下:

在这里插入图片描述

2.1 Envoy

2.1.1 特点

Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。

Envoy 代理被部署为服务的 Sidecar,在逻辑上为服务增加了 Envoy 的许多内置特性,例如:

  • 动态服务发现
  • 负载均衡
  • TLS 终端
  • HTTP/2 与 gRPC 代理
  • 熔断器
  • 健康检查
  • 基于百分比流量分割的分阶段发布
  • 故障注入
  • 丰富的指标

2.1.2 概念

  • Downstream:下游(downstream)主机连接到 Envoy,发送请求并获得响应
  • Upstream:上游(upstream)主机获取来自 Envoy 的连接接请求和响应
  • Cluster: 集群(cluster)是 Envoy 连接到的一组逻辑上相似的上游主机
  • Mesh:一组互相协调以提供一致网络拓扑的主机
  • Listener: 监听器(listener)是可以由下游客户端连接的命名网络位置(例如,端口、unix域套接字等),监听 IP 地址和端口,然后根据策略转发
  • Listener filter:Listener使用listener filter(监听器过滤器)来操作连接的元数据
  • Http Route Table:HTTP 的路由规则,例如请求的域名,Path 符合什么规则,转发给哪个Cluster。

2.1.3 配置

在这里插入图片描述

Istio envoy sidecar proxy 配置中包含以下四个部分:

  • bootstrap:Envoy proxy 启动时候加载的静态配置
  • listeners:监听器配置,使用 LDS 下发
  • clusters:集群配置,静态配置中包括 xds-grpc 和 zipkin 地址,动态配置使用 CDS 下发
  • routes:路由配置,静态配置中包括了本地监听的服务的集群信息,其中引用了 cluster,动态配置使用 RDS 下发

每个部分中都包含静态配置与动态配置,其中 bootstrap 配置又是在集群启动的时候通过 sidecar 启动参数注入的,配置文件在 /etc/istio/proxy/envoy-rev0.json

2.1.4 Envoy xDS协议

Envoy 提供了如下的 API:

CDS(Cluster Discovery Service):集群发现服务
EDS(Endpoint Discovery Service):端点发现服务
HDS(Health Discovery Service):健康发现服务
LDS(Listener Discovery Service):监听器发现服务
MS(Metric Service):将 metric 推送到远端服务器
RLS(Rate Limit Service):速率限制服务
RDS(Route Discovery Service):路由发现服务   
SDS(Secret Discovery Service):秘钥发现服务

所有名称以 DS 结尾的服务统称为 xDS

2.2 Istiod

Istiod 提供服务发现、配置和证书管理。

Istiod 将控制流量行为的高级路由规则转换为 Envoy 特定的配置,并在运行时将其传播给 Sidecar。

Pilot 提取了特定平台的服务发现机制,并将其综合为一种标准格式,任何符合 Envoy API 的 Sidecar 都可以使用。

Istiod 安全通过内置的身份和凭证管理,实现了强大的服务对服务和终端用户认证。您可以使用 Istio 来升级服务网格中未加密的流量。

Istiod 充当证书授权(CA),并生成证书以允许在数据平面中进行安全的 mTLS 通信。

Istiod做了进一步的细分,分成了 Pilot、Mixer 和 Citadel,它们的各自功能如下:

  • Pilot: 为 Envoy 提供了服务发现,流量管理和智能路由(AB 测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。 用户通过 Pilot 的 API 管理网络相关的资源对象,Pilot 会根据用户的配置和服务的信息把网络流量管理变成 Envoy 能识别的格式分发到各个 Sidecar 代理中。

  • Mixer: 为整个集群执行访问控制(哪些用户可以访问哪些服务)和 Policy 管理(Rate Limit,Quota 等),并且收集代理观察到的服务之间的流量统计数据。

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

2.3 性能和扩展性

2.3.1 Istio 1.10.3 性能总结

Istio 负载测试网格包含了 1000 个服务和 2000 个 sidecar,全网格范围内,QPS 为 70,000。 在使用 Istio 1.10.3 运行测试后,我们得到了如下结果:

  • 通过代理的 QPS 有 1000 时,Envoy 使用了 0.5 vCPU 和 50 MB 内存。
  • 网格总的 QPS 为 1000 时,istio-telemetry 服务使用了 0.6 vCPU。
  • Pilot 使用了 1 vCPU 和 1.5 GB 内存。
  • 90% 的情况 Envoy 代理只增加了 6.3 ms 的延迟。

2.3.2 控制平面性能

控制平面支持数千个服务,分布在数千个 pod 上,所需的用户自有虚拟服务和其它配置对象的数量级与之类似。Pilot 的 CPU 和内存资源需求量与系统配置和可能状态的量级成正比。CPU 消耗的变化取决于以下因素:

  • 部署改变的频率。
  • 配置改变的频率。
  • 连接到 Pilot 的代理数量。

一个单一的 Pilot 实例仅用 1 vCPU 和 1.5 GB 的内存就可以支持 1000 个服务和 2000 个 sidecar,可以增加 Pilot 实例的数量来降低它花在推送配置到所有代理的耗时。

2.3.3 数据平面性能

数据平面的性能受很多因素影响,例如:

  • 客户端连接数量
  • 目标服务接收请求的密度
  • 请求和响应的体量
  • 代理工作线程的数量
  • 协议
  • CPU 核数
  • 代理过滤器的数量和类型,特别是 Mixer 过滤器

代理的内存消耗取决于它的总体配置状态。大量的监听器、集群和路由会增加内存使用量。Istio 1.1 引入了命名空间隔离来限制配置被下发到代理的范围。在一个比较大的命名空间中,代理将消耗大约 50 MB 的内存。

因为 Istio 在数据路径上注入了一个 sidecar 代理,所以延迟是重要的考量因素。Istio 向代理添加了身份验证和 Mixer 过滤器。每一个额外的过滤器都会增加代理内的路径长度并影响延迟。

在网格内部,一个请求会先遍历客户端代理,然后遍历服务端代理。在 90% 的情况下,数据路径上的这两个代理每 1000 QPS 会产生 6.3 ms 的延迟。90% 的情况下仅服务端代理会增加 1.7 ms 的延迟。

3. 功能

3.1 流量管理

3.1.1 配置请求路由

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

3.1.2 故障注入

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    fault:
      delay:
        percentage:
          value: 100.0
        fixedDelay: 7s
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

3.1.3 流量转移

将流量从微服务的一个版本的逐渐迁移到另一个版本,在 Istio 中,通过配置一系列规则来实现此目标,这些规则将一定比例的流量路由到一个或另一个服务。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50

我们使用 Istio 的权重路由功能将 reviews 服务的流量迁移到新版本,这和使用容器编排平台的部署功能来进行版本迁移完全不同,后者使用了实例扩容来对流量进行管理。

使用 Istio,两个版本的 reviews 服务可以独立地进行扩容和缩容,而不会影响这两个服务版本之间的流量分发。

3.1.4 熔断

DestinationRule配置

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1 # 并发连接数最大为1
      http:
        http1MaxPendingRequests: 1  # 最大并发请求数
        maxRequestsPerConnection: 1 #每个连接最大请求数
    outlierDetection:
      consecutive5xxErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100

3.1.5 流量镜像

当流量被镜像时,请求将发送到镜像服务中,并在 headers 中的 Host/Authority 属性值上追加 -shadow。例如 cluster-1 变为 cluster-1-shadow,可以使用 mirror_percent 属性来设置镜像流量的百分比。
被镜像的流量是即发即弃的,就是说镜像请求的响应会被丢弃

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
    - httpbin
  http:
  - route:
    - destination:
        host: httpbin
        subset: v1
      weight: 100
    mirror: # 将流量100% 镜像到v2服务
      host: httpbin 
      subset: v2
    mirrorPercent: 100

3.1.6 Ingress

  • Ingress Gateway

除了支持Kubernetes Ingress,Istio还提供了另一种配置模式,Istio Gateway。与 Ingress 相比,Istio Gateway 提供了更广泛的自定义和灵活性,并允许将 Istio 功能(例如监控和路由规则)应用于进入集群的流量。

# Gateway
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "httpbin.example.com"

# VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - "httpbin.example.com"
  gateways:
  - httpbin-gateway
  http:
  - match:
    - uri:
        prefix: /status
    - uri:
        prefix: /delay
    route:
    - destination:
        port:
          number: 8000
        host: httpbin

# 请求
curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/status/200"
  • Kubernetes Ingress

使用Ingress Resource入口资源将Istio配置为在服务网格集群之外公开服务。

Ingress资源如下所示,使用 kubernetes.io/ingress.class 注解来告知 Istio 网关控制器它应该处理此 Ingress,在 Kubernetes 1.18 中,添加了新资源 IngressClass ,以替换 Ingress 资源上的 kubernetes.io/ingress.class 注解。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: istio
  name: ingress
spec:
  rules:
  - host: httpbin.example.com
    http:
      paths:
      - path: /status/*
        backend:
          serviceName: httpbin
          servicePort: 8000

3.1.6 Egress

由于默认情况下,来自 Istio-enable Pod 的所有出站流量都会重定向到其 Sidecar 代理,集群外部 URL 的可访问性取决于代理的配置。默认情况下,Istio 将 Envoy 代理配置为允许传递未知服务的请求。

三种访问外部服务的方法:

允许 Envoy 代理将请求传递到未在网格内配置过的服务。
配置 service entries 以提供对外部服务的受控访问。
对于特定范围的 IP,完全绕过 Envoy 代理。

  • Envoy 转发流量到外部服务

通过 global.outboundTrafficPolicy.mode,配置 sidecar 对外部服务(那些没有在 Istio 的内部服务注册中定义的服务)的处理方式

  • ALLOW_ANY, 允许调用未知的服务,默认为ALLOW_ANY
  • REGISTRY_ONLY,会阻止任何没有在网格中定义的 HTTP 服务或 service entry 的主机

从 Istio 网格调用外部服务的三种方法:

  • 配置 Envoy 以允许访问任何外部服务
  • 使用 service entry 将一个可访问的外部服务注册到网格中,这也是推荐的方法
  • 配置 Istio sidecar 以从其重新映射的 IP 表中排除外部 IP

3.2 可观察性

4. 部署

kubectl create namespace istio-system

# 部署token、sa
helm install istio-base manifests/charts/base -n istio-system

# 部署 istiod
helm upgrade --install istiod istio-control/istio-discovery \
    --set global.hub="docker.io/istio" \
    --set global.tag="1.10.5" \
    --set global.jwtPolicy=first-party-jwt \
    --set meshConfig.accessLogFile=/dev/stdout \
    -n istio-system

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

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

相关文章

高项.项目管理经验、理念、教训

一、项目管理的一些经验 管项目重在管理,而不是死抠无关紧要的技术细节等等。 真正的团队一定是11>2,要把重心放在凝聚团队协力,共同完成目标上。 项目的推进永远都是不确定性的,真正考验项目经理的是不断出现的需求变更和状…

vue重修之路由【上】

文章目录 单页应用程序: SPA - Single Page Application路由简介Vue Reouter简介VueRouter的使用(52)组件的存放目录问题组件分类存放目录 路由的封装抽离 单页应用程序: SPA - Single Page Application 单页面应用(SPA): 所有功能在 一个html页面 上 单…

常用的跨域解决方案有哪些?

在 Web 开发中,跨域是指在浏览器环境下,通过 JavaScript 代码从一个域名的网页去访问另一个域名的资源。由于同源策略的限制,跨域请求通常会被浏览器阻止,为了实现跨域访问,HTML5 提供了一些机制来解决这个问题。 以下是一些常用的跨域解决方案: 1:JSONP(JSON with P…

展馆导览系统之AR互动式导航与展品语音讲解应用

一、项目背景 随着科技的进步和人们对于文化、艺术、历史等方面需求的提升,展馆在人们的生活中扮演着越来越重要的角色。然而,传统的展馆导览方式,如纸质导览、人工讲解等,已无法满足参观者的多元化需求。为了提升参观者的体验&a…

​CUDA学习笔记(六)Warp解析

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 Warp 逻辑上,所有thread是并行的,但是,从硬件的角度来说,实际上并不是所有的thread能够在同一时刻执行,接下来我们将解释有关wa…

​CUDA学习笔记(五)GPU架构

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 GPU架构 SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的。 以Fermi架构为例,其包含以下主要组成…

什么是SpringMVC?简单好理解!

1、SpringMVC是什么? SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分。简化开发&…

并发编程-线程池ThreadPoolExecutor底层原理分析(一)

问题: 线程池的核心线程数、最大线程数该如何设置? 线程池执行任务的具体流程是怎样的? 线程池的五种状态是如何流转的? 线程池中的线程是如何关闭的? 线程池为什么一定得是阻塞队列? 线程发生异常&…

蓝桥杯 (饮料换购,C++)

思路&#xff1a; 1、先加上初始的饮料数n。 2、再加上n可以兑换的饮料数n/3&#xff0c;求多余的瓶盖n%3。循环直至瓶盖数无法兑换新的一瓶饮料。 #include<iostream> using namespace std; int main() {int n,a0,sum0;cin >> n;sum n;while (n){n n a;//加上上…

【软考】11.5 测试原则/阶段/测试用例设计/调试

《测试原则和方法》 测试原则 测试&#xff1a;为了发现错误而执行程序的过程成功的测试&#xff1a;发现了至今尚未发现的错误的测试 测试方法 静态测试&#xff08;有效发现30%-70%的错误&#xff09; a. &#xff08;文档&#xff09;检查单 b. &#xff08;代码&#xff…

学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例

要想通过SpringBoot写一个简单的处理请求的服务器&#xff08;方法&#xff09;&#xff0c;需要有以下步骤 建立连接请求响应 来复习的话直接在文章末尾看源码就行 1、创建SpringBoot项目 https://blog.csdn.net/dream_ready/article/details/133948253 2、编写Controller建…

WebSocket的入门秘籍?

一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c…

postman打开后,以前的接口记录不在,问题解决

要不这些文件保存在C:\Users\{用户名}\AppData\Roaming\Postman 比如&#xff0c;你目前使用的window登录用户是abc&#xff0c;那么地址便是C:\Users\abc\AppData\Roaming\Postman 打开后&#xff0c;这个目录下会有一些命名为backup-yyyy-MM-ddThh-mm-ss.SSSZ.json类似的文…

[python 刷题] 287 Find the Duplicate Number

[python 刷题] 287 Find the Duplicate Number 题目&#xff1a; Given an array of integers nums containing n 1 integers where each integer is in the range [1, n] inclusive. There is only one repeated number in nums, return this repeated number. You must sol…

zookeeper的介绍和用docker搭建zookeeper集群,以及Go语言使用zookeeper

typora-copy-images-to: imgs Zookeeper的使用 1、Zookeeper简介 Apache ZooKeeper 是 Apache 软件基金会的一个软件项目&#xff0c;为大型分布式系统提供开源分布式配置服务、同步服务和命名注册。ZooKeeper原本是Hadoop的一个子项目&#xff0c;但现在它本身已经是一个顶级…

新年学新语言Go之三

一、前言 这一篇简单介绍一下Go中的数组、切片、map和指针。 二、数组 Go语言的数组和Java差不多都是定长的&#xff0c;用于存储有相同类型的元素&#xff0c;数组在内存中是连续分配的&#xff0c;索引数组中任意数据速度都非常快。 注&#xff1a;Go声明变量和其它强类型…

C++前缀和算法的应用:得到连续 K 个 1 的最少相邻交换次数 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 滑动窗口 题目 给你一个整数数组 nums 和一个整数 k 。 nums 仅包含 0 和 1 。每一次移动&#xff0c;你可以选择 相邻 两个数字并将它们交换。 请你返回使 nums 中包…

FL Studio中文最新21破解版本水果软件下载

那么&#xff0c;大家知道编曲是什么吗&#xff1f;编曲和作曲又有什么区别呢&#xff1f; 一首歌的制作过程通常是由作词或作曲开始的&#xff0c;作曲就是运用基本乐理、和声学、复调、配器法、曲式结构的技术理论体系来表达创作者音乐思想的方法。说白了其实就是制作一首歌…

学信息系统项目管理师第4版系列34_10大管理49过程ITTO

整合管理 组 过程 输入 工具和技术 输出 启动 制定项目章程 立项管理文件协议事业环境因素组织过程资产 专家判断数据收集人际关系与团队技能会议 项目章程假设日志 计划 2.制定项目管理计划 项目章程其他知识领域规划过程的输出事业环境因素组织过程资产 专家…

【软考】9.5 排序算法原理

《直接插入排序》 针对少量数据的排序情况多次比较&#xff0c;一次插入 默认第一个元素为有序队列&#xff0c;依次与前面的元素进行比较&#xff0c;直到找到第一个小于他的值&#xff0c;才插入 《希尔排序》 缩小增量排序&#xff1b;针对大数据的排序情况分组&#xff0…