除了可以基于各种传入请求属性(例如 URL 的一部分,标头值,请求方法等)在不同应用程序版本之间进行更多的 “传统” 流量路由之外,Istio 还支持流量镜像。
当您不想发布应用程序的新版本并将用户暴露给它时,可以使用流量镜像。但是,您仍然希望对其进行部署,并观察其工作原理,收集遥测数据,并将现有应用程序的性能和功能与新应用程序进行比较。
您可能会问——部署和发布某些内容有什么区别?当我们谈论将服务部署到生产环境时,我们只是将可执行代码(二进制文件,容器,以及执行代码所需的任何形式)移动到生产环境中。但是,我们没有向其发送任何生产流量。该应用程序已存在,但不影响它旁边运行的任何现有应用程序和服务。
发布应用程序涉及采用已部署的实例并开始将生产流量路由到该实例。此时,我们移至生产环境的代码正在运行,并且可能会影响其他应用程序和最终用户。
在两个版本之间路由流量(进行蓝绿色发布)是有用且有用的,但是存在风险。例如,如果新应用程序损坏或出现故障怎么办?即使新应用仅接收了 1%的生产流量,它仍然会对许多用户产生负面影响。
什么是流量镜像?
流量镜像的想法是最大程度地降低将用户暴露于潜在损坏或错误的应用程序中的风险。我们没有部署,释放流量并将其路由到新应用程序,而是部署了新应用程序并将镜像的生产流量发送到该应用程序的发行版。
然后,您可以观察到应用程序接收到的镜像流量是否有错误,而不会影响任何生产流量。除了在应用程序的已部署版本上运行各种测试之外,我们现在还可以使用实际的生产流量并扩大测试范围。这给了我们更大的信心,并将释放出无法正常工作的东西的风险降到最低。
请注意,发送到镜像实例的请求是 “即发即弃”,并且镜像实例发回的任何响应都将被忽略。
如何使用 Istio 启用流量镜像?
这是一个快速的 YAML 代码段,显示了如何使用 Istio 启用流量镜像。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-app
spec:
hosts:
- my-app
http:
- route:
- destination:
host: my-app.default.svc.cluster.local
port:
number: 3000
subset: v1
weight: 100
mirror:
host: my-app.default.svc.cluster.local
port:
number: 3000
subset: test-v1
上面的 VirtualService 将 100%的流量路由到 v1 子集,同时还将相同的流量镜像到该test-v1
子集。发送给v1
子集的相同请求将被复制并触发该test-v1
子集。
最快看到此效果的方法是test-v1
在将一些请求发送到应用程序的 v1 版本时查看应用程序的日志。
调用应用程序时您将获得的响应将来自该v1
子集。但是,您还将看到请求镜像到该test-v1
子集:
kubectl logs my-app-test-v1–78fc64b995-krzf7 -c svc -f
> my-app@test-1.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