Windows Server アプリケーションのデプロイ


このページでは、ステートレスの Windows Server アプリケーションを Google Kubernetes Engine(GKE)クラスタにデプロイする方法について説明します。クラスタには、一般公開または限定公開のいずれかを指定できます。また、ステートフル Windows アプリケーションをデプロイする方法についてもご確認いただけます。

始める前に

作業を始める前に、次のことを確認してください。

  • Artifact Registry API と Google Kubernetes Engine API を有効にします。
  • API を有効にする
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得します。

Windows Server アプリケーションをクラスタにデプロイする

Windows Server アプリケーションを GKE パブリック クラスタにデプロイするには、次のタスクを行う必要があります。

  1. クラスタを作成する。
  2. Deployment マニフェスト ファイルを作成する。
  3. Deployment を作成して公開する。
  4. Pod が動作していることを確認する。

クラスタの作成

Windows Server ノードプールを使用する GKE クラスタをすでにお持ちの場合は、次のステップに進みます。お持ちでない場合は、Windows Server ノードプールを使用してクラスタを作成します

Deployment マニフェスト ファイルを作成する

Windows Server ノードは Key-Value ペア node.kubernetes.io/os=windows:NoScheduletaint が設定されています。

これにより、GKE スケジューラが Windows Server ノードで Linux コンテナを実行しようとしなくなります。Windows Server ノード上の Windows Server コンテナをスケジュールするには、マニフェスト ファイルに次のノードセレクタを含める必要があります。

nodeSelector:
 kubernetes.io/os: windows

クラスタで実行されるアドミッション Webhook は、この Windows ノードセレクタに新しいワークロードがあるかチェックします。新しいワークロードが発見された場合、次の許容値をワークロードに適用して、taint が設定された Windows Server ノードで動作できるようにします。

tolerations:
- effect: NoSchedule
  key: node.kubernetes.io/os
  operator: Equal
  value: windows

場合によっては、この許容値をマニフェスト ファイルに明示的に含める必要があります。たとえば、クラスタ内のすべての Linux ノードと Windows Server ノードで実行するマルチ アーキテクチャ コンテナ イメージを含む DaemonSet をデプロイする場合、マニフェスト ファイルに Windows ノードセレクタは含まれません。Windows taint の許容値を明示的に含める必要があります。

マニフェスト ファイルの例

次のサンプル Deployment ファイル(iis.yaml)は、Microsoft の IIS イメージを単一の Pod にデプロイします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis
  labels:
    app: iis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iis
  template:
    metadata:
      labels:
        app: iis
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: iis-server
        image: mcr.microsoft.com/windows/servercore/iis
        ports:
        - containerPort: 80

このファイルは、すべてのワークロードが同じ Windows Server ノードイメージ タイプとバージョンを使用するクラスタ向けです。混在ノードイメージの操作方法の詳細については、混在ノードイメージを使用するをご覧ください。

Deployment を作成して公開する

前のステップで作成した Deployment ファイルを、外部ロードバランサの Deployment を使用して Kubernetes Service として作成して公開します。

  1. Deployment リソースを作成するには、次のコマンドを実行します。

    kubectl apply -f iis.yaml
    
  2. Deployment を外部ロードバランサとして公開するには、次のコマンドを実行します。

    kubectl expose deployment iis \
        --type=LoadBalancer \
        --name=iis
    

Pod が実行されていることを確認する

Pod を検証して、機能していることを確認します。

  1. kubectl を使用して、Pod のステータスを確認します。

    kubectl get pods
    
  2. 返された出力で、Pod のステータスが Running になるまで待ちます。

    NAME                   READY     STATUS    RESTARTS   AGE
    iis-5c997657fb-w95dl   1/1       Running   0          28s
    
  3. サービスのステータスを取得し、EXTERNAL-IP フィールドに値が入力されるまで待ちます。

    kubectl get service iis
    

    次の出力が表示されます。

    NAME   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    iis    LoadBalancer   10.44.2.112   external-ip    80:32233/TCP   17s
    

これで、ブラウザを使用して http://EXTERNAL_IP を開き、IIS ウェブページを表示できます。

Windows Server アプリケーションを限定公開クラスタにデプロイする

このセクションでは、Windows Server コンテナ アプリケーションを限定公開クラスタにデプロイする方法を説明します。

Windows Server コンテナ イメージには複数のレイヤがあり、基本レイヤは Microsoft が提供しています。基本レイヤは、Linux Docker イメージレイヤのようにイメージに埋め込まれるのではなく、外部レイヤとして保存されます。Windows Server コンテナ イメージを最初に pull するときに、通常、Microsoft サーバーから基本レイヤをダウンロードする必要があります。限定公開クラスタのノードはインターネットに接続されないため、Windows Server の基本コンテナレイヤを Microsoft サーバーから直接 pull することはできません。

限定公開クラスタを使用するには、非分散レイヤを限定公開レジストリに push できるように Docker デーモンを構成します。詳細については、Docker の GitHub ページの Allow push of non-distributable artifacts をご覧ください。

Windows Server アプリケーションを限定公開クラスタにデプロイするには:

  1. Windows Server ノードを含めた限定公開クラスタを作成する。
  2. Windows Server アプリケーションの Docker イメージをビルドする。
  3. アプリケーションを限定公開クラスタにデプロイする。
  4. Pod が動作していることを確認する。

限定公開クラスタを作成する

Windows Server ノードを含めたクラスタの作成限定公開クラスタの作成の手順を行い、Windows ノードプールを作成して限定公開クラスタに追加します。

Windows Server アプリケーションの Docker イメージをビルドする

  1. Docker イメージをビルドするには、アプリケーション コンテナを実行する Windows Server バージョン(Windows Server 2019、Windows Server バージョン 20H2 など)で Compute Engine インスタンスを起動します。また、インターネットに接続されていることを確認します。

  2. Compute Engine インスタンスで、Docker デーモン config に移動します。

    cat C:\ProgramData\docker\config\daemon.json
    
  3. 以下の行を追加して、外部レイヤを限定公開レジストリに push できるように Docker daemon.json ファイルを構成します。

    {
      "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"]
    }
    

    この例では、REGISTRY_REGION-docker.pkg.dev は、イメージがホストされる Artifact Registry を意味します。

  4. Docker デーモンを再起動します。

    Restart-Service docker
    
  5. Artifact Registry で Docker リポジトリを作成します

  6. アプリケーションの Docker イメージをビルドしてタグを付けします。

    cd C:\my-app
    
    docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
    

    このコマンドを実行すると、Docker は現在のディレクトリにある Dockerfile を使用してイメージをビルドし、us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2 などの名前を使用してタグ付けします。

  7. アプリケーションの Docker イメージをプロジェクトの Artifact Registry リポジトリに push します。allow-nondistributable-artifacts 構成を設定すると、Windows 基本レイヤが限定公開レジストリに push されます。

    docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
    

Deployment マニフェスト ファイルを作成する

my-app.yaml という名前のサンプル Deployment マニフェスト ファイルを以下に示します。この例のイメージは、前のステップ(REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2)で push したイメージです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: my-server
        image: REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
  1. 作成したクラスタで kubectl が動作するようにするには、get-credentials コマンドを使用します。

    gcloud container clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME は、作成した限定公開クラスタの名前に置き換えます。

  2. my-app.yaml ファイルで指定されているアプリケーションを限定公開クラスタにデプロイします。

    kubectl apply -f my-app.yaml
    

Pod が実行されていることを確認する

すべての Pod を一覧表示して、アプリケーションが正しく実行されていることを確認します。

kubectl get pods

次の出力のように、Pod のステータスが Running と表示されます。

NAME                     READY   STATUS    RESTARTS   AGE
my-app-c95fc5596-c9zcb   1/1     Running   0          5m

混在ノードイメージを使用する

クラスタには、複数の Windows Server タイプと Windows Server バージョンのノードプールを含めることができます。また、Windows Server と Linux のワークロードを組み合わせることもできます。以下のセクションでは、これらのタイプのクラスタを使用するようにワークロードを構成する方法について詳しく説明します。

さまざまな Windows Server ノードイメージ タイプでワークロードを使用する

さまざまな Windows Server イメージタイプを使用して、ノードプールをクラスタに追加できます。Windows Server タイプが混在するクラスタでは、互換性のない Windows Server ノードに Windows Server コンテナがスケジュールされていないことを確認する必要があります。

Windows Server LTSC ノードプールと Windows Server SAC ノードプールがある場合、両方のワークロードに gke-os-distribution ノードラベルを追加します。

Windows Server LTSC ワークロードのマニフェスト ファイルに、次の nodeSelector を追加します。

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_ltsc

Windows Server SAC ワークロードのマニフェスト ファイルに、次の nodeSelector を追加します。

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_sac

このラベルを追加すると、LTSC コンテナ イメージが互換性のない SAC ノードにスケジュールされなくなり、その逆も同様です。

さまざまな Windows Server LTSC OS バージョンでワークロードを使用する

Windows Server ノードは、LTSC2022 と LTSC2019 OS イメージの両方をサポートしています。使用する Windows OS のバージョン(LTSC2022)は、nodeSelector の Key-Value ペア cloud.google.com/gke-windows-os-version=2022 で指定できます。

このノードラベルにより、GKE スケジューラは LTSC2022 または LTSC2019 ワークロードを実行するために、適切な Windows Server ノードを選択します。Windows Server ノードはどちらもイメージタイプ windows_ltsc_containerd に属します。ノードラベルの値は 2022 または 2019 です。ノードラベルが指定されていない場合、LTSC2019 または LTSC2022 の両方のノードを使用してコンテナをスケジュールできます。Windows Server コンテナを Windows Server LTSC2022 ノードでのみスケジュールするには、マニフェスト ファイルに次のノードセレクタを含める必要があります。

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_ltsc
   cloud.google.com/gke-windows-os-version: 2022

さまざまな Windows Server バージョンでワークロードを使用する

複数の異なる LTSC または SAC バージョンで Windows Server ノードプールを実行する必要がある場合は、クラスタで使用するすべての Windows Server バージョンで実行できるマルチアーキテクチャ イメージとしてコンテナを構築することをおすすめします。gke-os-distribution ノードラベルは、互換性のないノードにワークロードがスケジュールされるのを防ぐのに十分ではありません。

クラスタで Linux と Windows Server のワークロードを使用する

次のノードセレクタを Linux ワークロードに追加して、常に Linux ノードにスケジュールされるようにします。

nodeSelector:
   kubernetes.io/os: linux

これにより、NoSchedule taint が誤って Windows Server ノードから削除された場合に、Linux ワークロードが Windows Server ノードにスケジュールされるのを防ぐことができます。