Implementar contentores em instâncias e MIGs

Pode configurar uma instância do Compute Engine ou um modelo de instância para implementar e iniciar um contentor do Docker. O Compute Engine fornece uma imagem atualizada do SO otimizado para contentores (COS) com o Docker instalado e inicia o contentor quando a instância é iniciada.

Antes de começar

Optar por implementar contentores em instâncias e MIGs

Ao implementar contentores no Compute Engine, pode simplificar a implementação de apps enquanto controla a infraestrutura da instância.

  • Faça a gestão das instâncias que estão a executar contentores da mesma forma que trataria qualquer outra instância ao configurar e gerir a sua infraestrutura do Compute Engine.
  • Use processos e ferramentas familiares, como a CLI Google Cloud ou a API Compute Engine, para gerir as suas instâncias com contentores.
  • Crie serviços escaláveis através de grupos de instâncias geridas (GIGs) que executam contentores, que oferecem funcionalidades como escala automática, autorreparação, atualizações contínuas, implementações em várias zonas e balanceamento de carga.

Em alternativa, pode considerar a implementação no Google Kubernetes Engine para:

  • Executar um grande número de microsserviços
  • Ter um tempo de arranque do contentor mais rápido
  • Tire partido da orquestração automatizada do Kubernetes, incluindo atualizações automáticas, reparação automática de nós e escala automática

A execução de cada microsserviço numa instância separada no Compute Engine pode fazer com que a sobrecarga do sistema operativo seja uma parte significativa do seu custo. O Google Kubernetes Engine permite-lhe implementar vários contentores e grupos de contentores para cada instância, o que pode alocar recursos de instâncias de anfitrião de forma mais eficiente para microsserviços com uma pegada mais pequena.

Como funciona a implementação de contentores no Compute Engine

Os métodos comuns de implementação de software numa instância do Compute Engine incluem:

  • Implementar software no arranque da instância através de um script de arranque ou do cloud-init.
  • Criar uma imagem de disco de arranque personalizada com software pré-instalado.

Ambos os métodos na lista anterior combinam as tarefas de configuração da app e configuração do ambiente do sistema operativo. Enquanto programador, tem de monitorizar e resolver cuidadosamente todas as dependências de tempo de execução. Por exemplo, se duas apps em execução numa MV usarem versões diferentes da mesma biblioteca, tem de instalar ambas as versões e apontar para elas através de variáveis do sistema.

Apps executadas em diferentes versões da mesma biblioteca.
Uma instância com apps implementadas diretamente no sistema operativo

Em alternativa, pode implementar software num contentor numa instância ou num MIG. Um contentor transporta o software de aplicação e as bibliotecas necessárias, e está isolado das apps e bibliotecas do SO. Um contentor pode ser movido entre ambientes de implementação sem ter de lidar com versões de bibliotecas em conflito no contentor e no respetivo SO.

Um exemplo de apps implementadas em contentores.
Uma instância com apps implementadas num contentor

O processo seguinte descreve como implementar um contentor no Compute Engine:

  1. Agrupa a sua app e as bibliotecas necessárias numa imagem de Docker e publica a imagem no Artifact Registry ou num registo de terceiros, como o Docker Hub.
  2. Especifica um nome de imagem do Docker e a docker runconfiguração quando cria uma instância ou um modelo de instância para um MIG.

O Compute Engine executa as seguintes tarefas depois de fazer um pedido para criar uma instância:

  1. O Compute Engine cria uma instância de VM que usa uma imagem do SO otimizado para contentores fornecida pela Google. Esta imagem inclui um tempo de execução do Docker e software adicional responsável por iniciar o seu contentor.
  2. O Compute Engine armazena as definições do contentor nos metadados da instância na chave de metadados gce-container-declaration.
  3. Quando a VM é iniciada, a imagem do SO otimizado para contentores usa a configuração do comando docker run armazenada nos metadados da instância, extrai a imagem do contentor do repositório e inicia o contentor.
Usando a imagem do contentor e o comando docker run.
Passos para criar uma instância ou um grupo de instâncias geridas que execute um contentor

Limitações

  • Só pode implementar um contentor para cada instância. Considere o Google Kubernetes Engine se precisar de implementar vários contentores por instância.
  • Só pode implementar contentores a partir de um repositório público ou de um repositório privado do Artifact Registry ou do Container Registry ao qual tenha acesso. Outros repositórios privados não são suportados.

    Consulte a documentação de controlo de acesso do Artifact Registry ou do Container Registry para ver informações acerca das autorizações do registo privado.

  • Não pode mapear as portas de uma instância para as portas do contentor (opção -p do Docker). Para ativar o acesso aos seus contentores, consulte o artigo Publicar portas de contentores.

  • Só pode usar imagens do SO otimizado para contentores com este método de implementação.

  • Só pode usar esta funcionalidade através da Google Cloud consola ou da CLI Google Cloud e não da API.

Preparar um contentor para implementação

Escolha uma das seguintes abordagens para tornar a imagem do contentor acessível ao Compute Engine:

  • Carregue a sua imagem de Docker para o Artifact Registry.
  • Use quaisquer imagens de contentores disponíveis publicamente a partir do Docker Hub ou de outros registos.

Implementar um contentor numa nova instância

Pode implementar um contentor numa nova instância de VM através daGoogle Cloud consola ou da Google Cloud CLI.

Consola

O exemplo seguinte implementa um contentor a partir de uma imagem do Docker do Nginx fornecida pela Google, https://gcr.io/cloud-marketplace/google/nginx1:latest, numa instância de VM. Para usar uma imagem do Docker diferente, substitua a imagem do Docker do Nginx pela que quer nos passos seguintes.

Aceda a Criar uma instância

Se lhe for solicitado, selecione o seu projeto e clique em Continuar. É apresentada a página Criar uma instância e é apresentado o painel Configuração da máquina.

  1. No painel Configuração da máquina, aceda a Nome e especifique um nome para a instância. Para mais informações, consulte o artigo Convenção de nomenclatura de recursos.

  2. No menu de navegação, clique em SO e armazenamento. É apresentado o painel Sistema operativo e armazenamento.

  3. Aceda à secção Contentor e, de seguida, clique em Implementar contentor. No painel Configurar contentor apresentado, faça o seguinte:

    1. Especifique a imagem do contentor a usar. Considere os seguintes exemplos:
      • Para selecionar uma imagem de contentor do NGINX 1.12 a partir do Cloud Launcher, especifique gcr.io/cloud-marketplace/google/nginx1:1.12.
      • Para implementar uma imagem de contentor Apache a partir do Docker Hub, especifique sempre o nome completo da imagem do Docker, como docker.io/httpd:2.4.
    2. Opcional. Especifique outros parâmetros de configuração à sua escolha. Para mais informações sobre as opções de configuração do contentor, consulte o artigo Configurar opções para executar o contentor.
    3. Para terminar a configuração do contentor e regressar ao painel Sistema operativo e armazenamento, clique em Selecionar.
  4. Opcional: especifique outras opções de configuração. Para mais informações, consulte o artigo 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 inicia a instância e inicia o contentor.

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 comando gcloud compute instances create-with-container:

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

    Substitua o seguinte:

    • INSTANCE_NAME: name para a nova instância.
    • CONTAINER_IMAGE: nome da imagem do contentor.

    Por exemplo, o comando seguinte cria uma instância com o nome nginx-vm, que inicia e executa a imagem do contentor:

    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 implementar uma imagem de contentor Apache a partir do Docker Hub, especifique sempre o nome completo da imagem Docker:

    docker.io/httpd:2.4.

Atualizar um contentor numa instância

Pode atualizar uma imagem do Docker e as opções de configuração para executar o contentor numa instância através da Google Cloud consola ou da CLI Google Cloud.

Quando atualiza um contentor em execução, o Compute Engine executa dois passos:

  • Atualiza a declaração do contentor na instância. O Compute Engine armazena a declaração do contentor atualizada nos metadados da instância na gce-container-declaration chave de metadados.
  • Para e reinicia a instância para acionar a configuração atualizada, se a instância estiver em execução. Se a instância estiver parada, atualiza a declaração do contentor e mantém a instância parada. A instância transfere a nova imagem e inicia o contentor no arranque.

Consola

  1. Aceda à página Instâncias de VM.

    Aceder às instâncias de VM

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

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

  4. Especifique a nova imagem do contentor e atualize as opções para executar o contentor conforme necessário.

  5. Para guardar as alterações, clique em Guardar e reiniciar. O Compute Engine guarda as alterações e reinicia a instância automaticamente para fazer a atualização. Após o reinício da instância, esta transfere a nova imagem e inicia o contentor com a configuração atualizada.

gcloud

Atualize a declaração do contentor através do comando gcloud compute instances update-container. Por exemplo:

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

Este comando define a imagem do contentor como gcr.io/cloud-marketplace/google/nginx1:latest e reinicia a instância para acionar as alterações. Também pode atualizar qualquer uma das propriedades descritas em Configurar opções para executar o seu contentor adicionando as flags correspondentes.

Após o reinício da instância, esta transfere a nova imagem do contentor e inicia o contentor com a nova configuração.

Implementar um contentor num grupo de instâncias geridas

Pode implementar um contentor num novo grupo de instâncias gerido (MIG) através da Google Cloud consola ou da Google Cloud CLI seguindo estes passos:

  1. Crie um modelo de instância baseado numa imagem do Docker.

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

Consola

O exemplo seguinte cria um modelo de instância que implementa um contentor a partir de uma imagem do Docker do Nginx (gcr.io/cloud-marketplace/google/nginx1:15) fornecida pela Google num MIG. Para usar outras imagens do Docker, substitua gcr.io/cloud-marketplace/google/nginx1:15 no exemplo seguinte pela imagem que quer usar.

  1. Aceda à página Modelos de instâncias.

    Aceda a Modelos de instâncias

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

  3. Em Contentor, selecione Implementar imagem do contentor.

  4. Em Imagem do contentor, especifique o nome da imagem do Docker e configure as opções para executar o contentor. Por exemplo, pode especificar gcr.io/cloud-marketplace/google/nginx1:15 para a imagem do contentor.

  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 do Docker com o comando gcloud compute instance-templates create-with-container:

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

Também pode configurar as opções para executar o contentor.

Por exemplo, o comando seguinte 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 deste 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 com o novo modelo de instância.

Agora que tem um modelo de instância, pode criar um MIG que usa o modelo de instância. Por exemplo, para criar um MIG usando a CLI gcloud e o nginx-template que 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

Atualizar um grupo de instâncias gerido que executa um contentor

Pode atualizar um grupo de instâncias gerido (MIG) para implementar uma nova versão de uma imagem do Docker ou uma nova versão da imagem do SO otimizado para contentores.

Atualizar um MIG para uma nova versão de uma imagem de contentor

Pode implementar uma nova versão de uma imagem do Docker num MIG através do atualizador do grupo de instâncias gerido em três passos:

  1. Prepare uma nova imagem do Docker para implementação.
  2. Crie um modelo de instância com base na nova imagem do Docker da mesma forma que cria um modelo baseado em contentores.
  3. Atualize um MIG para o novo modelo de instância através do atualizador do grupo de instâncias geridas.

Atualizar um grupo de instâncias gerido para uma nova versão da imagem do SO otimizado para contentores

A Google atualiza as imagens do SO otimizado para contentores regularmente e, por isso, é recomendável aplicar essas atualizações aos MIGs contentorizados sem alterar a imagem do Docker. Pode atualizar um MIG para uma nova versão de uma imagem do SO otimizado para contentores através da Google Cloud consola ou da CLI Google Cloud em dois passos:

  1. Crie um modelo de instância com base na versão atual da sua imagem do Docker, da mesma forma que cria um modelo baseado em contentores para um novo MIG. A versão suportada mais recente de uma imagem do SO otimizado para contentores é usada por predefinição.
  2. Atualize um MIG com o novo modelo de instância através do atualizador do grupo de instâncias geridas.

Ligar-se a um contentor através de SSH

Pode estabelecer ligação a um contentor numa instância através de SSH. Use a CLI gcloud para executar gcloud compute ssh com a flag --container:

gcloud compute ssh INSTANCE_NAME --container CONTAINER_NAME

Substitua o seguinte:

  • INSTANCE_NAME: o nome da instância
  • CONTAINER_NAME: o nome do contentor

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

Monitorizar contentores no Compute Engine

Para monitorizar as suas instâncias que executam uma imagem do SO otimizado para contentores, use o agente Node Problem Detector, que comunica com o Cloud Monitoring e comunica métricas relacionadas com o estado. O agente está integrado nas imagens do SO otimizado para contentores a partir da versão Milestone 77.

Para ativar o agente, em contentores que usam imagens com a versão 88 ou posterior do Milestone, edite a secção de metadados personalizados e defina google-monitoring-enabled como true.

Para encontrar outras formas de ativar o Node Problem Detector, visite o artigo Ativar a monitorização da integridade.

O agente Node Problem Detector suporta as métricas na lista de métricas que começam com guest/.

Para interagir com as métricas recolhidas pelo agente, visite o Explorador de métricas.

Ver registos

Pode ver três tipos de registos relacionados com contentores:

  1. Registos do agente de arranque, também conhecidos como registos do konlet. O agente de arranque analisa a configuração do contentor e executa tarefas para iniciar o contentor numa instância do Compute Engine.

  2. Os registos de eventos do Docker comunicam eventos de contentores, incluindo eventos de início e fim de contentores.

  3. Os registos do seu contentor incluem o STDOUT de apps que são executadas no seu contentor.

Ver registos de agentes de arranque

Os registos do agente de arranque estão disponíveis na consola série, através do serviço de sistema journald incluído na imagem do SO e através do Cloud Logging.

Ver registos do agente de arranque na consola de série

Consola

  1. Aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Selecione a instância para a qual quer ver os registos do agente de arranque.

  3. Em Registos, clique em Porta de série 1 (consola) para ver os registos da consola de série.

gcloud

Use o comando get-serial-port-output para ver os registos na porta série da instância.

gcloud compute instances get-serial-port-output INSTANCE_NAME

Substitua INSTANCE_NAME pelo nome da instância.

Por exemplo, use o seguinte comando para ver o resultado da porta série de uma instância denominada nginx-vm:

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

Visualizar registos de agentes de arranque no journald

  1. Estabeleça ligação à sua instância com um contentor através do SSH.
  2. Execute o comando sudo journalctl para ver os registos de arranque da instância e de arranque do contentor. Use o seguinte comando para filtrar os registos do agente de arranque do contentor (konlet).

    sudo journalctl -u konlet*
    

Ver registos de agentes de arranque no registo

Consola

  1. Aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Selecione a instância para a qual quer ver os registos do agente de arranque.

  3. Em Registos, clique em Cloud Logging para ver os registos do Cloud Logging.

  4. Introduza um filtro de pesquisa para obter registos de agentes de arranque.

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto que contém a instância
    • INSTANCE_NAME: o nome da instância para a qual quer obter registos

gcloud

Use o comando gcloud logging read com um filtro adequado para ver os registos do agente de arranque do contentor.

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 o seguinte:

  • PROJECT_ID: o ID do projeto que contém a instância
  • INSTANCE_NAME: o nome da instância para a qual quer obter registos

Por exemplo, use o seguinte comando para ver os últimos 10 registos de agentes de arranque no Logging para uma instância denominada nginx-vm que está a executar 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

Visualizar registos de eventos do Docker

Pode ver os registos de eventos do Docker no journald e no Cloud Logging.

Visualizar registos de eventos do Docker no journald

  1. Estabeleça ligação à sua instância com um contentor através do SSH.
  2. Execute o comando sudo journalctl com o seguinte filtro para ver os registos de eventos do Docker.

    sudo journalctl -u docker-events-collector
    

Visualizar registos de eventos do Docker no Logging

Consola

  1. Aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Selecione a instância para a qual quer ver os registos do agente de arranque.

  3. Em Registos, clique em Cloud Logging para ver os registos do Cloud Logging.

  4. Introduza o seguinte filtro de pesquisa para obter registos de eventos do Docker.

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto que contém a instância
    • INSTANCE_NAME: o nome da instância para a qual quer obter registos

gcloud

Use o comando gcloud logging read com um filtro adequado para ver os registos 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 o seguinte:

  • PROJECT_ID: o ID do projeto que contém a instância
  • INSTANCE_NAME: o nome da instância para a qual quer obter registos

Por exemplo, use o seguinte comando para ver os últimos 10 registos de eventos do Docker no Logging para uma instância denominada nginx-vm que esteja a executar o COS 70 e que exista 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

Ver registos de contentores

Consola

  1. Aceda à página Instâncias de VM.

    Aceder às instâncias de VM

  2. Selecione a instância para a qual quer ver os registos do agente de arranque.

  3. Em Registos, clique em Cloud Logging para ver os registos do Cloud Logging.

    Regista a porta de série 1.

  4. A página do Cloud Logging é carregada com um filtro de pesquisa predefinido. Copie o valor de resource.labels.instance_id. Vai usá-lo mais tarde.

  5. Atualize o filtro de pesquisa para obter registos de contentores.

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto que contém a instância
    • INSTANCE_ID: o ID da instância para a qual quer obter registos

gcloud

Use o comando gcloud logging read para ver os registos do contentor.

  1. Determine o ID da instância para a qual quer obter registos:

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

    Substitua o seguinte:

    • INSTANCE_NAME: o nome da instância para a qual quer obter registos
    • ZONE: a zona onde a instância está localizada
  2. Use o seguinte comando e filtro para ver os registos do contentor 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 o seguinte:

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

    Por exemplo, use o seguinte comando para ver os últimos 10 registos de contentores no Cloud Logging para uma instância que esteja a executar o COS 70, que exista em my-project e que tenha um ID da 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
    

Especificar imagens otimizadas para contentores ou famílias de imagens

As instâncias ou os modelos de instâncias em contentores são criados para usar a imagem otimizada para contentores suportada mais recente por predefinição. A imagem pertence ao projeto cos-cloud.

Pode substituir esta predefinição por outra imagem do projeto cos-cloud. Para obter informações sobre as famílias de imagens disponíveis e os respetivos atributos, consulte o artigo Escolher a versão certa do SO otimizado para contentores.

Por exemplo, depois de saber que imagem quer usar, na CLI gcloud, forneça a flag --image para substituir a imagem otimizada para contentores predefinida 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 seguinte cria uma instância contentorizada 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

Configurar regras de firewall

As instâncias contentorizadas iniciam contentores cuja rede está definida para o modo de anfitrião. Um contentor partilha a pilha de rede do anfitrião e todas as interfaces do anfitrião estão disponíveis para o contentor.

Por predefinição, Google Cloud as regras de firewall bloqueiam todas as ligações recebidas a uma instância e permitem todas as ligações enviadas a partir de uma instância.

Crie regras de firewall para permitir ligações recebidas à sua instância e, por conseguinte, ao contentor.

Configurar opções para executar um contentor

Pode configurar as seguintes opções para executar o seu contentor:

  • Especifique uma política de reinício do contentor.
  • Substituir contentor ENTRYPOINT (comando predefinido a executar no início do contentor).
  • Transmita argumentos para o comando ENTRYPOINT do contentor.
  • Executar um contentor num modo privilegiado.
  • Montar um diretório do anfitrião ou tmpfs como um volume de dados no contentor.
  • Defina variáveis de ambiente.
  • Atribua um buffer para STDIN no tempo de execução do contentor.
  • Atribua um pseudo-TTY.

Saiba como configurar opções para executar o seu contentor.

O que se segue?