自訂服務封鎖清單

根據預設,當您將 VM 遷移至容器時,Migrate to Containers 會停用 VM 上不需要的服務。這些服務有時可能會導致已遷移容器的問題,或是在容器情境中不需要。

您也可以使用自訂封鎖清單,定義要停用的遷移容器服務清單。您可以使用封鎖清單,指定要停用的一或多個服務。

定義封鎖清單

在 .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. 將來源 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 和 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. 將來源 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-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