自定义服务屏蔽名单

默认情况下,Migrate to Containers 会在将虚拟机迁移到容器时停用不需要的服务。这些服务有时可能会导致已迁移的容器出现问题,或者不为容器上下文所需要。

您还可以使用自定义屏蔽名单定义要在迁移的容器中停用的专属自定义服务列表。使用屏蔽名单,您可以在迁移的容器中指定要停用的一个或多个服务。

定义屏蔽名单

在 .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>

其中:

  • 群组是服务的逻辑集合,因此您可以在单个群组中收集类似的服务。为群组名称指定任意字符串值。
  • 服务名称指定要在迁移的容器中停用的服务。

例如,将文件 my-blocklist.yaml 定义为:

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

应用自定义屏蔽名单

通过以下任一方式将您的自定义屏蔽名单应用于容器:

  • 创建包含屏蔽名单的 Kubernetes configmap,并将其添加到容器的部署规范中。

    此方法让您可以添加屏蔽名单,而无需重新构建容器。但是,您必须在用于托管容器的每个集群上重新创建 configmap

  • 修改容器的 Dockerfile 并重新构建容器映像。

    此方法要求您重新构建容器映像以添加屏蔽名单。由于屏蔽名单现已包含在容器中,因此无需在部署前对集群执行任何额外的配置。

使用 ConfigMap

如需使用 configmap 创建屏蔽名单,请执行以下操作:

  1. 将来源虚拟机迁移到容器。

  2. 按照上文所示的步骤创建 blocklist.yaml 文件以列出要停用的服务。在此示例中,将文件命名为 my-blocklist.yaml

  3. 从 blocklist.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 的新环境变量,指定 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 与 blocklist.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. 将来源虚拟机迁移到容器。

  2. 在编辑器中打开 Dockerfile。

  3. 添加以下 COPY 命令,以将 blocklist.yaml 文件添加到容器的文件系统中:

    COPY src dest 

    例如:

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

    目标路径可以是容器中的任何路径。

  4. 添加一个名为 HC_CUSTOM_SERVICE_BLOCKLIST 的新环境变量,以根据 COPY 命令指定的文件目标,指定 blocklist.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-location 可能为 gcr.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