Como implantar no Google Kubernetes Engine

O Google Kubernetes Engine pode extrair imagens diretamente dos repositórios do Docker. Algumas versões incluem suporte pré-configurado para extrair imagens de repositórios Docker do Artifact Registry.

Requisitos

Nesta seção, descrevemos os requisitos para fazer a integração com o GKE.

Permissões

Por padrão, o GKE usa a conta de serviço do Compute Engine como a identidade dos nós. Essa conta de serviço padrão tem acesso somente leitura aos repositórios do Artifact Registry no mesmo projeto do Google Cloud.

Se os repositórios estiverem em um projeto diferente ou se você usar uma conta de serviço gerenciada pelo usuário como a identidade dos nós, será necessário conceder o papel de leitor do Artifact Registry à conta de serviço. Para fazer upload para repositórios de nós, conceda o papel de gravador do Artifact Registry.

Para mais informações, consulte a documentação sobre controle de acesso.

Versão GKE

A tabela a seguir lista as versões mínimas necessárias do GKE para criar clusters com permissões padrão para extrair contêineres dos repositórios do Docker no mesmo projeto.

Versão Patch mínimo necessário
1.14 1.14.8-gke.37
1.14.9-gke.28
1.14.10-gke.22
1.15 1.15.7-gke28 1.15.8-gke.6
1.15.9-gke.1
1.16 1.16.4-gke.28
1.16.5-gke.0
1.17 1.17.0-gke.5

Se a versão do GKE for anterior à versão mínima, configure imagePullSecrets do Kubernetes para permitir que o GKE extraia imagens.

Se o GKE estiver em um projeto diferente do Artifact Registry, conceda permissões do Artifact Registry à conta de serviço usada pelo nó do GKE. Os nós usam a conta de serviço padrão do Compute Engine.

Como executar uma imagem

É possível executar uma imagem do Artifact Registry em um cluster do Google Kubernetes Engine usando o comando a seguir:

kubectl run [NAME] --image=LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG

onde:

Para mais informações sobre os comandos do Kubernetes, consulte Visão geral do kubectl (em inglês).

Como solucionar problemas de imagens de nó containerd

A partir da versão 1.19 do nó do GKE, a imagem do nó padrão para nós do Linux é o SO do Container-Optimized com containerd (cos_containerd) em vez do Container-Optimized OS com Docker (cos).

Embora o binário do Docker esteja disponível atualmente em nós do Linux que usam o containerd como um ambiente de execução, não recomendamos usá-lo. O Docker não gerencia os contêineres que o Kubernetes executa em nós. Portanto, não é possível usá-lo para ver ou interagir com contêineres do Kubernetes em comandos do Docker ou com a API Docker.

Para depurar ou solucionar problemas em nós do Linux, use o containerd por meio da ferramenta de linha de comando portátil crictl, criada para os ambientes de execução de contêiner do Kubernetes. O crictl é compatível com funcionalidades comuns para visualizar contêineres e imagens, ler registros e executar comandos nos contêineres.

Para mais informações, consulte o guia do usuário básico e a documentação do GKE sobre o containerd.

Para os nós do Windows Server, o daemon containerd é executado como um serviço do Windows chamado containerd. Os registros estão disponíveis no seguinte diretório de registros: C:\etc\kubernetes\logs\containerd.log e são exibidos no Explorador de registros em LOG NAME: "container-runtime".

Como extrair de um repositório público do Artifact Registry

Depois de implantar e gerar uma imagem em um cluster do GKE com nós containerd, conecte-se a uma instância de VM usando SSH e execute comandos do crictl para solucionar problemas.

Os repositórios do Artifact Registry público não requerem autenticação. crictl também pode ser usado para extrair imagens em repositórios particulares do Artifact Registry.

Console

  1. No Console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Na lista de instâncias de máquina virtual, clique na seta ao lado de SSH na linha da instância à qual você quer se conectar.

    Botão "SSH" ao lado do nome da instância.

  3. Selecione "Abrir na janela do navegador" ou o método de conexão de sua preferência nas opções suspensas.

  4. O Console do Cloud abre uma nova janela de terminal. Use crictl para extrair uma imagem do Artifact Registry:

    crictl pull IMAGE_LOCATION:TAG
    

    A saída será assim:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    Ao extrair uma imagem de um repositório particular do Artifact Registry, você precisa se autenticar no repositório. Use um token de acesso para fornecer suas credenciais.

gcloud

  1. Verifique se você tem a versão mais recente da ferramenta de linha de comando gcloud

    gcloud components update
    
  2. Conecte-se à VM:

    gcloud compute ssh --project=PROJECT_ID \
     --zone=ZONE \
     VM_NAME
    

    Substitua:

    • PROJECT_ID: o ID do projeto que contém a VM.
    • ZONE: o nome da zona em que a VM está localizada
    • VM_NAME: O nome da VM.

    Se você definiu propriedades padrão para a ferramenta de linha de comando gcloud, poderá omitir as sinalizações --project e --zone desse comando. Exemplo:

    gcloud compute ssh VM_NAME
    
  3. Se você ainda não tiver criado uma chave SSH, um keygen SSH gerará uma para você. Digite uma senha longa ou deixe em branco quando solicitado.

  4. Use crictl para extrair uma imagem do Artifact Registry:

    crictl pull IMAGE_LOCATION:TAG
    
  5. A saída será assim:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

    Ao extrair uma imagem de um repositório particular do Artifact Registry, você precisa se autenticar no repositório. Use um token de acesso para fornecer suas credenciais.

Como extrair de um repositório particular do Artifact Registry

Console

  1. No Console do Google Cloud, acesse a página Instâncias de VMs.

    Acessar instâncias de VM

  2. Na lista de instâncias de máquina virtual, clique na seta ao lado de SSH na linha da instância à qual você quer se conectar.

    Botão "SSH" ao lado do nome da instância.

  3. Selecione "Abrir na janela do navegador" nas opções da lista suspensa.

  4. O Console do Cloud abre uma nova janela de terminal. Gere um token de acesso à conta de serviço do Compute Engine usando curl.

    curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
    

    A resposta tem a aparência do exemplo a seguir.

    "access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc
    HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T
    sh","expires_in":3526,"token_type":"Bearer"}
  5. Copie o valor de access_token da saída retornada sem as aspas.

  6. Extraia a imagem usando crictl pull --creds e o valor access_token copiado na etapa anterior.

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG

    A saída será assim:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

gcloud

  1. Verifique se você tem a versão mais recente da ferramenta de linha de comando gcloud

    gcloud components update
    
  2. Conecte-se à VM:

    gcloud compute ssh --project=PROJECT_ID \
     --zone=ZONE \
     VM_NAME
    

    Substitua as seguintes variáveis:

    • PROJECT_ID: o ID do projeto que contém a VM.
    • ZONE: o nome da zona em que a VM está localizada
    • VM_NAME: O nome da VM.

    Se você definiu propriedades padrão para a ferramenta de linha de comando gcloud, poderá omitir as sinalizações --project e --zone desse comando. Exemplo:

    gcloud compute ssh VM_NAME
    
  3. Se você ainda não tiver criado uma chave SSH, um keygen SSH gerará uma para você. Digite uma senha longa ou deixe em branco quando solicitado.

  4. Gere um token de acesso à conta de serviço do Compute Engine usando curl.

    curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
    

    A saída será assim:

    "access_token":"ya29.c.KpkBCQgdwv6LrZ2tjrCpG6snWwPMX29LzMeUmAV_Hq_XaxUurfXcCfGZfASGh_KbdmUYTvkuV3sh-WaSBplEskdP6Tc
    HDsTv4B9hMyvoL4M9HrzKHuKTa1ZGj_3iQ1lwq_dAMxAPGjxEVKexatwN2KP0EAWyb6R55Cuu8ItgLf9f4pm9lC5zH4Qo0fkxPUsnCGRBe4AYxEpN6T
    sh","expires_in":3526,"token_type":"Bearer"}
  5. Copie o valor de access_token da saída retornada sem as aspas.

  6. Extraia a imagem usando crictl pull --creds e o valor access_token copiado na etapa anterior.

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" IMAGE_LOCATION:TAG

    A saída será assim:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

crictl permite que os desenvolvedores depurem o ambiente de execução sem precisar configurar componentes do Kubernetes. Para uma lista completa de comandos, consulte os documentos do crictl e os documentos de depuração do Kubernetes.