配置请求路由

Istio Bookinfo 示例包含四个独立的微服务, 每个微服务都有多个版本。其中一个微服务 reviews 的三个不同版本已经部署并同时运行。

有时书评的输出包含星级评分,有时则不包含。这是因为没有明确的默认服务版本可路由, Istio 将以循环方式将请求路由到所有可用版本。

v1版本

云计算-istio实验一_微服务

V2版本

云计算-istio实验一_微服务_02

v3版本

云计算-istio实验一_App_03

路由到v1版本

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

显示已经定义的路由

kubectl get virtualservices -o yaml

云计算-istio实验一_微服务_04

显示相应的subset定义

kubectl get destinationrules -o yaml

您已将 Istio 配置为路由到 Bookinfo 微服务的 v1 版本,最重要的是 reviews 服务的版本 1。


基于用户身份的路由

更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。在这种情况下, 来自名为 Jason 的用户的所有流量将被路由到服务 reviews:v2。

请注意,Istio 对用户身份没有任何特殊的内置机制。事实上,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到了本例子的效果

# 启用基于用户的路由
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml


#确认规则
kubectl get virtualservice reviews -o yaml

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

在 Bookinfo 应用程序的 /productpage 上,以用户 jason 身份登录。

刷新浏览器。您看到了什么?星级评分显示在每个评论旁边。

以其他用户身份登录(选择您想要的任何名称)。

刷新浏览器。现在星星消失了。这是因为除了 Jason 之外,所有用户的流量都被路由到 reviews:v1

清除

kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml


故障注入

#初始化版本路由
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

经过上面的配置,下面是请求的流程:

  • productpage → reviews:v2 → ratings(针对 jason 用户)
  • productpage → reviews:v1(其他用户)

注入 HTTP 延迟故障

为了测试微服务应用程序 Bookinfo 的弹性,我们将为用户 jason 在 reviews:v2 和 ratings 服务之间注入一个 7 秒的延迟。 这个测试将会发现一个故意引入 Bookinfo 应用程序中的 BUG。

注意 reviews:v2 服务对 ratings 服务的调用具有 10 秒的硬编码连接超时。 因此,尽管引入了 7 秒的延迟,我们仍然期望端到端的流程是没有任何错误的。

#创建故障注入规则
kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml

#确认规则建立
kubectl get virtualservice ratings -o yaml
============
apiVersion: networking.istio.io/v1
kind: VirtualService
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        fixedDelay: 7s
        percentage:
          value: 100
    match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

测试延迟配置

用户 jason 登录到 /productpage 页面。

期望 Bookinfo 主页在大约 7 秒钟加载完成并且没有错误。 但是,出现了一个问题:Reviews 部分显示了错误消息:

Sorry, product reviews are currently unavailable for this book.

查看页面的响应时间:

  • 打开浏览器的开发工具菜单
  • 打开网络标签
  • 重新加载 /productpage 页面,您会看到页面加载实际上用了大约 6 秒。

流量切换

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

在本任务中,您将会把 50% 的流量发送到 reviews:v1,另外,50% 的流量发送到 reviews:v3。接着,再把 100% 的流量发送到 reviews:v3 来完成迁移。

应用基于权重的路由

运行此命令将所有流量路由到各个微服务的 v1 版本。

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

此时,不管刷新多少次,目前将流量路由到了v1版本

云计算-istio实验一_App_05

以下,将50%的流量从v1转移到v3

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml

#确认路由规则生效
kubectl get virtualservice reviews -o yaml
===========
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50

此时刷新页面,大约50%的几率访问v3

#将流量100%路由到v3
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml

云计算-istio实验一_App_06

查询指标

查询Istio度量指标

#验证prometheus
kubectl -n istio-system get svc prometheus

#向网格发送流量
curl "http://$GATEWAY_URL/productpage"

#开开prometheus ui
nohup istioctl dashboard prometheus --address=192.168.233.3 &
======

云计算-istio实验一_应用程序_07


执行查询,istio_requests_total

云计算-istio实验一_应用程序_08

云计算-istio实验一_微服务_09

其他查询

#请求 productpage 服务的总次数:
istio_requests_total{destination_service="productpage.default.svc.cluster.local"}
#请求 reviews 服务 v3 版本的总次数:
istio_requests_total{destination_service="reviews.default.svc.cluster.local", destination_version="v3"}
#该查询返回所有请求 reviews 服务 v3 版本的当前总次数。
#过去 5 分钟 productpage 服务所有实例的请求频次:
rate(istio_requests_total{destination_service=~"productpage.*", response_code="200"}[5m])


网格可视化

多次访问 http://$GATEWAY_URL/productpage

查看graph,能够考到调用链和图形

云计算-istio实验一_App_10

使用不同的图形类型查看服务网格,请从 Graph Type 下拉菜单中选择一种图形类型。 有几种图形类型可供选择:App、Versioned App、Workload、Service。

  • App 图形类型将一个应用程序的所有版本聚合到一个图形节点中。 以下示例显示了一个单独的 reviews 节点,它代表了 reviews 应用程序的三个版本。

检查istio配置

查看service

云计算-istio实验一_应用程序_11


流量转移


1、查看 bookinfo 图的 Versioned app graph。

  • 确保已启用 Traffic Distribution Edge Label 的 Display 选项,以查看路由到每个工作负载的流量百分比。
  • 确保已经已启用 Show Service Nodes 的 Display 选项,以在图中查看服务节点。

云计算-istio实验一_App_12

2、通过点击 ratings 服务(三角形)节点,将关注点放在 bookinfo 图内的 ratings 服务上。 注意,ratings 服务流量平均分配给两个 ratings 服务 v1 和 v2(每台服务被路由 50% 的请求)。

云计算-istio实验一_微服务_13

3、点击侧面板上的 ratings 链接进入 ratings 服务的详情视图。 这也可以通过右键点击 ratings 服务节点并从上下文菜单中选择 Details 来完成。

4、从 Action 下拉菜单中,选择 Traffic Shifting 以流量转移向导。

云计算-istio实验一_微服务_14


5、拖动滑块以指定要路由到每个服务的流量百分比。 对于 ratings-v1,将其设置为 10%;对于 ratings-v2,请将其设置为 90%。

云计算-istio实验一_App_15