我们可以使用“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”来实现“蓝/绿”部署?
我们可以使用“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
不建议在 Helm 中使用。但是有变通的解决方案根据helm issue #3518,不建议使用Helm
forblue/green
或canary
deployment。
基于 Helm 之上的解决方案至少有 3 种,见下文
但是,对于这种情况,有一个 Helm 图表。
Helm 本身不适用于这种情况。查看他们的解释:
Helm 更像是一个传统的包管理器,以一种优雅的方式将图表从一个版本升级到下一个版本(感谢 pod liveness/readiness probes 和部署更新策略),就像人们期望的那样
apt upgrade
工作。与升级工作流的包管理器风格相比,蓝/绿部署是一种非常不同的野兽;蓝/绿在工具链中处于较高级别,因为围绕这些部署的用例需要逐步进/出策略、逐步流量迁移和回滚。因此,我们认为蓝/绿部署超出了 Helm 的范围,尽管在幕后利用 Helm 的工具(或类似 istio 的类似工具)很可能能够处理该用例。
Helm
至少有三种基于 top of 的解决方案,在此Helm
进行描述和比较:
bookingcom/shipper:使用 Helm 的 Kubernetes 原生多集群 Canary 或蓝绿部署
它通过依赖 Helm 并使用 Helm Charts 作为配置部署单元来做到这一点。Shipper 的 Application 对象提供了一个接口,用于为 Chart 指定值,就像 helm 命令行工具一样。Shipper 直接从 ChartMuseum 等 Chart 存储库中使用 Charts,并将对象安装到集群中。这具有很好的特性,即常规 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 团队编写了指南:Blue/Green Deployments - Flagger 本指南向您展示如何使用 Flagger 和 Kubernetes 自动化蓝/绿部署
此外,正如Kamol Hasan建议的那样,您可以尝试使用该图表:puneetsaraswat/HelmCharts/blue-green。
{{ 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 图表的蓝/绿部署