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 realizar essa tarefa usando o console do Google Cloud ou a gcloud CLI.
Console
Acesse a página "Instâncias de VMs".
Clique em Criar instância.
Especifique um Nome para sua instância.
Na seção Contêiner, marque a caixa de seleção Implantar uma imagem de contêiner nesta instância de VM.
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 imagemhello-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
- É possível especificar uma imagem do Container Registry ou do Artifact Registry.
Por exemplo:
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.
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 no console do Google Cloud
lista de imagens 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
É possível criar uma instância usando o console do Google Cloud, a CLI 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:
Abra a página de criação de instâncias do Compute Engine no console do Google Cloud.
Especifique um Nome para sua instância.
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.
Na seção Disco de inicialização, selecione uma imagem do Container-Optimized OS.
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
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/image-name' } } ] }
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 uma maneira de configurar a instância quando ela é 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 filename no diretório
atual, o seguinte comando cria uma instância do Container-Optimized OS e
aciona cloud-init
atribuindo o conteúdo do arquivo à chave user-data
nos metadados da instância:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata-from-file user-data=filename
Substitua:
- instance-name: o nome da instância de VM.
- image-name: o nome da imagem do Container-Optimized OS para a instância. Por exemplo,
--image=cos-113-18244-85-29
. - 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. Além disso, a partir do marco 97,
é possível definir sinalizações de metadados no projeto
metadados usando a sinalização --metadata
no comando gcloud compute project-info add-metadata
. Sinalizações
definidas no nível da instância têm precedência sobre as sinalizações definidas no
para envolvidos no projeto.
O exemplo anterior pode ser expandido para coletar estatísticas de uso e coleta de despejo de falhas com o seguinte comando:
gcloud compute instances create instance-name \ --image image-name \ --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 automática. O valor pode ser update_enabled , update_disabled ou não definido.Se não definido, o comportamento padrão de atualização automática para o marco será usado. Se ativado, o comportamento depende do canal de lançamento:
|
|
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
. Você pode usar o
Google Cloud CLI, a API ou o console do Google Cloud para fornecer
script de inicialização. Consulte Como executar scripts de inicialização
para mais detalhes.
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.
Ativar ou desativar as atualizações automáticas
Há duas maneiras de ativar ou desativar as atualizações automáticas. O método preferido
é definir a chave de metadados da instância cos-update-strategy
como update_enabled
ou
update_disabled
, respectivamente. Exemplo:
gcloud compute instances create instance-name \ --image image-name \ --image-project cos-cloud \ --metadata cos-update-strategy=update_disabled
A partir do marco 97, Também é possível desativar ou ativar as atualizações automáticas nos metadados do projeto:
gcloud compute project-info add-metadata \ --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