本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
CodeDeploy 实例运行状况
CodeDeploy 监控部署组中实例的运行状况。如果运行正常的实例数小于部署期间已为部署组指定的最小运行正常实例数,则部署将失败。例如,如果 85% 的实例必须在部署期间保持运行正常,且部署组包含 10 个实例,则只要一个实例的部署失败,整个部署都将失败。这是因为,当一个实例脱机以安装最新的应用程序版本时,可用的运行正常的实例计数已降至 90%。一个出现故障的实例加上另一个脱机实例意味着只有 80% 的实例运行正常且可用。CodeDeploy 将使整个部署失败。
需要牢记的是,为了使整个部署成功,必须满足以下条件:
-
CodeDeploy 可以部署到部署中的每个实例。
-
到至少一个实例的部署必须成功。也就是说,即使最小正常运行的主机数值为 0,也是到至少一个实例的部署必须成功(即至少有一个实例必须是正常运行的),才能使整个部署成功。
运行状况
CodeDeploy 为每个实例分配两个运行状况值:修订运行状况 和实例运行状况。
- 修订运行状况
-
修订运行状况基于实例上当前安装的应用程序修订。它具有以下状态值:
-
当前:实例上安装的修订与部署组的上次成功部署的修订匹配。
-
旧:实例上安装的修订与旧版应用程序匹配。
-
未知:应用程序修订尚未安装成功到实例上。
-
- 实例运行状况
-
实例运行状况基于针对实例的部署是否成功。它具有以下值:
-
正常:针对实例的上次部署成功。
-
不正常:尝试将修订部署到实例失败,或修订尚未部署到实例。
-
CodeDeploy 使用修订运行状况和实例运行状况按以下顺序计划针对部署组的实例的部署:
-
“不正常”实例运行状况。
-
“未知”修订运行状况。
-
“旧”修订运行状况。
-
“当前”修订运行状况。
如果整个部署成功,则将更新修订,并更新部署组的运行状况值来反映最新的部署。
-
具有成功部署的所有当前实例将保持“当前”状态。否则,它们将变为“未知”状态。
-
具有成功部署的所有“旧”或“未知”实例将变为“当前”状态。否则,它们将保持“旧”或“未知”状态。
-
所有具有成功部署的正常实例都将保持“正常”状态。否则,它们将变为“不正常”状态。
-
所有具有成功部署的不正常实例都将变为“正常”状态。否则,它们将保持“不正常”状态。
如果整个部署失败或停止:
-
CodeDeploy 尝试将应用程序修订部署到的每个实例的实例运行状况将设置为“正常”或“不正常”,具体取决于针对该实例的部署尝试是成功还是失败。
-
CodeDeploy 未尝试将应用程序修订部署到的每个实例将保持其当前实例运行状况值。
-
部署组的修订保持不变。
关于最小运行正常的实例数
所需的最小运行正常实例数在部署配置中进行定义。
重要
在蓝/绿部署期间,部署配置和最小运行正常主机值将应用于替换环境中的实例,而不应用于原始环境中的实例。但是,当原始环境中的实例从负载均衡器取消注册时,只要一个原始实例未能成功取消注册,整个环境就将标记为失败。
CodeDeploy 提供了三种具有常用的最小正常运行主机值的默认部署配置:
| 默认部署配置名称 | 预定义的最小正常运行主机值 |
|---|---|
| CodeDeployDefault.OneAtATime | 1 |
| CodeDeployDefault.HalfAtATime | 50% |
| CodeDeployDefault.AllAtOnce | 0 |
在 在中使用部署配置 CodeDeploy 中,您将发现有关默认部署配置的更多信息。
您可以在 CodeDeploy 中创建自定义部署配置,以定义您自己的最小正常运行主机值。在使用以下操作时,您可以将这些值定义为整数或百分比:
-
在 Amazon CLI 中使用 create-deployment-config 命令时,作为
minimum-healthy-hosts。 -
作为 CodeDeploy API 的 MinimumHealthyHosts 数据类型中的
Value。 -
在 Amazon CloudFormation 模板中使用 AWS::CodeDeploy::DeploymentConfig 时作为
MinimumHealthyHosts。
CodeDeploy 允许您出于以下两大目的为部署指定最小运行正常的实例数。
-
确定整个部署是成功还是失败。如果应用程序修订已成功部署到至少最小数量的运行正常的实例,则部署将成功。
-
确定部署期间为允许继续部署而必须运行正常的实例的数量。
您可以实例数或实例总数百分比的形式为部署组指定最小运行正常的实例数。如果您指定百分比,则在部署开始时,CodeDeploy 将转换等量实例的百分比,并对实例数的小数部分取整。
CodeDeploy 将在部署过程中跟踪部署组的实例的运行状况,并使用部署的指定的最小运行正常的实例数来确定是否继续部署。基本原则是,部署绝对不能导致运行正常的实例数低于您指定的最小数量。此规则的一个例外情况是,当部署组最初具有的运行正常的实例数少于指定的最小运行正常的实例数时。在此情况下,部署过程不会进一步减少运行正常的实例数。
注意
CodeDeploy 将尝试部署到部署组中的所有实例,甚至包括当前处于停止状态的实例。在计算正常运行的最小主机数过程中,处于停止状态的实例和出现故障的实例的影响相同。如果由于处于停止状态的实例过多而导致部署失败,要解决这种问题,请重启实例或更改实例的标签,以将它们从部署组排除出去。
CodeDeploy 通过尝试将应用程序修订部署到部署组的不正常实例来开始部署过程。对于每次成功的部署,CodeDeploy 都会将实例的运行状况更改为运行正常,并将其添加到部署组的运行正常的实例中。然后,CodeDeploy 会将当前运行正常的实例数与指定的最小运行正常的实例数进行比较。
-
如果运行正常的实例数小于或等于指定的最小运行正常的实例数,则 CodeDeploy 将取消部署以确保运行正常的实例数不会随着部署的增加而减少。
-
如果运行正常的实例数比指定的最小运行正常的实例数至少多 1,则 CodeDeploy 会将应用程序修订部署到原始的运行正常的实例组。
如果针对运行正常的实例的部署失败,则 CodeDeploy 会将实例的运行状况更改为“不正常”。当部署进行时,CodeDeploy 将更新当前的运行正常的实例数并将它与指定的最小运行正常的实例数进行比较。如果运行正常的实例数在部署过程中的任何时间点小于指定的最小数量,则 CodeDeploy 将停止部署。此做法可防止下一个部署失败的可能性,并减小运行正常的实例数以使其小于指定的最小数量。
注意
确保您指定的最小运行正常的实例数小于部署组中的实例总数。如果您指定百分比值,请记住此值将取整。否则,当部署开始时,运行正常的实例数将小于或等于指定的最小运行正常的实例数,并且 CodeDeploy 将立即使整个部署失败。
CodeDeploy 还使用指定的最小运行正常的实例数和实际的运行正常的实例数来确定是否以及如何将应用程序修订部署到多个实例。默认情况下,CodeDeploy 会将应用程序修订部署到尽可能多的实例,而没有使运行正常的实例数小于指定的最小运行正常的实例数的风险。
为了确定一次应部署到的实例数量,CodeDeploy 将使用以下计算方法:
[total-hosts] - [minimum-healthy-hosts] =
[number-of-hosts-to-deploy-to-at-once]
例如:
-
如果您的部署组具有 10 个实例,并且您将最小运行正常的实例数设置为 9,则 CodeDeploy 一次将部署到 1 个实例。
-
如果您的部署组具有 10 个实例,并且您将最小运行正常的实例数设置为 3,则 CodeDeploy 将在第一批同时部署到 7 个实例,然后在第二批部署到其余 3 个实例。
-
如果您的部署组具有 10 个实例,并且您将最小运行正常的实例数设置为 0,则 CodeDeploy 将同时部署到 10 个实例。
示例
以下示例假定一个具有 10 个实例的部署组。
- 最小运行正常的实例数:95%
-
CodeDeploy 会将最小运行正常的实例数取整为 10 个实例,这等于运行正常的实例数。如果未将修订部署到任何实例,则整个部署将立即失败。
- 最小运行正常的实例数:9
-
CodeDeploy 一次将修订部署到一个实例。如果到任何实例的部署失败,运行正常的实例数将等于最小运行正常的实例数,因此 CodeDeploy 会立即让整个部署失败。此规则的例外情况是,如果最后一个实例失败,部署仍将成功。
CodeDeploy 将继续部署,一次部署到一个实例,直至任一部署失败或整个部署完成。如果 10 个部署全都成功,则部署组现在将具有 10 个运行正常的实例。
- 最小运行正常的实例数:8
-
CodeDeploy 一次将修订部署到 2 个实例。如果这些部署中的 2 个部署失败,则 CodeDeploy 将立即使整个部署失败。此规则的例外情况是,如果最后一个实例是第二个失败的实例,则部署仍将成功。
- 最小运行正常的实例数:0
-
CodeDeploy 一次性将修订部署到整个部署组。至少一个到实例的部署必须成功,整个部署才能成功。如果 0 个实例正常运行,则部署会失败。这是因为如下要求:为了将整个部署标记为成功,在完成整个部署时,至少有一个实例必须是正常运行的,即使最小正常运行的实例数值为 0。
关于每个可用区最小运行正常的实例数
注意
本节交替使用实例和主机这两个术语来指代 Amazon EC2 实例。
如果您要部署到多个可用区中的实例,可以选择启用zonal configuration功能,这允许 CodeDeploy 一次部署到一个可用区。
启用此功能后,CodeDeploy 将确保正常运行的主机数量保持在“每个区域最小正常运行的主机数”和“最小正常运行的主机数”值之上。如果正常运行的主机数低于任一值,CodeDeploy 将无法在所有可用区内部署。
为了计算一次部署到的主机数量,CodeDeploy 将同时使用“每个区域最小正常运行的主机数”和“最小正常运行的主机数”值。CodeDeploy 将使用 [A] 和 [B] 的计算结果中较小的那一个,其中 [A] 和 [B] 分别为:
[A] = [total-hosts] - [min-healthy-hosts] =
[number-of-hosts-to-deploy-to-at-once]
[B] = [total-hosts-per-AZ] - [min-healthy-hosts-per-AZ] =
[number-of-hosts-to-deploy-to-at-once-per-AZ]
确定一次要部署到的主机数量后,CodeDeploy 将按此数量分批部署到主机,一次部署一个可用区,区域之间可以选择暂停(或“烘焙时间”)。
示例:
如果您的部署配置如下:
-
[total-hosts]为:200 -
[minimum-healthy-hosts]为:160 -
[total-hosts-per-AZ]为:100 -
[minimum-healthy-hosts-per-AZ]为:50
则...
-
[A]=200 - 160 = 40 -
[B]=100 - 50 = 50 -
40小于50
因此,CodeDeploy 将一次部署到 40 台主机。
在这种情况下,部署展开如下:
-
CodeDeploy 部署到第一个可用区:
-
CodeDeploy 部署到第一批
40台主机。 -
CodeDeploy 部署到下一批
40台主机。 -
CodeDeploy 部署到剩余的
20台主机。到第一个可用区的部署现已完成。
-
-
(可选)CodeDeploy 等待到第一个区域的部署进行“烘焙”,具体由监控持续时间或为第一个区域添加监控持续时间设置决定。如果没有问题,CodeDeploy 将继续。
-
CodeDeploy 部署到第二个可用区:
-
CodeDeploy 部署到第一批
40台主机。 -
CodeDeploy 部署到下一批
40台主机。 -
CodeDeploy 部署到剩余的
20台主机。到第二个也是最后一个可用区的部署现已完成。
-
要了解区域配置功能以及如何指定每个可用区正常运行主机的最小数量,请参阅zonal configuration。