Use um registro de imagem privado sem segredos

O GKE na AWS oferece uma maneira de extrair imagens privadas do Artifact Registry ou do Container Registry sem precisar usar um segredo do Kubernetes. Anteriormente, você precisava executar as seguintes etapas:

  1. Crie uma conta de serviço do Google Identity and Access Management (IAM).
  2. Conceda à conta de serviço permissões para acessar o registro privado.
  3. Baixe a chave da conta de serviço e salve-a como um segredo do Kubernetes no seu cluster.
  4. Faça referência a este segredo no seu manifesto YAML para pods ou implantações para que eles possam acessar imagens do repositório de contêineres privado.
  5. Gire e gerencie regularmente as chaves associadas à conta de serviço do Google IAM.

O GKE na AWS elimina todas essas etapas manuais e lida automaticamente com a autenticação e a autorização necessárias para extrair imagens privadas.

Antes de começar

Para executar as etapas desta página, primeiro conclua o seguinte:

Verifique as imagens no Registro de Artefatos

Para concluir o restante dessas etapas, você precisa de uma imagem de contêiner. Obtenha o nome das suas imagens de contêiner executando as seguintes etapas:

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

    gcloud auth configure-docker
    

    O Google Cloud CLI registra um auxiliar de credencial para todos os registros do Docker compatíveis com o Google.

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

    docker images
    

    O Docker se conecta ao Artifact Registry e retorna as imagens disponíveis no seu repositório. Por exemplo, a resposta a seguir mostra uma imagem de contêiner chamada 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 você não tiver uma imagem de contêiner pronta, crie uma seguindo as etapas em Implantando um aplicativo em contêiner .

Crie Pods com imagens privadas sem segredos de extração de imagens

Para criar um Pod que possa acessar uma imagem de contêiner privada de um registro, você não precisa mais fornecer o campo spec.imagePullSecrets na especificação do seu Pod. Para configurar seu Pod, siga estas etapas:

  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 Pod.
    • CONTAINER_NAME : o nome do contêiner dentro do Pod.
    • LOCATION : a Google Cloud região que contém seu registro. Por exemplo, us-west1 .
    • PROJECT_NAME : o nome do projeto do Google que hospeda o repositório do Artifact Registry, que pode ser o mesmo do projeto do seu cluster. Se o repositório estiver em um projeto diferente, consulte Usar o Artifact Registry quando ele não estiver no mesmo projeto que o seu cluster para obter etapas 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 seu cluster com kubectl :

    kubectl apply -f YAML_FILE_NAME
    

    Substitua YAML_FILE_NAME pelo nome do seu arquivo YAML.

Exemplo de criação de Pods sem extração de imagem Secrets

Aqui está um exemplo de criação de um Pod do Kubernetes sem a necessidade de extrair a imagem Secrets. O Pod extrai a imagem hello-app do Artifact Registry.

  1. Para extrair a imagem hello-app , copie o seguinte YAML em um arquivo chamado 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 seu 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 status Running .

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

Crie implantações com imagens privadas sem segredos de extração de imagens

Para criar uma implantação que possa acessar uma imagem de contêiner privada de um registro, você não precisa mais fornecer o campo spec.imagePullSecrets na especificação da implantação. Para configurar sua implantação, siga estas etapas:

  1. Crie uma definição de implantaçã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 implantação.
    • NUMBER_OF_REPLICAS : quantas instâncias do Pod definido na Implantação devem estar em execução a qualquer momento.
    • CONTAINER_NAME : o nome do contêiner dentro do Pod.
    • LOCATION : a Google Cloud região que contém seu registro. Por exemplo, us-west1 .
    • PROJECT_NAME : o nome do projeto do Google que hospeda o repositório do Artifact Registry, que pode não ser o mesmo do projeto do seu cluster. Se o repositório estiver em um projeto diferente, consulte Usar o Artifact Registry quando ele não estiver no mesmo projeto que o seu cluster para obter etapas 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 seu cluster com kubectl .

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

Exemplo de criação de uma implantação sem extração de imagem Secrets

Aqui está um exemplo de criação de uma implantação sem segredos de extração de imagem. A implantação extrai uma imagem hello-app do Artifact Registry.

  1. Crie um arquivo chamado 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:

  2. Aplique a configuração ao seu cluster com kubectl .

    kubectl apply -f hello-deployment.yaml
    
  3. Confirme se sua implantação está sendo executada com kubectl pods .

    kubectl get pods --selector=app=products
    

    A saída exibe três Pods Running .

    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 ele não estiver no mesmo projeto que seu cluster

Para usar um repositório do Artifact Registry que esteja em um Projeto Google diferente daquele que contém seu cluster, execute as seguintes etapas:

Conceda à conta de serviço para as instâncias de máquina virtual do pool de nós do seu cluster, conhecida como Agente de Serviço de Máquina do Pool de Nós , as permissões necessárias para acessar esse registro.

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

Esta etapa garante que seu cluster possa recuperar artefatos do registro nesse projeto separado.

Substitua o seguinte:

  • AR_PROJECT_ID : o ID do projeto do Google que hospeda o Artifact Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT : a conta de serviço para o pool de nós do seu 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 permissões suficientes para acessar imagens no repositório do Artifact Registry.

Usar o Registro de Contêineres do Google privado

Para integrar um Google Container Registry privado ao seu cluster do GKE na AWS, independentemente da localização do projeto do Google, siga estas etapas:

Permita que o Node Pool Machine Service Agent, a conta de serviço para as instâncias de máquina virtual do pool de nós do seu cluster, acesse o Container Registry:

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

Esta etapa permite o acesso da conta de serviço do cluster às imagens de contêiner privadas.

Substitua o seguinte:

  • GCR_PROJECT_ID : o ID do projeto que hospeda o Container Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT : a conta de serviço do pool 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 acesso suficiente ao Registro de Contêineres. Tenha cuidado com o acesso amplo com storage.objectViewer .

Limpar

Para remover os recursos que você 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 arquivo YAML no qual você definiu o Pod.
  • DEPLOYMENT_YAML_FILE : o nome do arquivo YAML no qual você definiu a implantação.

O que vem a seguir