Windows Server マルチアーキテクチャ イメージのビルド


このチュートリアルでは、複数の Windows Server バージョンをターゲットとするイメージをビルドする際のバージョニングの複雑度を管理する方法について説明します。Windows Server コンテナには、複数の Windows Server ホスト バージョンでコンテナが実行されることを回避するためのバージョンの互換性に関する要件が存在します。ただし、Windows Server の Docker では、複数の Windows Server バージョンで実行できるマルチアーキテクチャ(またはマルチプラットフォーム)コンテナ イメージがサポートされています。

マルチアーキテクチャ イメージを使用することで、イメージを再ビルドして Pod 仕様を変更することなく、Google Kubernetes Engine(GKE)Windows Server のノードプールを任意の Windows Server バージョンにアップグレードできます。次に例を示します。

  • GKE バージョン 1.15 は Windows Server 1809 をサポートしています
  • GKE バージョン 1.16 は Windows Server 1909 をサポートしています

ある GKE バージョンからそれ以降のバージョンに自動的にアップグレードするには、Windows ワークロードのマルチアーキテクチャ イメージをビルドする必要があります。マルチアーキテクチャ イメージをビルドするには、Windows Server のバージョンごとにイメージをビルドしてから、Windows Server の各バージョンに対してそれらのイメージを参照するマニフェストを作成する必要があります。イメージの作成とビルドのプロセスを完全に制御する必要がある場合は、イメージを手動で作成できます。または、Cloud Build を使用して Windows Server マルチアーキテクチャ イメージを自動的にビルドすることもできます。

目標

このチュートリアルでは、Windows Server マルチアーキテクチャ イメージを手動で作成する、または Cloud Build を使用して作成する方法について説明します。

  • イメージを手動でビルドします。

    • Long-Term Servicing Channel(LTSC)や Semi-Annual Channel(SAC)など、Windows Server のさまざまなバージョンやタイプで 2 つの Docker イメージを作成します。
    • Windows Server VM を作成します。
    • マニフェストを作成し、レジストリに push します。
  • Cloud Build を使用してイメージをビルドします。

    • プロジェクトを作成し、API を有効にして、権限を付与することによって、環境を準備します。
    • アプリケーション、Dockerfile、ビルドファイルを作成します。
    • コマンドを実行して、イメージをビルドします。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • Cloud Build

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

作業を始める前に、次のタスクを完了済みであることを確認してください。

  1. Cloud SDK をインストールして、gcloud コマンドを実行します。
  2. Docker をインストールしてコンテナをビルドします。
  3. Go をインストールして Windows Server バイナリをビルドします。
  4. Container Registry(gcr.io)を使用してイメージを保存している場合は、イメージを push および pull するように設定されていることを確認します。

マルチアーキテクチャ イメージの手動ビルド

マルチアーキテクチャ イメージを手動でビルドすると、必要な Windows Server バージョンが含まれるイメージを柔軟にビルドできます。マルチアーキテクチャ イメージを手動でビルドする手順は次のとおりです。

  1. LTSC 2019 Docker シングル アーキテクチャ イメージを作成します。Docker イメージ作成の詳細については、Windows Server アプリケーションのデプロイをご覧ください。例: gcr.io/my-project/foo:1.0-2019
  2. SAC 1909 Docker シングル アーキテクチャ イメージを作成します。例:gcr.io/my-project/foo:1.0-1909
  3. Windows Server VM を作成します(バージョン 1909 など)。Windows Server VM の使用に関するクイックスタートをご覧ください。
  4. RDP を使用して VM に接続します。
  5. 次の手順で、PowerShell ウィンドウを開いてコマンドを実行します。
  6. docker manifest 試験運用版機能を有効にします。Docker マニフェストは、レジストリに push するイメージのリストです。

    PS C:\> $env:DOCKER_CLI_EXPERIMENTAL = 'enabled'
    
  7. マルチアーキテクチャ マニフェストを作成します。

    docker manifest create gcr.io/my-project/foo:1.0 gcr.io/my-project/foo:1.0-2019 gcr.io/my-project/foo:1.0-1909
    
  8. 新しく作成したマルチアーキテクチャ イメージのマニフェストを Container Registry に push します。

     docker manifest push gcr.io/my-project/foo:1.0
    
  9. マルチアーキテクチャ イメージが正常にビルドされて push されたことを確認するには、gcr.io/my-project/foo に移動し、対象のイメージをクリックします。3 つのイメージが表示されます。

    • foo:1.0-2019
    • foo:1.0-1909
    • foo:1.0

Pod 仕様でマルチアーキテクチャ イメージ gcr.io/my-project/foo:1.0 を参照できるようになりました。これにより、GKE Windows ノードプールの自動アップグレードを安全に使用できます。

Cloud Build gke-windows-builder を使用したマルチアーキテクチャ イメージのビルド

手動のビルドステップを簡単にするために、OSS windows-builder をベースとした gke-windows-builder を使用できます。Cloud Build で gke-windows-builder を使用して、Windows Server マルチアーキテクチャ イメージを自動的にビルドできます。リリースされた際にサポート対象の新しい Windows SAC と LTSC が含まれるように、GKE がビルダーを更新します。このビルダーを使用するもう 1 つの利点は、イメージをビルドするために Powershell を使用して独自の Windows VM を作成する必要がないことです。Windows VM は、Cloud Build 内でコマンドを実行する Docker コンテナに置き換えられます。

ビルダーの動作を理解できるように、この例の手順に沿って「hello world」のマルチアーキテクチャ イメージをビルドします。次の手順は、Linux サーバーまたは Windows サーバーで行えます。

環境の準備

環境を準備するには、次の手順を行います。

  1. 作業用マシンにワークスペース ディレクトリを作成します(例: ~/gke-windows-builder/hello-world)。
  2. このチュートリアル用のプロジェクトを作成するか選択します。
  3. プロジェクトに対して課金が有効になっていることを確認します。
  4. プロジェクトに対して Cloud Build API が有効になっていることを確認します。

    Cloud Build API を有効にする

  5. gcloud コマンドライン ツールを使用して、Cloud Build サービス アカウントに次の Identity and Access Management(IAM)ロールを付与します。

    1. この API を有効にして、gke-windows-builder で Windows Server VM を作成、管理できるようにします。

      gcloud services enable compute.googleapis.com
      
    2. 変数を設定します。

      export PROJECT=$(gcloud info --format='value(config.project)')
      export MEMBER=$(gcloud projects describe $PROJECT --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com
      
    3. ロールを割り当てます。ビルダーが Windows Server VM を作成し、ワークスペースを Cloud Storage バケットにコピーして、Docker イメージをビルドできるようにネットワークを構成するには、以下のロールが必要です。

      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'
      
  6. allow-winrm-ingress という名前のファイアウォール ルールを追加して、WinRM が Windows Server VM に接続して Docker ビルドを実行することを許可します。

    gcloud compute firewall-rules create allow-winrm-ingress --allow=tcp:5986 --direction=INGRESS
    

ワークスペースでの hello.exe バイナリの作成

このチュートリアルでは、Go で記述されたシンプルな「hello world」アプリケーションを作成します。サンプルアプリのコードは GitHub にに掲載されています。

  1. 次のコマンドを使用して、このチュートリアルのサンプルコードが含まれるリポジトリのクローンをローカルマシンに作成します。

     git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
     cd kubernetes-engine-samples/windows-multi-arch
    
  2. hello.go ファイルに「Hello World」というテキストが出力されます。

    // Copyright 2020 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     http://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    
    package main
    import "fmt"
    func main() {
        fmt.Println("Hello World!")
    }
  3. hello.exe バイナリを生成します。

    GOOS=windows go build hello.go
    

ワークスペースに hello.exe バイナリが表示されます。

Dockerfile を作成し、ワークスペースでファイルをビルドする

このセクションでは、Dockerfile を使用してシングル アーキテクチャの Windows Server の各イメージをビルドし、ビルドファイルを使用して Cloud Build をトリガーします。このビルドでは、シングル アーキテクチャ イメージがマルチアーキテクチャのイメージに統合されます。

  1. Dockerfile は、Docker がイメージを作成するための指示が記載されたテキスト ドキュメントです。gke-windows-builder は、WINDOWS_VERSION をイメージのビルド対象である Windows Server バージョンに置き換えます。たとえば、Windows Server 1909 で docker build -t multi-arch-helloworld:latest_1909 --build-arg WINDOWS_VERSION=1909 . を実行します。

    # Copyright 2020 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ARG WINDOWS_VERSION=
    FROM mcr.microsoft.com/windows/servercore:${WINDOWS_VERSION}
    COPY hello.exe /hello.exe
    USER ContainerUser
    ENTRYPOINT ["hello.exe"]
    
  2. Dockerfile が含まれているのと同じディレクトリ内の cloudbuild.yaml ファイルはビルド構成ファイルです。ビルド時に、Cloud Build が自動的に $PROJECT_ID をプロジェクト ID に置き換えます。

    # Copyright 2020 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    timeout: 3600s
    steps:
    - name: 'gcr.io/gke-release/gke-windows-builder:release-2.6.1-gke.0'
      args:
      - --container-image-name
      - 'gcr.io/$PROJECT_ID/multiarch-helloworld:latest'
    

イメージのビルド

これで、イメージをビルドしてログを表示し、ビルドが成功したことを確認できるようになりました。

  1. イメージをビルドするには、次のコマンドを実行します。

    gcloud builds submit --config=cloudbuild.yaml .
    
  2. ログは、次の例のように表示されます。ログの最後の行に、ビルドが成功したことが示されます。

    Creating temporary tarball archive of 2 file(s) totalling 492 bytes before compression.
    Uploading tarball of [.] to [gs://{your project}_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz]
    Created [https://cloudbuild.googleapis.com/v1/projects/{your project}/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 gcr.io/{your project}/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://{your project}_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz  -                 SUCCESS
    

ビルド構成ファイルを使用してイメージをビルドし、ビルドしたイメージを gcr.io/{your project}/multiarch-helloworld:latest で Container Registry に push しました。

イメージのデプロイ

マルチアーキテクチャ Windows イメージをクラスタにデプロイするには、Windows Server アプリケーションのデプロイをご覧になり、イメージをデプロイする方法を確認してください。

gke-windows-builder の高度な使用方法

gke-windows-builder がサポートするフラグを確認するには、Linux サーバーまたは Cloud Shell で次のコマンドを実行します。

docker run -it gcr.io/gke-release/gke-windows-builder:release-2.6.1-gke.0 --help

gke-windows-builder の動作をカスタマイズするには、これらのフラグを cloudbuild.yamlargs セクションに追加します。たとえば、ビルドを高速化するには、Windows インスタンスのより大きなマシンタイプを使用できます。

  - --machineType
  - 'n1-standard-8'

GKE がサポートするすべての Windows バージョン用にイメージをビルドする代わりに、--versions フラグを使用して、ビルド対象の Windows Server の特定のバージョンを選択できます。

  - --versions
  - '1909,ltsc2019'

ワークスペースに多くのファイルがある場合、WinRM ではなく Cloud Storage を介してワークスペースをコピーするようにビルダーを構成すると、イメージビルドの信頼性が向上します。プロジェクトで gs://{your project}_builder などのバケットを作成してから、--workspace-bucket フラグを設定します。

  - --workspace-bucket
  - '{your project}_builder'

共有 VPC サービス プロジェクトで Windows ビルダー インスタンスを実行するには、次のフラグを使用してインスタンスのネットワーク設定を制御します。

  - --subnetwork-project
  - 'shared-vpc-host-project'
  - --subnetwork
  - 'host-project-subnet-shared-with-service-project'

クリーンアップ

チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。

イメージの削除

イメージを削除するには:

  1. Cloud Console の [Container Registry] ページに移動します。

    [Container Registry] に移動

  2. [イメージ] ページに移動します。

  3. [multiarch-helloworld] をクリックします。

  4. すべてのイメージを選択します。

  5. [削除] ボタンをクリックします。

  6. プロンプト ウィンドウで [削除] をクリックします。

このチュートリアルで作成したイメージの削除は完了です。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ