更新執行個體屬性

您可以使用 Google Cloud CLICompute Engine API 的單一要求,更新多個執行個體屬性,並視需要重新啟動執行個體。更新方法會處理驗證更新後執行個體屬性的邏輯,並確保有必要的資源可順利完成更新。如果要求包含無效屬性,或要求的資源無法使用,要求就會傳回錯誤,且執行個體不會有任何變更。這可防止執行個體進行部分更新,並避免執行個體停止運作,導致無法存取資源來重新啟動。

如要更新執行個體的網路介面 (networkInterfaces),請參閱「更新執行個體的網路介面」。

如要從執行個體新增或移除動態網路介面,請使用下列程序,而非更新執行個體屬性:

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上的分頁,瞭解如何使用範例:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。

    gcloud

    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  • 設定預設地區和區域
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

限制

  • 透過 gcloud CLI 或 Compute Engine API 發出的執行個體更新要求,不支援 PATCH 語意。更新要求中的例項資源必須包含例項的所有屬性。更新要求中缺少例項設定的屬性,會視為從例項中刪除。
  • 您只能更新特定房源清單
  • 如果執行個體已連結本機 SSD 磁碟,您就無法在執行個體執行期間,更新需要重新啟動執行個體的屬性。您可以刪除執行個體並重新建立,也可以停止執行個體、更新屬性,然後重新啟動。
  • 您可以更新執行個體的 networkInterfaces 屬性,但無法在執行個體中新增或移除虛擬 NIC (vNIC)。
  • 如果執行個體使用的資源僅適用於 Beta 版 Compute Engine API,您必須使用正確版本的 instances.update 方法更新這些屬性。舉例來說,如果您使用 Beta 版 Compute Engine API 建立執行個體,並透過只有 Beta 版 API 才能辨識的資源設定執行個體,您也必須使用 Beta 版的 instances.update 方法更新這些資源。instances.update 方法的 v1 版本無法辨識執行個體使用的 Beta 版資源,因此在更新過程中,系統會從執行個體設定中刪除這些 Beta 版資源。這個行為也適用於 Alpha 版 API 中的資源。

權限

您必須具備 compute.instances.update 權限才能更新執行個體。 這項權限已納入多個現有的 Identity and Access Management (IAM) 角色。您也必須有權在執行個體上使用要修改的資源。舉例來說,如要將磁碟新增至執行個體,您必須具備下列權限:

  • 要更新的執行個體上的 compute.instances.update 權限。
  • 現有磁碟的 compute.disks.use 權限,或要在其中建立新磁碟的專案的 compute.disks.create 權限。

最佳做法

為確保執行個體更新介面能發揮最大效益,請遵循下列最佳做法:

  • 請盡可能使用相同版本的 Compute Engine API,建立、設定及更新執行個體。這樣一來,即使例項資源只在一個 API 版本中提供,您也能更新及修改這些資源。
  • 雖然您可以使用 instances.update 方法更新代管執行個體群組 (MIG) 中的執行個體,但在大多數情況下,最好是變更群組的執行個體範本,然後將更新推出至 MIG
  • 如要更新執行個體使用的資源,請使用指令更新該資源執行個體,而非更新執行個體屬性,例如:
    • 您可以使用 disks.update 方法修改磁碟
    • 如要變更執行個體使用的網路,可以使用 instances.updateNetworkInterface 方法,不必停止執行個體。

可更新的屬性

您只能透過更新方法變更特定執行個體屬性。更新部分屬性時,需要重新啟動執行個體。 為避免執行個體意外重新啟動,您的要求必須定義允許對執行個體執行的動作。要求可以指定下列其中一項動作:

  • NO_EFFECT:更新要求會檢查要求是否有效,以及資源是否可用,但不會執行更新。使用這項動作測試指令,不必啟動任何實際更新。
  • REFRESH:只有在修改後的執行個體屬性不需要重新啟動執行個體時,才會執行更新要求。如果要求有效但需要重新啟動,要求會傳回 INFEASIBLE 錯誤。
  • RESTART:如果更新需要重新啟動執行個體,系統就會重新啟動執行個體。

下列屬性需要重新啟動 (RESTART) 才能更新:

  • disks:開機磁碟,包括所有磁碟 (disks.deviceName)
  • displayDevice
  • enableNestedVirtualization
  • guestAccelerators
  • machineType
  • minCpuPlatform
  • networkInterfaces
  • networkPerformanceConfig
  • performanceMonitoringUnit
  • reservationAffinity:您只能更新執行個體使用預訂的方式 (reservationAffinity.consumeReservationType),如下所示:
    • 從使用任何相符的預留項目 (ANY_RESERVATION) 改為不使用預留項目 (NO_RESERVATION)
    • 從不使用預留資源 (NO_RESERVATION) 到使用任何相符的預留資源 (ANY_RESERVATION)
  • resourcePolicies
  • scheduling
  • serviceAccounts
  • shieldedInstanceConfig
  • threadsPerCore
  • visibleCoreCount

下列屬性只要重新整理 (REFRESH) 即可更新:

  • canIpForward
  • deletionProtection
  • description
  • disks:非開機磁碟屬性,不含 deviceName
  • labels
  • metadata
  • nodeAffinities
  • tags

更新執行個體屬性

請按照下列步驟更新執行個體:

  1. 匯出現有執行個體設定屬性。
  2. 修改執行個體設定的屬性。
  3. 指定 NO_EFFECT 為干擾程度最高的動作,執行測試要求。 回應會指出例項設定中的無效欄位,以及套用變更時需要執行的動作。
  4. 如果設定可接受,請要求更新執行個體,並指定執行個體更新作業可接受的最大干擾動作。

只有在要求符合下列規定時,系統才會啟動更新程序:

  • 要求中的執行個體 fingerprint 屬性,必須與要更新的執行個體 fingerprint 相同。這樣可避免對同一執行個體提出同步更新要求,導致彼此覆寫。
  • 更新要求中的屬性必須有效。
  • 您要求的資源必須可用。
  • 如果要求中的屬性需要重新啟動執行個體,要求必須將 RESTART 指定為允許的動作。

如果符合條件,系統就會啟動執行個體更新程序。否則,系統不會對現有執行個體或其設定進行任何變更。

您可以使用 gcloud CLI 或 Compute Engine API 啟動更新。

gcloud

  1. 使用 instances export 指令匯出現有執行個體屬性:

    gcloud compute instances export INSTANCE_NAME \
        --project PROJECT_ID \
        --zone ZONE \
        --destination=FILE_PATH
    

    更改下列內容:

    • INSTANCE_NAME:要匯出的執行個體名稱。
    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的可用區
    • FILE_PATH:您要在本機工作站儲存執行個體設定檔的輸出路徑。
  2. 使用文字編輯器修改匯出的執行個體設定檔中的一或多個屬性。如要瞭解可更新的屬性,請參閱本文中的可更新屬性清單。 舉例來說,如要變更執行個體的機器類型,請變更 machineType 屬性:

    ...
    machineType: https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/MACHINE_TYPE
    ...
    

    更改下列內容:

    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的可用區
    • MACHINE_TYPE:執行個體的機器類型,例如 n1-standard-2
  3. 使用 instances update-from-file 指令,對目標執行個體執行測試更新。指定 --most-disruptive-allowed-action=NO_EFFECT 標記。回應會指出設定錯誤的屬性,並說明是否需要執行 RESTARTREFRESH 動作才能套用更新。

    gcloud compute instances update-from-file INSTANCE_NAME \
        --project PROJECT_ID \
        --zone ZONE \
        --source=FILE_PATH \
        --most-disruptive-allowed-action NO_EFFECT
    

    更改下列內容:

    • INSTANCE_NAME:要匯出的執行個體名稱。
    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的可用區
    • FILE_PATH:本機工作站上已修改的執行個體設定檔路徑。
  4. 使用 instances update-from-file 指令更新目標執行個體。如要更新的屬性需要重新啟動執行個體,請加入 --most-disruptive-allowed-action=RESTART 旗標。如果屬性不需要重新啟動,請指定 --most-disruptive-allowed-action=REFRESH 旗標。如要瞭解哪些屬性需要重新啟動,請參閱本文中的可更新屬性清單

    gcloud compute instances update-from-file INSTANCE_NAME \
        --project PROJECT_ID \
        --zone ZONE \
        --source=FILE_PATH \
        --most-disruptive-allowed-action ALLOWED_ACTION
    

    更改下列內容:

    • INSTANCE_NAME:要匯出的執行個體名稱。
    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的可用區
    • FILE_PATH:本機工作站上已修改的執行個體設定檔路徑。
    • ALLOWED_ACTION:定義更新的干擾程度。指定 RESTART 可完整重新啟動執行個體。指定 REFRESH,即可只在修改後的屬性不需要重新啟動執行個體時,更新執行個體。

如果更新要求有效且有可用資源,就會開始執行執行個體更新程序。您可以查看稽核記錄,監控這項作業的狀態。如果更新需要重新啟動,且您的指令允許 RESTART,執行個體就會重新啟動以套用變更。

REST

  1. 使用 Compute Engine API 中的 instances.get 方法,匯出現有執行個體屬性:

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME
    

    更改下列內容:

    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的區域
    • INSTANCE_NAME:要匯出的執行個體名稱。

    這項要求會傳回執行個體資源定義

  2. 在回應中修改執行個體資源屬性。如要瞭解可更新的屬性,請參閱本文中的可更新屬性清單。舉例來說,如要變更執行個體的機器類型,請變更 machineType 屬性。您可以變更多個屬性。

    {
      ...
      "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/MACHINE_TYPE",
      ...
    }
    

    更改下列內容:

    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的可用區
    • MACHINE_TYPE:執行個體的機器類型,例如 n1-standard-2
  3. 使用 Compute Engine API 中的 instances.update 方法,並指定 mostDisruptiveAllowedAction=NO_EFFECT 查詢參數,對目標執行個體執行測試更新。回應會指出設定錯誤的屬性,並說明是否需要執行 RESTARTREFRESH 動作才能套用更新。

    PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME?mostDisruptiveAllowedAction=NO_EFFECT
    
    {
      ...
      "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/n1-standard-2",
      ...
    }
    

    更改下列內容:

    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的可用區
    • INSTANCE_NAME:要匯出的執行個體名稱。
  4. 使用 Compute Engine API 中的 instances.update 方法更新目標執行個體。如果要更新的屬性需要重新啟動執行個體,請加入 mostDisruptiveAllowedAction=RESTART 查詢參數,指出更新期間可以重新啟動執行個體。如果屬性不需要重新啟動,請指定 mostDisruptiveAllowedAction=REFRESH 查詢參數。如要瞭解哪些屬性需要重新啟動,請參閱本文中的可更新屬性清單。請提供您修改的執行個體資源完整主體。在以下範例中,主體會將機型變更為 n1-standard-2

    PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME?mostDisruptiveAllowedAction=ALLOWED_ACTION
    
    {
      ...
      "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/machineTypes/n1-standard-2",
      ...
    }
    

    更改下列內容:

    • PROJECT_ID:這項要求的專案 ID。
    • ZONE:這個執行個體的可用區
    • INSTANCE_NAME:要匯出的執行個體名稱。
    • ALLOWED_ACTION:定義更新的干擾程度。指定 RESTART 可完整重新啟動執行個體。指定 REFRESH,只在修改後的屬性不需要重新啟動執行個體時更新執行個體。

如果更新要求有效且有可用資源,就會開始執行執行個體更新程序。您可以查看稽核記錄,監控這項作業的狀態。如果更新需要重新啟動,且您的指令允許 RESTART,執行個體就會重新啟動以套用變更。

後續步驟