如何部署通过蓝/绿方式交叉引用服务的kubernetes helm环境?

问题描述 投票:0回答:1

我在 kubernetes 集群中跨命名空间部署了多个应用程序,并且一些应用程序引用另一个应用程序的服务来与其通信。所有应用程序都使用 helm 进行部署,我想使用蓝/绿方法进行部署...

我见过几种解决方案,其中您将服务拉到舵图之外(如在它们自己的单独文件中)并拥有 2 项服务 - 一项是实时服务,一项是临时服务。然后,您的实时和登台入口 URL 指向其相应的服务。然后,要在从蓝色 helmrelease 和绿色 helmrelease 创建的部署 Pod 之间来回交换流量,您只需更新服务上的选择器标签即可。但是,如果一个应用程序引用另一应用程序的服务,则此方法不起作用。因此,我有一个近乎硬性的要求,即该服务必须保留在 helm Chart/helmrelease 内。此外,并非每个应用程序都会同时部署。即 appA 可以发布,并且蓝色已上线,但引用 appA 服务的 appB 无法发布。

在切断流量之前,我需要能够承受 appA 的暂存环境和针对它的 QA 测试,并可能针对 appB 进行测试。我不能让 appB 总是引用蓝色服务,因为我们并不总是知道蓝色是实时的还是蓝色是暂存的。如果没有新的构建需要部署,我是否只需要要求 appA 和 appB 在每个周期都“发布”,即使我们只是建立与实时环境中已有的应用程序映像相同的应用程序映像?那么每个应用程序总是蓝色是实时的,绿色是暂存的,反之亦然?我想如果一个应用程序需要回滚而另一个应用程序不需要回滚,这将使回滚变得复杂。

我已经有了一个 POC,我将服务从 helm 图表中取出,然后将该图表分别部署为蓝色 helmrelease 和绿色 helmrelease。我可以通过更新服务的选择器标签几乎立即交换流量。跨应用程序服务名称引用使事情变得复杂。

kubernetes service kubernetes-helm blue-green-deployment
1个回答
0
投票

假设您已在同一命名空间中部署了应用程序的两个副本。

helm install -n app-a app-a-blue ./app-a --set color=blue
helm install -n app-a app-a-green ./app-a --set color=green

每个 Helm 版本都拥有一组资源。您需要一个指向应用程序实时副本的服务,并且需要它始终存在。这意味着它不能附加到应用程序的任何副本中;它需要分开。

我会创建一个仅包含服务的单独图表

apiVersion: v1
kind: Service
metadata:
  name: {{ include "app-service.fullname" . }}
  labels:
    {{- include "app-service.labels" . | nindent 4 }}
spec:
  ports:
    - name: http
      port: 80
      targetPort: http
  selector:
    {{- include "app-service.selectorLabels" . | nindent 4 }}
    color: {{ .Values.color }}  # <-------

三个

include
d 模板来自
_helpers.tpl
为您提供的
helm create
;除了最后的
color:
之外,这几乎与生成的
templates/service.yml
相同。您需要编辑
selectorLabels
帮助器以匹配您的应用程序正在部署的内容。您可以删除图表的几乎所有其余部分。

现在要从蓝色切换到绿色,您只需重新部署此仅服务图表,并指定其颜色。

helm upgrade --install -n app-a app-a-live ./app-a-service --set color=green
© www.soinside.com 2019 - 2024. All rights reserved.