创建部署后,可以在应用或服务发生变化时对部署进行更新。您可以使用 Deployment Manager 通过以下方式更新部署:
- 在部署中添加或移除资源。
- 更新部署中现有资源的属性。
单个更新可以包含这些更改的任意组合。例如,您可以在同一请求中更改现有资源的属性并添加新资源。您可以按照以下步骤更新部署:
- 根据需要的变化更改或创建配置文件。
- (可选)选择要使用的更新政策或使用默认政策。
- 向 Deployment Manager 发出更新请求。
准备工作
- 如果要使用本指南中的命令行示例,请安装 “gcloud” 命令行工具。
- 如果希望使用本指南中的 API 示例,请设置 API 访问权限。
- 了解如何创建部署。
更新准备
在更新部署之前,请按照以下指导做好更新准备:
如果要更新部署以向项目添加新资源,请检查资源是否已存在。
默认情况下,如果项目中已存在要添加的资源,则部署将获取该资源,而不是创建新资源。如果您不想获取现有资源,则必须更改要使用的政策以进行更新。
如需了解在更新部署时可以使用的政策,请参阅添加资源相关政策。
如果要更新部署以替换资源,请检查其依赖关系
如果要替换部署中的资源,则必须先确保删除它不会导致部署循环。当资源直接或间接依赖于自身时,就会发生部署循环。例如,请思考以下部署:
resources: - name: vm-a properties: zone: us-central1-f ... metadata: dependsOn: - vm-depends-on # The second VM - name: vm-depends-on properties: zone: $(ref.vm-a.zone) ...
在此部署中,对于
vm-a
,dependsOn
语句要求必须在vm-a
之前创建vm-depends-on
。但是,vm-depends-on
使用了对vm-a
的地区引用,这要求必须在vm-depends-on
之前创建vm-a
。在这种情况下,依赖关系处于循环中,部署会失败。如果您的资源与其他资源存在相互依赖关系,则替换该资源可能会导致部署循环。
例如,假设部署包含一个名为
disk-a
的永久性磁盘、一个名为vm-a
的虚拟机和一个名为ig-a
的实例组。vm-a
的配置包括对disk-a
的引用,ig-a
的配置包括对vm-a
的引用。在更新后的配置中,您需要移除vm-a
并将其替换为vm-b
。在这种情况下,解析 vm-a 和 vm-b 的依赖关系可能会导致部署循环,并且部署会失败。要在替换依赖关系链中的资源时避免部署循环,请执行以下操作之一:
通过移除 dependsOn 子句,或者移除或更改对其他资源的引用来移除要替换的资源的依赖项。使用这些更改更新部署后,再一次进行更新以替换资源。
删除依存资源链,并更新部署。然后,在下一次更新中重新创建要使用的资源。
确保存在支持更新的底层 API。
Deployment Manager 使用每个服务的 API 来创建和修改部署。要检查 Deployment Manager 是否可以完成您的请求,请参阅 Cloud Platform 服务中待更新资源的 API 文档。
例如,如果要更新部署中的 BigQuery 数据集,请参阅 Datasets API 参考文档中的可用方法。如果其中存在
update
方法,则表明可以使用 Deployment Manager 更新数据集。部分 API 具有用于更新其资源的自定义方法。例如,Compute Engine 为更新名为
setMetadata
的实例元数据提供了一种自定义方法。在这种情况下,Deployment Manager 会尝试使用自定义方法。确保您要更新的资源是可变的。
有些资源在创建后是不可变的,无法更新。要确定资源是否不可变,请参阅资源的相关 API 参考文档。通常情况下,不可变资源缺少更新资源属性的
update
API 方法或自定义方法。
限制
对于每个部署,您每次可以应用一个更新。如果更新已在进行中,则您必须停止当前更新,然后才能开始新的更新。
如果您修改部署中的资源时未使用 Deployment Manager,而是使用 Google Cloud 控制台或
gcloud
等方式,则在尝试修改更新中的资源时,您可能会看到错误或意外问题。
更改配置
如果保存了现有配置,请更改配置并在更新请求中使用该配置。
如果您没有保存现有配置,请创建新配置。如需了解创建配置文件的步骤,请阅读配置。
Deployment Manager 会将您在更新请求中提供的配置与之前的清单进行比较,并根据其区别来更新部署。
例如,下表显示了两种配置:一种描述现有部署,另一种描述部署所需的更新状态。您提供更新配置后,Deployment Manager 会评估差异并进行适当的更新。
本示例更新了现有实例资源以添加一些自定义元数据,并向部署添加了新虚拟机资源。粗体部分是模板之间的不同之处。
当前模板 | 更新后的模板 |
---|---|
resources: - name: vm-created-by-cloud-config type: compute.v1.instance properties: zone: us-central1-a machineType: machine-type-url disks: - deviceName: boot type: PERSISTENT boot: true autoDelete: true initializeParams: diskName: disk-created-by-cloud-config sourceImage: image-url networkInterfaces: - network: network-url |
resources: - name: vm-created-by-cloud-config type: compute.v1.instance properties: zone: us-central1-a machineType: machine-type-url disks: - deviceName: boot type: PERSISTENT boot: true initializeParams: diskName: disk-created-by-cloud-config sourceImage: image-url networkInterfaces: - network: network-url metadata: items: - key: 'foo' value: 'bar' - key: 'dev' value: 'vm' - name: a-new-vm type: compute.v1.instance properties: zone: us-central1-a machineType: machine-type-url - deviceName: boot type: PERSISTENT boot: true autoDelete: false initializeParams: diskName: a-new-vm-disk sourceImage: image-url networkInterfaces: - network: network-url |
(可选)确定用于更新的政策
接下来,确定要用于更新的政策。该政策决定更新部署时资源的更新方式。
Deployment Manager 使用以下默认政策:
- 用于添加资源的默认政策是
CREATE_OR_ACQUIRE
。 - 用于移除资源的默认政策是
DELETE
。 - 用于更新资源的默认政策是
UPDATE
。
如需了解每个政策,请参阅以下部分。
用于添加资源的政策
添加资源时,您可以选择创建新资源并将其添加到部署中,也可以获取现有资源:
CREATE_OR_ACQUIRE
- [默认] Deployment Manager 可获取项目中已存在的资源,或者创建资源(如果资源不存在)。为了获取资源,Deployment Manager 会检查您尝试创建的资源的属性的配置。如果存在具有相同属性的现有资源,Deployment Manager 将在部署过程中获取该资源。Deployment Manager 检查的属性取决于您正在创建的资源类型,可能包括以下属性:
- 资源的
name
- 资源的
type
- 资源的
zone
或region
(如适用)
这些属性是资源
GET
API 请求的网址的一部分。要查看 Deployment Manager 用于获取资源的属性,请参阅资源的GET
方法的 API 文档。例如,对于 Compute Engine 实例,instances.get
方法的请求网址包括resourceId
(配置中的name
)、zone
和project
。- 资源的
CREATE
- Deployment Manager 创建新的资源。如果配置中的任何资源已存在于项目中,部署就会失败。ACQUIRE
- Deployment Manager 使用与CREATE_OR_ACQUIRE
相同的条件获取已存在的资源。如果项目中已经有许多资源,并且您希望将它们作为单个部署一起管理,请使用
ACQUIRE
政策。您必须在模板或配置中为这些资源提供必要属性,就像在创建它们一样。如果项目中不存在配置中的任何资源,部署将失败。
用于移除资源的政策
提供以下用于移除资源的政策之一:
DELETE
- [默认] 该政策将从部署中移除对资源的所有引用,并删除底层资源。此操作是永久性的,无法撤消,但您可以重新创建具有相同属性的新资源。ABANDON
- 该政策将从部署中移除对资源的所有引用,但不会删除底层资源。例如,放弃实例意味着将其从某个部署中移除,但该实例仍然存在并可供您使用。ABANDON
政策仅适用于删除整个资源的情况,不适用于删除资源属性或用新属性更新资源的情况。如果您想保留资源的属性,则必须在更新的配置中添加资源及其所有原始属性。如果您使用新的配置文件进行更新,则建议您从原始配置中复制资源的定义。
用于更新现有资源的政策
如果存在用于更新现有资源的 UPDATE
方法,则 Deployment Manager 将使用该方法。
否则,如果存在自定义方法,Deployment Manager 将使用自定义方法。Deployment Manager 支持使用动词 set
的自定义方法。例如,setMetadata()
是有效的自定义方法,但 addAccessConfigs()
不是。
(可选)预览更新的配置
您可以使用 Google Cloud CLI 或 API 在提交任何更改之前预览要进行的更新。Deployment Manager 服务通过扩展完整配置和创建“空壳”资源来预览配置。
在预览配置时,Deployment Manager 不会实例化任何实际资源,以便让您在提交之前查看部署。
gcloud
使用 Google Cloud CLI 发出带有 --preview
参数的 update
请求:
gcloud deployment-manager deployments update example-deployment \
--config configuration-file.yaml \
--preview
API
在 API 中,使用现有部署创建 PUT()
,并提供 preview=true
查询参数。请求正文必须包含 intent
、target
和 name
字段。在网址和请求正文中提供部署名称。
例如,以下 API 请求预览了一个简单的更新:
PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?preview=true
{
"target": {
"config": {
"content": "resources:\n- name: vm-created-by-cloud-config\n type: compute.v1.instance\n properties:\n zone: us-central1-a\n machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n disks:\n - deviceName: boot\n type: PERSISTENT\n boot: true\n autoDelete: true\n initializeParams:\n diskName: disk-created-by-cloud-config\n sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n networkInterfaces:\n - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
}
},
"name": "example-deployment"
}
预览部署后,您可以发出相同的 PUT()
请求并忽略配置和 preview
查询参数,以完全部署配置。Deployment Manager 会使用您的上一次预览来执行更新。例如:
gcloud deployment-manager deployments update example-deployment
如需了解发出更新请求的步骤,请参阅发出更新请求。
如果您决定不继续更新,请在发出其他更新或预览请求之前取消当前预览。
取消预览
预览完更新后,您必须决定是否要继续更新。如果不想继续,或者如果要使用其他配置文件来更新部署,请取消当前预览。
gcloud
使用 Google Cloud CLI 发出 deployments cancel-preview
请求:
gcloud deployment-manager deployments cancel-preview my-first-deployment
API
在 API 中,向 cancelPreview
方法发出 PUT()
请求,并提供最新的部署指纹。指纹是随机生成的值,随每个更新请求而变化。为防止更新期间出现错误,请在您的请求中提供最新的指纹。
要获取最新的部署指纹,请使用 get()
方法获取部署,并查找指纹值。指纹值如下所示:
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
您的 cancelPreview()
请求如下所示:
POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/cancelPreview
{
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
}
发出更新请求
要执行更新,请执行以下操作:
gcloud
在 Google Cloud CLI 中,使用 deployments update
子命令,同时提供新的配置以及更新政策(可选)。
gcloud deployment-manager deployments update my-first-deployment \
--create-policy POLICY \
--delete-policy POLICY
如果之前已经预览配置,请忽略配置,Deployment Manager 会使用上次预览的配置来执行更新。
gcloud deployment-manager deployments update my-first-deployment
API
在 API 中,发出 update
请求并提供最新的部署指纹。指纹是随机生成的值,随每个更新请求而变化。为防止更新期间出现错误,请在您的请求中提供最新的指纹。
要获取最新的部署指纹,请使用 get()
方法获取部署,并查找指纹值。指纹值如下所示:
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
接下来,在您的请求中提供指纹,以及新的配置和更新政策。如果之前已经预览配置,请忽略配置和更新政策,Deployment Manager 会使用上次预览的配置来执行更新。
在网址和请求正文中提供部署名称。
PUT https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment?createPolicy=ACQUIRE&deletePolicy=ABANDON
{
"target": {
"config": {
"content": "resources:\n- name: vm-created-by-cloud-config\n type: compute.v1.instance\n properties:\n zone: us-central1-a\n machineType: https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\n disks:\n - deviceName: boot\n type: PERSISTENT\n boot: true\n autoDelete: true\n initializeParams:\n diskName: disk-created-by-cloud-config\n sourceImage: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180716\n networkInterfaces:\n - network: https://www.googleapis.com/compute/v1/projects/myproject/global/networks/default"
}
},
"name": "example-deployment",
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
}
停止更新
您可以使用 stop()
方法停止正在进行的更新。此方法将取消特定更新的未完成进度,但不会撤消已经做出的任何更改。
如果您要取消预览,请参阅取消预览部分。
gcloud
使用 Google Cloud CLI 发出 deployments stop
请求:
gcloud deployment-manager deployments stop my-first-deployment
API
在 API 中,向 stop
方法发出 POST()
请求并提供最新的指纹属性。指纹是随机生成的值,随每个更新请求而变化。为防止出现存在冲突的更改,您必须在请求中提供最新指纹才能执行乐观锁定,这样,一次便只能执行一次更新。
要获取最新的部署指纹,请使用 get()
方法获取部署,并查找指纹值。指纹值如下所示:
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
您的请求如下所示:
POST https://www.googleapis.com/deploymentmanager/v2/projects/myproject/global/deployments/example-deployment/stop
{
"fingerprint": "nU2v7bzeA7gBBI8bdbtmFg=="
}