デプロイする Windows クラスタを準備する

このページでは、移行アーティファクトのカスタマイズが必要になるシナリオについて説明します。

始める前に

このドキュメントは、移行が完了していることを前提としています。

ターゲット クラスタに Docker レジストリへの読み取りアクセス権が付与されていることを確認する

移行処理の中で、Migrate to Containers は移行された VM を表す Docker イメージを Docker レジストリにアップロードします。こうした Docker イメージは、移行する VM のファイルとディレクトリを表します。

Docker レジストリには、次のものを使用できます。

詳細については、データ リポジトリの定義をご覧ください。

移行に使用していない Google Cloud プロジェクトにワークロードをデプロイする

多くの場合、環境には複数の Google Cloud プロジェクトがあります。1 つの Google Cloud プロジェクトで移行を実行した後、移行したワークロードを別のプロジェクトのクラスタにデプロイする場合は、権限が正しく構成されていることを確認する必要があります。

たとえば、プロジェクト A で移行を行います。この場合、移行したワークロードはプロジェクト A の Container Registry バケットにコピーされます。例:

gcr.io/project-a/image_name:image_tag

次に、プロジェクト B のクラスタにワークロードをデプロイします。プロジェクト B のクラスタにはプロジェクト A にイメージを pull する権限がないため、権限を正しく構成しないと、ワークロード Pod の実行に失敗します。次の形式のメッセージを含むイベントが Pod に表示されます。

Failed to pull image "gcr.io/project-a/image_name:image_tag...
pull access denied...
repository does not exist or may acquire 'docker login'...

Compute Engine API が有効になっているプロジェクトには、Compute Engine のデフォルトのサービス アカウントが作成されます。このアカウントには次のメールアドレスが設定されます。

PROJECT_NUMBER-compute@developer.gserviceaccount.com

ここで、PROJECT_NUMBER はプロジェクト B のプロジェクト番号です。

この問題を回避するには、プロジェクト B の Compute Engine のデフォルト サービス アカウントに Container Registry バケットへのアクセスに必要な権限を設定します。たとえば、次の gcloud storage コマンドを使用してアクセスを有効にします。

gcloud storage buckets add-iam-policy-binding gs://artifacts.project-a.appspot.com --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer 

処理クラスタにワークロードをデプロイする

移行に使用したのと同じクラスタ(Migrate to Containers 処理クラスタ)に、移行したワークロードをデプロイできます。ほとんどの場合、処理クラスタは移行の実施に Docker レジストリへの読み取りまたは書き込みアクセス権を必要としているため、処理クラスタで追加の構成を行う必要はありません。

ターゲット クラスタへのデプロイで Container Registry を Docker レジストリとして使用する

ターゲット クラスタが Container Registry にアクセスできるようにするには、Container Registry へのアクセスに必要な認証情報を含む Kubernetes Secret を作成します。

  1. Container Registry と Cloud Storage にアクセスするためのサービス アカウントを作成するで説明されているように、移行をデプロイするためのサービス アカウントを作成します。

    このプロセスでは、m4a-install.json という名前の JSON キーファイルをダウンロードする必要があります。

  2. Container Registry にアクセスするために必要な認証情報を含む Kubernetes Secret を作成します。

    kubectl create secret docker-registry gcr-json-key \
     --docker-server=gcr.io --docker-username=_json_key --docker-password="$(cat ~/m4a-install.json.json)" \
     --docker-email=account@project.iam.gserviceaccount.com

    ここで

    • docker-registry には、Kubernetes Secret の名前(この例では gcr-json-key)を指定します。
    • docker-server=gcr.io には、サーバーとして Container Registry を指定します。
    • docker-username=_json_key は、ユーザー名が JSON キーファイルに含まれていることを指定します。
    • docker-password は、JSON キーファイルからパスワードを使用する場合に指定します。
    • docker-email には、サービス アカウントのメールアドレスを指定します。
  3. 次のいずれかの方法で、Kubernetes Secret を設定します。

    • デフォルトの imagePullSecrets 値を次のように変更します。

      kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "gcr-json-key"}]}'
    • deployment_spec.yaml ファイルを編集して、spec.template.spec 定義に imagePullSecrets 値を追加します。WebSphere traditional を使用する場合、Deployment YAML ファイルはターゲットに応じて twas_deployment_spec.yamlliberty_deployment_spec.yaml、または openliberty_deployment_spec.yaml という名前になります。

      spec:
        containers:
        - image: gcr.io/PROJECT_ID/mycontainer-instance:v1.0.0
          name: mycontainer-instance
          ...
        volumes:
        - hostPath:
            path: /sys/fs/cgroup
            type: Directory
          name: cgroups
        imagePullSecrets:
        - name: gcr-json-key

      PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  4. secrets.yaml が存在する場合、ワークロード シークレットをデプロイします。Liberty を使用して、Tomcat ベースのワークロードと WebSphere traditional ベースのワークロード用に Secrets ファイルが作成されます。Liberty ファイルの名前は liberty-secrets.yaml です。

    kubectl apply -f secrets.yaml

Docker レジストリを使用してターゲット クラスタに基本認証でデプロイする

Docker レジストリを使用して移行イメージを保存する場合は、レジストリでユーザー名とパスワードを使用した基本認証がサポートされている必要があります。Docker レジストリへの読み取り専用接続を構成する方法は多数あるため、クラスタ プラットフォームと Docker レジストリに適した方法を使用する必要があります。

gMSA を使用するように移行後のワークロードを構成する

Windows IIS アプリケーション ワークロードは、多くの場合 Active Directory(AD)に参加しており、ドメイン ID で操作されます。これらの VM をコンテナに移行するときに、コンテナ自体はドメインに参加せず、ホストの Kubernetes クラスタノードがドメインに参加している場合があります。

移行後のコンテナをクラスタにデプロイするときに、グループ マネージド サービス アカウント(gMSA)を使用できます。gMSA を使用すると、特定のサービス アカウント ID でコンテナを実行できます。gMSA をコンテナ イメージ内の静的 ID 構成ではなく、Pod 構成の一部として Kubernetes クラスタで使用します。

Migrate to Containers は、ワークロードの変換プロセスで役立ちます。Migrate to Containers は、IIS アプリケーション プールの構成を自動的に検出し、生成された移行計画に推奨事項を追加します。その後、推奨事項を評価し、特定の環境と要件に合わせて調整します。

Migrate to Containers がアプリケーション プールの構成に gMSA は必要ないと判断した場合、元のアプリケーション プール構成が維持されます。たとえば、ApplicationPoolIdentityNetworkServiceLocalSystemLocalService などの組み込みアカウント タイプを使用している場合が該当します。

移行後の Windows コンテナで gMSA をサポートするには、次のことを行う必要があります。

  1. 移行計画を編集して必要なプロパティを設定し、gMSA を使用するように移行後のコンテナを構成する。

  2. デプロイされたコンテナをホストするターゲット クラスタを構成する

gMSA をサポートするようにターゲット クラスタを構成する

gMSA をコンテナ イメージ内の静的 ID 構成ではなく、Pod 構成の一部として Kubernetes クラスタで使用します。

移行後の Windows コンテナをホストするクラスタで gMSA をサポートするには、次の操作が完了している必要があります。

  1. VM が自動的にドメインに参加するように Active Directory を構成する

  2. Windows Pod とコンテナに gMSA を構成する

詳しくは以下をご覧ください。

SSL 証明書を Kubernetes Secret として保存するときにコンテナをデプロイする

外部からデプロイ済みコンテナへのアクセスを保護するため、HTTPS フロントエンドとして Cloud Load BalancingIngress、または Cloud Service Mesh を使用することをおすすめします。この方法では、クラスタ内の証明書を使用せずに外部通信を保護できます。詳細については、移行計画のカスタマイズをご覧ください。

SSL(Secure Sockets Layer)証明書を Kubernetes Secret として保存し、実行時にコンテナにマウントすることもできます。

Kubernetes Secret を使用するには:

  1. 証明書とパスワードを含む PFX ファイルを作成します。

  2. サイトのアクセスを定義する構成 YAML ファイルを作成します。

    sites:
     - sitename: "sitename"
       sslport: 443
       pfxpath: c:\sslconfig\pfx
       password: "password"
       thumbprint: "3e858d0551fc0536f52d411dad92b680a4fad4da"

    ここで

    • sitename には、SSL を使用するように構成されたサイトの名前を指定します。sites プロパティには複数の sitename エントリを指定できます。

    • sslport には、SSL 接続をリッスンするポートを指定します(通常 443)。

    • pfxpath には、PFX ファイルへのパスを指定します。これは、Pod のデプロイの volumeMounts の一部として構成します。

    • password には、PFX ファイルのパスワードを指定します。

    • thumbprint には、PowerShell コマンドで取得できる PFX ファイルの SHA-1 サムプリントを指定します。

      Get-PfxCertificate -FilePath "path to pfx"

      これは、Windows 証明書マネージャーでも確認できます。

  3. Kubernetes Secret を作成します。

    kubectl create secret generic secret-name --from-file=pfx=path-to-pfx --from-file=config=path-to-config
  4. イメージのデプロイ時にボリュームとボリュームのマウントを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
     name: iis-pod
     labels:
       app: iis-server-simple
     spec:
       nodeSelector:
         kubernetes.io/os: windows
       containers:
       - name: iis-server
         image: your-image-url
         volumeMounts:
         - name: ssl-secret
           mountPath: c:\sslconfig
         env:
         - name: M4A_CERT_YAML
           value: c:\sslconfig\config
       volumes:
       - name: ssl-secret
         secret:
           secretName: secret-name

    ここで

    • mountPath は、手順 2 で作成した構成ファイルの pfxpath で指定したパスと同じです。
    • M4A_CERT_YAML は、手順 2 で作成した構成 YAML ファイルのフルパスが設定された環境変数です。
    • secret-name は、手順 3 で作成した Secret の名前です。

SSL を構成する

SSL 証明書の秘密鍵はコンテナ イメージ内に誰でもアクセスできるため、コンテナ イメージ内に保存しないことをおすすめします。Migrate to Containers には Windows 用の SSL を処理する方法がいくつか用意されています。

自動生成された自己署名証明書を使用する

デフォルトでは、HTTPS バインディングの Windows コンテナに自動生成された自己署名証明書が割り当てられます。この証明書は Docker コンテナの初期化で生成されます。この構成は、移行したワークロードのテストでは使用できますが、本番環境では使用できません。コンテナが実行されるたびに証明書が自己署名され、再生成されます。

推奨の方法 - Cloud Load Balancing、Ingress、または Cloud Service Mesh を使用する

HTTP を使用するように移行計画のバインディングをカスタマイズできます。これにより、HTTPS フロントエンドとして Cloud Load BalancingIngress、または Cloud Service Mesh を使用して、外部アクセスを保護できます。この方法では、クラスタ内の証明書を使用せずに外部通信を保護できます。

  • バインディングをカスタマイズするには、移行を表す移行計画の site 定義を編集して、protocolhttp に設定します。

    sites:
      site:
      - applications:
        - path: /
          virtualdirectories:
            - path: /
              physicalpath: '%SystemDrive%\inetpub\wwwroot'
              bindings:
              - port: 8080
                protocol: http
              name: Default Web Site
    

これにより、HTTPS フロントエンドから Windows ワークロードの HTTP パスとポートにリクエストを転送できます。

SSL 証明書を Kubernetes Secret として保存する

外部アクセスを保護するため、HTTPS フロントエンドとして Cloud Load BalancingIngress、または Cloud Service Mesh を使用することをおすすめします。ただし、SSL 証明書を Kubernetes Secret として保存し、実行時にコンテナにマウントすることもできます。

Kubernetes Secret として保存されている SSL 証明書を使用する場合は、コンテナのデプロイ イメージを編集する必要があります。詳細については、SSL 証明書を Kubernetes Secret として保存するときにコンテナをデプロイするをご覧ください。

Cloud Logging へのロギングを構成する

Migrate to Containers は、LogMonitor ツールを使用して Windows コンテナからログを抽出し、GKE クラスタに転送します。これらのログは自動的に Cloud Logging に転送されます。Cloud Logging はコンテナをモニタリングするためのツールセットを備えています。

Migrate to Containers のデフォルトでは、IIS ロギングで IIS ログをモニタリングし、アプリケーションまたはシステム イベントのログを Cloud Logging に転送できます。

ロギングを構成する

生成された artifacts.zip ファイルを展開すると、m4a ディレクトリなどの複数のディレクトリが作成されます。ディレクトリには、すべてのイメージのフォルダが含まれます。m4a ディレクトリにある LogMonitorConfig.json ファイルを編集して、ロギングを制御できます。

LogMonitorConfig.json の編集の詳細については、構成ファイルの編集をご覧ください。

ACL を設定する

一部の IIS アプリケーションでは、アプリケーションが正しく機能するように、ファイルとフォルダに特定のアクセス制御リスト(ACL)の権限を設定する必要があります。Migrate to Containers は、移行されたすべての IIS アプリケーションを自動的にスキャンします。IIS アカウント(IUSR アカウントと IIS_IUSRS グループ)に適用される移行元 VM で定義されている特定の権限を追加し、生成されたコンテナ イメージにコピーされたファイルとディレクトリにその権限を適用します。

Windows コンテナ イメージでは Docker COPY コマンドの一部として ACL を設定できないため、ACL を set_acls.bat というスクリプトに設定します。Migrate to Containers は、特定の Windows アプリケーション用に生成されたイメージのディレクトリに set_acls.bat を自動的に作成します。Migrate to Containers は、docker build コマンドを実行すると set_acls.bat を呼び出します。

set_acls.bat を編集してカスタム権限を追加または削除するか、特定の IIS ユーザーに関連しないため Migrate to Containers で検出されなかった権限を編集します。

このスクリプトでは、Windows 組み込みの icacls ツールを使用して権限を設定します。

.NET グローバル アセンブリ キャッシュについて

Migrate to Containers は、ソースマシンで公式イメージの一部として使用できない .NET リソース用のソースイメージ .NET グローバル アセンブリ キャッシュ(GAC)をスキャンします。検出された DLL は、Docker コンテキストにコピーされ、ユーティリティ スクリプト install_gac.ps1 によってターゲット イメージのビルドの一部としてインストールされます。

すべての .NET アセンブリは、m4a\gac ディレクトリの Docker コンテキストにコピーされます。アセンブリをイメージから削除するには、それらを m4a\gac ディレクトリから削除します。

COM オブジェクト DLL の登録

COM オブジェクトを公開する DLL が自動的にスキャンされ、登録されます。抽出段階で、コピーされたファイルがスキャンされ、COM オブジェクトとして登録されている DLL がコンテナに登録されます。

このプロセスは、ユーザーによる入力なしで実行されます。ただし、コピーする DLL を追加すると、このプロセスに影響を与えることができます。必要に応じて、これらの DLL が順番にチェックされて登録されます。

次のステップ