使用 Docker Swarm 处理 Canary 部署的最佳方式
Best way to handle Canary deployments with Docker Swarm
微服务部署的一个最佳实践是“金丝雀部署”(将应用程序的新版本与现有应用程序一起部署,并让您的 API gateway/proxy 发送少量新版本的流量,直到您满意它稳定为止,此时您最终将其增加到 100% 并删除旧服务版本。)
为了在 Docker Swarm 中执行此操作,在我看来,我需要在服务名称中使用版本号以允许这种并行部署,例如myapp_1_0_0
和 myapp_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
中实现金丝雀
微服务部署的一个最佳实践是“金丝雀部署”(将应用程序的新版本与现有应用程序一起部署,并让您的 API gateway/proxy 发送少量新版本的流量,直到您满意它稳定为止,此时您最终将其增加到 100% 并删除旧服务版本。)
为了在 Docker Swarm 中执行此操作,在我看来,我需要在服务名称中使用版本号以允许这种并行部署,例如myapp_1_0_0
和 myapp_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
中实现金丝雀