Como implantar contêineres em VMs e MIGs

É possível configurar uma instância de máquina virtual (VM, na sigla em inglês) ou um modelo de instância para implantar e lançar um contêiner do Docker. O Compute Engine fornece uma imagem atualizada do Container-Optimized OS (COS) com o Docker instalado e lança o contêiner quando a VM é inicializada.

Antes de começar

Como definir quando implantar contêineres em VMs e MIGs

Ao implantar contêineres no Compute Engine, você simplifica a implantação de aplicativos e controla a infraestrutura da VM.

  • Gerencie as VMs que executam contêineres da mesma forma que você trataria qualquer outra ao configurar e gerenciar a infraestrutura do Compute Engine.
  • Crie serviços escalonáveis usando grupos de instâncias gerenciadas (MIGs, na sigla em inglês) que executam contêineres. Eles oferecem recursos como recuperação e escalonamento automáticos, atualizações contínuas, implantações em várias zonas e balanceamento de carga.
  • Use ferramentas e processos conhecidos, como a ferramenta de linha de comando da gcloud ou a API Compute Engine para gerenciar VMs com contêineres.

Como alternativa, considere a implantar no Google Kubernetes Engine para:

  • executar um grande número de microsserviços;
  • acelerar o tempo de inicialização do contêiner;
  • aproveitar a orquestração automática do Kubernetes, incluindo upgrades, reparo de nó e escalonamento automáticos.

Executar cada microsserviço em uma máquina virtual (VM, na sigla em inglês) separada no Compute Engine pode levar o sistema operacional a sobrecarregar grande parte do seu custo. O Google Kubernetes Engine permite que você implante vários contêineres e grupos de contêineres para cada instância de VM, o que pode alocar recursos de VMs do host com mais eficiência a microsserviços com um espaço menor.

Como funciona a implantação de contêineres no Compute Engine

Os métodos comuns de implantação de software em uma instância de VM do Compute Engine incluem:

  • implantar durante a inicialização da VM usando um script de inicialização ou o cloud-init (em inglês);
  • criar uma imagem de disco de inicialização personalizada com o software pré-instalado.

Os métodos acima combinam as tarefas de configuração do app e do ambiente do sistema operacional. Como desenvolvedor, você precisa acompanhar e resolver cuidadosamente quaisquer dependências do tempo de execução. Por exemplo, se dois aplicativos em execução em uma VM usam versões diferentes da mesma biblioteca, você precisa instalar as duas versões e direcioná-las por meio das variáveis do sistema.

Aplicativos em execução em diferentes versões da mesma biblioteca.
Uma instância de VM com aplicativos implantados diretamente no sistema operacional

Como alternativa, é possível implantar o software em um contêiner em uma instância de VM ou um MIG. Um contêiner tem os softwares do aplicativo e as bibliotecas necessárias, além de ser isolado dos aplicativos e bibliotecas do SO. Um contêiner pode ser movido com facilidade entre os ambientes de implantação, sem precisar lidar com as versões conflitantes da biblioteca no contêiner e no SO dele.

Apps em contêineres.
Uma instância de VM com apps implantados em um contêiner

Você verá a seguir como implantar um contêiner no Compute Engine:

  1. Agrupe o aplicativo e as bibliotecas necessárias em uma imagem do Docker e publique-a no Artifact Registry, no Container Registry ou em um registro de terceiros, como o Docker Hub.
  2. Especifique um nome de imagem do Docker e a configuração docker run ao criar uma instância de VM ou um modelo para um MIG.

Depois que você faz uma solicitação para criar uma instância de VM, o Compute Engine executa as seguintes tarefas:

  1. O Compute Engine cria uma instância de VM que usa uma imagem do Container-Optimized OS fornecida pelo Google. Essa imagem inclui um ambiente de execução do Docker e um outro software responsável por inicializar seu contêiner.
  2. O Compute Engine armazena as configurações do contêiner nos metadados da instância, na chave de metadados gce-container-declaration.
  3. Quando a VM é iniciada, a imagem do Container-Optimized OS usa a configuração de comando docker run armazenada nos metadados da instância, extrai a imagem do contêiner do repositório e inicia o contêiner.
Como usar a imagem do contêiner e o comando "docker run".
Etapas para criar uma instância de VM ou um grupo gerenciado de instâncias executando um contêiner

Limitações

  • Só é possível implantar um contêiner para cada instância de VM. Considere usar o Google Kubernetes Engine caso precise implantar vários contêineres por instância de VM.
  • Só é possível implantar contêineres de um repositório público ou de um repositório particular do Container Registry ao qual você tenha acesso. Outros repositórios particulares não são compatíveis.
  • Não é possível mapear as portas de uma instância de VM para as portas do contêiner (opção -p do Docker). Para ativar o acesso aos contêineres, consulte Como publicar portas de contêiner.
  • Só é possível usar as imagens do Container-Optimized OS com esse método de implantação.
  • Esse recurso pode ser usado apenas no Console do Google Cloud ou por meio da ferramenta de linha de comando da gcloud, mas não com a API.

Como preparar o contêiner para a implantação

Escolha uma das abordagens a seguir para tornar sua imagem de contêiner acessível ao Compute Engine:

  • Faça upload da imagem do Docker para o Container Registry.
  • Use qualquer imagem de contêiner disponível publicamente no Docker Hub (em inglês) ou em outros registros.

Como implantar um contêiner em uma nova instância de VM

É possível implantar um contêiner em uma nova instância de VM usando o Console do Google Cloud ou a ferramenta de linha de comando da gcloud.

Console

No exemplo a seguir, um contêiner de uma imagem do Nginx Docker fornecida pelo Google, https://gcr.io/cloud-marketplace/google/nginx1:latest, é implantado em uma instância de VM. Para usar uma imagem diferente do Docker, especifique a que você quer usar nos exemplos abaixo.

  1. No Console do Google Cloud, acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Clique em Criar instância para criar uma instância.

  3. Em Contêiner, selecione Implantar imagem do contêiner.

  4. Em Imagem do contêiner, especifique um nome de imagem de contêiner e configure as opções para executar o contêiner, se preferir. Por exemplo, é possível especificar gcr.io/cloud-marketplace/google/nginx1:latest para a imagem do contêiner.

  5. Clique em Criar.

gcloud

Use o comando gcloud compute instances create-with-container:

gcloud compute instances create-with-container VM_NAME \
    --container-image DOCKER_IMAGE

Por exemplo, o comando a seguir cria uma nova instância de VM chamada nginx-vm, que inicia e executa a imagem do Docker gcr.io/cloud-marketplace/google/nginx1:latest.

gcloud compute instances create-with-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:latest

Saiba mais sobre o comando gcloud compute instances create-with-container.

Ao usar uma imagem pública do Docker Hub, é preciso sempre especificar um nome completo para ela. Por exemplo, forneça o seguinte nome para implantar uma imagem do contêiner Apache:

docker.io/httpd:2.4

Como atualizar um contêiner em uma instância de VM

É possível atualizar uma imagem do Docker e as opções de configuração para executar o contêiner em uma instância de VM usando o Console do Google Cloud ou a ferramenta de linha de comando da gcloud.

Quando uma VM que executa um contêiner é atualizada, o Compute Engine executa duas tarefas:

  • Atualiza a declaração do contêiner na instância. O Compute Engine armazena a declaração de contêiner atualizada nos metadados da instância sob a chave de metadados gce-container-declaration.
  • Interrompe e reinicia a instância para ativar a configuração atualizada. Isso só acontece se a instância estiver em execução. Se ela estiver interrompida, o Compute Engine atualiza a declaração do contêiner e mantém esse estado da instância. A instância de VM faz o download da nova imagem e inicializa o contêiner no início da VM.

Console

  1. No Console do Google Cloud, acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Clique no nome da instância para atualizar.

  3. Na página de detalhes da instância, clique em Editar.

  4. Especifique a nova imagem do contêiner e atualize as opções para executá-lo conforme necessário.

  5. Clique em Salvar e reiniciar para salvar as alterações. O Compute Engine salva as alterações e reinicia a instância automaticamente para aplicar a atualização. Após a reinicialização da VM, ele faz o download da nova imagem e inicia o contêiner com a configuração atualizada.

gcloud

Use o comando gcloud compute instances update-container para atualizar a declaração do contêiner. Exemplo:

gcloud compute instances update-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:latest

Esse comando define a imagem do contêiner para gcr.io/cloud-marketplace/google/nginx1:latest e reinicia a instância para ativar as alterações. Além disso, é possível atualizar qualquer propriedade descrita em Como configurar opções para executar seu contêiner adicionando as sinalizações correspondentes.

Após reinicialização da instância, será feito o download da nova imagem do contêiner e a inicialização do contêiner com a nova configuração.

Como implantar um contêiner em um grupo de instâncias gerenciadas

Para implantar um contêiner em um novo grupo gerenciado de instâncias (MIG, na sigla em inglês) usando o Console do Google Cloud ou a ferramenta de linha de comando gcloud, siga as etapas abaixo:

  1. Crie um modelo de instância com base em uma imagem do Docker.

  2. Crie um MIG a partir do novo modelo de instância.

Console

O exemplo a seguir cria um modelo de instância que implanta um contêiner em um MIG a partir de uma imagem do Docker Nginx fornecida pelo Google (gcr.io/cloud-marketplace/google/nginx1:15). Para usar outras imagens do Docker, especifique a imagem que você quer usar no lugar de gcr.io/cloud-marketplace/google/nginx1:15 no exemplo a seguir.

  1. No Console do Google Cloud, acesse a página Modelos de instância.

    Acesse "Modelos de instância"

  2. Para criar um modelo de instância, clique em Criar modelo de instância.

  3. Em Contêiner, selecione Implantar imagem do contêiner.

  4. Em Imagem do contêiner, especifique o nome da imagem do Docker e configure as opções para executar o contêiner, se preferir. Por exemplo, é possível especificar gcr.io/cloud-marketplace/google/nginx1:15 para a imagem do contêiner.

  5. Clique em Criar.

Em seguida, crie um MIG que use o novo modelo de instância.

gcloud

Use o comando gcloud compute instance-templates create-with-container para criar um modelo de instância para executar imagens do Docker:

gcloud compute instance-templates create-with-container TEMPLATE_NAME \
  --container-image DOCKER_IMAGE

Caso prefira, configure as opções para executar seu contêiner.

Por exemplo, o comando abaixo cria um novo modelo de instância com o nome nginx-template, que inclui informações sobre a imagem do Docker. Uma instância de VM criada a partir desse modelo inicia e executa a imagem do Docker gcr.io/cloud-marketplace/google/nginx1:15 quando a VM é iniciada.

gcloud compute instance-templates create-with-container nginx-template \
    --container-image gcr.io/cloud-marketplace/google/nginx1:15

Em seguida, crie um MIG usando o novo modelo de instância.

Agora que você tem um modelo de instância, é possível criar um MIG que use o modelo. Por exemplo, para criar um MIG usando a ferramenta gcloud e o nginx-template que você acabou de criar, execute o seguinte comando:

gcloud compute instance-groups managed create example-group \
    --base-instance-name nginx-vm \
    --size 3 \
    --template nginx-template

Como atualizar um grupo de instâncias gerenciadas executando um contêiner

É possível atualizar um grupo gerenciado de instâncias (MIG) para implantar a nova versão de uma imagem do Docker ou uma nova versão da imagem do Container-Optimized OS.

Como atualizar um MIG para a nova versão de uma imagem de contêiner

É possível implantar a nova versão de uma imagem do Docker em um MIG usando o Managed Instance Group Updater, em três etapas:

  1. Prepare uma nova imagem do Docker para implantação.
  2. Crie um modelo de instância com base na nova imagem do Docker, da mesma maneira que um modelo com base em contêiner é criado.
  3. Atualize um MIG para o novo modelo de instância usando o Managed Instance Group Updater.

Como atualizar um grupo de instâncias gerenciadas para uma nova versão da imagem do Container-Optimized OS

O Google atualiza regularmente as imagens do Container-Optimized OS. Convém aplicar essas atualizações nos MIGs em contêineres sem alterar a imagem do Docker. É possível atualizar um MIG para a nova versão de uma imagem do Container-Optimized OS em duas etapas, usando o Console do Google Cloud ou a ferramenta de linha de comando gcloud:

  1. Crie um modelo de instância com base na versão atual da sua imagem do Docker, da mesma maneira que um modelo com base em contêiner é criado para um novo MIG. A versão compatível mais recente de uma imagem do Container-Optimized OS é usada por padrão.
  2. Atualize um MIG com o novo modelo de instância usando o Managed Instance Group Updater.

Como se conectar a um contêiner usando SSH

Conecte-se a um contêiner em uma VM usando SSH. Use a ferramenta gcloud para executar o comando gcloud compute ssh com a sinalização --container:

gcloud compute ssh VM_NAME --container CONTAINER_NAME

Substitua:

  • VM_NAME: o nome da instância de VM
  • CONTAINER_NAME: o nome do contêiner

Saiba mais sobre o comando gcloud compute ssh e os respectivos argumentos.

Como monitorar contêineres no Compute Engine

Para monitorar instâncias que executam uma imagem do Container-Optimized OS, use o agente Detector de problemas de nós, que se comunica com o Cloud Monitoring e informa métricas relacionadas à integridade. O agente é integrado a imagens do Container-Optimized OS a partir do Milestone 77.

Para ativar o agente em contêineres que usam imagens com o Milestone 88 ou posterior, edite a seção de metadados personalizados e defina google-monitoring-enabled como true.

Para encontrar outras maneiras de ativar o detector de problemas de nós, acesse Como ativar o monitoramento de integridade.

O agente do detector de problemas de nós é compatível com as métricas na lista de métricas que começam com guest/.

Para interagir com as métricas coletadas pelo agente, acesse o Metrics Explorer.

Como ver registros

É possível visualizar três tipos de registros relacionados a contêineres:

  1. Os registros do agente de inicialização também são conhecidos como registros de konlet (em inglês). O agente de inicialização analisa a configuração do contêiner e executa as tarefas para iniciá-lo em uma instância da VM do Compute Engine.

  2. Os registros do evento do Docker alerta sobre eventos de contêiner, incluindo eventos de início e parada do contêiner.

  3. Os registros do contêiner incluem STDOUT dos apps executados no contêiner.

Como ver registros do agente de inicialização

Os registros do agente de inicialização estão disponíveis no console serial por meio do Cloud Logging e do serviço do sistema journald incluído na imagem do SO.

Como ver os registros do agente de inicialização no console serial

Console

  1. No Console do Google Cloud, acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Selecione a instância de VM em que você quer ver os registros do agente de inicialização.

  3. Em Registros, clique em Porta Serial 1 (console) para ver os registros do console serial.

    Registra a porta serial 1.

gcloud

Use o comando get-serial-port-output (em inglês) para ver os registros na porta serial da instância.

gcloud compute instances get-serial-port-output VM_NAME

Substitua VM_NAME pelo nome da instância de VM.

Por exemplo, use o comando a seguir para ver a saída da porta serial de uma instância de VM chamada nginx-vm:

gcloud compute instances get-serial-port-output nginx-vm

Como ver registros do agente de inicialização journald

  1. Conecte-se à sua instância com um contêiner usando o SSH.
  2. Execute o comando sudo journalctl para ver os registros de inicialização da VM e do contêiner. Use o comando a seguir para filtrar os registros do agente de inicialização do contêiner (konlet).

    sudo journalctl -u konlet*
    

Como visualizar registros do agente de inicialização no Logging

Console

  1. No Console do Google Cloud, acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Selecione a instância de VM em que você quer ver os registros do agente de inicialização.

  3. Em Registros, clique em Cloud Logging para ver os registros do Cloud Logging.

    Registra a porta serial 1.

  4. Digite um filtro de pesquisa para recuperar os registros do agente de inicialização.

    resource.type="gce_instance"
    logName="projects/PROJECT_ID/logs/cos_system"
    jsonPayload.SYSLOG_IDENTIFIER="konlet-startup"
    jsonPayload._HOSTNAME="VM_NAME"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que contém a instância
    • VM_NAME: o nome da instância que você quer que receba os registros

gcloud

Use o comando gcloud logging read com um filtro adequado para ver os registros do agente de inicialização do contêiner.

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/PROJECT_ID/logs/cos_system AND \
    jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \
    jsonPayload._HOSTNAME=VM_NAME"

Substitua:

  • PROJECT_ID: o ID do projeto que contém a instância
  • VM_NAME: o nome da instância que você quer que receba os registros

Por exemplo, use o comando a seguir para ver os últimos 10 registros do agente de inicialização no Logging relacionados a uma instância de VM chamada nginx-vm que executa o COS 70 e reside em my-project.

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/my-project/logs/cos_system AND \
    jsonPayload.SYSLOG_IDENTIFIER=konlet-startup AND \
    jsonPayload._HOSTNAME=nginx-vm" \
    --limit 10

Como ver registros de eventos do Docker

Veja os registros de eventos do Docker em journald e no Cloud Logging.

Como ver os registros de eventos do Docker em journald

  1. Conecte-se à sua instância com um contêiner usando o SSH.
  2. Execute o comando sudo journalctl com o filtro a seguir para visualizar os registros de eventos do Docker.

    sudo journalctl -u docker-events-collector
    

Como visualizar registros de eventos do Docker no Logging

Console

  1. No Console do Google Cloud, acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Selecione a instância de VM em que você quer ver os registros do agente de inicialização.

  3. Em Registros, clique em Cloud Logging para ver os registros do Cloud Logging.

    Registra a porta serial 1.

  4. Digite o filtro de pesquisa a seguir para recuperar os registros de eventos do Docker.

    resource.type="gce_instance"
    logName="projects/PROJECT_ID/logs/cos_system"
    jsonPayload._HOSTNAME="VM_NAME"
    jsonPayload.SYSLOG_IDENTIFIER="docker"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que contém a instância
    • VM_NAME: o nome da instância que você quer que receba os registros

gcloud

Use o comando gcloud logging read com um filtro adequado para ver os registros de eventos do Docker.

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/PROJECT_ID/logs/cos_system AND \
    jsonPayload._HOSTNAME=VM_NAME AND \
    jsonPayload.SYSLOG_IDENTIFIER=docker"

Substitua:

  • PROJECT_ID: o ID do projeto que contém a instância
  • VM_NAME: o nome da instância que você quer que receba os registros

Por exemplo, use o comando a seguir para ver os últimos 10 registros de eventos do Docker relacionados a uma instância de VM chamada nginx-vm que executa o COS 70 e reside em my-project.

gcloud logging read "resource.type=gce_instance AND \
    logName=projects/my-project/logs/cos_system AND \
    jsonPayload._HOSTNAME=nginx-vm AND \
    jsonPayload.SYSLOG_IDENTIFIER=docker" \
    --limit 10

Como visualizar registros de contêiner

Console

  1. No Console do Google Cloud, acesse a página Instâncias de VM.

    Acessar instâncias de VM

  2. Selecione a instância de VM em que você quer ver os registros do agente de inicialização.

  3. Em Registros, clique em Cloud Logging para ver os registros do Cloud Logging.

    Registra a porta serial 1.

  4. A página do Cloud Logging é carregada com um filtro de pesquisa padrão. Copie o valor de resource.labels.instance_id. Ele será usado mais tarde.

  5. Atualize o filtro de pesquisa para recuperar os registros de contêiner.

    resource.type="gce_instance"
    logName="projects/PROJECT_ID/logs/cos_containers"
    resource.labels.instance_id="INSTANCE_ID"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que contém a instância
    • INSTANCE_ID: o código da instância que você quer que receba o registro

gcloud

Use o comando gcloud logging read para ver os registros do contêiner.

  1. Determine o ID da instância em que você quer receber os registros:

    gcloud compute instances describe VM_NAME \
       --zone ZONE \
       --format="value(id)"
    

    Substitua:

    • VM_NAME: o nome da instância que você quer que receba os registros
    • ZONE: a zona em que a instância está localizada.
  2. Use o comando a seguir e filtre para visualizar os registros de contêiner da instância.

    gcloud logging read "resource.type=gce_instance AND \
        logName=projects/PROJECT_ID/logs/cos_containers AND \
        resource.labels.instance_id=INSTANCE_ID"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que contém a instância.
    • INSTANCE_ID: o ID da instância.

    Por exemplo, use o comando a seguir para visualizar os últimos 10 registros de contêiner no Cloud Logging de uma instância de VM que executa o COS 70, que existe em my-project e que tem um ID de instância como 555123456789012345.

    gcloud logging read "resource.type=gce_instance AND \
        logName=projects/my-project/logs/cos_containers AND \
        resource.labels.instance_id=555123456789012345" \
        --limit 10
    

Como especificar imagens ou famílias de imagens otimizadas para contêineres

Por padrão, instâncias de VM em contêiner ou modelos de instância são criados para usar a última imagem otimizada para contêiner compatível. Ela pertence ao projeto cos-cloud.

É possível modificar esse padrão com outra imagem do projeto cos-cloud. Para mais informações sobre famílias de imagens disponíveis e os atributos delas, consulte Como escolher a versão correta do Container-Optimized OS.

Por exemplo, depois de saber qual imagem você quer usar, na ferramenta gcloud, forneça a sinalização --image para modificar a imagem padrão otimizada para contêineres ou forneça o --image-family para escolher a imagem mais recente da família especificada no momento da criação da VM.

O exemplo a seguir cria uma instância de VM em contêiner que usa a imagem mais recente da família de imagens cos-dev:

gcloud compute instances create-with-container nginx-vm \
    --image-family cos-dev \
    --image-project cos-cloud \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.15

Como configurar regras de firewall

VMs em contêiner os iniciam com a rede configurada no modo host. Um contêiner compartilha a pilha de rede do host, e todas as respectivas interfaces estão disponíveis para o contêiner.

Por padrão, as regras de firewall do Google Cloud bloqueiam todas as conexões de entrada e autorizam todas as conexões de saída de uma instância de VM.

Crie regras de firewall para permitir conexões de entrada para a instância e, portanto, para o contêiner.

Como configurar opções para executar um contêiner

Configure as seguintes opções para executar seu contêiner:

  • Especifique uma política de reinicialização de contêiner.
  • Modifique o contêiner ENTRYPOINT, que é o comando padrão a ser executado na inicialização dele.
  • Transmita os argumentos ao comando ENTRYPOINT do contêiner.
  • Execute um contêiner em modo privilegiado.
  • Ative um diretório do host ou tmpfs como um volume de dados no contêiner.
  • Defina variáveis de ambiente.
  • Alocar um buffer para STDIN no tempo de execução do contêiner.
  • Aloque um pseudo-TTY.

Saiba mais sobre como configurar opções para executar o contêiner.

A seguir