Lista de bloqueio de serviços personalizados

Por predefinição, a ferramenta Migrate to Containers desativa os serviços desnecessários numa VM quando a migra para um contentor. Por vezes, estes serviços podem causar problemas com o contentor migrado ou não são necessários num contexto de contentor.

Também pode definir a sua própria lista personalizada de serviços a desativar num contentor migrado através de uma lista de bloqueio personalizada. Com uma lista de bloqueio, especifica um ou mais serviços a desativar num contentor migrado.

Definir a lista de bloqueio

Defina a sua lista de bloqueios personalizada num ficheiro .yaml, no formato:

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>

Onde:

  • Os grupos são uma coleção lógica de serviços para que possa recolher serviços semelhantes num único grupo. Especifique qualquer valor de string para o nome do grupo.
  • O nome do serviço especifica o serviço a desativar no contentor migrado.

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

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

Aplicar uma lista de bloqueio personalizada

Aplique a sua lista de bloqueios personalizada a um contentor de uma das seguintes formas:

  • Criar um Kubernetes configmap que contenha a lista de bloqueio e adicioná-lo à especificação de implementação do contentor.

    Este método permite-lhe adicionar a lista de bloqueio sem ter de reconstruir o contentor. No entanto, tem de recriar o configmap em todos os clusters usados para alojar o contentor.

  • Edite o Dockerfile do contentor e reconstrua a imagem do contentor.

    Este método requer que recrie a imagem do contentor para adicionar a lista de bloqueio. Uma vez que a lista de bloqueio está agora incluída no contentor, não é necessário fazer nenhuma configuração adicional no cluster antes da implementação.

Usar um configmap

Para criar uma lista de bloqueios através de um configmap:

  1. Migre a VM de origem para um contentor.

  2. Crie um ficheiro .yaml de lista de bloqueios, conforme mostrado acima, que liste o serviço que quer desativar. Neste exemplo, atribua o nome my-blocklist.yaml ao ficheiro.

  3. Crie uma configmap a partir do ficheiro .yaml da lista de bloqueio:

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

    Neste exemplo, o configmap chama-se blocklistcm:

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

    kubectl describe configmaps
  5. Edite o deployment_spec.yaml criado quando migrou o contentor:

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

    1. Adicione um novo volume para o 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 de 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 denominada HC_CUSTOM_SERVICE_BLOCKLIST que especifique o caminho para o ficheiro .yaml da lista de bloqueio. O nome da variável de ambiente tem de 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 pelo valor é a concatenação do mountPath do configmap e do nome do ficheiro .yaml da lista de bloqueio, my-blocklist.yaml.

    4. Guarde o ficheiro.

  7. Implemente o contentor:

    kubectl apply -f deployment_spec.yaml
  8. Depois de o contentor ser implementado, pode examiná-lo para garantir que os serviços não estão em execução. Por 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```
    

Editar o ficheiro Dockerfile

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

  1. Migre a VM de origem para um contentor.

  2. Abra o Dockerfile num editor.

  3. Adicione o seguinte comando COPY para adicionar o ficheiro .yaml da lista de bloqueio ao sistema de ficheiros do contentor:

    COPY src dest 

    Por exemplo:

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

    O caminho de destino pode ser qualquer caminho dentro do contentor.

  4. Adicione uma nova variável de ambiente denominada HC_CUSTOM_SERVICE_BLOCKLIST que especifique o caminho para o ficheiro .yaml da lista de bloqueio com base no destino do ficheiro especificado pelo comando COPY. O nome da variável de ambiente tem de 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 contentor.

    A forma como atualiza a imagem do contentor depende do seu ambiente de compilação. Pode usar:

    1. gcloud para criar a imagem e carregá-la para o Container Registry, conforme descrito no Início rápido: criar.

    2. docker build, conforme descrito em Crie e execute a sua imagem .

  6. Depois de criar a nova imagem, abra o ficheiro deployment_spec.yaml num editor para atualizar a localização 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 usou gcloud para criar a imagem e a carregou para o Container Registry.

  7. Implemente o contentor:

    kubectl apply -f deployment_spec.yaml
  8. Depois de o contentor ser implementado, pode examiná-lo para garantir que os serviços não estão em execução. Por 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