Como criar e configurar instâncias

Há duas maneiras de criar e configurar instâncias do Compute Engine que executam o Container-Optimized OS do Google.

Em cenários simples em que você quer executar um único contêiner em uma ou todas as VMs de um grupo de instâncias gerenciadas, é possível especificar uma imagem de contêiner e parâmetros de configuração opcionais ao definir a instância ou o modelo de instância. O Compute Engine cria a instância com a versão mais recente do Container-Optimized OS e inicia o contêiner especificado quando a VM é iniciada.

Para cenários avançados em que é possível implantar vários contêineres e configurar as opções do Docker usando cloud-init, você pode criar uma instância do Compute Engine com a opção da imagem do Container-Optimized OS e continuar configurando-a conforme necessário.

Como criar uma instância simples

Use este método para implantar um único contêiner em uma VM usando a versão mais recente do Container-Optimized OS. Você pode executar esta tarefa usando o Console do Google Cloud ou a ferramenta gcloud.

Console

  1. Acesse a página "Instâncias de VMs".

    Acessar a página "Instâncias de VMs"

  2. Clique em Criar instância.

  3. Especifique um Nome para sua instância.

  4. Na seção Contêiner, marque a caixa de seleção Implantar uma imagem de contêiner nesta instância de VM.

  5. Especifique a Imagem de contêiner a ser usada.

    • É possível especificar uma imagem do Container Registry ou do Artifact Registry. Por exemplo:
      • gcr.io/cloud-marketplace/google/nginx1:1.15 seleciona uma imagem de contêiner NGINX 1.15 do Google Cloud Marketplace.
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 seleciona um exemplo de imagem hello-app do Artifact Registry.
    • Se você usar uma imagem de contêiner do Docker Hub, sempre especifique o nome completo da imagem do Docker. Por exemplo, forneça o seguinte nome para implantar uma imagem do contêiner Apache: docker.io/httpd:2.4
  6. Se quiser, clique em Opções de contêiner avançadas. Para mais informações, consulte Como configurar opções para executar seu contêiner.

  7. Clique em Criar para criar a instância, inicializá-la e iniciar o contêiner.

gcloud

Para criar uma instância simples da VM, execute o seguinte comando:

gcloud compute instances create-with-container instance-name \
    --container-image image-name

Substitua:

  • instance-name: o nome da nova instância
  • image-name: o nome da imagem do contêiner.

Por exemplo, o comando a seguir cria uma nova instância de VM chamada nginx-vm, que iniciará e executará a imagem do contêiner, gcr.io/cloud-marketplace/google/nginx1:1.15:

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

Da mesma forma, crie uma nova instância de VM chamada hello-app, que iniciará e executará um contêiner de amostra no Artifact Registry:

gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Ao usar uma imagem de contêiner do Docker Hub, você precisa sempre especificar um nome da imagem completo do Docker. Por exemplo, forneça o seguinte nome para implantar uma imagem do contêiner Apache:

docker.io/httpd:2.4

Para executar um único contêiner em cada VM em um grupo de instâncias gerenciadas, especifique o nome da imagem do contêiner ao definir o modelo da instância. Consulte Como criar um modelo de instância com uma imagem de contêiner para mais informações.

Como criar uma instância para cenários avançados

Use esse método para selecionar uma imagem específica do Container-Optimized OS, implantar vários contêineres e usar cloud-init para configuração avançada.

Visualizar imagens disponíveis

As imagens do Container-Optimized OS estão disponíveis na lista de imagens do Console do Google Cloud com o prefixo cos. Eles são hospedados no projeto cos-cloud. Você também pode ver todas as liberações atualmente disponíveis na linha de comandos, executando o seguinte comando:

gcloud compute images list --project cos-cloud --no-standard-images

A saída será assim:

NAME                       PROJECT    FAMILY      DEPRECATED  STATUS
cos-69-10895-385-0         cos-cloud  cos-69-lts              READY
cos-73-11647-534-0         cos-cloud  cos-73-lts              READY
cos-77-12371-251-0         cos-cloud  cos-77-lts              READY
cos-81-12871-103-0         cos-cloud  cos-81-lts              READY
cos-beta-81-12871-44-0     cos-cloud  cos-beta                READY
cos-dev-84-13078-0-0       cos-cloud  cos-dev                 READY
cos-stable-81-12871-103-0  cos-cloud  cos-stable              READY

Criar uma instância

Você pode criar uma instância usando o Console do Google Cloud, a ferramenta gcloud ou a API.

Console

Para executar uma instância do Compute Engine com um SO e Docker otimizados para contêiner instalado, execute o seguinte:

  1. Abra a página de criação de instâncias do Compute Engine no Console do Google Cloud.

    Criar uma nova instância do Compute Engine

  2. Especifique um Nome para sua instância.

  3. Na seção Contêineres, desmarque a caixa de seleção Implantar uma imagem de contêiner nesta instância de VM. Essa opção é útil se você quiser implantar um único contêiner na VM.

  4. Na seção Disco de inicialização, selecione uma imagem do Container-Optimized OS.

  5. Clique em Criar para criar e inicializar a instância.

gcloud

Revise as imagens disponíveis atualmente e use o comando a seguir para criar uma instância de imagem de nó cos:

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

Substitua:

  • instance-name: o nome da instância de VM.
  • image-name: o nome da imagem do Container-Optimized OS para a instância, obtida da lista de imagens disponíveis. Do nosso exemplo anterior, podemos usar cos-beta-81-12871-44-0.
  • compute-zone: a zona de computação da instância.
  • machine-type-name: o tipo de máquina a ser usado para essa nova instância. O tipo padrão é n1-standard-1.

Por exemplo, o comando a seguir cria uma instância chamada cos-test usando a imagem cos-beta-67-10575-13-0:

gcloud compute instances create cos-test \
    --image cos-beta-67-10575-13-0 \
    --image-project cos-cloud \
    --zone us-east1-d \
    --machine-type n1-standard-1

Se você quiser o Container-Optimized OS dev, beta ou stable disponível mais recente, use o sinalizador --image-family, como o seguinte:

gcloud compute instances create instance-name \
    --image-family cos-beta \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

Você pode adicionar a sinalização --preemptible para instâncias experimentais únicas.

API

Na API, crie uma solicitação normal para criar uma instância, mas inclua uma imagem de origem do Container-Optimized OS. Por exemplo:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/compute-zone/instances

{
  'machineType': 'zones/compute-zone/machineTypes/machine-type-name',
  'name': 'instance-name',
  'networkInterfaces': [
    {
      'accessConfigs': [
        {
          'type': 'ONE_TO_ONE_NAT',
          'name': 'External NAT'
        }
      ],
      'network': 'global/networks/default'
    }
  ],
  'disks': [
    {
      'type': 'PERSISTENT',
      'boot': true,
      'autoDelete': true,
      'initializeParams': {
        'sourceImage': 'projects/cos-cloud/global/images/family/cos-stable'
      }
    }
  ]
}

Como configurar uma instância

Em alguns casos, será necessário fazer outras configurações quando a instância for inicializada. Você pode usar a ferramenta cloud-init com o Container-Optimized OS para aplicar as informações de configuração fornecidas em um formato cloud-config.

Como usar cloud-init com o formato de configuração do Cloud

As imagens do Container-Optimized OS incluem cloud-init como forma de configurar a instância quando ela for inicializada. A ferramenta cloud-init espera a configuração no valor da chave user-data dos metadados da instância. A ferramenta cloud-init entende vários formatos.

Veja um exemplo de arquivo cloud-init que mostra como criar uma conta de usuário e criar um serviço do sistema pertencente a esse usuário que controla o gerenciamento de um contêiner de caixa de entrada do Docker:

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=mycloudservice busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

# Optional once-per-boot setup. For example: mounting a PD.
bootcmd:
- fsck.ext4 -tvy /dev/[DEVICE_ID]
- mkdir -p /mnt/disks/[MNT_DIR]
- mount -t ext4 -O ... /dev/[DEVICE_ID] /mnt/disks/[MNT_DIR]

Para criar uma instância de VM do Container-Optimized OS que faça referência a esse arquivo cloud-init, use a sinalização de linha de comando --metadata-from-file. Supondo que o arquivo cloud-init é chamado de filename no diretório atual, o comando a seguir cria uma instância do Container-Optimized OS e aciona cloud-init atribuindo o conteúdo do arquivo para o user-data nos metadados da instância:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

Substitua:

  • instance-name: o nome da instância de VM.
  • filename: o nome do arquivo de metadados.

É possível definir outras sinalizações de metadados ao criar instâncias do Container-Optimized OS. Como essas propriedades são pares de chave-valor simples, é possível usar a sinalização --metadata no comando gcloud compute instances create para criar as propriedades. O exemplo anterior pode ser expandido para coletar estatísticas de uso e coleta de despejo de falhas com:

gcloud compute instances create instance-name \
    --image-family cos-stable \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename \
    --metadata=cos-metrics-enabled=true

Outras sinalizações de metadados

Chave de metadados Descrição Comportamento padrão
cos-update-strategy Especifica o comportamento de atualização. O único valor aceito é: update_disabled. Se não for definida, o download e a instalação de todas as atualizações do canal serão feitos automaticamente.
cos-metrics-enabled Permite a coleta de despejo de memória. Os valores podem ser:
true
false (padrão).
Desativada por padrão

Conexão a uma instância

Você pode fazer o SSH na sua instância da VM executando a imagem do nó cos da da mesma maneira do SSH em outras instâncias do Compute Engine.

Exemplo:

gcloud compute ssh instance-name \
    --project project-id \
    --zone compute-zone

Como executar scripts de inicialização

Você pode especificar um script de inicialização por meio do servidor de metadados usando a chave de metadados startup-script. Use a ferramenta de linha de comando gcloud, a API ou o Console do Cloud para fornecer um script de inicialização. Consulte Como executar scripts de inicialização para ver mais detalhes.

Como iniciar e interromper serviços systemd

Para iniciar o serviço especificado no arquivo hello.service, execute o seguinte comando:

sudo systemctl start hello.service

Para parar o serviço especificado no arquivo hello.service, execute o seguinte comando:

sudo systemctl stop hello.service

Sincronização de tempo

Antes do marco 85, o Container-Optimized OS usava o serviço systemd-timesyncd do systemd para sincronizar o relógio do sistema local com um servidor Remote Time Protocol (NTP) por meio do protocolo STPTP. As entradas a seguir no arquivo de configuração /etc/systemd/timesyncd.conf mostram os valores de configuração padrão comentados para ajudar o administrador a fazer as alterações necessárias:

cat /etc/systemd/timesyncd.conf
# comments omitted for brevity
[Time]
#NTP=
#FallbackNTP=metadata.google.internal
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Assim, a distância raiz máxima aceitável é de 5 segundos e os intervalos mínimo e máximo de pesquisa para mensagens NTP são 32 e 2048 segundos, respectivamente.

A partir do marco 85, o Container-Optimized OS usa o serviço chronyd para sincronizar o relógio do sistema local com um servidor Remote Time Protocol (NTP) por meio do protocolo NTP. As entradas a seguir no arquivo de configuração /etc/chrony/chrony.conf mostram valores padrão de configuração comentados para ajudar o administrador a fazer as alterações desejadas:

cat /etc/chrony/chrony.conf
# Use custom NTP servers
server metadata.google.internal prefer iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

O servidor NTP é definido a partir da resposta DHCP do eth0, que geralmente é o servidor de metadados do Compute Engine:

networkctl status eth0 | grep NTP
             NTP: 169.254.169.254

Como alterar o fuso horário

O fuso horário padrão do Container-Optimized OS do Google é UTC0. Crie uma vinculação simbólica ao fuso horário desejado como no exemplo a seguir:

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime

Observe que /etc não tem estado. Portanto, o fuso horário será redefinido para o padrão (UTC0) a cada reinicialização.

Como desativar atualizações automáticas

Há duas maneiras de desativar as atualizações automáticas. O método preferido é usar a chave de metadados cos-update-strategy:

--metadata cos-update-strategy=update_disabled

Também é possível desativar as atualizações automáticas em uma instância em execução com systemctl:

sudo systemctl stop update-engine
sudo systemctl mask update-engine