使用Istio服务网格实现流量镜像


Istio除了支持不同服务版本之间的更多“传统”流量路由,包括可以基于各种传入请求属性,例如URL的部分,标头值,请求方法等,Istio还支持流量镜像。
当您不想发布新版本并向其公开用户时,可以使用流量镜像,但您仍然希望部署它并观察其工作原理,收集遥测数据并比较新旧服务的性能和功能。
您可能会问 - 这种部署和发布有什么区别?当我们谈论将服务“部署”到生产时,我们只是将可执行代码(二进制文件,容器,代码所需的任何形式)移动到生产环境中,但不向它发送任何生产流量。服务就在那里,但它不会(希望如此!)影响它旁边运行的任何现有服务。这是部署而不发布。
发布服务涉及获取已部署的服务并开始将生产流量路由到该服务。此时,我们转移到生产的代码正在执行,它可能会影响其他服务和最终用户。
在两个版本之间路由流量,执行蓝绿色版本是有用的,但是存在风险 - 如果服务中断或出现故障会怎样?即使服务仅接收1%的生产流量,它仍然会对许多用户产生负面影响。

流量镜像背后的想法是将用户暴露给潜在的错误服务的风险最小化。我们不是部署,释放流量并将流量路由到新服务,而是部署新服务,然后只镜像那些发送到已发布版本服务的生产流量。(类似模拟复流量)

然后,可以观察服务接收镜像流量的错误,但不会影响任何生产流量。除了对部署的服务版本运行各种测试之外,您现在还可以使用实际的生产流量并增加测试覆盖率,这可以让您更有信心并最大限度地降低发布错误服务的风险。

以下是有关如何使用Istio打开流量镜像的快速摘录:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
    name: greeter-service
spec:
    hosts:
        - greeter-service
    http:
    - route:
      - destination:
          host: greeter-service
          port:
            number: 3000
          subset: v1
        weight: 100
      mirror:
        host: greeter-service
        port:
            number: 3000

以上是将greeter-service的v1子集流量映射到v2子集

上面的虚拟服务将100%的流量路由到v1版本,同时还将相同的流量镜像到v2版本。查看此操作的最快方法是在向v1版本的服务发送一些请求时,从v2服务中查看日志。

您将在网页上看到的响应将来自服务的v1版本,但是,您还会看到发送到v2版本的请求:

$ kubectl logs greeter-service-v2–78fc64b995-krzf7 -c svc -f
> greeter-service@2.0.0 start /app
> node server.js
Listening on port 3000
GET /hello 200 9.303 ms — 59
GET /hello 200 0.811 ms — 59
GET /hello 200 0.254 ms — 59
GET /hello 200 3.563 ms — 59