Como implantar contêineres em instâncias e MIGs


É possível configurar uma instância do Compute Engine ou um modelo de instância para implantar e iniciar um contêiner do Docker. O Compute Engine fornece uma imagem atualizada do Container-Optimized OS (COS) com o Docker instalado e inicia o contêiner quando a instância é iniciada.

Antes de começar

Como implantar contêineres em instâncias e MIGs

Ao implantar contêineres no Compute Engine, você simplifica a implantação de apps e controla a infraestrutura da instância.

  • Gerencie instâncias que executam contêineres da mesma forma que você trataria qualquer outra ao configurar e gerenciar a infraestrutura do Compute Engine.
  • Use ferramentas e processos conhecidos, como a Google Cloud CLI ou a API Compute Engine, para gerenciar instâncias com contêineres.
  • 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.

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 instância separada no Compute Engine pode levar o sistema operacional a sobrecarregar grande parte do seu custo. O Google Kubernetes Engine permite implantar vários contêineres e grupos de contêineres para cada instância, o que pode alocar recursos de instâncias 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 do Compute Engine incluem:

  • Implantar o software durante a inicialização da instância 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 dois métodos na lista anterior 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 apps em execução em uma VM usarem 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 com apps implantados diretamente no sistema operacional

Como alternativa, é possível implantar o software em um contêiner em uma instância ou em 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 entre os ambientes de implantação sem precisar lidar com versões conflitantes da biblioteca no contêiner e no SO dele.

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

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

  1. Você agrupa o aplicativo e as bibliotecas necessárias em uma imagem do Docker e a publica no Artifact 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 ou um modelo para um MIG.

Depois que você faz uma solicitação para criar uma instância, 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 iniciar o 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 ou um grupo de instâncias gerenciadas para executar um contêiner

Limitações

  • Só é possível implantar um contêiner para cada instância. Considere usar o Google Kubernetes Engine caso precise implantar vários contêineres por instância.
  • Só é possível implantar contêineres de um repositório público ou de um repositório particular do Artifact Registry ou do Container Registry que pode ser acessado. Outros repositórios particulares não são compatíveis.

    Consulte a documentação de controle de acesso do Artifact Registry ou do Container Registry para informações sobre permissões de registro particular.

  • Não é possível mapear as portas de uma instância 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 só pode ser usado no console do Google Cloud ou na CLI do Google Cloud, 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 Artifact 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

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

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 Docker diferente, substitua a imagem Nginx Docker pela que você quer nas etapas a seguir.

Acesse "Criar uma instância"

Se solicitado, selecione o projeto e clique em Continuar. A página Criar uma instância aparece e mostra o painel Configuração da máquina.

  1. No painel Configuração da máquina, acesse Nome e especifique um nome para a instância. Saiba mais em Convenção de nomenclatura de recursos.

  2. No menu de navegação, clique em SO e armazenamento. O painel Sistema operacional e armazenamento aparece.

  3. Acesse a seção Contêiner e clique em Implantar contêiner. No painel Configure container que aparece, faça o seguinte:

    1. Especifique a Imagem do contêiner para usar. Confira os exemplos a seguir:
      • Para selecionar uma imagem de contêiner NGINX 1.12 no Cloud Launcher, especifique gcr.io/cloud-marketplace/google/nginx1:1.12.
      • Para implantar uma imagem de contêiner Apache do Docker Hub, sempre especifique o nome completo da imagem do Docker, como docker.io/httpd:2.4.
    2. Opcional. Especifique outros parâmetros de configuração. Para mais informações sobre as opções de configuração de contêineres, consulte Como configurar opções para executar o contêiner.
    3. Para terminar de configurar o contêiner e retornar ao painel Sistema operacional e armazenamento, clique em Selecionar.
  4. Opcional: especifique outras opções de configuração. Para mais informações, consulte Opções de configuração durante a criação de instâncias.

  5. Para concluir a criação da instância, clique em Criar.

    Depois de criar a instância, o Compute Engine a inicia e lança o contêiner.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Execute o gcloud compute instances create-with-containercomando:

    gcloud compute instances create-with-container INSTANCE_NAME \
        --container-image=CONTAINER_IMAGE
    

    Substitua:

    • INSTANCE_NAME: nome da nova instância.
    • CONTAINER_IMAGE: nome da imagem do contêiner.

    Por exemplo, o comando a seguir cria uma instância chamada nginx-vm, que inicia e executa a imagem do contêiner:

    gcr.io/cloud-marketplace/google/nginx1:1.12

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

    Para implantar uma imagem de contêiner Apache do Docker Hub, sempre especifique o nome completo da imagem do Docker:

    docker.io/httpd:2.4

Como atualizar um contêiner em uma instância

É possível atualizar uma imagem do Docker e as opções de configuração para executar o contêiner em uma instância usando o console do Google Cloud ou a CLI do Google Cloud.

Quando você atualiza um contêiner em execução, o Compute Engine executa duas etapas:

  • 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 faz o download da nova imagem e inicia o contêiner na inicialização.

Console

  1. Acesse a página Instâncias da 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. Para salvar as alterações, clique em Salvar e reiniciar. O Compute Engine salva as alterações e reinicia a instância automaticamente para aplicar a atualização. Após a reinicialização da instância, será feito o download da nova imagem e a inicialização do contêiner com a configuração atualizada.

gcloud

Use o comando gcloud compute instances update-container para atualizar a declaração do contêiner. Por 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 CLI do Google Cloud, siga estas etapas:

  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, substitua gcr.io/cloud-marketplace/google/nginx1:15 no exemplo a seguir pela imagem que você quer usar.

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

Você também pode configurar 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 criada a partir desse modelo inicia e executa a imagem do Docker gcr.io/cloud-marketplace/google/nginx1:15 quando a instância é 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 CLI 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 usando o Console do Google Cloud ou a CLI do Google Cloud em duas etapas:

  1. Crie um modelo de instância com base na versão atual da sua imagem do Docker, da mesma maneira que você cria um modelo baseado em contêiner 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 conectar-se a um contêiner usando o SSH

É possível se conectar a um contêiner em uma instância usando SSH. Use a CLI gcloud para executar gcloud compute ssh com a sinalização --container:

gcloud compute ssh INSTANCE_NAME --container CONTAINER_NAME

Substitua:

  • INSTANCE_NAME: o nome da instância.
  • 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 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. Acesse a página Instâncias da VM.

    Acessar instâncias de VM

  2. Selecione a instância em que você quer acessar 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 INSTANCE_NAME

Substitua INSTANCE_NAME pelo nome da instância.

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

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

Como visualizar registros do agente de inicialização em journald

  1. Conecte-se à sua instância com um contêiner usando o SSH.
  2. Execute o comando sudo journalctl para conferir os registros de inicialização da instância 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. Acesse a página Instâncias da VM.

    Acessar instâncias de VM

  2. Selecione a instância em que você quer acessar 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="INSTANCE_NAME"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que contém a instância
    • INSTANCE_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=INSTANCE_NAME"

Substitua:

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

Por exemplo, use o comando a seguir para conferir os últimos 10 registros do agente de inicialização no Logging de uma instância chamada nginx-vm que executa o COS 70 e existe 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 visualizar 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. Acesse a página Instâncias da VM.

    Acessar instâncias de VM

  2. Selecione a instância em que você quer acessar 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="INSTANCE_NAME"
    jsonPayload.SYSLOG_IDENTIFIER="docker"
    

    Substitua:

    • PROJECT_ID: o ID do projeto que contém a instância
    • INSTANCE_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=INSTANCE_NAME AND \
    jsonPayload.SYSLOG_IDENTIFIER=docker"

Substitua:

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

Por exemplo, use o comando a seguir para conferir os últimos 10 registros de eventos do Docker no Logging para uma instância chamada nginx-vm que executa o COS 70 e existe 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 ver registros de contêineres

Console

  1. Acesse a página Instâncias da VM.

    Acessar instâncias de VM

  2. Selecione a instância em que você quer acessar 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 INSTANCE_NAME \
       --zone ZONE \
       --format="value(id)"
    

    Substitua:

    • INSTANCE_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 conferir os últimos 10 registros de contêiner no Cloud Logging de uma instância que executa o COS 70, que existe em my-project e que tem um ID de instância 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 ou modelos de instâncias em contêiner são criados para usar a última imagem otimizada para contêiner compatível. A imagem 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 CLI gcloud, forneça a flag --image para modificar a imagem padrão otimizada para contêineres ou forneça a flag --image-family para escolher a imagem mais recente da família especificada no momento da criação da instância.

O exemplo a seguir cria uma instância 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

As instâncias em contêiner iniciam contêineres 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, Google Cloud as regras de firewall bloqueiam todas as conexões de entrada para uma instância e permitem todas as conexões de saída dela.

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