创建部署后,可以在应用或服务发生变化时对部署进行更新。您可以使用 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 参考文档。通常情况下,不可变资源缺少更新资源属性的 - updateAPI 方法或自定义方法。
限制
- 对于每个部署,您每次可以应用一个更新。如果更新已在进行中,则您必须停止当前更新,然后才能开始新的更新。 
- 如果您修改部署中的资源时未使用 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(如适用)
 - 这些属性是资源 - GETAPI 请求的网址的一部分。要查看 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=="
 }