我们可以使用 'Helm Charts' 部署应用程序。
helm install --name the-release helm/the-service-helm --namespace myns
我们可以使用'Rolling Upgrade'来升级部署,
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
我们可以使用'Rolling Upgrade'来升级部署,
helm upgrade --recreate-pods the-release helm/the-service-helm --namespace myns
是否有一种使用 'Helm Charts' 实现'蓝/绿'部署的方法?
由于有许多部署策略,我们从定义开始。
根据马丁·福勒的说法:
蓝绿部署通过确保您拥有两个尽可能相同的生产环境来实现此目标。任何时候,其中一个环境(例如本例中的蓝色)是活动的。当您准备发布软件的新版本时,您在绿色环境中进行最后的测试阶段。一旦软件在绿色环境中正常工作,您就可以切换路由器,使所有传入请求都发送到绿色环境-蓝色环境现在处于闲置状态。
Blue/Green
不建议在Helm中使用。但有解决办法根据helm issue #3518,不建议使用Helm
进行blue/green
或canary
部署。
至少有三个基于Helm的解决方案,请参见以下内容
但是,有一个Helm图表适用于该情况。
Helm本身不适用于此情况。请看他们的解释:
Helm的工作方式更像传统软件包管理器,以优美的方式从一个版本升级到另一个版本(通过pod liveness/readiness探针和部署更新策略),就像人们期望类似于
apt upgrade
。 蓝/绿部署与包管理器样式的升级工作流非常不同;蓝/绿位于工具链中的更高层次,因为这些部署的用例需要逐步交通迁移和回滚。因此,我们决定蓝/绿部署超出了Helm的范围,尽管利用Helm在内部(或类似Istio的并行工具)的工具很可能能够处理该用例。
Helm
的其他解决方案至少有三个基于Helm
的解决方案,这些解决方案在此处进行了描述和比较:
bookingcom/shipper: 使用 Helm 可以在 Kubernetes 上实现多集群金丝雀发布或蓝绿部署。
它通过依赖 Helm 并使用 Helm Charts 作为配置部署的单元来实现此目标。Shipper 的 Application 对象提供了一种类似于 helm 命令行工具的接口来指定 Chart 的值。 Shipper 直接从 Chart 存储库(例如 ChartMuseum)中消耗 Charts,并将对象安装到集群中。这很好地满足了常规 Kubernetes 认证和 RBAC 控制,可以用于管理对 Shipper APIs 的访问权限。
使用 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自动化Blue/Green部署。
此外,正如 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 Charts进行蓝绿部署