Linux VM の移行計画をカスタマイズする

移行計画を実行する前に、計画を確認して、必要に応じてカスタマイズしてください。移行計画の詳細は、ソース VM からワークロード コンテナ アーティファクトを抽出する際や、コンテナ イメージを本番環境のクラスタなどの他のクラスタにデプロイする際に使用する Kubernetes Deployment ファイルを生成するために使用されます。

このセクションでは、移行計画の内容と、移行を実行してデプロイ アーティファクトを生成する前に考慮すべきカスタマイズの種類について説明します。

始める前に

このトピックでは、すでに移行を作成し、移行計画ファイルが作成されていることを前提としています。

移行計画を編集する

移行計画を編集するには、migctl ツールまたは Google Cloud Console を使用します。

migctl

移行計画をダウンロードしてから編集する必要があります。

  1. 移行計画をダウンロードします。Linux ワークロードの移行計画は、LinuxMigrationCommonSpec で表されます。

    migctl migration get my-migration
    
  2. ダウンロードした移行計画 my-migration.yaml をテキスト エディタで編集します。

  3. 編集が完了したら、修正した移行計画を保存してアップロードします。

    migctl migration update my-migration --main-config my-migration.yaml
    
  4. さらに編集が必要な場合は、上記の手順を繰り返します。

Console

YAML エディタを使用して Google Cloud コンソールで移行プランを編集します。Linux ワークロードの移行計画は、LinuxMigrationCommonSpec CRD で表されます。

  1. Google Cloud コンソールで [Migrate to Containers] ページを開きます。

    [Migrate to Containers] ページに移動

  2. [移行] タブをクリックして、使用可能な移行を含むテーブルを表示します。

  3. 目的の移行の行で移行の名前を選択し、[詳細] タブを開きます。

  4. [YAML] タブを選択します。

  5. 必要に応じて、移行計画を編集します。

  6. 編集が完了したら、次のいずれかの操作を行います。

    1. 移行計画を保存する。その後、移行アーティファクトを手動で生成して移行する必要があります。移行の実行の手順を行います。

    2. アーティファクトを保存して生成する。編集内容を使用して、移行アーティファクトを生成し、移行を実施します。このプロセスは、移行の実行で説明する方法と同じです。その後、移行のモニタリングの説明に従って移行をモニタリングします。

CRD

移行計画をダウンロードして編集し、適用する必要があります。Linux ワークロードの移行計画は、LinuxMigrationCommonSpec CRD で表されます。

  1. AppXGenerateArtifactsFlow の名前を取得します。

    kubectl get migrations.anthos-migrate.cloud.google.com -n v2k-system -o jsonpath={.status.migrationPlanRef.name} my-migration

    命名パターンは appx-generateartifactsflow-id の形式で返されます。

  2. 移行計画を名前で取得し、my-plan.yaml という名前のファイルに書き込みます。

    kubectl -n v2k-system get appxgenerateartifactsflows.anthos-migrate.cloud.google.com -o jsonpath={.spec.appXGenerateArtifactsConfig} appx-generateartifactsflow-id > my-plan.yaml
  3. 必要に応じて、移行計画を編集します。

  4. ファイルを適用します。

    kubectl patch appxgenerateartifactsflows.anthos-migrate.cloud.google.com --type merge -n v2k-system --patch '{"spec": {"appXGenerateArtifactsConfig": '"$(jq -n --rawfile plan my-plan.yaml '$plan')"'}}' appx-generateartifactsflow-id

移行から除外するコンテンツを指定する

デフォルトでは、Migrate to Containers は、GKE のコンテキストに関係のない一般的な VM コンテンツを除外します。このフィルタはカスタマイズできます。

filters フィールド値には、移行から除外する必要があるパスが一覧表示されます。このパスは、コンテナ イメージの一部にはなりません。フィールドの値には、転送するファイルとスキップするファイルを指定する rsync フィルタルールが一覧表示されます。各パスとファイルの前にマイナス記号が付いていると、リスト内のアイテムを移行から除外する必要があることを示しています。リストは YAML の行の順序で処理され、除外または登録はその順序で評価されます。

詳しくは、rsync のマニュアル ページの「INCLUDE/EXCLUDE PATTERN RULES」セクションを参照してください。

サイズが大きすぎて Docker イメージに含めることができないファイルは、YAML ファイルに一覧表示されます。これにより、検討対象となるファイルが 1 GB を超える場合はフラグが設定されます。Docker イメージのサイズが大きすぎるか、15 GB を超えると、移行中に障害が発生する可能性があります。

YAML リストを編集して、パスを追加または削除できます。以下の YAML の例をご覧ください。これには、除外の例と、大きなファイルやスパース ファイルの通知が含まれています。インラインのガイダンスに沿って、次のいずれかを行います。

  • 検出されたフォルダを除外するには、コメントを解除してグローバル フィルタのセクションに配置します。
  • 検出されたフォルダを永続ボリュームに移動するには、コメントを解除してデータフォルダ セクションに配置します。

同様に、検出されたスパース ファイルも除外または移動することをおすすめします。

  global:
    # Files and directories to exclude from the migration, in rsync format.
    filters:
      - "- *.swp"
      - "- /etc/fstab"
      - "- /boot/"
      - "- /tmp/*"
      - "- /var/log/*.log*"
      - "- /var/log/*/*.log*"
      - "- /var/cache/*"

    ## The data folders below are too large to be included in the docker image.
    ## Consider uncommenting and placing them under either the global filters
    ## or the data folder section.
      # - '- /a' # (1.8GB, last access 2022-02-02 10:50:30, last modified 2020-02-02 10:50:30)
      # - '- /a/c' # (1.8GB, last access 2022-02-02 10:50:30, last modified 2020-02-02 10:50:30)

    ## Sparse files will fail the run of a docker image. Consider excluding the below
    ## detected files and any other sparse files by uncommenting and placing them in
    ## the global filters section, or export them to a persistent volume by specifying
    ## them in the data folder section.
      # - '- /a/b' # (1.8GB, last access 2022-02-02 10:50:30, last modified 2020-02-02 10:50:30)
      # - '- /a/d' # (1.8GB, last access 2022-02-02 10:50:30, last modified 2020-02-02 10:50:30)

コンテナ イメージの名前を設定する

image フィールド値は、移行した VM から作成された 2 つのイメージの名前と場所を定義します。他の名前が望ましい場合は、これらの値を変更できます。

移行中、Migrate to Containers は移行で使用するために、移行ワークロードを表すファイルとディレクトリを(デフォルトで)Container Registry にコピーします。移行プロセスでは、抽出されたワークロードを GKE で実行可能なイメージに適合させます。

Migrate to Containers は、(base パスにある)元の VM のファイルとディレクトリをレジストリに保存します。このイメージは、抽出されたワークロード ファイルを含む実行不可能なベースレイヤとして機能し、Migrate to Containers ランタイム ソフトウェア レイヤと一緒に、実行可能なコンテナ イメージをビルドします。

別々のレイヤを使用すると、必要に応じてベースレイヤと Migrate to Containers ソフトウェア レイヤを個別に更新できるので、後のコンテナ イメージの更新が簡単になります。

このイメージは実行できませんが、Migrate to Containers をアップグレードすると、Migrate to Containers が元のコンテナを更新できるようになります。

basename のフィールド値は、レジストリで作成されるイメージを指定します。

  • base -- ソース プラットフォームからコピーした VM ファイルとディレクトリから作成されたイメージの名前。このイメージは GKE でのデプロイに対応していないため、GKE では実行できません。
  • name -- コンテナに使用される実行可能イメージの名前。このイメージには、ソース VM のコンテンツと、Migrate to Containers ランタイムの両方が含まれているため、実行可能です。
        image:
          # Review and set the name for extracted non-runnable base image,
          # if an image tag is not specified, a random tag is auto-generated when the image is built.
          base: "centos-mini-non-runnable-base"

          # Review and set the name for runnable container image,
          # if an image tag is not specified, a random tag is auto-generated when the image is built.
          name: "centos-mini"

デフォルトでは、移行のタイムスタンプに対応するタグがこれらの値に自動的に適用されます。このタグの形式は次のとおりです。

MM-DD-YYYY--hh:mm:ss

独自のタグを適用するには、デフォルトのタグをオーバーライドして、以下のように CRD を編集して追加します。

        image:
          # Review and set the name for extracted non-runnable base image,
          # if an image tag is not specified, a random tag is auto-generated when the image is built.
          base: "centos-mini-non-runnable-base:tag"

          # Review and set the name for runnable container image,
          # if an image tag is not specified, a random tag is auto-generated when the image is built.
          name: "centos-mini:tag"

サービスリストをカスタマイズする

デフォルトでは、Migrate to Containers は VM をコンテナに移行するときに、VM 上の不要なサービスを無効にします。これらのサービスにより、移行後のコンテナで問題が発生することがあります。また、これらのサービスがコンテナのコンテキストで不要になることもあります。

Migrate to Containers によって自動的に無効にされないサービスも無効にすることもできます。

  • Migrate to Containers は、サービスを自動的に検出してそのリストを移行計画に追加しますが、この中には無効にできるサービスもあります。たとえば、ssh やウェブサーバーなどのサービスは、移行後のワークロードで不要となることがあります。サービスが不要かどうかはご自身で判断してください。必要に応じて、移行計画を編集してこれらのサービスを無効にします。

  • Migrate to Containers は、ソース VM で実行されているサービスをすべてリストに追加するわけではありません。たとえば、オペレーティング システムに関連するサービスは省略します。必要に応じて、移行計画を編集して移行先のコンテナで無効にするサービスのリストを追加することもできます。

systemServices フィールドには、Migrate to Containers によって検出されたサービスのリストを指定します。次に例を示します。

    systemServices:
    - enabled: true|false
      name: service-name
      probed: true|false
    - enabled: true|false
      name: service-name
      probed: true|false
      ...

サービスを無効にするには、enabledfalse に設定します。

Migrate to Containers では、オペレーティング システムに関連するサービスなど、ソース VM で実行されているすべてのサービスが一覧表示されるわけではありません。ただし、リストにサービスを追加することは可能です。たとえば、service2cron サービスを無効にするには、次のコマンドを実行します。

    systemServices:
    - enabled: true
      name: service1
      probed: false
    - enabled: false
      name: service2
      probed: false
    - enabled: false
      name: cron
      probed: false

移行を実行して移行アーティファクトを生成すると、Migrate to Containers によって blocklist.yaml ファイルが作成されます。このファイルには、移行計画の設定に基づいて無効にするコンテナ サービスが列挙されています。次に例を示します。

service_list:
- name: disabled-services
  services:
  # Because you used systemServices above to disabled service2 and cron:
  - service2
  - cron

無効化されているサービスのリストを変更するには:

  • 移行計画のサービスのリストを編集します。
  • 移行を実行して、更新済みの blocklist.yaml ファイル、deployment_spec.yaml ファイル、Dockerfile などの移行アーティファクトを再生成します。

または、移行を実行して移行アーティファクトを生成した後に、blocklist.yaml ファイルを直接編集して、ご自身でコンテナ イメージを再ビルドし push することもできます。次に例を示します。

  1. blocklist.yaml ファイルを更新します。

  2. コンテナ イメージを再構築して push します。

    コンテナ イメージを再構築して push する方法は、ビルド環境によって異なります。次を使用できます。

    1. gcloud: クイックスタート: ビルドの説明に従ってイメージを再ビルドし Container Registry に push します。
    2. docker build: イメージのビルドと実行の説明のとおりに実行します。
  3. 新しいイメージを再ビルドして push したら、エディタで deployment_spec.yaml ファイルを開き、イメージの場所を更新します。

    spec:
     containers:
       - image: new-image-location
    

    たとえば、gcloud を使用してイメージを再ビルドし、Container Registry に push した場合、new-image-locationmy-new-image:v1.0 になります。

サービス エンドポイントをカスタマイズする

移行計画には、移行されたワークロードによって提供される Kubernetes Service の作成に使用されるポートとプロトコルを定義する endpoints 配列が含まれます。エンドポイント定義を追加、編集、削除して移行計画をカスタマイズできます。

Service エンドポイントごとに、移行計画に次の定義を追加します。

    endpoints:
    - port: PORT_NUMBER
      protocol: PORT_PROTOCOL
      name: PORT_NAME

ここで

  • PORT_NUMBER は、サービスへのリクエストがルーティングされるコンテナのポート番号を指定します。
  • PORT_PROTOCOL には、HTTP、HTTPS、TCP などのポート プロトコルを指定します。すべてのプロトコルの一覧については、サポートされているプロトコルをご覧ください。
  • PORT_NAME には、サービス エンドポイントへのアクセスに使用する名前を指定します。Migrate to Containers は、生成されたエンドポイント定義ごとに一意の PORT_NAME を生成します。

たとえば、Migrate to Containers は次のエンドポイントを検出します。

  endpoints:
    - port: 80
      protocol: HTTP
      name: backend-server-nginx
    - port: 6379
      protocol: TCP
      name: backend-server-redis

name プロパティの値を設定するために、Migrate to Containers は、ソース VM 名(この例では backend-server)と Service のプログラム名を組み合わせます。生成される名前は、Kubernetes の命名規則と互換性があり、移行計画内で一意です。たとえば、先述の移行計画では、HTTP 経由でポート 80 の Nginx をターゲットとする Service が作成されます。

重複する名前がある場合は、Migrate to Containers によって接尾辞として番号が追加されます。たとえば、Nginx が 2 つのポートに関連付けられている場合、2 番目の定義では -2 接尾辞が name に追加されます。

  endpoints:
    - port: 80
      protocol: HTTP
      name: backend-server-nginx
    - port: 8080
      protocol: HTTPS
      name: backend-server-nginx-2
    - port: 6379
      protocol: TCP
      name: backend-server-redis

移行を実行して移行アーティファクトを生成すると、Migrate to Containers によって各エンドポイントの deployment_spec.yaml ファイルに Service 定義が作成されます。

例として、deployment_spec.yaml ファイル内の Service 定義を以下に示します。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  name: backend-server-nginx
spec:
  ports:
  - port: 80
    protocol: HTTP
    targetPort: 80
  selector:
    app: backend-server
status:
  loadBalancer: {}

NFS マウントをカスタマイズする

Migrate to Containers には、生成された移行計画に NFS マウントが含まれます。この情報は fstab ファイルから収集され、移行計画の nfsMounts 配列に書き込まれます。NFS マウント ポイントの定義を追加または編集して、移行計画をカスタマイズできます。

移行計画を生成する際は、Migrate to Containers は次のように動作します。

  • /sys/dev の NFS マウントを無視します。
  • nfs または nfs4 以外のタイプの NFS マウントを無視します。

移行計画の各 NFS マウントには、次の形式でサーバーの IP アドレスとローカル マウントパスが含まれます。

    nfsMounts:
    - mountPoint: MOUNT_POINT
      exportedDirectory: DIR_NAME
      nfsServer: IP
      mountOptions:
         - OPTION_1
         - OPTION_2
      enabled: false|true

ここで

  • MOUNT_POINT には、fstab から取得したマウント ポイントを指定します。
  • DIR_NAME には、共有ディレクトリの名前を指定します。
  • IP には、マウント ポイントをホストするサーバーの IP アドレスを指定します。
  • OPTION_N は、fstab から抽出したマウント ポイントのオプションを指定します。

たとえば、fstab の次のエントリの場合:

<file system>       <mount point>   <type>  <options>   <dump>  <pass>
10.49.232.26:/vol1  /mnt/test       nfs     rw,hard     0       0

Migrate to Containers では、移行計画に次のエントリが生成されます。

    nfsMounts:
    - mountPoint: /mnt/test
      exportedDirectory: /vol1
      nfsServer: 10.49.232.26
      mountOptions:
         - rw
         - hard
      enabled: false

nfsMounts 配列のエントリを処理するように Migrate to Containers を構成するには、mountPoint エントリの enabledtrue に設定します。mountPoints エントリの 1 つ、複数、またはすべてを有効にしたり、エントリを編集できます。また、独自のエントリを追加することもできます。

移行を実行して移行アーティファクトを生成すると、Migrate to Containers が Volumes と volumeMounts の定義と、PersistentVolume と PersistentVolumeClaim の定義を有効な NFS マウントごとに deployment_spec.yaml ファイルに作成します。

例として、deployment_spec.yaml ファイル内の volumeMounts 定義を以下に示します。

    spec:
      containers:
          - image: gcr.io/myimage-1/image-name
            name: some-app
            volumeMounts:
                   - mountPath: /sys/fs/cgroup
                     name: cgroups
                   - mountPath: /mnt/test
                     name: nfs-pv

ここで、name の値は、Migrate to Containers によって生成された一意の識別子です。

deployment_spec.yaml ファイル内の PersistentVolumeClaimPersistentVolume の定義の例を以下に示します。

apiVersion: v1
kind: PersistentVolumeClaim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Mi
  storageClassName: ""
  volumeName: nfs-pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  mountOptions:
    - rw
    - hard
  nfs:
    path: /vol1
    server: 10.49.232.26

Cloud Logging に書き込まれるログデータをカスタマイズする

通常、ソース VM は 1 つ以上のログファイルに情報を書き込みます。VM の移行の一環として、移行されるワークロードを構成して、そのログ情報を Cloud Logging に書き込むことができます。

移行計画を生成すると、Migrate to Containers は、ソース VM のログの宛先ファイルを自動的に検索します。Migrate to Containers によって、検出されたファイルに関する情報が移行計画の logPaths 領域に書き込まれます。

deployment:
    ...
    logPaths:
    - appName: APP_NAME
      globs:
      - LOG_PATH

次に例を示します。

deployment:
    ...
    logPaths:
    - appName: tomcat
      globs:
      - /var/log/tomcat*/catalina.out

移行アーティファクトを生成すると、Migrate to Containers が移行計画から logs.yaml ファイルを生成するようになりました。このファイルには、ソース VM で検出されたログファイルのリストが含まれます。たとえば、上記の logsPath の定義で、logs.yaml には以下が含まれています。

logs:
  tomcat:
  - /var/log/tomcat*/catalina.out

この例では、移行されたワークロードをデプロイすると、catalina.out に書き込まれたログ情報が自動的に Cloud Logging に書き込まれます。

ログで、エントリは次の形式で 1 行に表示されます。

DATE TIME APP_NAME LOG_OUTPUT

次の例は、Tomcat からのエントリの形式を示しています。

2019-09-22 12:43:08.681193976 +0000 UTC tomcat log-output

ロギングを構成するには、次のいずれかを行います。

  • 移行アーティファクトを生成する前に移行計画を編集し、logPaths のエントリを追加、削除、または編集します。移行アーティファクトを生成すると、この編集は logs.yaml ファイルに反映されます。

  • 移行アーティファクトを生成した後に logs.yaml を編集して、logs のエントリを追加、削除、または編集します。

移行計画を編集する利点は、アーティファクトを生成するたびに編集内容が logs.yaml に反映されることです。なんらかの理由で logs.yaml を直接編集してからアーティファクトを再生成する場合は、編集内容を logs.yaml に再度適用する必要があります。

Linux v2kServiceManager の正常性プローブを設定する

マネージド コンテナのダウンタイムと準備完了ステータスは、Tomcat ウェブサーバーの移行計画でプローブを指定することによりモニタリングできます。正常性プローブのモニタリングは、移行されたコンテナのダウンタイムを減らし、モニタリングを改善する効果があります。

不明なヘルス状態は、可用性の低下、可用性モニタリングの誤判定、およびデータ損失を引き起こす可能性があります。正常性プローブがなければ、kubelet は、コンテナの健全性を想定することしかできず、準備ができていないコンテナ インスタンスにトラフィックを送信する可能性があります。これにより、トラフィックが失われる場合があります。kubelet は、フリーズされたコンテナを検出することもできず、コンテナは再起動されません。

正常性プローブは、コンテナの起動時に小さなスクリプト ステートメントを実行します。このスクリプトは、成功したプローブの種類をチェックします。これは、使用されるプローブのタイプによって定義されます。期間は移行計画の periodSeconds フィールドで定義されます。これらのスクリプトは、手動で実行または定義できます。

kubelet のプローブの詳細については、Kubernetes ドキュメントの livenessProbe、readinessProbe、startupProbe の構成をご覧ください。

構成可能なプローブには 2 つのタイプがありますが、どちらのプローブも probe-v1-core リファレンスで定義された Probe-v1-core で、container-v1-core の対応フィールドと同じ機能を共有します。

  • livenessProbe - livenessProbe は、コンテナを再起動するタイミングを把握するために使用されます。

  • readinessProbe - readinessProbe は、コンテナがトラフィックの受信を開始する準備が整うタイミングを認識するために使用されます。プローブが成功した場合にのみ Pod へのトラフィックの送信を開始するには、readinessProbe を指定します。readinessProbe は livenessProbe と同様に機能する場合もありますが、仕様の readinessProbe は、Pod がトラフィックを受信せずに起動し、プローブが成功した後にのみトラフィックの受信を開始することを示します。

調査後、プローブ構成が移行計画に追加されます。プローブは、次のようにデフォルト構成で使用できます。プローブを無効にするには、yaml から probes セクションを削除します。

v2kServiceManager: true
deployment:
  probes:
    livenessProbe:
      exec:
        command:
        - gamma
        - /probe

    readinessProbe:
      exec:
        command:
        - gamma
        - /probe
      initialDelaySeconds: 60
      periodSeconds: 5

image:
  # Disable system services that do not need to be executed at the migrated workload containers.
  # Enable the 'probed' property to include system services in the container health checks.
  systemServices:
  - enabled: true
    name: apache2
    probed: true
  - enabled: true
    name: atd
    probed: false

デフォルトでは、すべてのサービス プローブは無効になっています。モニタリングするサービスのサブセットを定義する必要があります。

プローブを使用してコンテナを確認するには、事前定義された 4 つの方法があります。各プローブでは、次の 4 つのメカニズムのいずれか 1 つのみを定義する必要があります。

  • exec - コンテナ内で指定されたコマンドを実行します。終了ステータス コードが 0 の場合、正常に実行されたとみなされます。
  • grpc - gRPC を使用してリモート プロシージャ コールを実行します。gRPC プローブはアルファ版の機能です。
  • httpGet - 指定されたポートとパスにある Pod の IP アドレスに対して HTTP GET リクエストを実行します。ステータス コードが 200 以上 400 未満の場合、リクエストが正常に終了したとみなされます。
  • tcpSocket - 指定されたポートにある Pod の IP アドレスに対して TCP チェックを実行します。ポートが開いている場合、チェックが正常に終了したとみなされます。

デフォルトでは、移行計画によって exec プローブ方式が有効になります。移行計画に手動構成を使用して、別の方法を有効にします。

デフォルトの readinessProbe を使用しながら、readinessProbe に外部依存関係を追加するには、exec readinessProbe と、ロジックを実装するスクリプトを定義します。

次のステップ