Use um registo de imagens privado sem segredos

O GKE na AWS oferece uma forma de extrair imagens privadas do Artifact Registry ou do Container Registry sem ter de usar um segredo do Kubernetes. Anteriormente, tinha de realizar os seguintes passos:

  1. Crie uma conta de serviço da gestão de identidade e de acesso (IAM) da Google.
  2. Conceda autorizações à conta de serviço para aceder ao registo privado.
  3. Transfira a chave da conta de serviço e guarde-a como um segredo do Kubernetes no seu cluster.
  4. Faça referência a este segredo no manifesto YAML para pods ou implementações para que possam aceder a imagens do repositório de contentores privado.
  5. Alterne e faça a gestão regularmente das chaves associadas à conta de serviço do Google IAM.

O GKE on AWS elimina todos estes passos manuais e processa automaticamente a autenticação e a autorização necessárias para obter imagens privadas.

Antes de começar

Para realizar os passos nesta página, conclua primeiro o seguinte:

Verifique se existem imagens no Artifact Registry

Para concluir os restantes passos, precisa de uma imagem de contentor. Obtenha o nome das suas imagens de contentores seguindo os passos abaixo:

  1. Configure a ferramenta de linha de comandos do Docker para autenticar no Artifact Registry com o SDK Cloud da Google:

    gcloud auth configure-docker
    

    A CLI do Google Cloud regista um auxiliar de credenciais para todos os registos do Docker suportados pela Google.

  2. Confirme se o Artifact Registry inclui uma imagem com o comando:docker images

    docker images
    

    O Docker liga-se ao Artifact Registry e devolve as imagens disponíveis no seu repositório. Por exemplo, a resposta seguinte mostra uma imagem de contentor com o nome hello-app no repositório PROJECT_NAME em us-west1-docker.pkg.dev.

    REPOSITORY                                                            TAG          IMAGE ID       CREATED          SIZE
    us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app   v1           f7cfe0d58569   21 minutes ago   11.5MB
    

Se não tiver uma imagem de contentor pronta, crie uma seguindo os passos em Implementar uma aplicação em contentores.

Crie pods com imagens privadas sem segredos de obtenção de imagens

Para criar um Pod que possa aceder a uma imagem de contentor privada a partir de um registo, já não tem de fornecer o campo spec.imagePullSecrets na especificação do Pod. Para configurar o Pod, siga estes passos:

  1. Crie uma definição de pod sem o campo spec.imagePullSecrets:

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    Substitua o seguinte:

    • POD_NAME: o nome do agrupamento.
    • CONTAINER_NAME: o nome do contentor no interior do agrupamento.
    • LOCATION: a região Google Cloud que contém o seu registo. Por exemplo, us-west1.
    • PROJECT_NAME: o nome do projeto Google que aloja o seu repositório do Artifact Registry, que pode ser o mesmo que o projeto do seu cluster. Se o repositório estiver num projeto diferente, consulte o artigo Use o Artifact Registry quando não estiver no mesmo projeto que o cluster para ver passos adicionais.
    • REPOSITORY_NAME: o nome do seu repositório.
    • IMAGE_NAME: o nome da imagem.
    • IMAGE_VERSION: a versão da imagem.
  2. Aplique a configuração ao cluster com kubectl:

    kubectl apply -f YAML_FILE_NAME
    

    Substitua YAML_FILE_NAME pelo nome do seu ficheiro YAML.

Exemplo de criação de pods sem segredos de obtenção de imagens

Segue-se um exemplo de criação de um pod do Kubernetes sem a necessidade de segredos de obtenção de imagens. O pod extrai a imagem hello-app do Artifact Registry.

  1. Para extrair a imagem hello-app, copie o seguinte YAML para um ficheiro com o nome hello-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: hello-pod
    spec:
      containers:
      - name: hello-container
        image: us-west1-docker.pkg.dev/example-project/hello-repo/hello-app:v1
    
  2. Aplique a configuração ao cluster com kubectl:

    kubectl apply -f hello-pod.yaml
    
  3. Confirme se o pod está em execução com kubectl get:

    kubectl get pod/hello-pod
    

    A resposta inclui um Pod com o estado Running.

    NAME        READY   STATUS    RESTARTS   AGE
    hello-pod   1/1     Running   0          15s
    

Crie implementações com imagens privadas sem segredos de obtenção de imagens

Para criar uma implementação que possa aceder a uma imagem de contentor privada a partir de um registo, já não tem de fornecer o campo spec.imagePullSecrets na especificação de implementação. Para configurar a implementação, siga estes passos:

  1. Crie uma definição de implementação sem o campo spec.imagePullSecrets:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: DEPLOYMENT_NAME
    spec:
      replicas: NUMBER_OF_REPLICAS
      template:
        spec:
          containers:
          - name: CONTAINER_NAME
            image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    Substitua o seguinte:

    • DEPLOYMENT_NAME: o nome da sua implementação.
    • NUMBER_OF_REPLICAS: quantas instâncias do Pod definido na implementação devem estar em execução em qualquer altura.
    • CONTAINER_NAME: o nome do contentor no interior do agrupamento.
    • LOCATION: a região Google Cloud que contém o seu registo. Por exemplo, us-west1.
    • PROJECT_NAME: o nome do projeto Google que aloja o seu repositório do Artifact Registry, que pode não ser o mesmo que o projeto do seu cluster. Se o repositório estiver num projeto diferente, consulte o artigo Use o Artifact Registry quando não estiver no mesmo projeto que o cluster para ver passos adicionais.
    • REPOSITORY_NAME: o nome do seu repositório.
    • IMAGE_NAME: o nome da imagem.
    • IMAGE_VERSION: a versão da imagem.
  2. Aplique a configuração ao cluster com kubectl.

    kubectl apply -f name-of-your-yaml-file.yaml
    

Exemplo de criação de uma implementação sem segredos de obtenção de imagens

Segue-se um exemplo de criação de uma implementação sem segredos de obtenção de imagens. A implementação extrai uma imagem hello-app do Artifact Registry.

  1. Crie um ficheiro denominado hello-deployment.yaml com o seguinte conteúdo:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app-deployment
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
            env:
            - name: "PORT"
              value: "50001"
    

    Substitua o seguinte:

    • LOCATION: a região Google Cloud que contém o seu registo. Por exemplo, us-west1.
    • PROJECT_NAME: o nome do projeto Google que aloja o seu repositório do Artifact Registry, que pode não ser o mesmo que o projeto do seu cluster. Se o repositório estiver num projeto diferente, consulte o artigo Use o Artifact Registry quando não estiver no mesmo projeto que o cluster para ver passos adicionais.
  2. Aplique a configuração ao cluster com kubectl.

    kubectl apply -f hello-deployment.yaml
    
  3. Confirme que a implementação está a ser executada com o kubectl pods.

    kubectl get pods --selector=app=products
    

    O resultado apresenta 3 Running pods.

    NAME                                    READY   STATUS    RESTARTS   AGE
    hello-app-deployment-67d9c6d98c-b69f2   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-d6k5c   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-p2md5   1/1     Running   0          14m
    

Use o Artifact Registry quando não estiver no mesmo projeto que o cluster

Para usar um repositório do Artifact Registry que esteja num projeto Google diferente do que contém o cluster, siga estes passos:

Conceda à conta de serviço das instâncias de máquinas virtuais do conjunto de nós do cluster, conhecida como o agente do serviço da máquina do conjunto de nós, as autorizações necessárias para aceder a este registo.

gcloud projects add-iam-policy-binding AR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

Este passo garante que o cluster pode obter artefactos do registo nesse projeto separado.

Substitua o seguinte:

  • AR_PROJECT_ID: o ID do projeto Google que aloja o Artifact Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT: a conta de serviço do conjunto de nós do cluster, que tem o seguinte formato: service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
  • ROLE: a função roles/artifactregistry.reader ou uma função personalizada que concede autorizações suficientes para aceder a imagens no repositório do Artifact Registry.

Use o Google Container Registry privado

Para integrar um registo de contentores Google privado com o seu cluster do GKE no AWS, independentemente da respetiva localização do projeto Google, siga estes passos:

Permita que o agente de serviço da máquina do conjunto de nós, a conta de serviço das instâncias de máquinas virtuais do conjunto de nós do cluster, aceda ao Container Registry:

gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

Este passo permite o acesso da conta de serviço do cluster às imagens de contentores privados.

Substitua o seguinte:

  • GCR_PROJECT_ID: o ID do projeto que aloja o Container Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT: a conta de serviço do conjunto de nós, no formato service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com.
  • ROLE: escolha storage.objectViewer ou uma função personalizada para ter acesso suficiente ao Container Registry. Tenha cuidado com o acesso amplo com o storage.objectViewer.

Limpar

Para remover os recursos que criou nesta página, execute estes comandos:

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

Substitua o seguinte:

  • POD_YAML_FILE: o nome do ficheiro YAML no qual definiu o pod.
  • DEPLOYMENT_YAML_FILE: o nome do ficheiro YAML no qual definiu a implementação.

O que se segue?