事前準備
- 如要使用本指南中的指令列範例,請完成下列事項:
- 安裝或更新至最新版 gcloud 指令列工具。
- 設定預設地區和區域。
- 如要使用本指南中的 API 範例,請設定 API 存取權。
在執行個體與本機電腦之間複製檔案
使用 gcloud compute scp
在 Linux 執行個體與本機電腦之間傳輸檔案:
gcloud compute scp my-instance:~/file-1 \
my-instance:~/file-2 \
~/local-dir
如要將檔案從本機電腦複製到執行個體:
gcloud compute scp ~/local-dir/file-1 \
my-instance:~/remote-destination
偵測您是否在 Compute Engine 中執行
系統想要偵測其是否在特定雲端環境內執行是很常見的情形。請使用下列指示來協助您偵測您是否正在 Compute Engine 中執行。
使用中繼資料伺服器
您可以使用中繼資料伺服器,輕鬆偵測出您的應用程式或指令碼是否正在 Compute Engine 執行個體內執行。當您對伺服器提出要求時,來自中繼資料伺服器的任何回應都將包含 Metadata-Flavor: Google
標頭。您可以尋找此標頭,可靠地偵測出您是否正在 Compute Engine 中執行。
例如,以下 curl 要求會傳回 Metadata-Flavor: Google
標頭,指示要求正從 Compute Engine 執行個體內提出。
me@my-inst:~$ curl metadata.google.internal -i HTTP/1.1 200 OK Metadata-Flavor: Google Content-Type: application/text Date: Thu, 10 Apr 2014 19:24:27 GMT Server: Metadata Server for VM Content-Length: 22 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN 0.1/ computeMetadata/
使用其他方法
Linux
針對 Linux 執行個體,dmidecode
工具可用來直接存取 /proc/mem
中的 DMI/SMBIOS 資訊。執行下列指令,dmidecode 工具應會輸出「Google Compute Engine」以指示您正在 Compute Engine 中執行:
my@myinst:~$ sudo dmidecode -s system-product-name | grep "Google Compute Engine" Google Compute Engine
Windows
在 Windows 執行個體上,會列出「Google」做為系統製造商與機型。您可以使用例如 msinfo32.exe 的公用程式查詢此資訊。 例如,msinfo32 即會顯示下列資訊:

如果您需要透過程式確定 Windows 執行個體上的這項資訊,可以進行一些修改來建立 Windows Management Instrumentation (WMI) 應用程式。
如何處理執行個體失敗
遺憾的是,個別執行個體將不時會遇到失敗的情況。 這可能因為各種原因,包括非預期中斷、硬體錯誤或其他系統失敗。如要減輕此種情況,您應使用永久磁碟並定期備份資料。
如果執行個體失敗,它將會以失敗時的相同根永久磁碟、中繼資料與執行個體設定自動重新啟動。如要控管執行個體的自動重新啟動行為,請參閱如何設定排程選項一文。
一般而言,您應將系統設計成足夠完善可靠,使單一執行個體的失敗不至於對您的應用程式造成災難性的後果。詳情請參閱設計完善可靠的系統一文。
透過 UUID 識別執行個體
每部虛擬機器都有通用專屬識別碼 (UUID),可透過 Linux 映像檔的 dmidecode 工具存取。UUID 可透過虛擬機器的專案 ID、區域與執行個體名稱計算。執行個體的 UUID 在所有 Compute Engine 虛擬機器之間都是專屬的,並且在執行個體的完整生命週期中都是穩定的。UUID 將於虛擬機器重新啟動時持續存在,如果在同一專案與區域中刪除虛擬機器並以相同執行個體名稱重新建立,UUID 仍將保持不變。
如要在 Linux 執行個體上尋找執行個體的 UUID,請從您的虛擬機器執行下列指令:
me@myinst:~$ sudo dmidecode -t system | grep UUID
工具應會輸出類似以下的回應:
UUID: FE0C672D-324F-25F1-052C-6C50FA8B7397
安裝套件及設定執行個體
執行個體建立者對於他們新增至專案的任何執行個體都具有管理員權限,並且會自動位於 SUDO 清單上。
當您以管理員身分登入執行個體時,可透過對正常 Linux 機器相同的方式安裝套件並設定執行個體。 例如,您可以安裝 Apache,如下所示:
user@myinst:~$ sudo apt-get update && sudo apt-get install apache2 Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: [...]
您可按照在執行個體和本機電腦之間複製檔案一文所述的方式,使用 gcloud compute scp
在本機電腦與執行個體之間移動檔案。
請注意,您的機器需要能夠存取網際網路,才能執行 apt-get。這表示機器需要外部 IP 位址或內部 Proxy 的存取權。
Compute Engine 會變更虛擬機器中繼資料伺服器中的特殊屬性,然後很快嘗試進行待處理的基礎架構維護事件,嘗試即時遷移或終止並重新啟動虛擬機器。系統會在事件前後更新 maintenance-event
屬性,讓您知道即將發生這類事件。您可以利用這項資訊,在維護事件之前和/或之後自動執行您想執行的任何指令碼或指令。
列出所有執行個體
您可以呼叫 instances list
來查看專案中所有執行個體的清單:
gcloud compute instances list
NAME ZONE MACHINE_TYPE INTERNAL_IP EXTERNAL_IP STATUS example-instance us-central1-a n1-standard-1 10.105.155.92 173.255.114.53 RUNNING example-instance-2 us-central1-a n1-standard-1 10.181.215.203 146.148.32.59 RUNNING
gcloud compute
預設提供所有可用區域的所有資源匯總清單。如果您只需要單一區域中的資源清單,請在您的要求中提供 --zones
標記。
在 API 中,您需要對兩種不同的方法提出要求,以取得匯總資源的清單或區域內的資源清單。如要對匯總清單提出要求,請對該資源的 aggregatedList
URI 提出 GET
要求,並以您自己的專案 ID 取代專案:
https://www.googleapis.com/compute/v1/projects/myproject/aggregated/instances
在用戶端程式庫中,對 instances().aggregatedList
函式提出要求:
def listAllInstances(auth_http, gce_service):
request = gce_service.instances().aggregatedList(project=PROJECT_ID)
response = request.execute(auth_http)
print response
如要針對區域內的執行個體清單提出要求,請對下列 URI 提出 GET
要求,用您自己的專案 ID 取代專案,並用執行個體的區域取代區域:
https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances
在 API 用戶端程式庫中,提出 instances().list
要求:
def listInstances(auth_http, gce_service):
request = gce_service.instances().list(project="myproject",
zone="us-central1-f")
response = request.execute(auth_http)
print response
降低先佔執行個體的成本
Compute Engine 提供先占執行個體,可讓您以遠低於一般執行個體的價格建立及執行。如果您的應用程式具有容錯性質,且能承受執行個體的不穩定性,先佔執行個體將可大幅節省您在 Compute Engine 上的花費。詳情請參閱先佔執行個體說明文件。
為執行個體設定網路時間通訊協定 (NTP)
許多依賴於謹慎排序事件的軟體系統都依賴於穩定、一致的系統時鐘。大多數服務寫入的系統記錄都包含時間戳記,其有助於對系統各元件之間發生的問題進行偵錯。為了協助保持系統時鐘的同步,Compute Engine 執行個體已預先設定為使用網路時間通訊協定 (NTP)。
除了保持伺服器時間的同步以外,NTP 也對極少出現的閏秒情況有所幫助。閏秒是為了因應地球自轉的變化而對 UTC 時間做出的一秒調整。閏秒不會以定期間隔發生,因為地球自轉速度會不規則變化,以對氣候與地質事件做出反應。之前的閏秒曾對網路上的各種服務與應用程式造成毀滅性的破壞。NTP 伺服器可協助確保所有伺服器在發生閏秒事件期間都報告相同的時間。
本節說明如何在虛擬機器上設定 NTP 伺服器,使其在發生閏秒時能夠產生正確的行為。
Google NTP 伺服器與閏秒抹除
Unix 時間中的閏秒一般透過重複一天中的最後一秒來實作。這可能會導致預期時間戳記只會增加的軟體發生問題。為了解決這個問題,Google 的時間伺服器會每二十小時 (閏秒事件之前及之後的十秒)「抹除」額外的一秒,這樣電腦就不會突然看到額外的秒數成為重複的時間戳記。這樣可以降低依賴一致時間戳記之系統的風險。建議所有 Compute Engine 虛擬機器執行個體都設定為使用內部 Google NTP 服務。
為您的執行個體設定 NTP
Google 無法預測例如 pool.ntp.org 這樣的外部 NTP 服務將如何處理閏秒。如有可能,建議您不要對 Compute Engine 虛擬機器使用外部 NTP 來源。更糟的情況是,同時使用 Google 的 NTP 服務與外部服務可能導致系統時間出現無法預測的變更。僅使用單一外部 NTP 來源比混合使用好,但是例如 pool.ntp.org 這樣的外部 NTP 服務很可能會使用步進法來處理閏秒。因此,您的虛擬機器可能會看見重複的時間戳記。
最安全的方法是設定讓您的 Compute Engine 虛擬機器使用單一 NTP 伺服器,即 Google 提供的內部 NTP 伺服器。請勿混用外部 NTP 伺服器與 Google NTP 伺服器,因為這可能會導致發生非預期的行為。
如要確保正確設定您的虛擬機器,請按照以下說明操作。
Linux
使用 ssh 連線至執行個體。
主控台
- 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。
按一下您要設定的執行個體旁邊的 [ssh] 按鈕。
gcloud
使用
gcloud
指令列工具,執行:gcloud compute instances ssh INSTANCE
在您的執行個體上,執行
ntpq -p
以檢查 NTP 設定的目前狀態:$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *metadata.google 255.28.23.83 2 u 27 64 1 0.634 -2.537 2.285 *217.162.232.173 130.149.17.8 2 u 191 1024 176 79.245 3.589 27.454
如果您看見單一記錄指向
metadata.google
或metadata.google.internal
,則不需要進行任何變更。如果您看見混合出現的多個來源,包括 metadata.google 與 pool.ntp.org 之類的公共來源,則需要更新您的來源以移除任何外部 NTP 伺服器。在這個範例中有兩個記錄,一個指向
metadata.google
,另一個指向外部位址。由於有多個來源,因此您需要更新您的 NTP 伺服器,移除*217.162.232.173
位址。設定您的 NTP 伺服器,移除外部來源。
如要設定 NTP 伺服器,請用您常用的文字編輯器編輯
/etc/ntp.conf
檔案。找到設定的servers
區段,移除所有非 Google NTP 來源:
$ vim /etc/ntp.conf
... # You do need to talk to an NTP server or two (or three). #server ntp.your-provider.example ... server metadata.google.internal iburst
編輯
/etc/ntp.conf
檔案之後,重新啟動 NTP 服務。重新啟動的指令可能因 Linux 發行版而不同:$ sudo service ntp reload
- 驗證您的設定。再次執行
ntpq -p
指令,驗證您的變更:
$ ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *metadata.google 255.28.23.83 2 u 27 64 1 0.634 -2.537 2.285
Windows
- 前往 GCP 主控台的「VM instances」(VM 執行個體) 頁面。
按一下您要登入的 Windows 執行個體旁邊的 [RDP] (遠端桌面通訊協定) 按鈕。
登入之後,在 Powershell 圖示上按一下滑鼠右鍵,選取 [Run as administrator] (以系統管理員身分執行)。
當命令提示字元載入時,執行下列指令來查看目前的 NTP 設定:
PS C:\Windows\system32>w32tm /query /configuration [Configuration] ... Type: NTP (Local) NtpServer: metadata.google.internal, ...
如果您看見單一記錄指向
metadata.google
或metadata.google.internal
,則不需要進行任何變更。如果您看見混合出現的多個來源,包括metadata.google
與公開來源,則需要移除外部伺服器。按照 Windows 指南設定您的 NTP 伺服器。
Google 的 NTP 伺服器的閏秒抹除功能是一種便利的方法,可消除在時間敏感系統上重播一秒時涉及的風險。其他 NTP 服務可為大多數軟體系統提供可接受的解決辦法。重點在於不要混用 Google 閏秒抹除 NTP 服務與公開 NTP 步進式服務。
如要將 Google 雲端之外裝置與抹除的時間同步,請使用 Google 公開 NTP。該項目會使用為 Compute Engine 虛擬機器執行個體提供的相同抹除方法。