Como usar o Container Registry com o Google Cloud

Os recursos de computação no Google Cloud são integrados ao Container Registry para facilitar o acesso. Neste documento, descrevemos as configurações de acesso necessárias para enviar e extrair imagens no Google Cloud Platform.

Requisitos

É necessário configurar as permissões e escopos corretos para VMs usadas para extrair ou enviar imagens.

Permissões IAM

As permissões do IAM precisam ser configuradas para a conta de serviço que acessa o intervalo de armazenamento do Container Registry.

  • Para extrair imagens privadas do Docker, a conta de serviço usada por instâncias de VM deve ter a permissão read para o intervalo de armazenamento da imagem.
  • Para enviar imagens privadas do Docker, a conta de serviço usada por instâncias de VM deve ter a permissão read-write ou full-control para o intervalo de armazenamento da imagem.

Consulte Como configurar o controle de acesso para saber detalhes sobre as permissões necessárias.

Access scopes

Os escopos de acesso definem os escopos OAuth padrão usados nas solicitações da ferramenta gcloud. As instâncias de VM que enviam ou extraem imagens por push ou pull precisam ter o escopo de acesso de armazenamento correto para funcionar com o Container Registry.

Para extrair somente imagens, defina a permissão read-only para seus intervalos de armazenamento. Para extrair e enviar imagens, defina a permissão read-write para seus intervalos de armazenamento.

Como definir escopos em uma instância de VM

Para criar uma nova instância de VM e especificar o escopo, use a opção --scope.

  • Para uma instância com permissões "somente leitura", execute o comando:

    gcloud compute instances create INSTANCE \
        --scopes https://www.googleapis.com/auth/devstorage.read_only
        
  • Para uma instância com permissões de "leitura e gravação", execute o comando:

    gcloud compute instances create INSTANCE \
        --scopes https://www.googleapis.com/auth/devstorage.read_write
        

Para alterar a conta de serviço e os escopos de acesso de uma instância, você precisa interromper a instância temporariamente. Para interromper a instância, leia a documentação sobre Como interromper uma instância. Depois de alterar a conta de serviço ou os escopos de acesso, lembre-se de reiniciar a instância. Use um dos seguintes comandos para alterar a conta de serviço ou os escopos de acesso da instância interrompida.

  • Para definir permissões "somente leitura", execute o comando:

    gcloud compute instances set-service-account INSTANCE --scopes=storage-ro
        
  • Para definir permissões de "leitura e gravação", execute o comando:

    gcloud compute instances set-service-account INSTANCE --scopes=storage-rw
        

Como definir escopos em um cluster do Google Kubernetes Engine

Por padrão, novos clusters do Google Kubernetes Engine são criados com permissões somente leitura para intervalos de armazenamento. Para definir o escopo de armazenamento read-write ao criar um cluster do Google Kubernetes Engine, use a opção --scopes. Por exemplo, o comando a seguir cria um cluster com os escopos bigquery,

`storage-rw`, and `compute-ro`:

        gcloud container clusters create example-cluster \
      --scopes=bigquery,storage-rw,compute-ro
    

Para mais informações sobre escopos que podem ser definidos ao criar um novo cluster, consulte a documentação do comando gcloud container clusters create.

Compute Engine

Se a instância de VM para envio ou extração de imagens e o intervalo de armazenamento do Container Registry estiverem no mesmo projeto do Google Cloud, a conta de serviço padrão do Compute Engine será configurada com as permissões apropriadas para enviar ou extrair imagens. Se a instância de VM estiver em um projeto diferente ou se a instância usar uma conta de serviço diferente, configure o acesso ao intervalo de armazenamento usado pelo repositório.

Por padrão, uma VM do Compute Engine tem o escopo de acesso read-only configurado para os intervalos de armazenamento. Para enviar imagens particulares do Docker, sua instância deve ter o escopo de acesso ao armazenamento read-write configurado conforme descrito em Escopos de acesso.

Instâncias do Compute Engine otimizadas para contêineres

Para mais informações sobre como iniciar uma instância do Compute Engine otimizada para contêineres usando uma imagem no registro, consulte Como iniciar um contêiner do Docker via cloud-config.

Para ver mais informações, acesse Criar e configurar instâncias.

Google Kubernetes Engine

O Google Kubernetes Engine usa a conta de serviço configurada nas instâncias de VM dos nós do cluster para enviar e extrair imagens por push e pull.

Se o cluster do Google Kubernetes Engine e do Container Registry estiverem no mesmo projeto do Google Cloud, a conta de serviço padrão do Compute Engine será configurada com as permissões apropriadas para enviar ou extrair imagens. Se o cluster estiver em um projeto diferente ou se as VMs do cluster usarem uma conta de serviço diferente, configure o acesso ao intervalo de armazenamento usado pelo repositório.

Por padrão, uma VM do Compute Engine tem o escopo de acesso read-only configurado para os intervalos de armazenamento. Para enviar imagens particulares do Docker, sua instância deve ter o escopo de acesso ao armazenamento read-write configurado conforme descrito em Escopos de acesso.

Como executar uma imagem

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

kubectl run [NAME] --image=[HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]
    

onde:

  • [NAME] é o nome do recurso;
  • [HOSTNAME] está listado em Location no console. É uma das quatro opções: gcr.io, us.gcr.io, eu.gcr.io ou asia.gcr.io.
  • [PROJECT-ID] é o ID do projeto do seu Console do Google Cloud. Caso o ID do projeto contenha dois pontos (:), consulte Projetos com escopo de domínio.
  • [IMAGE] é o nome da imagem no Container Registry;
  • [TAG] é a tag que identifica a versão da imagem no Container Registry. Se você não especificar uma tag, o Container Registry procurará a tag padrão latest.

Para mais informações sobre os comandos do Kubernetes, consulte Visão geral do kubectl (em inglês). Se suas imagens estiverem em outro projeto, você precisará explicitamente conceder acesso de leitura à conta de serviço usada pelo cluster do Google Kubernetes Engine no intervalo de armazenamento em que estão as imagens.

Ambiente flexível do App Engine

É possível usar o Ambiente flexível do App Engine para personalizar um ambiente de execução existente, como Java 8, ou fornecer o próprio ambiente de execução fornecendo uma imagem personalizada do Docker ou Dockerfile.

O ambiente flexível compila automaticamente as imagens de contêiner usando o Cloud Build e as armazena no Container Registry.

Se a instância de VM que você está usando para enviar ou extrair imagens e o intervalo de armazenamento do Container Registry estiverem no mesmo projeto do Google Cloud, a conta de serviço padrão do Compute Engine será configurada com as permissões apropriadas para enviar ou extrair imagens. Se as VMs estiverem em um projeto diferente ou se as VMs do cluster usarem uma conta de serviço diferente, configure o acesso ao intervalo de armazenamento usado pelo repositório.

Por padrão, uma VM do Compute Engine tem o escopo de acesso read-only configurado para os intervalos de armazenamento. Para enviar imagens particulares do Docker, sua instância deve ter o escopo de acesso ao armazenamento read-write configurado conforme descrito em Escopos de acesso.

Como implantar no App Engine

É possível implantar uma imagem hospedada pelo Container Registry no App Engine usando a ferramenta de linha de comando gcloud.

É possível usar o comando gcloud beta app gen-config no diretório raiz de sua imagem para criar automaticamente o arquivo app.yaml, necessário para implantar no App Engine. Se preferir, você mesmo pode gravar o arquivo.

Depois de criar o arquivo de configuração do App Engine, gerar a imagem do Docker e enviá-la ao Container Registry, implante essa imagem no App Engine. Basta executar o comando a seguir:

gcloud app deploy --image-url=[HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]
    

onde:

  • [HOSTNAME] está listado em Location no console. É uma das quatro opções: gcr.io, us.gcr.io, eu.gcr.io ou asia.gcr.io.
  • [PROJECT-ID] é o ID do projeto do seu Console do Google Cloud. Caso o ID do projeto contenha dois pontos (:), consulte Projetos com escopo de domínio.
  • [IMAGE] é o nome da imagem no Container Registry;
  • [TAG] é a tag que identifica a versão da imagem no Container Registry. Se você não especificar uma tag, o Container Registry procurará a tag padrão latest.