Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >10个 Istio 流量管理 最常用的例子,你知道几个?

10个 Istio 流量管理 最常用的例子,你知道几个?

作者头像
万猫学社
发布于 2022-12-01 08:06:21
发布于 2022-12-01 08:06:21
40300
代码可运行
举报
运行总次数:0
代码可运行

10 个 Istio 流量管理 最常用的例子,强烈建议收藏起来,以备不时之需。

为了方便理解,以Istio官方提供的Bookinfo应用示例为例,引出 Istio 流量管理的常用例子。

Bookinfo应用的架构图如下:

其中,包含四个单独的微服务:

  • productpage:调用 detailsreviews 两个服务,用来生成页面。
  • details:包含了书籍的信息。
  • reviews:包含了书籍相关的评论。它还会调用 ratings 微服务。
  • rating:包含了由书籍评价组成的评级信息。

其中,reviews 服务有 3 个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

流量转移

目标1:把reviews 服务的所有流量都路由到v1版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

目标2:把reviews 服务的50%流量转移到v3版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

目标3:把reviews 服务的所有流量都路由到v3版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

基于用户身份的路由

目标:来自名为 OneMore 的用户的所有流量都路由到v2版本,其他流量都路由到v1版本。

Istio 对用户身份没有任何特殊的内置机制。在应用示例中,productpage服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,其值为用户名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: OneMore
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

注入 HTTP 延迟故障

目标:用户 OneMore 访问时, ratings 服务注入一个 2 秒的延迟,productpage页面在大约 2 秒钟加载完成并且没有错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: OneMore
    fault:
      delay:
        percentage:
          value: 100.0
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
    - labels:
        version: v1
      name: v1

注入 HTTP 中止故障

目标:用户 OneMore 访问时, ratings 服务注入一个503的中止故障,productpage 页面能够立即被加载,同时显示 “Ratings service is currently unavailable” 这样的消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
    - ratings
  http:
    - fault:
        abort:
          httpStatus: 503
          percentage:
            value: 100
      match:
        - headers:
            end-user:
              exact: OneMore
      route:
        - destination:
            host: ratings
            subset: v1
    - route:
        - destination:
            host: ratings
            subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
    - labels:
        version: v1
      name: v1

设置请求超时

首先,用户 OneMore 访问时, ratings 服务注入一个 2 秒的延迟,productpage页面在大约 2 秒钟加载完成并且没有错误。

按照上文注入 HTTP 延迟故障进行操作,不再赘述。

目标:用户 OneMore 访问时, reviews 服务的请求超时设置为 1 秒,同时显示 “Sorry, product reviews are currently unavailable for this book.” 这样的消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
    - match:
        - headers:
            end-user:
              exact: OneMore
      route:
        - destination:
            host: reviews
            subset: v2
      timeout: 1s
    - route:
        - destination:
            host: reviews
            subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

在Jaeger可以看到具体的调用链如下:

设置请求重试

首先,用户 OneMore 访问时, ratings 服务注入一个 2 秒的延迟,productpage页面在大约 2 秒钟加载完成并且没有错误。

按照上文注入 HTTP 延迟故障进行操作,不再赘述。

目标:用户 OneMore 访问时, reviews 服务的请求重试次数为2次,重试超时时间为 0.5 秒,同时显示 “Sorry, product reviews are currently unavailable for this book.” 这样的错误消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
    - match:
        - headers:
            end-user:
              exact: OneMore
      route:
        - destination:
            host: reviews
            subset: v2
      retries:
        attempts: 2
        perTryTimeout: 0.5s
    - route:
        - destination:
            host: reviews
            subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

拒绝目标IP的请求

目标:除了IP为10.201.240.131的客户端可以访问/api/v1/products/1,其他客户端拒绝请求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-by-ip
spec:
  selector:
    matchLabels:
      app: productpage
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/api/v1/products/1"]
    when:
    - key: remote.ip
      notValues: ["10.201.240.131"]

熔断

目标:设置details服务的并发上限为1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1

可以使用 Fortio 进行负载测试,发送并发数为 2 的连接(-c 2),请求 20 次(-n 20):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl exec fortio-deploy-684b6b47f8-tzsg8 -c fortio -- /usr/bin/fortio load -c  -qps  -n  -loglevel Warning http://details:9080/details/0

其中,fortio-deploy-684b6b47f8-tzsg8是Fortio的Pod名称,效果如下:

流量镜像

目标:把流量全部路由到reviews服务的 v2 版本,再把流量全部镜像到 v3 版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    mirror:
      host: reviews
      subset: v3
    mirrorPercentage:
      value: 100.0
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3

执行如下命令查看reviews服务 v3 版本的 Envoy 访问日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl logs -l app=reviews,version=v3 -c istio-proxy

可以看到reviews服务 v3 版本被调用的日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
     "authority": "reviews-shadow:9080",
     "bytes_received": ,
     "bytes_sent": ,
     "connection_termination_details": null,
     "downstream_local_address": "10.1.1.64:9080",
     "downstream_remote_address": "10.1.1.59:0",
     "duration": ,
     "method": "GET",
     "path": "/reviews/0",
     "protocol": "HTTP/1.1",
     "request_id": "b79cefe6-1277-9c39-b398-f94a704840cc",
     "requested_server_name": "outbound_.9080_.v3_.reviews.default.svc.cluster.local",
     "response_code": ,
     "response_code_details": "via_upstream",
     "response_flags": "-",
     "route_name": "default",
     "start_time": "2022-06-27T07:34:19.129Z",
     "upstream_cluster": "inbound|9080||",
     "upstream_host": "10.1.1.64:9080",
     "upstream_local_address": "127.0.0.6:59837",
     "upstream_service_time": "1913",
     "upstream_transport_failure_reason": null,
     "user_agent": "curl/7.79.1",
     "x_forwarded_for": "10.1.1.59"
}

Ingress的路由

目标:请求头app-iddetails的所有流量都路由到details服务中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
    - '*'
  gateways:
    - bookinfo-gateway
  http:
    - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
      route:
        - destination:
            host: productpage
            port:
              number: 9080
    - match:
        - headers:
            app-id:
              exact: details
      route:
        - destination:
            host: details
            port:
              number: 9080

使用curl命令验证一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -H "app-id: details" -v http://127.0.0.1/details/2

返回结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* Trying 127.0.0.1:80...
* Connected to 127.0.0.1 (127.0.0.1) port  (#)
> GET /details/ HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.79.1
> Accept: */*
> app-id: details
>
* Mark bundle as not supporting multiuse
< HTTP/1.1  OK
< content-type: application/json
< server: istio-envoy
< date: Tue,  Jun  :: GMT
< content-length: 
< x-envoy-upstream-service-time: 
<

{"id":,"author":"William Shakespeare","year":,"type":"paperback","pages":,"publisher":"PublisherA","language":"English","ISBN-10":"1234567890","ISBN-13":"123-1234567890"}

* Connection # to host 127.0.0.1 left intact

返回结果可以看出,访问的是details服务。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 万猫学社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
istio 流量管理
​ Istio Bookinfo 示例包含四个独立的微服务,每个微服务都有多个版本。 其中一个微服务 reviews 的三个不同版本已经部署并同时运行。 为了说明这导致的问题,在浏览器中访问 Bookinfo 应用程序的 /productpage 并刷新几次。 您会注意到,有时书评的输出包含星级评分,有时则不包含。 这是因为没有明确的默认服务版本路由,Istio 将以循环方式请求路由到所有可用版本,此任务的最初目标是应用将所有流量路由到微服务的 v1 (版本 1)的规则。
星哥玩云
2022/09/15
5950
istio 流量管理
Istio流量管理之请求路由分析
前面我们了解了 Gateway 和 VirtualService 资源对象的作用,以及它们是如何影响 Envoy 的配置的,那么这些资源对象又是如何影响流量的呢?通过 Istio 如何实现流量管理的呢?
我是阳明
2023/11/09
4830
Istio流量管理之请求路由分析
Istio 入门(五):访问控制和流量管理
主要演示了使用 Istio Gateway、VirtualService 对外暴露服务的访问地址 ,以及基于 Istio 实现可观察性的 Kiali 组件。让我们回在上一章中部署的 bookinfo 示例已经学习了什么:
痴者工良
2023/07/24
9760
Istio 入门(五):访问控制和流量管理
《istio实战指南》第4章 Bookinfo应用
第4章 Bookinfo应用 ---- 什么是Bookinfo应用 Bookinfo是一个模拟的在线书店应用,只有一个页面,由图书列表、图书详细信息、评论和评分4个部分组成,这些部分分别由对应的微服务来实现。Bookinfo应用是一个异构应用,不同的服务使用不同的程序语言编写,共同组成了一个微服务系统 服务 功能 实现 productpage 图书列表 Python details 图书详细信息 Ruby reviews 评论 Java ratings 评分 Node.js 另外,reviews服务有3个
yeedomliu
2020/07/14
2.2K0
《istio实战指南》第4章 Bookinfo应用
《istio实战指南》第5章 流量管理
第5章 流量管理 ---- 流量管理中的规则配置 要控制流量,就需要定义一些规则。Istio中定义了一个简单的配置模型,可以很方便地进行规则的配置。在示例练习前,需要先了解一下与规则配置相关的重要概念和基本的配置方法 Istio中定义了4种针对流量管理的配置资源 定义路由规则,控制请求如何被路由到服务 VirtualService VirtualService的主要功能是定义路由规则,使请求(流量)可以依据这些规则被分发到对应的服务。路由的方式也有很多种,可以根据请求的源或目标地址路由,也可以根据路径、头信
yeedomliu
2020/07/14
1.5K0
《istio实战指南》第5章 流量管理
mac 上学习k8s系列(36)istio part IV 内外路由和故障注入
下面以bookingo为例介绍下如何实现上述功能的。Bookinfo这个示例应用由4个独立的微服务组成
golangLeetcode
2022/08/02
3400
mac 上学习k8s系列(36)istio part IV 内外路由和故障注入
Istio 入门(三):体验 Istio、微服务部署、可观测性
在本章中,我们正式迈入学习 Istio 的第一步。因为 Istio 的知识体系是较为庞大的,因此我们可以先通过本章的入门教程快速了解如何使用 Istio 部署一套微服务,以及 Istio 核心功能的使用方法,了解 Istio 可以为微服务解决什么问题。
痴者工良
2023/07/24
1.9K0
Istio 入门(三):体验 Istio、微服务部署、可观测性
摸索:Istio 路由规则 Alpha v3
Istio 近期的版本中出现了一个新的 API 组:networking.istio.io/v1alpha3,应该会替代现有的config.istio.io/v1alpha2 API。新的 API 不管是结构上还是功能上、以及命名上,都有很大差异。这里使用一些简单例子,体验一下 Alpha 3 带来的变化。
崔秀龙
2019/07/22
7560
[Istio是什么?] 还不知道你就out了,一文40分钟快速理解
服务网格是通过sidecar(边车)代理服务实现,控制平面主要是对sidecar的配置和管理,这包括:
秋意零
2022/04/22
4.6K0
[Istio是什么?] 还不知道你就out了,一文40分钟快速理解
istio流量路由小试牛刀
下载https://github.com/istio/istio/releases/download/1.18.2/istio-1.18.2-osx-arm64.tar.gz
code4it
2023/07/27
2680
istio流量路由小试牛刀
istio流量路由小试牛刀
下载https://github.com/istio/istio/releases/download/1.18.2/istio-1.18.2-osx-arm64.tar.gz
code4it
2023/08/31
2560
istio流量路由小试牛刀
5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?
5 个 Istio 访问外部服务的流量控制常用例子,强烈建议收藏起来,以备不时之需。
万猫学社
2022/12/01
3640
使用 Istio 实现非侵入流量治理
现在最火的后端架构无疑是微服务了,微服务将之前的单体应用拆分成了许多独立的服务应用,每个微服务都是独立的,好处自然很多,但是随着应用的越来越大,微服务暴露出来的问题也就随之而来了,微服务越来越多,管理越来越麻烦,特别是要你部署一套新环境的时候,你就能体会到这种痛苦了,随之而来的服务发现、负载均衡、Trace跟踪、流量管理、安全认证等等问题。如果从头到尾完成过一套微服务框架的话,你就会知道这里面涉及到的东西真的非常多。当然随着微服务的不断发展,微服务的生态也不断完善,最近新一代的微服务开发就悄然兴起了,那就是服务网格/Service Mesh。
我是阳明
2021/07/27
1.4K0
三, 跨语言微服务框架 - Istio官方示例(自动注入.请求路由.流量控制.故障注入)
基础的Istio环境已经搭建完成,我们需要开始了解Istio提供作为微服务网格的各种机制,也就是本文标题的自动注入.请求路由.故障注入.流量切换,官方很给力的准备的实例项目也不需要大家自己编写demo来进行测试,那就来时跑跑看吧.
喵了个咪233
2019/05/26
8510
istio-in-action - 06 使用 DestinationRule Subset 进行路由分组(版本控制)
默认情况下会根据 VirtualService 的默认规则 轮询 到后端的所有服务。
老麦
2022/12/24
7430
小白带你去上云-容器服务网格实践
随着容器技术、微服务架构的普及,越来越多的团队开始走向Service mesh之路。
白鹏飞
2021/03/03
9150
小白带你去上云-容器服务网格实践
Istio v1aplha3 路由 AP
v1alpha3引入了以下这些新的配置资源来控制进入网格,网格内部和离开网格的流量路由。
py3study
2020/01/08
8370
Service Mesh - Istio流量控制篇(上)
路由这个功能是流量控制里面非常重要,也是最常用的一个功能。在Istio里一般通过Virtual Service(虚拟服务)以及Destination Rule(目标规则)这两个API资源进行动态路由的设置。
端碗吹水
2020/12/23
1.6K0
Service Mesh - Istio流量控制篇(上)
Isito 入门(八):金丝雀发布
新版本上线之前,经历过开发和测试人员的验证,也经过产品经理的验收。可是当要上线到生产环境时,谁也保证不了上线一定就能跑起来。所以往往需要在上线时保持新版本和旧版本同时在用,测试人员或内测用户可以访问新版本,其他人继续使用旧版本。再有就是上线时新旧系统能够丝滑切换,用户完全感知不到这种变化。
痴者工良
2023/11/03
6940
Isito 入门(八):金丝雀发布
Istio从A到Y
Istio 是一款开源服务网格,允许您连接、保护、控制和观察应用程序的服务。我们将了解如何安装 Istio,以及如何使用它来保护和监控我们的服务。
云云众生s
2024/07/21
4890
Istio从A到Y
相关推荐
istio 流量管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验