让我们从定义开始
既然有many deployment strategies,那就从定义开始吧。
根据Martin Flower:
蓝绿部署方法通过确保您拥有两个尽可能相同的生产环境来做到这一点。在任何时候,其中一个,例如蓝色,是实时的。当您准备软件的新版本时,您将在绿色环境中进行最后阶段的测试。一旦软件在绿色环境中运行,您切换路由器,以便所有传入请求都进入绿色环境 - 蓝色的现在空闲。
在 Helm 中不建议使用 Blue/Green。但是有变通的解决方案
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 原生多集群金丝雀或蓝绿部署
你可以试试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团队编写的指南: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