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 definir quando 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 as instâncias que estão executando contêineres da mesma forma que você trataria qualquer outra instância ao configurar e gerenciar sua 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 gerenciados de instâncias (MIGs) que executam contêineres. Eles oferecem recursos como escalonamento automático, recuperação automática, atualizações graduais, 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. Com o Google Kubernetes Engine, é possível implantar vários contêineres e grupos de contêineres para cada instância, o que aloca recursos de instância de host de maneira mais eficiente para microsserviços com uma pegada 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:

  • Implantação de software na inicialização da instância usando um script de inicialização ou cloud-init.
  • Criar uma imagem do disco de inicialização personalizada com software pré-instalado.

Os dois métodos na lista anterior combinam as tarefas de configuração do app e configuração 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 executados em uma VM usarem versões diferentes da mesma biblioteca, instale as duas versões e aponte para elas usando variáveis de sistema.

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

Também é possível implantar software em um contêiner em uma instância ou em um MIG. Um contêiner carrega o software de aplicativo e as bibliotecas necessárias, além de ser isolado dos apps e das bibliotecas do SO. Um contêiner pode ser movido entre ambientes de implantação sem lidar com versões de biblioteca conflitantes no contêiner e no SO.

Um 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 app e as bibliotecas necessárias em uma imagem Docker e a publica no Artifact Registry ou em um registro de terceiros, como o Docker Hub.
  2. Especifique um nome de imagem Docker e a configuração docker run ao criar uma instância ou um modelo de instância 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 software adicional 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 gerenciado de instâncias que executa um contêiner

Limitações

  • Só é possível implantar um contêiner por 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 pode ser usado apenas no console do Google Cloud ou na Google Cloud CLI, 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 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 Google Cloud console ou a Google Cloud CLI.

Console

O exemplo a seguir implanta um contêiner de uma imagem Docker do Nginx fornecida pelo Google, https://gcr.io/cloud-marketplace/google/nginx1:latest, em uma instância de VM. Para usar uma imagem Docker diferente, substitua a imagem do 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 é exibido.

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

    1. Especifique a Imagem do contêiner para usar. Confira estes exemplos:
      • 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 de sua escolha. Para mais informações sobre as opções de configuração de contêiner, consulte Como configurar opções para executar seu contêiner.
    3. Para terminar de configurar o contêiner e voltar 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 da instância.

  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. No console do Google Cloud , ative o Cloud Shell.

    Ativar o Cloud Shell

    Na parte inferior do console do Google Cloud , uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a CLI do Google Cloud já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.

  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 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 Google Cloud CLI.

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 baixa a nova imagem e inicia o contêiner na inicialização.

Console

  1. 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. 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. Depois que a instância é reiniciada, ela 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. 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 gerenciado de instâncias

Para implantar um contêiner em um novo grupo gerenciado de instâncias (MIG) usando o Google Cloud console ou a Google Cloud CLI, siga estas etapas:

  1. Crie um modelo de instância com base em uma imagem 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 de uma imagem Docker do Nginx (gcr.io/cloud-marketplace/google/nginx1:15) fornecida pelo Google em um MIG. Para usar outras imagens 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 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

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

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 a seguir cria um modelo de instância com o nome nginx-template, que inclui informações sobre a imagem Docker. Uma instância criada com base nesse modelo inicia e executa a imagem 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 gerenciado de instâncias executando um contêiner

É possível atualizar um grupo gerenciado de instâncias (MIG) para implantar uma 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 uma nova versão de uma imagem Docker em um MIG usando o atualizador de grupo gerenciado de instâncias em três etapas:

  1. Prepare uma nova imagem Docker para implantação.
  2. Crie um modelo de instância com base na nova imagem Docker da mesma forma que você cria um modelo com base em contêineres.
  3. Atualize um MIG para o novo modelo de instância usando o atualizador de grupo gerenciado de instâncias.

Como atualizar um grupo gerenciado de instâncias 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 Google Cloud ou a Google Cloud CLI:

  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 mais recente compatível 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: 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 as instâncias que executam uma imagem do Container-Optimized OS, use o agente Node Problem Detector, que se comunica com o Cloud Monitoring e informa métricas relacionadas à integridade. O agente é integrado às imagens do SO 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 do contêiner analisa a configuração do contêiner e executa tarefas para iniciá-lo em uma instância do Compute Engine.

  2. Os logs de eventos do Docker informam eventos de contêiner, incluindo eventos de início e interrupção de contêiner.

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

Como ver registros do agente de inicialização do contêiner

Os registros do agente de inicialização do contêiner estão disponíveis no console serial, pelo serviço do sistema journald incluído na imagem do SO e pelo Cloud Logging.

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

Console

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

    Acessar instâncias de VM

  2. Selecione a instância para a qual você quer ver os registros do agente de inicialização do contêiner.

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

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 do contêiner no 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 agênticos do agente de inicialização do contêiner (konlet).

    sudo journalctl -u konlet*
    

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

Console

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

    Acessar instâncias de VM

  2. Selecione a instância para a qual você quer ver os registros do agente de inicialização do contêiner.

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

  4. Insira um filtro de pesquisa para recuperar os registros agênticos de inicialização do contêiner.

    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 agênticos 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 para a qual você quer receber registros.

Por exemplo, use o comando a seguir para conferir os últimos 10 registros do agente de inicialização do contêiner no Logging de uma instância chamada nginx-vm que está executando o COS 70 e que 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 logs de eventos do Docker

É possível conferir os logs de eventos do Docker no journald e no Cloud Logging.

Como visualizar logs de eventos do Docker no 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 conferir os logs de eventos do Docker.

    sudo journalctl -u docker-events-collector
    

Como visualizar logs de eventos do Docker no Logging

Console

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

    Acessar instâncias de VM

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

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

  4. Insira o filtro de pesquisa a seguir para recuperar os logs 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 de que você quer receber registros.

gcloud

Use o comando gcloud logging read com um filtro adequado para ver os logs 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 logs de eventos do Docker no Logging de uma instância chamada nginx-vm que está executando o COS 70 e que 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 de VM.

    Acessar instâncias de VM

  2. Selecione a instância em que você quer ver os registros agênticos 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 ver os últimos 10 registros de contêiner no Cloud Logging para uma instância que está executando o COS 70, que existe em my-project e que tem um ID de instância de 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

As instâncias ou modelos de instância em contêineres são criados para usar a mais recente imagem otimizada para contêineres compatível por padrão. A imagem pertence ao projeto cos-cloud.

É possível substituir esse padrão por 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êineres iniciam contêineres com a rede definida para o modo de 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 Cloudbloqueiam todas as conexões de entrada para uma instância e permitem todas as conexões de saída de uma instância.

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.
  • Substitua o contêiner ENTRYPOINT (comando padrão a ser executado na inicialização do contêiner).
  • 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