本頁面說明要建立確定性執行個體範本的時機與原因。在部署執行個體範本時,確定性執行個體範本會明確指出要在執行個體上安裝的第三方服務或應用程式類型。建立確定性執行個體範本,您可以將執行個體範本發生模棱兩可的情況與非預期行為的可能性降到最低。
建立確定性執行個體範本的理由
一般來說,我們建議執行個體範本的屬性盡量明確且具確定性。如果您在安裝或使用第三方服務的執行個體範本中使用開機指令碼,請確認這些指令碼提供了明確的資訊,例如要安裝的應用程式版本。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 install -y apache2
scp myuser@108.59.87.185:index.php /var/www/'
這個開機指令碼有兩個潛在問題:
- 指令碼未明確定義要安裝的 apache2 版本,且依賴於
apt
存放區中的目前可用版本。 - 指令碼依賴第三方託管未經版本化的檔案,且從上次使用執行個體範本後可能已經變更。
如果您使用自動配置器,非確定性執行個體範本會導致您的自動配置器將新的執行個體新增至設定不同的代管執行個體群組,例如其他版本的 apache2。
同樣地,如果您將這個範本套用至代管執行個體群組,將群組更新為不同的範本服務,然後決定回復至先前的範本,則執行個體可能會使用與更新前不同的 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 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 指令碼。