本教學課程說明如何管理建構映像檔的版本管理複雜度,這些映像檔適用於多個 Windows Server 版本。Windows Server 容器有版本相容性規定,因此容器無法在多個 Windows Server 主機版本上執行。不過,Windows Server 上的 Docker 支援多架構 (或多平台) 容器映像檔,可在多個 Windows Server 版本上執行。
使用多架構映像檔,您可以將 Google Kubernetes Engine (GKE) Windows Server 節點集區升級至偏好的 Windows Server 版本,而不需重建映像檔和變更 Pod 規格。例如:
- GKE 1.15 版支援 Windows Server 1809
- GKE 1.16 版支援 Windows Server 1909
如要自動從某個 GKE 版本升級至後續版本,您必須為 Windows 工作負載建構多架構映像檔。建構多架構映像檔時,需要為每個 Windows Server 版本建構映像檔,然後建構參照這些映像檔的資訊清單。如要完全控管映像檔的建立和建構程序,可以手動建構映像檔。或者,您也可以使用 Cloud Build 自動建構 Windows Server 多架構映像檔。
目標
在本教學課程中,您將瞭解如何手動或使用 Cloud Build 建立 Windows Server 多架構映像檔。手動建構映像檔:
- 建立 2 個 Docker 映像檔,使用不同版本或類型的 Windows Server,例如長期維護通道 (LTSC) 和半年通道 (SAC)。
- 建立 Windows Server VM。
- 建立資訊清單並推送至登錄檔。
使用 Cloud Build 建構映像檔:
- 建立專案、啟用 API 並授予權限,準備好環境。
- 建立應用程式、Dockerfile 和建構檔案。
- 執行指令來建構映像檔。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
開始之前,請確認您已完成下列工作:- 安裝 Google Cloud CLI,以便執行
gcloud
指令。 - 安裝 Docker 來建構容器。
- 安裝 Go,建構 Windows Server 二進位檔。
- 本教學課程使用 Artifact Registry 做為存放區。確認您已建立 Docker 存放區。
手動建構多架構映像檔
手動建構多架構映像檔可讓您彈性建構映像檔,其中包含您需要的任何 Windows Server 版本。如要手動建構多架構映像檔,請按照下列步驟操作:
- 建立 LTSC 2019 Docker 單一架構映像檔。如要瞭解如何建立 Docker 映像檔,請參閱「部署 Windows Server 應用程式」。例如:
us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2019
。 - 建立 LTSC 2022 Docker 單一架構映像檔。例如
us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2022
。 - 建立 SAC 20H2 Docker 單一架構映像檔。例如
us-docker.pkg.dev/my-project/docker-repo/foo:1.0-20h2
。 - 建立 Windows Server VM,例如 20H2 版。請參閱「使用 Windows Server VM 的快速入門導覽課程」。
- 使用 RDP 連線至 VM。
- 開啟 PowerShell 視窗,執行後續步驟中的指令。
啟用
docker manifest
實驗功能。Docker 資訊清單是要推送至登錄檔的映像檔清單:PS C:\> $env:DOCKER_CLI_EXPERIMENTAL = 'enabled'
建立多架構資訊清單:
docker manifest create ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0 ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2019 ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2022 ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-20h2
將新建立的多重架構映像檔資訊清單推送至 Artifact Registry 存放區:
docker manifest push ` REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0
如要確保已成功建構及推送多架構映像檔,請前往
REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo
並點選該映像檔。你會看到 3 張圖片 :foo:1.0-2019
foo:1.0-2022
foo:1.0-20h2
foo:1.0
現在您可以在 Pod 規格中參照多架構映像檔 REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0
。這樣一來,您就能安全地對 GKE Windows 節點集區使用自動升級功能。
使用 Cloud Build gke-windows-builder 建構多架構映像檔
如要簡化手動建構步驟,可以使用以 OSS gke-windows-builder 為基礎的 gke-windows-builder。您可以搭配使用 gke-windows-builder 和 Cloud Build,自動建構 Windows Server 多架構映像檔。GKE 會在推出新的支援版本時,更新建構工具,納入支援的 Windows SAC 和 LTSC 版本。使用建構工具的另一個好處是,您不必使用 Powershell 建立自己的 Windows VM 來建構映像檔。Windows VM 會由 Docker 容器取代,在 Cloud Build 中為您執行指令。
為協助您瞭解建構工具的運作方式,請按照這個範例建構「hello world」多架構映像檔。這些步驟可在 Linux 或 Windows 伺服器上執行。
準備環境
如要準備環境,請完成下列步驟:
- 在工作電腦上建立工作區目錄,例如:
~/gke-windows-builder/hello-world
。 - 建立或選取本教學課程的專案。
- 確認您已為專案啟用計費功能。
為專案啟用 Compute Engine、Cloud Build 和 Artifact Registry API。系統會使用 Cloud Build 叫用 gke-windows-builder,並將產生的多架構容器映像檔推送至 Artifact Registry。建構工具必須使用 Compute Engine,才能建立及管理 Windows Server VM。
gcloud services enable compute.googleapis.com cloudbuild.googleapis.com \ artifactregistry.googleapis.com cloudbuild.googleapis.com
使用 Google Cloud CLI,將下列 Identity and Access Management (IAM) 角色授予 Cloud Build 服務帳戶:
設定變數:
export PROJECT=$(gcloud info --format='value(config.project)') export MEMBER=$(gcloud projects describe $PROJECT --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com
指派角色。建構工具必須具備這些角色,才能建立 Windows Server VM、將工作區複製到 Cloud Storage bucket、設定網路來建構 Docker 映像檔,以及將產生的映像檔推送至 Artifact Registry:
gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.instanceAdmin' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/iam.serviceAccountUser' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.networkViewer' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/storage.admin' gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/artifactregistry.writer'
新增名為
allow-winrm-ingress
的防火牆規則,允許 WinRM 連線至 Windows Server VM,以執行 Docker 建構作業:gcloud compute firewall-rules create allow-winrm-ingress --allow=tcp:5986 --direction=INGRESS
為專案在 Artifact Registry 中建立 Docker 存放區。如果您從未使用過 Artifact Registry 中的 Docker 存放區,請先完成 Docker 快速入門導覽課程。執行下列指令來建立存放區:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker --location=REGISTRY_REGION \ --description="Docker repository"
更改下列內容:
REPOSITORY
:名稱,例如windows-multi-arch-images
。REGISTRY_REGION
:有效的 Artifact Registry 位置。
在工作區中建立 hello.exe 二進位檔
在本教學課程中,請建立以 Go 語言撰寫的簡單「hello world」應用程式。範例應用程式的程式碼位於 GitHub。
使用下列指令,將包含本教學課程範例程式碼的存放區複製到本機電腦:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/windows/windows-multi-arch
hello.go
檔案會列印「Hello World」字詞:產生
hello.exe
二進位檔:GOOS=windows go build hello.go
工作區中會顯示 hello.exe
二進位檔。
在工作區中建立 Dockerfile 和建構檔案
在本節中,您會使用 Dockerfile
建構每個單一架構 Windows Server 映像檔,然後使用建構檔案觸發 Cloud Build。建構作業會將單一架構映像檔合併為多重架構映像檔。
Dockerfile
是文字文件,內含 Docker 建構映像檔的操作說明。gke-windows-builder 會將WINDOWS_VERSION
替換為特定 Windows Server 版本,以建構映像檔。舉例來說,建構工具會在 Windows Server 20H2 上執行docker build -t multi-arch-helloworld:latest_20h2 --build-arg WINDOWS_VERSION=20H2 .
。在含有
Dockerfile
的同一個目錄中,cloudbuild.yaml
檔案就是您的建構設定檔。將 <REPOSITORY> 和 <REGISTRY_REGION> 替換為您在上一步建立的 Artifact Registry 存放區名稱和區域。在建構階段,Cloud Build 會將$PROJECT_ID
自動取代為您的專案 ID。
建構映像檔
現在您可以建構映像檔,並查看記錄檔來確認建構作業是否成功。
如要建構映像檔,請執行下列指令:
gcloud builds submit --config=cloudbuild.yaml .
您會看到類似下列範例的記錄。記錄的最後一行顯示建構作業成功:
Creating temporary tarball archive of 2 file(s) totalling 492 bytes before compression. Uploading tarball of [.] to [gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz] Created [https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds/ec333452-1301-47e8-90e2-716aeb2f5650]. Logs are available at [https://console.cloud.google.com/cloud-build/builds/ec333452-1301-47e8-90e2-716aeb2f5650?project=840737568665]. ------------------------ REMOTE BUILD OUTPUT--------------------------------------- ... ... Created manifest list REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest sha256:3ecbbc9f5144f358f81f7c7f1a7e28f069c98423d59c40eaff72bf184af0be02 2020/09/14 11:34:25 Instance: 35.184.178.49 shut down successfully PUSH DONE ----------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS ec333452-1301-47e8-90e2-716aeb2f5650 2020-09-14T11:21:43+00:00 12M43S gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz - SUCCESS
您已使用建構設定檔建構映像檔,並將映像檔推送至 Artifact Registry 的 REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest
。
部署映像檔
如要在叢集上部署多架構 Windows 映像檔,請參閱部署 Windows Server 應用程式,瞭解如何部署映像檔。
進階 gke-windows-builder 用法
您可以在 cloudbuild.yaml
建構設定檔的 args
區段中新增標記,自訂 gke-windows-builder 的行為。本節將說明常見行為的部分標記,但這並非完整清單。如要查看 gke-windows-builder 支援的完整標記清單,請在 Linux 伺服器或 Cloud Shell 中執行下列指令:
docker run -it us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest --help
如要加快建構速度,您可以為 Windows 執行個體使用較大的機器類型:
- --machineType
- 'n1-standard-8'
您不必為 GKE 支援的所有 Windows 版本建構映像檔,而是可以使用 --versions
標記,選擇要建構的特定 Windows Server 版本:
- --versions
- '20H2,ltsc2019'
如果工作區有許多檔案,建議您將建構工具設定為透過 Cloud Storage (而非 WinRM) 複製工作區,這樣映像檔建構作業會更可靠。在專案中建立值區,例如 gs://{your project}_builder
,然後設定 --workspace-bucket
標記:
- --workspace-bucket
- '{your project}_builder'
如要在共用虛擬私有雲服務專案中執行 Windows 建構工具執行個體,請使用下列可控管執行個體網路設定的標記:
- --subnetwork-project
- 'shared-vpc-host-project'
- --subnetwork
- 'host-project-subnet-shared-with-service-project'
清除所用資源
完成教學課程後,您可以清除所建立的資源,這樣資源就不會繼續使用配額,也不會產生費用。下列各節將說明如何刪除或關閉這些資源。
刪除映像檔
如要刪除 Artifact Registry 中的 multiarch-helloworld
映像檔,請參閱「刪除映像檔」。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
如要刪除專案:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
後續步驟
探索其他 Kubernetes Engine 教學課程。
探索 Google Cloud 的參考架構、圖表和最佳做法。 歡迎瀏覽我們的雲端架構中心。