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

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

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

始める前に

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

移行計画を編集する

ファイル システムをコピーして分析すると、指定した出力パス(ANALYSIS_OUTPUT_PATH/config.yaml)に新しく作成されたディレクトリに移行計画が作成されます。

この移行計画を必要に応じて編集し、変更を保存します。

移行計画の詳細とコメントを確認して、必要に応じて情報を追加します。特に、次のセクションに関する編集を検討してください。

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

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

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

rsync フィルタルールの詳細をご確認ください。

サイズが大きすぎて 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 セクションの name の値は、コンテナに使用される移行済みの VM から作成されたイメージの名前を定義します。別の名前を使用する場合は、この値を変更できます。

image:
     # Review and set the name for runnable container image.
     name: linux-system

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

デフォルトでは、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 を含む移行アーティファクトを再生成します。

また、移行を実行して移行アーティファクトを生成すると、blocklist.yaml ファイルを直接編集して、Skaffold を使用してコンテナ イメージをビルドしてデプロイできます。

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

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

エンドポイント ポートを取得するには、ポートをリッスンしているプログラムを確認します。

sudo netstat --programs --listening --tcp --udp [--sctp]

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 セクションを削除します。

deployment:
  probes:
    livenessProbe:
      exec:
        command:
        - /ko-app/service-manager-runtime
        - /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 と、ロジックを実装するスクリプトを定義します。

次のステップ