首页 > 解决方案 > 带有 Helm 图表的蓝绿色部署

问题描述

我们可以使用“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”来实现“蓝/绿”部署?

标签: kuberneteskubernetes-helmblue-green-deploymentcanary-deployment

解决方案


让我们从定义开始

既然部署策略有很多,那就从定义说起吧。

根据马丁花

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

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

  • 根据helm issue #3518,不建议使用Helmforblue/greencanarydeployment。

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

  • 但是,对于这种情况,有一个 Helm 图表。

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

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

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

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

基于其他解决方案Helm

至少有三种基于 top of 的解决方案,在Helm进行描述和比较:

Booking.com 的托运人

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

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

使用 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 团队编写了指南:Blue/Green Deployments - Flagger 本指南向您展示如何使用 Flagger 和 Kubernetes 自动化蓝/绿部署

你可以试试 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 图表的蓝/绿部署


推荐阅读