Istio
Istio 的安装以及入门使用 - 图1

Istio 的安装

学习的最好方式就是亲自动手实践,要想学 Istio ,就先把 Istio 给装起来!

安装方式的选择

Istio 提供了多种可选的安装方式:

安装方式 说明 推荐度 源码位置
Istioctl Istio 提供的命令行工具 ⭐⭐⭐⭐⭐ istio/istioctl
Istio Operator Istio 提供的 Operator 控制器 ⭐⭐
直接使用 Operator 进行安装可能存在安全隐患,并且官方不会优先为其考虑新特性了
istio/operator
Helm Kubernetes 的包管理器 ⭐⭐⭐
此特性目前(2022-02-03)仍处于 alpha 阶段
istio/manifests/charts

使用 Istioctl 和 Istio Operator 安装 Istio 时,底层使用的都是相同的 IstioOperator API 。
它们区别在于当使用 istioctl install 命令时,操作运行于管理员用户的安全上下文中;而直接使用 Operator 时,操作运行于集群内 pod 自己的安全上下文中。 为了避免此漏洞,需要确保 Operator 自身部署的足够安全,所以一般不建议直接使用 Operator 。
而不论是使用 Helm chart ,或是 Istioctl 、 Operator 安装 Istio 时,它们使用的底层 chart 都是相同的。
接下来将使用 Istioctl 来进行 Istio 的安装

开始安装

首先需要将 Istioctl 工具下载到服务器,可以自行到 Istio release 页面下载对应的平台版本。
也有个简单的办法,直接使用 Istio 提供的 downloadIstio 脚本一键下载:

  1. $ curl -L https://istio.io/downloadIstio | sh -

不过该方式默认下载的是最新版本,推荐大家指定一下具体版本,以 1.12.1 为例,可以通过传递 ISTIO_VERSION 参数:

  1. $ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.12.1 sh -

执行完成后会在当前位置生成 istio-1.12.1 目录,其中包括以下内容(具体版本可能存在差异):
Istio 的安装以及入门使用 - 图2

  • bin : 存放 istioctl 二进制文件
  • manifests : istio 的内置 chart 目录,默认使用这些内置 chart 生成安装清单,安装过程也可以自行设置 —manifests=other_manifests/ 参数来指定外部 chart
  • samples : istio 提供的一些示例应用程序
  • tools : 一些工具,如 certs 用于生成证书

为了方便使用 istioctl ,将 bin 目录添加到环境变量中:

  1. $ export PATH=$PWD/bin:$PATH

检查一下 istio 环境以及版本信息:

  1. $ istioctl version
  2. no running Istio pods in "istio-system"
  3. 1.12.1

到这,istioctl 的安装就完成了,还要继续借助 istioctl 来完成 Istio 的安装,这才是最终目的。
在继续安装 Istio 之前,先要了解下 Istio 提供的几个内置的配置文件,这些配置文件提供了对 Istio 控制平面和 Istio 数据平面 Sidecar 的定制内容。
要想知道有哪几个内置的配置文件,可以运行以下命令:

  1. $ istioctl profile list
  2. Istio configuration profiles:
  3. default
  4. demo
  5. empty
  6. external
  7. minimal
  8. openshift
  9. preview
  10. remote

其中几个主要的配置文件:

配置文件 核心组件 说明
default istio-ingressgateway、istiod 根据 IstioOperator API 的默认设置启动组件。可用于生产部署
demo istio-egressgateway、istio-ingressgateway、istiod 旨在展示 Istio 的功能,启用了高级别的追踪和访问日志(需要具有适度的资源),适合学习使用
minimal istiod 与默认配置文件相同,但只安装了控制平面组件。
remote - 配置 Multicluster Mesh 的 Remote Cluster。
empty - 不部署任何东西。可以作为自定义配置的基本配置文件。
preview istio-ingressgateway、istiod 实验性。用于探索 Istio 的新功能。不确保稳定性、安全性和性能。

当足够熟悉 Istio 后,可以自定义配置文件。但在此之前,还是先以 demo 来入门吧。
可以浏览一下 demo 的配置信息:

  1. $ istioctl profile dump demo
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. spec:
  5. components:
  6. base:
  7. enabled: true
  8. cni:
  9. enabled: false
  10. egressGateways:
  11. - enabled: true
  12. k8s:
  13. resources:
  14. requests:
  15. cpu: 10m
  16. memory: 40Mi
  17. name: istio-egressgateway
  18. ingressGateways:
  19. - enabled: true
  20. ......

开始使用 demo 配置文件进行 Istio 安装,有两种方式:
1、直接通过在命令行传递配置名称

  1. $ istioctl install --set profile=demo

2、通过 -f 传递配置文件(推荐方式)

  1. $ vi my-demo-config.yaml
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. spec:
  5. profile: demo
  6. $ istioctl install -f my-demo-config.yaml

完整的 API 记录可以参考 IstioOperator API 文档
耐心等待,出现如下结果:

  1. This will install the Istio 1.12.1 demo profile with ["Istio core" "Istiod" "Ingress gateways" "Egress gateways"] components into the cluster. Proceed? (y/N) y
  2. Istio core installed
  3. Istiod installed
  4. Egress gateways installed
  5. Ingress gateways installed
  6. Installation complete
  7. Making this installation the default for injection and validation.
  8. Thank you for installing Istio 1.12. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/xxx

到此,Istio 的安装就完成了。
再次检查一下 istio 环境以及版本信息:

  1. $ istioctl version
  2. client version: 1.12.1
  3. control plane version: 1.12.1
  4. data plane version: 1.12.1 (2 proxies)

也可以对其进行验证:

  1. $ istioctl verify-install -f my-demo-config.yaml
  2. ......
  3. Checked 14 custom resource definitions
  4. Checked 3 Istio Deployments
  5. Istio is installed and verified successfully

查看 Istio 在 Kubernetes 部署了什么:

  1. $ kubectl -n istio-system get deploy
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. istio-egressgateway 1/1 1 1 9m49s
  4. istio-ingressgateway 1/1 1 1 9m49s
  5. istiod 1/1 1 1 10m

为了下面示例项目的演示,先准备一个命名空间 istio-app,为其添加标签,指示在此命名空间部署应用时,Istio 自动给 Pod 注入 Envoy 边车代理:

  1. $ kubectl create ns istio-app
  2. namespace/istio-app created
  3. $ kubectl label ns istio-app istio-injection=enabled
  4. namespace/istio-app labeled

最后,如果不需要 Istio ,可以卸载掉(希望不会执行到这一步 😅):

  1. $ istioctl manifest generate -f my-demo-config.yaml | kubectl delete --ignore-not-found=true -f -
  2. $ kubectl delete ns istio-system
  3. $ kubectl label ns istio-app istio-injection-
  4. $ kubectl delete ns istio-app

微服务示例项目

本篇文章的微服务示例项目将选用:Online Boutique
这是一个基于云原生微服务架构的 web 商城应用,由 11 个用不同语言编写的微服务组成,服务间通过 gRPC 相互通信。用户可以在其中进行浏览商品、添加购物车并购买等操作。
Istio 的安装以及入门使用 - 图3
Online Boutique 架构图

服务 语言 说明
frontend Go 提供一个 HTTP 服务。实现不需要注册/登录并自动为所有用户生成会话 ID
cartservice C# 将用户购物车中的商品存储在 Redis 中并进行检索
productcatalogservice Go 产品列表(来自 JSON 文件)、搜索产品以及获取单个产品
currencyservice Node.js 将一种货币金额转换为另一种货币。 使用从欧洲中央银行获取的真实值。 这是最高的 QPS 服务
paymentservice Node.js 用给定的金额向给定的信用卡信息(模拟)收取费用并返回交易 ID
shippingservice Go 根据购物车提供运费估算。 将物品运送到给定地址(模拟)
emailservice Python 向用户发送订单确认电子邮件(模拟)
checkoutservice Go 检索用户购物车、准备订单并协调付款、运输和电子邮件通知
recommendationservice Python 根据购物车中给出的内容推荐其他产品
adservice Java 根据给定的上下文词提供文字广告
loadgenerator Python/Locust 不断向前端发送模仿真实用户购物流程的请求

使用 Kubernetes 部署

Online Boutique 的 Kubernetes 部署配置位于:https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/release/kubernetes-manifests.yaml
建议先自行下载到本地,其中使用到的 gcr.io 镜像如果无法拉取,可以参考:
解决 k8s.gcr.io 镜像下载失败的 4 种方法
先为 Online Boutique 应用创建一个命名空间:

  1. $ kubectl create ns microservices-demo
  2. namespace/microservices-demo created

开始部署 Online Boutique 应用:

  1. $ kubectl apply -n microservices-demo -f kubernetes-manifests.yaml
  2. deployment.apps/emailservice created
  3. service/emailservice created
  4. deployment.apps/checkoutservice created
  5. service/checkoutservice created
  6. deployment.apps/recommendationservice created
  7. service/recommendationservice created
  8. deployment.apps/frontend created
  9. service/frontend created
  10. service/frontend-external created
  11. deployment.apps/paymentservice created
  12. service/paymentservice created
  13. deployment.apps/productcatalogservice created
  14. service/productcatalogservice created
  15. deployment.apps/cartservice created
  16. service/cartservice created
  17. deployment.apps/loadgenerator created
  18. deployment.apps/currencyservice created
  19. service/currencyservice created
  20. deployment.apps/shippingservice created
  21. service/shippingservice created
  22. deployment.apps/redis-cart created
  23. service/redis-cart created
  24. deployment.apps/adservice created
  25. service/adservice created

等待所有 POD 启动完成:

  1. $ kubectl get pod -n microservices-demo
  2. NAME READY STATUS RESTARTS AGE
  3. adservice-78c76f67d7-ssk2d 1/1 Running 0 68s
  4. cartservice-7fb7c7bbcf-hcjvb 1/1 Running 0 69s
  5. checkoutservice-7dc67d866f-fqx6g 1/1 Running 0 69s
  6. currencyservice-86cbc887cf-9cs89 1/1 Running 0 69s
  7. emailservice-5d4d698877-sg5rq 1/1 Running 0 69s
  8. frontend-78756cdbb9-szdsg 1/1 Running 0 69s
  9. loadgenerator-7ddcddf799-6bjr9 1/1 Running 0 69s
  10. paymentservice-66697f866c-b7vjv 1/1 Running 0 69s
  11. productcatalogservice-78b45fdb9f-58rq6 1/1 Running 0 69s
  12. recommendationservice-58956f7f99-k9bgq 1/1 Running 0 69s
  13. redis-cart-5b569cd47-96knk 1/1 Running 0 68s
  14. shippingservice-5cbc5b7c4c-t2x79 1/1 Running 0 68s

查看 Service :

  1. $ kubectl get svc -n microservices-demo
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. adservice ClusterIP 10.104.91.120 <none> 9555/TCP 110s
  4. cartservice ClusterIP 10.100.229.227 <none> 7070/TCP 110s
  5. checkoutservice ClusterIP 10.97.11.220 <none> 5050/TCP 110s
  6. currencyservice ClusterIP 10.99.197.174 <none> 7000/TCP 110s
  7. emailservice ClusterIP 10.104.16.76 <none> 5000/TCP 110s
  8. frontend ClusterIP 10.105.83.87 <none> 80/TCP 110s
  9. frontend-external LoadBalancer 10.101.227.191 localhost 80:31057/TCP 110s
  10. paymentservice ClusterIP 10.105.219.247 <none> 50051/TCP 110s
  11. productcatalogservice ClusterIP 10.98.241.58 <none> 3550/TCP 110s
  12. recommendationservice ClusterIP 10.96.153.244 <none> 8080/TCP 110s
  13. redis-cart ClusterIP 10.107.73.80 <none> 6379/TCP 110s
  14. shippingservice ClusterIP 10.100.207.175 <none> 50051/TCP 110s

浏览器访问 frontend-external 服务,这是 Online Boutique 暴露的 LoadBalancer 前端服务。
Istio 的安装以及入门使用 - 图4
Online Boutique 前端首页
Online Boutique 商品详情页
Online Boutique 推荐和广告页
完整功能自行部署后进行体验。

为微服务启用 Istio

部署在 microservices-demo 命名空间中的 Online Boutique 是一个简单的基于 Kubernetes 的微服务架构应用,而在一些细化管理的需求上,如熔断、限流、监控、认证、授权、安全、负载均衡等,无法很好的得到满足。
所以,将为其升级到服务网格架构,为微服务启用 Istio 支持。
要启用 Istio 支持,只要为 POD 额外注入一个 SideCar 应用。
可以手动注入,也可以为整个命名空间添加 istio-injection=enabled 标签实现自动注入。
在安装 Istio 时,已经预先创建了一个 istio-app 命名空间并为其添加了 Istio 自动注入 SideCar 的标签。
重新在 istio-app 命名空间部署 Online Boutique 应用:

  1. $ kubectl apply -n istio-app -f kubernetes-manifests.yaml
  2. deployment.apps/emailservice created
  3. service/emailservice created
  4. deployment.apps/checkoutservice created
  5. service/checkoutservice created
  6. deployment.apps/recommendationservice created
  7. service/recommendationservice created
  8. deployment.apps/frontend created
  9. service/frontend created
  10. service/frontend-external created
  11. deployment.apps/paymentservice created
  12. service/paymentservice created
  13. deployment.apps/productcatalogservice created
  14. service/productcatalogservice created
  15. deployment.apps/cartservice created
  16. service/cartservice created
  17. deployment.apps/loadgenerator created
  18. deployment.apps/currencyservice created
  19. service/currencyservice created
  20. deployment.apps/shippingservice created
  21. service/shippingservice created
  22. deployment.apps/redis-cart created
  23. service/redis-cart created
  24. deployment.apps/adservice created
  25. service/adservice created

同样的,等待所有 POD 启动完成:

  1. $ kubectl get pod -n istio-app
  2. NAME READY STATUS RESTARTS AGE
  3. adservice-78c76f67d7-vgc8d 2/2 Running 0 59s
  4. cartservice-7fb7c7bbcf-7xklw 2/2 Running 0 60s
  5. checkoutservice-7dc67d866f-jh9vm 2/2 Running 0 60s
  6. currencyservice-86cbc887cf-29v9n 2/2 Running 0 60s
  7. emailservice-5d4d698877-vgvc8 2/2 Running 0 60s
  8. frontend-78756cdbb9-xzm95 2/2 Running 0 60s
  9. loadgenerator-7ddcddf799-9hrkj 2/2 Running 0 60s
  10. paymentservice-66697f866c-k5qnj 2/2 Running 0 60s
  11. productcatalogservice-78b45fdb9f-t7t8x 2/2 Running 0 60s
  12. recommendationservice-58956f7f99-fxk6s 2/2 Running 0 60s
  13. redis-cart-5b569cd47-7c48x 2/2 Running 0 59s
  14. shippingservice-5cbc5b7c4c-5tb95 2/2 Running 0 59s

每个 POD 中都额外多了一个容器,即 SideCar 代理。
和之前不同的是,应该使用 Istio 的入口网关来访问应用,不再需要 frontend-external 服务了,可以把它删掉:

  1. $ kubectl delete svc frontend-external -n istio-app
  2. service "frontend-external" deleted

查看 Istio 的入口网关 istio-ingressgateway 暴露端口(80 或 443 映射的端口):

  1. $ kubectl get svc -n istio-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. istio-egressgateway ClusterIP 10.99.177.224 <none> 80/TCP,443/TCP 25d
  4. istio-ingressgateway NodePort 10.98.188.6 <none> 15021:31783/TCP,80:30776/TCP,443:32456/TCP,31400:30022/TCP,15443:30548/TCP 25d
  5. istiod ClusterIP 10.96.241.180 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 25d

在访问之前,还需要为 Istio 声明一些配置,让其可以正确路由到 Online Boutique 应用:

  1. $ kubectl apply -n istio-app -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/release/istio-manifests.yaml
  2. gateway.networking.istio.io/frontend-gateway created
  3. virtualservice.networking.istio.io/frontend-ingress created
  4. serviceentry.networking.istio.io/allow-egress-googleapis created
  5. serviceentry.networking.istio.io/allow-egress-google-metadata created
  6. virtualservice.networking.istio.io/frontend created
  7. $ kubectl delete serviceentry allow-egress-google-metadata -n istio-app
  8. serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
  9. $ kubectl delete serviceentry allow-egress-googleapis -n istio-app
  10. serviceentry.networking.istio.io "allow-egress-googleapis" deleted

关键配置说明:

  1. # Istio Gateway 配置
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: Gateway
  4. metadata:
  5. name: frontend-gateway
  6. spec:
  7. selector:
  8. istio: ingressgateway # 使用 Istio 默认网关实现
  9. servers:
  10. - port:
  11. number: 80
  12. name: http
  13. protocol: HTTP
  14. hosts:
  15. - "*"
  16. ---
  17. # 流量路由配置
  18. apiVersion: networking.istio.io/v1alpha3
  19. kind: VirtualService
  20. metadata:
  21. name: frontend-ingress
  22. spec:
  23. # 流量的目标主机
  24. hosts:
  25. - "*"
  26. # 与上面的网关绑定在一起,以接受来自该网关的流量
  27. gateways:
  28. - frontend-gateway
  29. http:
  30. - route:
  31. # 转发流量到实际目的地
  32. - destination:
  33. # 主机名
  34. host: frontend
  35. # 端口
  36. port:
  37. number: 80

访问效果和之前一样,只是入口变成了 Istio 的网关:
服务网格架构下的 Online Boutique 前端首页

集成遥测应用

在集成遥测应用之前,来体验一下 Istio 的金丝雀部署功能。
之前的 productcatalogservice 服务没有指定版本,可以将其删除并指定为 V1 版本:

  1. $ kubectl delete deploy productcatalogservice -n istio-app
  2. deployment.apps "productcatalogservice" deleted

V1 版本:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: productcatalogservice
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: productcatalogservice
  9. template:
  10. metadata:
  11. labels:
  12. app: productcatalogservice
  13. # 指定为 v1 版本
  14. version: v1
  15. spec:
  16. serviceAccountName: default
  17. terminationGracePeriodSeconds: 5
  18. containers:
  19. - name: server
  20. image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.5
  21. ports:
  22. - containerPort: 3550
  23. env:
  24. - name: PORT
  25. value: "3550"
  26. - name: DISABLE_STATS
  27. value: "1"
  28. - name: DISABLE_TRACING
  29. value: "1"
  30. - name: DISABLE_PROFILER
  31. value: "1"
  32. # - name: JAEGER_SERVICE_ADDR
  33. # value: "jaeger-collector:14268"
  34. readinessProbe:
  35. exec:
  36. command: ["/bin/grpc_health_probe", "-addr=:3550"]
  37. livenessProbe:
  38. exec:
  39. command: ["/bin/grpc_health_probe", "-addr=:3550"]
  40. resources:
  41. requests:
  42. cpu: 100m
  43. memory: 64Mi
  44. limits:
  45. cpu: 200m
  46. memory: 128Mi
  1. $ kubectl apply -n istio-app -f productcatalog-v1.yaml
  2. deployment.apps/productcatalogservice created
  3. $ kubectl get deploy productcatalogservice -n istio-app
  4. NAME READY UP-TO-DATE AVAILABLE AGE
  5. productcatalogservice 1/1 1 1 5s

V2 版本:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: productcatalogservice-v2
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: productcatalogservice
  9. template:
  10. metadata:
  11. labels:
  12. app: productcatalogservice
  13. # 指定为 v2 版本
  14. version: v2
  15. spec:
  16. containers:
  17. - env:
  18. - name: PORT
  19. value: '3550'
  20. - name: EXTRA_LATENCY
  21. value: 3s
  22. image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.3.5
  23. livenessProbe:
  24. exec:
  25. command:
  26. - /bin/grpc_health_probe
  27. - -addr=:3550
  28. name: server
  29. ports:
  30. - containerPort: 3550
  31. readinessProbe:
  32. exec:
  33. command:
  34. - /bin/grpc_health_probe
  35. - -addr=:3550
  36. resources:
  37. limits:
  38. cpu: 200m
  39. memory: 128Mi
  40. requests:
  41. cpu: 100m
  42. memory: 64Mi
  43. terminationGracePeriodSeconds: 5
  1. $ kubectl apply -n istio-app -f productcatalog-v2.yaml
  2. deployment.apps/productcatalogservice-v2 created
  3. $ kubectl get deploy productcatalogservice-v2 -n istio-app
  4. NAME READY UP-TO-DATE AVAILABLE AGE
  5. productcatalogservice-v2 1/1 1 1 6s

V2 版本设置了 EXTRA_LATENCY 环境变量,让接口时延延长 3 秒。(很明显,这是一个有故障的升级)
通过配置 Istio 使 75% 的流量流向 V1 , 25% 的流量流向 V2 :

  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: VirtualService
  3. metadata:
  4. name: productcatalogservice
  5. spec:
  6. hosts:
  7. - productcatalogservice
  8. http:
  9. - route:
  10. - destination:
  11. host: productcatalogservice
  12. subset: v1
  13. weight: 75
  14. - destination:
  15. host: productcatalogservice
  16. subset: v2
  17. weight: 25
  1. $ kubectl apply -n istio-app -f vs-split-traffic.yaml
  2. virtualservice.networking.istio.io/productcatalogservice created
  1. apiVersion: networking.istio.io/v1alpha3
  2. kind: DestinationRule
  3. metadata:
  4. name: productcatalogservice
  5. spec:
  6. host: productcatalogservice
  7. subsets:
  8. - labels:
  9. app: productcatalogservice
  10. version: v1
  11. name: v1
  12. - labels:
  13. app: productcatalogservice
  14. version: v2
  15. name: v2
  1. $ kubectl apply -n istio-app -f destinationrule.yaml
  2. destinationrule.networking.istio.io/productcatalogservice created

多次刷新首页。前端加载速度应该会周期性的变较慢(3 秒)。
这个时候就可以让遥测应用上场观察了。
这些应用能够与 Istio 集成以提供额外功能。
Istio 的安装以及入门使用 - 图8
在最开始下载 Istioctl 工具时,有一个 samples 文件夹,其中的 addons 目录就存放了这些遥测应用的部署配置。
Istio 的安装以及入门使用 - 图9
直接部署 samples/addons 下所有的遥测应用:

  1. $ kubectl apply -n istio-system -f samples/addons
  2. serviceaccount/grafana created
  3. configmap/grafana created
  4. service/grafana created
  5. deployment.apps/grafana created
  6. configmap/istio-grafana-dashboards created
  7. configmap/istio-services-grafana-dashboards created
  8. deployment.apps/jaeger created
  9. service/tracing created
  10. service/zipkin created
  11. service/jaeger-collector created
  12. serviceaccount/kiali created
  13. configmap/kiali created
  14. clusterrole.rbac.authorization.k8s.io/kiali-viewer created
  15. clusterrole.rbac.authorization.k8s.io/kiali created
  16. clusterrolebinding.rbac.authorization.k8s.io/kiali created
  17. role.rbac.authorization.k8s.io/kiali-controlplane created
  18. rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
  19. service/kiali created
  20. deployment.apps/kiali created
  21. serviceaccount/prometheus created
  22. configmap/prometheus created
  23. clusterrole.rbac.authorization.k8s.io/prometheus created
  24. clusterrolebinding.rbac.authorization.k8s.io/prometheus created
  25. service/prometheus created
  26. deployment.apps/prometheus created

使用 istioctl 访问 Kiali:

  1. $ istioctl dashboard kiali

Istio 的安装以及入门使用 - 图10
观察 productcatalogservice 看到大约 25% 的请求发送到 V2 :
Istio 的安装以及入门使用 - 图11
由于 V2 是一个故障升级,如果需要回滚,将 100% 的流量流向 V1 ,只需要更改 productcatalogserviceVirtualService 配置。
可以直接在 Kiali 中更改:
Istio 的安装以及入门使用 - 图12
Kiali 还有很多的功能就不在这一一体现了。

参考资料

istio/istioctl: https://github.com/istio/istio/tree/master/istioctl
istio/operator: https://github.com/istio/istio/tree/master/operator
istio/manifests/charts: https://github.com/istio/istio/tree/master/manifests/charts
Istio Release: https://github.com/istio/istio/releases
IstioOperator API 文档: https://istio.io/latest/zh/docs/reference/config/istio.operator.v1alpha1/
Online Boutique: https://github.com/GoogleCloudPlatform/microservices-demo
https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/release/kubernetes-manifests.yaml: https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/release/kubernetes-manifests.yaml