Lista de bloqueio de serviços personalizados

Por padrão, o Migrate to Containers desativa os serviços desnecessários em uma VM quando ela é migrada para um contêiner. Esses serviços às vezes podem causar problemas no contêiner migrado ou não são necessários em um contexto de contêiner.

Também é possível definir sua própria lista personalizada de serviços que será desativada em um contêiner migrado usando uma lista de bloqueio personalizada. Com uma lista de bloqueio, você especifica um ou mais serviços a serem desativados no contêiner migrado.

Como definir a lista de bloqueio

Defina sua lista de bloqueio personalizada em um arquivo .yaml no formulário:

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>

Em que:

  • Grupos são uma coleção lógica de serviços para que você possa coletar serviços semelhantes em um único grupo. Especifique qualquer valor de string para o nome do grupo.
  • O nome do serviço especifica o serviço a ser desativado no contêiner migrado.

Por exemplo, defina o arquivo my-blocklist.yaml como:

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

Como aplicar uma lista de bloqueio personalizada

Aplique sua lista de bloqueio personalizada a um contêiner:

  • Como criar um configmap do Kubernetes que contenha a lista de bloqueio e adicioná-lo à especificação de implantação do contêiner.

    Esse método permite que você adicione a lista de bloqueio sem ter que recriar o contêiner. No entanto, é necessário recriar o configmap em todos os clusters usados para hospedar o contêiner.

  • Edite o Dockerfile do contêiner e recrie a imagem.

    Esse método requer que você recrie a imagem do contêiner para adicionar a lista de bloqueio. Como a lista de bloqueio agora está incluída no contêiner, não é necessário executar outras configurações no cluster antes da implantação.

Como usar um configmap

Para criar uma lista de bloqueio usando um configmap:

  1. Migre a VM de origem para um contêiner.

  2. Crie um arquivo .yaml de lista de bloqueio, conforme mostrado acima, que lista o serviço que você quer desativar. Neste exemplo, nomeie o arquivo my-blocklist.yaml.

  3. Crie um configmap a partir do arquivo .yaml de lista de bloqueio:

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

    Neste exemplo, o configmap é chamado de blocklistcm:

    kubectl create configmap blocklistcm --from-file=./my-blocklist.yaml
  4. Ver o configmap:

    kubectl describe configmaps
  5. Edite o deployment_spec.yaml criado quando você migrou o contêiner:

    vi deployment_spec.yaml
  6. Na especificação de implantação, adicione o seguinte:

    1. Adicione um novo volume para configmap em volumes:

      volumes:
      - configMap: 
           name: blocklistcm # Name of the config map you created above. 
         name: blocklistvol # Name of the configmap volume.
      
    2. Adicione uma montagem do volume para o configmap:

      spec:
        containers: 
          volumeMounts: 
          - mountPath: /etc/bl # Mount path for the configmap volume. 
            name: blocklistvol # Name of the configmap volume. 
      
    3. Adicione uma nova variável de ambiente chamada HC_CUSTOM_SERVICE_BLOCKLIST especificando o caminho para o arquivo .yaml de lista de bloqueio. O nome da variável de ambiente precisa ser HC_CUSTOM_SERVICE_BLOCKLIST:

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

      O caminho especificado por valor é a concatenação do mountPath do configmap e do nome do arquivo .yaml de lista de bloqueio, my-blocklist.yaml.

    4. Salve o arquivo.

  7. Implantar o contêiner:

    kubectl apply -f deployment_spec.yaml
  8. Depois que o contêiner for implantado, examine-o para garantir que os serviços não estarão em execução. Exemplo:

    # 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```
    

Como editar o Dockerfile

Esta seção descreve como criar uma lista de bloqueio personalizada editando o Dockerfile criado pela migração.

  1. Migre a VM de origem para um contêiner.

  2. Abra o Dockerfile em um editor.

  3. Adicione o seguinte comando COPY para adicionar o arquivo .yaml de lista de bloqueio ao sistema de arquivos do contêiner:

    COPY src dest 

    Por exemplo:

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

    O caminho de destino pode ser qualquer caminho dentro do contêiner.

  4. Adicione uma nova variável de ambiente chamada HC_CUSTOM_SERVICE_BLOCKLIST especificando o caminho para o arquivo .yaml de lista de bloqueio com base no destino do arquivo especificado pelo comando COPY. O nome da variável de ambiente precisa ser HC_CUSTOM_SERVICE_BLOCKLIST:

    ENV HC_CUSTOM_SERVICE_BLOCKLIST /file-path

    Por exemplo:

    ENV HC_CUSTOM_SERVICE_BLOCKLIST /etc/mybl/my-blocklist.yaml
  5. Atualize a imagem do contêiner.

    O modo como você atualiza a imagem do contêiner depende do seu ambiente de criação. Você pode usar:

    1. gcloud para criar a imagem e fazer upload dela para o Container Registry, conforme descrito noGuia de início rápido: criar.

    2. docker build, conforme descrito em Criar e executar a imagem

  6. Depois de criar a nova imagem, abra o arquivo deployment_spec.yaml em um editor para atualizar o local da imagem:

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

    Por exemplo, new-image-location pode ser gcr.io/my-project/my-new-image:v1.0, se você usou gcloud para criar a imagem e enviá-la ao Container Registry.

  7. Implantar o contêiner:

    kubectl apply -f deployment_spec.yaml
  8. Depois que o contêiner for implantado, examine-o para garantir que os serviços não estarão em execução. Exemplo:

    # 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