我们可以使用 '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 中使用Blue/Green
。但是有解决方法
-
根据 helm 问题 #3518,不建议将
Helm
用于blue/green
或canary
部署。 -
至少有 3 种基于 Helm 的解决方案,见下文
-
但是,对于这种情况,有一个 Helm 图表。
掌舵本身(TL;DR:不推荐(
Helm 本身不适用于这种情况。请参阅他们的解释:
直接支持头盔中的蓝/绿部署模式 ·问题 #3518 ·掌舵/掌舵
Helm 更像是传统的包管理器,以优雅的方式将图表从一个版本升级到下一个版本(这要归功于 pod 活动/就绪探测和部署更新策略(,就像人们期望像
apt upgrade
这样的东西工作一样。与升级工作流的包管理器样式相比,蓝/绿部署是一个非常不同的野兽;蓝/绿在工具链中的位置更高,因为这些部署的用例需要分步进/分步策略、逐步流量迁移和回滚。正因为如此,我们认为蓝/绿部署超出了 Helm 的范围,尽管在幕后使用 Helm 的工具(或像 istio 这样的平行工具(很可能能够处理该用例。
其他基于Helm
的解决方案
至少有三种基于Helm
的解决方案,在这里描述和比较:
- 托运人
- 伊斯蒂奥
- 弗拉格。
按 Booking.com 列出的发件人 -已弃用
bookingcom/shipper:使用 Helm 的 Kubernetes 原生多集群金丝雀或蓝绿推出
它通过依赖 Helm 并使用 Helm 图表作为配置部署单元来实现此目的。托运人的应用程序对象提供了一个接口,用于指定图表的值,就像 helm 命令行工具一样。 Shipper直接从ChartMuseum等图表存储库使用图表,并将对象本身安装到集群中。这有一个很好的属性,即常规的 Kubernetes 身份验证和 RBAC 控件可用于管理对 Shipper API 的访问。
使用 Helm 的 Kubernetes 原生多集群金丝雀或蓝绿推出
伊斯蒂奥
你可以尝试这样的事情:
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 本指南向您展示如何使用 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 图表的蓝/绿部署