カスタム サービスのブロックリスト

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

カスタム ブロックリストを使用すると、移行されたコンテナで無効にするサービスの独自のカスタムリストを定義することもできます。ブロックリストには、移行されたコンテナで無効にするサービスを 1 つ以上指定します。

ブロックリストの定義

.yaml ファイルに、カスタマイズしたブロックリストを次の形式で定義します。

service_list:
  - name: <var>group-name-1</var>
    services:
      - <var>service-name</var>
  - name: <var>group-name-2</var>
    services:
      - <var>service-name</var>
      - <var>ervice-name</var>

ここで

  • グループはサービスの論理的な集合体で、類似するサービスを 1 つのグループにまとめることができます。グループ名の文字列値を指定します。
  • サービス名には、移行後のコンテナで無効にするサービスを指定します。

たとえば、次のように my-blocklist.yaml ファイルを定義します。

service_list:
  - name: lvm-related
    services:
      - lvm2-lvmetad
  - name: hardware-related
    services:
      - microcode
      - microcode.ctl

カスタム ブロックリストの適用

次のいずれかの方法で、カスタム ブロックリストをコンテナに適用します。

  • ブロックリストを含む Kubernetes configmap を作成し、コンテナの Deployment 仕様に追加します。

    この方法では、コンテナを再ビルドすることなくブロックリストを追加できます。ただし、コンテナをホストするすべてのクラスタで configmap を再作成する必要があります。

  • コンテナの Dockerfile を編集し、コンテナ イメージを再作成します。

    この方法では、コンテナ イメージを再ビルドしてブロックリストを追加する必要があります。ブロックリストがコンテナに含まれるので、デプロイ前にクラスタで追加の構成を行う必要はありません。

configmap の使用

configmap を使用してブロックリストを作成するには:

  1. 移行元の VM をコンテナに移行します。

  2. 上記のように、ブロックするサービスの一覧を含むブロックリスト .yaml ファイルを作成します。この例では、ファイル名を my-blocklist.yaml とします。

  3. ブロックリスト .yaml ファイルから configmap を作成します。

    kubectl create configmap configmap-name --from-file=path-to-yaml

    この例で、configmap は blocklistcm です。

    kubectl create configmap blocklistcm --from-file=./my-blocklist.yaml
  4. configmap を表示します。

    kubectl describe configmaps
  5. コンテナの移行時に作成された deployment_spec.yaml を編集します。

    vi deployment_spec.yaml
  6. デプロイ仕様に以下を追加します。

    1. volumes の下に configmap の新しいボリュームを追加します。

      volumes:
      - configMap: 
           name: blocklistcm # Name of the config map you created above. 
         name: blocklistvol # Name of the configmap volume.
      
    2. configmap にボリューム マウントを追加します。

      spec:
        containers: 
          volumeMounts: 
          - mountPath: /etc/bl # Mount path for the configmap volume. 
            name: blocklistvol # Name of the configmap volume. 
      
    3. 新しい環境変数 HC_CUSTOM_SERVICE_BLOCKLIST を追加します。その際、ブロックリスト .yaml ファイルのパスを指定します。環境変数の名前は HC_CUSTOM_SERVICE_BLOCKLIST にする必要があります。

      containers:
       - image: container-image-location
         env:
         - name: HC_CUSTOM_SERVICE_BLOCKLIST
           value: "/etc/bl/my-blocklist.yaml"
      

      パスには、configmap の mountPath とブロックリスト .yaml ファイルの名前を連結した値を指定します(my-blocklist.yaml)。

    4. ファイルを保存します。

  7. コンテナをデプロイします。

    kubectl apply -f deployment_spec.yaml
  8. コンテナがデプロイされたら、コンテナを調べて、サービスが実行されていないことを確認します。例:

    # Get pod name.
    $ kubectl get pod
    # Connect to pod.
    $ kubectl exec -it POD_NAME -- /bin/bash
    # View running services. This step is OS dependent. For example:
    $ service --status-all```
    

Dockerfile の編集

このセクションでは、移行によって作成された Dockerfile を編集してカスタム ブロックリストを作成する方法について説明します。

  1. 移行元の VM をコンテナに移行します。

  2. エディタで Dockerfile を開きます。

  3. 次の COPY コマンドを追加して、ブロックリスト .yaml ファイルをコンテナのファイル システムに追加します。

    COPY src dest 

    例:

    COPY my-blocklist.yaml /etc/mybl/my-blocklist.yaml

    宛先のパスには、コンテナ内の任意のパスを指定できます。

  4. HC_CUSTOM_SERVICE_BLOCKLIST という名前の新しい環境変数を追加し、COPY コマンドで指定された宛先に基づいてブロックリスト .yaml ファイルのパスを指定します。環境変数の名前は HC_CUSTOM_SERVICE_BLOCKLIST にする必要があります。

    ENV HC_CUSTOM_SERVICE_BLOCKLIST /file-path

    例:

    ENV HC_CUSTOM_SERVICE_BLOCKLIST /etc/mybl/my-blocklist.yaml
  5. コンテナ イメージを更新します。

    コンテナ イメージの更新方法はビルド環境によって異なります。次の方法があります。

    1. gcloud を使用してイメージをビルドし、クイックスタート: ビルドの説明に従って Container Registry にアップロードします。

    2. イメージを作成して実行するの説明に従って docker build を実行します。

  6. 新しいイメージをビルドしたら、エディタで deployment_spec.yaml ファイルを開いて、イメージの場所を更新します。

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

    たとえば、gcloud を使用してイメージをビルドし、Container Registry にアップロードした場合、new-image-locationgcr.io/my-project/my-new-image:v1.0 になります。

  7. コンテナをデプロイします。

    kubectl apply -f deployment_spec.yaml
  8. コンテナがデプロイされたら、コンテナを調べて、サービスが実行されていないことを確認します。例:

    # Get pod name.
    $ kubectl get pod
    # Connect to pod.
    $ kubectl exec -it POD_NAME -- /bin/bash
    # View running services. This step is OS dependent. For example:
    $ service --status-all