確定性執行個體範本

本頁面說明應建立確定性執行個體範本的時機與原因。確定性執行個體範本可讓您明確瞭解在部署執行個體範本時,應安裝在執行個體上的第三方服務或應用程式類型。建立確定性執行個體範本,您可以將執行個體範本發生模棱兩可的情況與非預期行為的可能性降到最低。

事前準備

您應建立確定性執行個體範本的原因

一般來說,我們建議執行個體範本的屬性要盡可能明確且具確定性。如果您在安裝或使用第三方服務的執行個體範本中採用開機指令碼,請確保這些指令碼可提供明確資訊,例如要安裝的應用程式版本。Compute Engine 只能依賴於在範本中定義的資訊,且無權干涉參照的第三方服務。如果您的範本太模糊,執行個體範本可能會以非預期的方式運作。

例如,請考慮下列指令來使用開機指令碼,建立安裝 apache2 且使用在外部伺服器上託管之檔案的執行個體範本。

gcloud compute instance-templates create example-template-with-startup \
    --image-family debian-9 \
    --image-project debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt-get install -y apache2
    scp myuser@108.59.87.185:index.php /var/www/'

這個開機指令碼有兩個潛在問題:

  • 指令碼未明確定義要安裝的 apache2 版本,且依賴於 apt-get 存放區中的目前可用版本。
  • 指令碼依賴第三方代管的未版本化檔案,而且執行個體範本從最近一次使用過後後可能已經變更。

如果您使用自動配置器,非絕對執行個體範本可能會導致自動配置器將新執行個體新增至設定不同的代管執行個體群組,例如其他版本的 apache2。

同樣的,如果您已將這個範本套用至代管執行個體群組,使用 Instance Group Updater 服務將群組更新為不同範本,然後決定復原至之前的範本,您最終可能會產生使用與更新前不同版本之 apache2 或 index.php 檔案的執行個體,因為您的執行個體一律會在開機時擷取最新的版本。

避免模棱兩可或非預期的執行個體範本行為

如要避免非預期的範本行為,請使用下列其中一種方法:

  • 使用容器最佳化的映像檔或 Docker (擁有 Docker 標記)。例如,我們建議您針對每個新版本的 Docker 映像檔指派新標記,並在您的執行個體範本中使用這些標記,而不是預設的最新標記。針對容器最佳化映像檔,您可以明確參照資訊清單檔案中特定版本的映像檔。下方範例使用 Docker 映像檔「myimage」,版本標記為「version_2_1_3」:

    version: v1beta2
    containers:
      - name: simple-echo
        image: myimage:version_2_1_3
           [ rest of your manifest file ]
    
  • 建立自訂映像檔,做為範本的映像檔使用。自訂映像檔能保證每個執行個體都相同,而開機指令碼可能會在發佈套件更新後產生不同結果,因此建議不要使用開機指令碼。如果是原型設計與快速開發,請在您的執行個體範本中使用開機指令碼,並在準備好部署實際運作品質的服務時使用自訂映像檔。

  • 如果您使用開機指令碼,請考慮將其更新為確定性指令碼。舉例來說,您可以建立先前範本的新版本,然後指定確定性開機指令碼。如下所示:

    gcloud compute instance-templates create example-template-with-startup-2-1-3 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --metadata startup-script='#! /bin/bash
        sudo apt-get install -y apache2=2.2.20-1ubuntu1
        scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
    

    其中「version_2_1_3」是一個子目錄,包含 2.1.3 版本服務的 PHP 指令碼。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件