使用 Docker Swarm 处理 Canary 部署的最佳方式

Best way to handle Canary deployments with Docker Swarm

微服务部署的一个最佳实践是“金丝雀部署”(将应用程序的新版本与现有应用程序一起部署,并让您的 API gateway/proxy 发送少量新版本的流量,直到您满意它稳定为止,此时您最终将其增加到 100% 并删除旧服务版本。)

为了在 Docker Swarm 中执行此操作,在我看来,我需要在服务名称中使用版本号以允许这种并行部署,例如myapp_1_0_0myapp_1_0_1

唯一的问题似乎是这会影响服务之间以及 proxy/gateway 和服务之间的 dns 查找,这意味着可能会有很多 complexity/api 调用等. 确保正确更新设置以避免停机。拥有一个像 myapp 这样的单一 dns 名称会更好,这样一切都会相应地查找 myapp 和代理路由。

解决这个问题的唯一方法是在代理中做大量工作,然后让所有服务使用代理进行 dns 查找,然后坚持使用版本名称吗?我查看了 Envoy,所以在 Swarm 前面使用类似的东西是否最有意义?是否有任何人都知道描述此设置的文档?

由于没有本地方法在docker-swarm中实现金丝雀,我尝试了一种自定义方法envoy and Envoy-Pilot

以下是流程的分步操作:https://github.com/dineshba/docker-swarm-canary

此方法将介绍:

  • 每个应用程序 1 个 envoy 代理容器(因为 envoy 是轻量级的,应该不会有太多开销)
  • 非常小的延迟,因为所有网络都将通过 envoy 代理(延迟(大约):0.004 秒 (4ms))

希望这能让您了解如何在 docker-swarm

中实现金丝雀