【问题标题】:Blue Green Deployment with Helm Charts带有 Helm 图表的蓝绿色部署
【发布时间】:2020-01-11 18:56:48
【问题描述】:

我们可以使用“Helm Charts”部署应用程序

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

我们使用 “滚动升级” 部署,

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

有没有办法使用 'Helm Charts' 来实现 'Blue/Green' 部署?

【问题讨论】:

  • 这可能对你有帮助,请访问here

标签: kubernetes kubernetes-helm blue-green-deployment canary-deployment


【解决方案1】:

让我们从定义开始

既然有many deployment strategies,那就从定义开始吧。

根据Martin Flower

蓝绿部署方法通过确保您拥有两个尽可能相同的生产环境来做到这一点。在任何时候,其中一个,例如蓝色,是实时的。当您准备软件的新版本时,您将在绿色环境中进行最后阶段的测试。一旦软件在绿色环境中运行,您切换路由器,以便所有传入请求都进入绿色环境 - 蓝色的现在空闲。

在 Helm 中不建议使用 Blue/Green。但是有变通的解决方案

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

  • 基于 Helm 之上的解决方案至少有 3 种,见下文

  • 但是有一个 Helm 图表适用于这种情况。

Helm 本身(TL;DR:不推荐)

Helm 本身不适用于这种情况。查看他们的解释:

direct support for blue / green deployment pattern in helm · Issue #3518 · helm/helm

Helm 更像是一个传统的包管理器,以一种优雅的方式将图表从一个版本升级到下一个版本(感谢 pod liveness/readiness 探针和部署更新策略),就像人们期望的 @987654346 @ 去工作。与升级工作流的包管理器风格相比,蓝/绿部署是一种截然不同的野兽;蓝/绿在工具链中处于较高级别,因为围绕这些部署的用例需要逐步进/出策略、逐步流量迁移和回滚。因此,我们认为蓝/绿部署超出了 Helm 的范围,尽管在幕后利用 Helm 的工具(或类似 istio 的类似工具)很可能能够处理该用例。

其他基于Helm的解决方案

至少有三个基于Helm的解决方案,描述和比较here

Shipper 来自 Booking.com

bookingcom/shipper:Kubernetes 原生多集群金丝雀或使用 Helm 的蓝绿部署

它通过依赖 Helm 并使用 Helm Charts 作为配置部署单元来做到这一点。 Shipper 的 Application 对象提供了一个接口,用于为 Chart 指定值,就像 helm 命令行工具一样。 Shipper 直接从 ChartMuseum 等 Chart 存储库中使用 Charts,并将对象安装到集群中。这具有很好的特性,即常规 Kubernetes 身份验证和 RBAC 控件可用于管理对 Shipper API 的访问。

使用 Helm 的 Kubernetes 原生多集群金丝雀或蓝绿部署

Istio

你可以试试like this:

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 自动化蓝/绿部署

你可以试试 Helm 本身

另外,正如Kamol Hasan 推荐的那样,您可以试试那个图表:puneetsaraswat/HelmCharts/blue-green

blue.yml sample

{{ 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 }}

中型博文:Blue/Green Deployments using Helm Charts

【讨论】:

  • Istio 并不是解决此问题的直接解决方案(尽管它确实支持我称之为“turquoise”的模式,它可以将可配置的部分流量路由到每个副本)。它不会帮助安装服务的两个副本。
  • 你是对的:Istioa service mesh rather than deployment tool。但是 Istio 也有一个 solution
猜你喜欢
  • 2020-06-10
  • 2021-09-18
  • 2019-01-01
  • 2021-07-18
  • 1970-01-01
  • 2017-07-10
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多