蓝/绿部署策略
蓝/绿部署是一种发布新软件的策略,它使用两个尽可能相同的生产环境,它们轮流为用户请求提供服务,并执行最后阶段的测试。
的HelmBlueGreenDeployStep将这两个环境称为蓝色的而且绿色.这些环境都可以玩闲置或生活角色,这取决于用户的请求被转发到哪个环境。当前处理用户请求的环境被认为是Live环境,而另一个被认为是Idle环境。要推出新版本,首先要将其部署到扮演Idle角色的环境中。在那里,我们可以验证新版本,以检查它是否适合用户使用。如果这是真的,那么环境角色可以翻转,以便以前的Idle环境变成Live环境并开始处理用户请求,而以前的Live环境变成Idle环境。这种策略的主要优点之一是回滚新版本就像再次翻转环境角色一样简单。
在Helm的上下文中,蓝色和绿色环境都表示为两个单独的版本,它们共存于同一个名称空间中。的HelmBlueGreenDeploystep通过为每个角色创建专用的公共服务副本,将空闲或活动角色分配给这些版本。通过这样做,我们可以通过将这些服务更新为来自特定环境的服务的副本来轻松地更改发布的角色。管道创建的角色服务可以用于提供额外的入口点组件,如DNS记录、入口规则或服务网格。
为了实现完整的蓝/绿部署策略工作流,管道提供了三个本地步骤:
- HelmBlueGreenDeploy:从运行时开始,此步骤发现哪个版本正在扮演空闲角色,将图表部署到它,并创建或更新空闲角色服务。
- elmBlueGreenRoleSwitch:从运行时开始,这个步骤发现哪个版本正在扮演每个角色,并通过创建或更新角色服务来翻转它们。
- HelmBlueGreenCleanup:从运行时开始,该步骤发现哪个版本正在扮演Idle角色并卸载它。
YAML模式
HelmBlueGreenDeploy本机步骤的YAML模式如下:
管道:- name:步骤:- name: 类型:HelmBlueGreenDeploy配置:#继承所有的标签从bash;//www.si-fil.com/confluence/display/JFROG/Bash helmVersion: <2 b| 3> #可选,默认为3命名空间: blueReleaseName: blueFlags: # optional bluevaluefileppaths: # optional - <路径和文件名> greenReleaseName: greenFlags: # optional greenvaluefileppaths: # optional - <路径和文件名> roleServices: - liveName: liveCustomProperties: # optional idleName: idleCustomProperties: # optional blueReferenceName: greenReferenceName: chartPath: <路径字符串> # optional,可能需要某些输入资源chartName: <路径字符串> # optional,可2022世界杯阿根廷预选赛赛程能需要某些输入资源chartVersion: <路径字符串> # optional,可能需要某些输入资源dryRun: # optional,仅在dryRun成功时部署lint: # lints chart before upgrade, default false lintFlags: "——strict " test: #在升级后运行helm测试,默认false testFlags:“——并行”集成:- name: # required inputResources: - name: # required,只允许一个输入资源执行:onStart: - echo“准备工作…”onSuccess: - echo“工作做得好!”onFailure: - echo“呃哦,出错了”onComplete: #always - echo“清理一些东西”
标签
的名字
标识步骤的字母数字字符串(允许使用下划线)。
类型
必须HelmBlueGreenDeploy
对于这个步骤类型。
配置
指定步骤执行环境的所有配置选择。该步骤继承Bash/PowerShell步骤配置标签,包括这些相关的标签:
标签 |
使用说明 |
必需的/可选 |
---|---|---|
集成 |
必须指定Kubernetes集成. 而且 必须指定Artifactory集成当 |
要求 可能需要 |
input2022世界杯阿根廷预选赛赛程Resources |
必须指定HelmChart,GitRepo,文件规范,BuildInfo,或ReleaseBundle资源,其中包含舵图。 |
要求 |
此外,可以定义这些标记来支持该步骤的本机操作:
从Bash派生的标记
标签 |
使用说明 |
必需的/可选 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
helmVersion |
表示要使用的Helm的主要版本的数字。可以是2或3。默认值为3。 | 可选 | |||||||||||||||||||||
名称空间 |
部署的目标kubernetes名称空间。 | 要求 | |||||||||||||||||||||
blueReleaseName |
蓝色环境的发布名称。类的——name (-n)选项舵安装命令。 |
要求 | |||||||||||||||||||||
blueFlags |
部署蓝色发布时包含在Helm命令中的标志字符串。例如:——set key= ' value ' -f myTestValues.yaml |
可选 | |||||||||||||||||||||
blueValueFilePaths |
指定值YAML文件用于 指定文件中引用的所有环境变量将自动替换为匹配的运行时环境变量的值。 |
可选 | |||||||||||||||||||||
greenReleaseName |
绿色环境的发布名称。相当于 |
要求 | |||||||||||||||||||||
greenFlags |
部署绿色释放时包含在Helm命令中的标志字符串。例如:——set key= ' value ' -f myTestValues.yaml |
可选 | |||||||||||||||||||||
greenValueFilePaths |
指定值YAML文件用于 指定文件中引用的所有环境变量将自动替换为匹配的运行时环境变量的值。 |
可选 | |||||||||||||||||||||
roleServices |
应该由pipeline创建的服务列表,用于将Idle和Live角色分配给发行版。
|
要求 | |||||||||||||||||||||
chartPath |
通往掌舵的路径图在 当指定了HelmChart资源时不要使用。 |
可能需要 | |||||||||||||||||||||
chartName |
掌舵图的名字
当指定了HelmChart/GitRepo资源或当输入资源不是Artifactory Helm存储库时,请不要使用。
|
可能需要 | |||||||||||||||||||||
chartVersion |
掌舵图的名字
当指定了HelmChart/GitRepo资源或当输入资源不是Artifactory Helm存储库时,请不要使用。
|
可能需要 | |||||||||||||||||||||
dryRun |
当真正的,只有在——dry-run install模拟成功时才部署。 默认为 |
可选 | |||||||||||||||||||||
线头 |
当设置为真正的,执行线头检查图表以找出可能的问题。 默认为 |
可选 | |||||||||||||||||||||
lintFlags |
对象要传递的标志字符串执掌线头 命令。 |
可选 | |||||||||||||||||||||
测验 |
当设置为真正的,执行测验为发布运行测试。 默认为 |
可选 | |||||||||||||||||||||
testFlags |
对象要传递的标志字符串执掌测试 命令。 |
可选 |
执行
声明在执行前和执行后阶段执行的shell命令序列集合:
标签 |
使用说明 |
必需的/可选 |
---|---|---|
onStart |
在本机操作之前执行的命令 | 可选 |
调用onSuccess |
成功完成后执行的命令 | 可选 |
onFailure |
在完成失败时执行的命令 | 可选 |
onComplete |
在任何补全时执行的命令 | 可选 |
对象执行的操作onExecute
阶段是此步骤类型固有的,不能被覆盖。
例子
下面的示例展示如何配置HelmBlueGreenDeploy步骤。
Helm 3和HelmChart资源输入
使用Helm 3和HelmChart资源输入的HelmBlueGreenDeploy步骤。
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue greenReleaseName: app-green roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service integrations:—name: kubernetes_integration inputResources:—name: helmChartResour2022世界杯阿根廷预选赛赛程ce
排练
使用Helm 3和HelmChart资源输入值文件的HelmBlueGreenDeploy步骤,并在部署前进行演练。
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue bluevaluefileppaths:—values/values1. zipYaml - values/values2。yaml greenReleaseName: app-green greenvaluefileppaths: - values/values1. yaml greenReleaseName: app-green greenvaluefileppaths:Yaml - values/values2。yaml roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service dryRun: true integrations:—name: kubernetes_integration inputReso2022世界杯阿根廷预选赛赛程urces:—name: helmChartResource
GitRepo输入
一个带有GitRepo输入的HelmBlueGreenDeploy步骤,而不是HelmChart, lint和测试命令。
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue blueFlags: "——set key=value" greenReleaseName: app-green greenFlags: "——set key=value" roleServices: - blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service chartPath: "/myChart" lint: true lintFlags: "——strict" test: true testFlags: "——parallel" integration: - name: kubernetes_integration inputR2022世界杯阿根廷预选赛赛程esources: - name: gitRepoResource
文件规范输入
带有FileSpec输入资源的HelmBlueGreenDeploy步骤。在使用FileSpec输入资源时,请使用chartPath
属性指定Helm图表文件在FileSpec资源中的位置。如果FileSpec表示Artifactory中包含Helm图表的Generic存储库,则使用以下配置作为参考:
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue greenReleaseName: app-green roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service chartPath: "。/myChart" lint: true lintFlags: "——strict" test: true testFlags: "——parallel" integration: - name: kubernetes_integration inputR2022世界杯阿根廷预选赛赛程esources: - name: fileSpecResource
如果FileSpec输入资源表示Artifactory中的Helm存储库,您也需要这样做提供chartName
而且chartVersion
配置属性:
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue greenReleaseName: app-green roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service chartPath: "。/myChart" chartName: "myChartName" chartVersion: 0.0.1 lint: true lintFlags: "——strict" test: true testFlags: "——parallel" integration: - name: kubernetes_integration inputR2022世界杯阿根廷预选赛赛程esources: - name: fileSpecResource
BuildInfo输入
带有BuildInfo输入资源的HelmBlueGreenDeploy步骤。在使用BuildInfo输入资源时,使用chartPath
属性指定Helm图文件在BuildInfo资源中的位置。如果BuildInfo表示Artifactory中包含Helm图表的通用存储库,则使用以下配置作为参考:
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue bluevaluefileppaths:—values/values1. zipYaml - values/values2。yaml greenReleaseName: app-green greenvaluefileppaths: - values/values1. yaml greenReleaseName: app-green greenvaluefileppaths:Yaml - values/values2。yaml roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service chartPath:”。/myChart" lint: true lintFlags: "--strict" test: true testFlags: "--parallel" integrations: - name: kubernetes_integration inputResources: - name: buildInfoResource
如果BuildInfo输入资源表示Artifactory中的Helm存储库,您也需要这样做提供chartName
而且chartVersion
配置属性:
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue bluevaluefileppaths:—values/values1. zipYaml - values/values2。yaml greenReleaseName: app-green greenvaluefileppaths: - values/values1. yaml greenReleaseName: app-green greenvaluefileppaths:Yaml - values/values2。yaml roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service chartPath:”。/myChart" chartName: "myChartName" chartVersion: 0.0.1 lint: true lintFlags: "--strict" test: true testFlags: "--parallel" integrations: - name: kubernetes_integration inputResources: - name: buildInfoResource
ReleaseBundle输入
带有ReleaseBundle输入资源的HelmBlueGreenDeploy步骤。当使用ReleaseBundle输入资源时,你需要指定Helm图表文件在ReleaseBundle资源中的位置chartPath
财产。
如果ReleaseBundle在Artifactory中表示一个包含Helm图表的通用存储库,请使用以下配置作为参考:
需要人工集成
您必须指定Artifactory集成当ReleaseBundle
是inputResource
来HelmBlueGreenDeploy
的一步。该集成将指向Artifactory,该Artifactory将是下载此步骤中使用的ReleaseBundle的源。
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue bluevaluefileppaths:—values/values1. zipYaml - values/values2。yaml greenReleaseName: app-green greenvaluefileppaths: - values/values1. yaml greenReleaseName: app-green greenvaluefileppaths:Yaml - values/values2。yaml roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service chartPath:”。/myChart" lint: true lintFlags: "--strict" test: true testFlags: "--parallel" integrations: - name: kubernetes_integration - name: artifactory_integration inputResources: - name: releaseBundleResource
如果ReleaseBundle输入资源代表Artifactory中的Helm存储库,您还必须指定chartName
而且chartVersion
配置属性:
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue bluevaluefileppaths:—values/values1. zipYaml - values/values2。yaml greenReleaseName: app-green greenvaluefileppaths: - values/values1. yaml greenReleaseName: app-green greenvaluefileppaths:Yaml - values/values2。yaml roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service chartPath:”。/myChart" chartName: "myChartName" chartVersion: 0.0.1 lint: true lintFlags: "--strict" test: true testFlags: "--parallel" integrations: - name: kubernetes_integration - name: artifactory_integration inputResources: - name: releaseBundleResource
定制角色服务
有两个自定义标签分配给角色Service的HelmBlueGreenDeploy步骤。
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue greenReleaseName: app-green roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service idleCustomProperties: ".metadata.labels. properties . "Mylabel = \"value\" | .metadata.labels。role = \"idle\"" liveName: app-service liveCustomProperties: ".metadata.labels. "Mylabel = \"value\" | .metadata.labels。role = \"live\"" integration: - name: kubernetes_integration inputR2022世界杯阿根廷预选赛赛程esources: - name: helmChartResource
多项公共服务
一个HelmBlueGreenDeploy步骤,部署一个公开两个服务的Helm Chart。
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 3 namespace: app-namespace blueReleaseName: app-blue greenReleaseName: app-green roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-blue-admin-service greenReferenceName: app-green-admin-service idlenename: app-green-admin-service idleName: app-green-admin-serviceapp-admin-service集成:—name: kubernetes_integration inputResources:—na2022世界杯阿根廷预选赛赛程me: helmChartResource
执掌2
使用Helm 2的HelmBlueGreenDeploy步骤。
管线:—name: helmDeployPipeline步骤:—name: helmDeployStep type: HelmBlueGreenDeploy配置:helmVersion: 2 namespace: app-namespace blueReleaseName: app-blue greenReleaseName: app-green roleServices:—blueReferenceName: app-blue-service greenReferenceName: app-green-service idleName: app-idle-service liveName: app-service integrations:—name: kubernetes_integration inputResources:—name: helmChartResour2022世界杯阿根廷预选赛赛程ce
工作原理
当你使用HelmBlueGreenDeploy管道中的本机步骤,它在后台执行以下功能:
- Helm init—仅面向客户端(如果Helm版本为2)
- jfrog rt配置(如果有一个HelmChart资源输入,使用Artifactory凭证配置jfrog CLI)
- jfrog rt使用(如果有HelmChart资源输入,设置当前默认的Artifactory配置)
- kubectl get service(获取Live Services来读取注释并发现当前空闲环境)
- 执掌取回(如果有HelmChart资源输入,Helm版本为2,获取图表)
- 执掌拉(如果有HelmChart资源输入,Helm版本为3,获取图表)
- replace_envs(如果有valuefilepath,替换变量占位符)
- 头盔绒线(如果绒线为真)
- helm—dry-run(如果dryRun为真)
- 舵(部署)
- kubectl get service(获取helm部署的服务,用于创建或更新角色服务)
- 清理和更新角色服务定义(使用
金桥
在Bash节点和金桥
而且ConvertFrom-Json
PowerShell节点上) - kubectl apply(创建或更新角色服务)
- add_pipeline_files(保存HelmBlueGreenDeploy配置,以供以后的HelmBlueGreenRoleSwitch和HelmBlueGreenCleanup步骤使用)
- 头盔测试(如果测试为真)
管道管理服务
由pipeline管理的角色Services可以通过以下标签和注释元数据来标识:
的名字 | 类型 | 价值 |
---|---|---|
app.kubernetes.io /管理 | 标签 | “管道” |
pipelines.www.si-fil.com/pipeline | 注释 | 管道的名字 |
pipelines.www.si-fil.com/deploy-step | 注释 | 步骤名称 |
pipelines.www.si-fil.com/run | 注释 | 最后一次运行更新服务的编号 |
pipelines.www.si-fil.com/reference | 注释 | 服务名称 |
pipelines.www.si-fil.com/environment | 注释 | 目前环境扮演着这个角色 |