使用Helm Charts进行蓝绿部署

11

我们可以使用 'Helm Charts' 部署应用程序。

helm install --name the-release  helm/the-service-helm --namespace myns

我们可以使用'Rolling Upgrade'来升级部署,

helm upgrade --recreate-pods the-release helm/the-service-helm --namespace myns

是否有一种使用 'Helm Charts' 实现'蓝/绿'部署的方法?


这可能会对你有所帮助,请访问这里 - Kamol Hasan
1个回答

21

从定义开始

由于有许多部署策略,我们从定义开始。

根据马丁·福勒的说法:

蓝绿部署通过确保您拥有两个尽可能相同的生产环境来实现此目标。任何时候,其中一个环境(例如本例中的蓝色)是活动的。当您准备发布软件的新版本时,您在绿色环境中进行最后的测试阶段。一旦软件在绿色环境中正常工作,您就可以切换路由器,使所有传入请求都发送到绿色环境-蓝色环境现在处于闲置状态。

Blue/Green不建议在Helm中使用。但有解决办法

  • 根据helm issue #3518,不建议使用Helm进行blue/greencanary部署。

  • 至少有三个基于Helm的解决方案,请参见以下内容

  • 但是,有一个Helm图表适用于该情况。

Helm本身(太长不看:不建议使用)

Helm本身不适用于此情况。请看他们的解释:

helm/helm中蓝/绿部署模式的直接支持·问题#3518

Helm的工作方式更像传统软件包管理器,以优美的方式从一个版本升级到另一个版本(通过pod liveness/readiness探针和部署更新策略),就像人们期望类似于apt upgrade。 蓝/绿部署与包管理器样式的升级工作流非常不同;蓝/绿位于工具链中的更高层次,因为这些部署的用例需要逐步交通迁移和回滚。因此,我们决定蓝/绿部署超出了Helm的范围,尽管利用Helm在内部(或类似Istio的并行工具)的工具很可能能够处理该用例。

基于Helm的其他解决方案

至少有三个基于Helm的解决方案,这些解决方案在此处进行了描述和比较:

Booking.com 的 Shipper - 不再维护

bookingcom/shipper: 使用 Helm 可以在 Kubernetes 上实现多集群金丝雀发布或蓝绿部署。

它通过依赖 Helm 并使用 Helm Charts 作为配置部署的单元来实现此目标。Shipper 的 Application 对象提供了一种类似于 helm 命令行工具的接口来指定 Chart 的值。 Shipper 直接从 Chart 存储库(例如 ChartMuseum)中消耗 Charts,并将对象安装到集群中。这很好地满足了常规 Kubernetes 认证和 RBAC 控制,可以用于管理对 Shipper APIs 的访问权限。

使用 Helm 在 Kubernetes 上实现多集群金丝雀发布或蓝绿部署。

Istio

你可以试试像这样的东西

kubectl create -f <(istioctl kube-inject -f cowsay-v1.yaml) # deploy v1
kubectl create -f <(istioctl kube-inject -f cowsay-v2.yaml) # deploy v1

Flagger

Flagger团队编写了一份指南:Blue/Green Deployments - Flagger,该指南展示了如何使用Flagger和Kubernetes自动化Blue/Green部署。

您可以尝试使用Helm本身

此外,正如 Kamol Hasan 所推荐的那样,您可以尝试使用该图表:puneetsaraswat/HelmCharts/blue-green

blue.yml 示例

{{ if .Values.blue.enabled }}
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {{ template "blue-green.fullname" . }}-blue
  labels:
    release: {{ .Release.Name }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version }}
    app: {{ template "blue-green.name" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ template "blue-green.name" . }}
        release: {{ .Release.Name }}
        slot: blue
    spec:
      containers:
        - name: {{ template "blue-green.name" . }}-blue
          image: nginx:stable
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          # This (and the volumes section below) mount the config map as a volume.
          volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: wwwdata-volume
      volumes:
        - name: wwwdata-volume
          configMap:
            name: {{ template "blue-green.fullname" . }}
{{ end }}

中等博客文章:使用Helm Charts进行蓝绿部署


1
Istio并不是直接解决这个问题的方案(尽管它支持我所谓的“青绿模式”,可以将可配置的一部分流量路由到每个副本)。它对于安装两个服务副本并没有任何帮助。 - David Maze
你是对的:Istio服务网格而不是部署工具。但是也有一个Istio的解决方案 - Yasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接