Use um registo de imagens privado

Por predefinição, a sua instalação do GKE no AWS pode aceder a imagens de contentores públicos. Este tópico explica como usar o GKE na AWS com um repositório de imagens de contentores privado, como o Artifact Registry.

A partir da versão 1.28, o GKE on AWS oferece uma forma de extrair imagens privadas do Artifact Registry ou do Container Registry sem ter de usar um segredo do Kubernetes. Para ver detalhes, consulte o artigo Use um registo de imagens privado sem segredos.

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 ferramenta de linha de comandos gcloud regista um assistente de credenciais para todos os registos do Docker suportados pela Google.

  2. Confirme que 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 abaixo mostra uma imagem de contentor denominada 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 uma conta de serviço

Os seus clusters são autenticados através de uma conta de serviço da gestão de identidade e de acesso (IAM).

Para criar uma nova conta de serviço, siga estes passos:

  1. Crie uma conta de serviço da IAM com a CLI Google Cloud.

    gcloud iam service-accounts create ACCOUNT_NAME
    

    Substitua ACCOUNT_NAME pelo nome da nova Google Cloud conta de serviço.

  2. Conceda à conta de serviço autorizações do Artifact Registry.

    gcloud projects add-iam-policy-binding PROJECT_NAME \
      --member serviceAccount:ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --role roles/artifactregistry.reader
    

    Substitua o seguinte:

    • PROJECT_NAME com o seu Google Cloud projeto
    • ACCOUNT_NAME com o nome da sua Google Cloud conta de serviço
  3. Transfira a chave da conta de serviço da conta.

    gcloud iam service-accounts keys create registry-access-key.json \
      --iam-account ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
    

    Substitua o seguinte:

    • PROJECT_NAME
    • ACCOUNT_NAME

Tem tudo pronto para configurar o cluster de utilizadores para se ligar ao Artifact Registry.

Guarde a chave no cluster

Para fornecer a chave para autenticação no Artifact Registry, guarde a chave da conta de serviço como um segredo do Kubernetes com estes passos:

  1. Use o kubectl para criar o Secret.

      kubectl create secret docker-registry registry-secret \
      --docker-server=LOCATION-docker.pkg.dev \
      --docker-username=_json_key \
      --docker-email=ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --docker-password="$(cat registry-access-key.json)"
    

    Substitua o seguinte:

    • LOCATION: a localização regional ou multirregional do repositório.
    • PROJECT_NAME
    • ACCOUNT_NAME
  2. Elimine a cópia local da chave da conta de serviço.

    rm registry-access-key.json
    

Agora, pode fazer referência a este segredo nas suas cargas de trabalho.

Crie uma carga de trabalho com uma imagem privada

Para usar uma imagem de um repositório de contentores privado com uma carga de trabalho, defina o campo spec.imagePullSecrets para o nome do seu segredo. Este campo encontra-se em localizações diferentes para Pods e Implementações.

Criar um Pod

Para criar um Pod que possa aceder ao registo de contentores, defina o campo spec.imagePullSecrets para o nome do seu segredo.

  1. Crie um pod que especifique spec.imagePullSecrets.

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
      imagePullSecrets:
      - name: registry-secret
    

    Substitua o seguinte:

    • POD_NAME: o nome do seu Pod
    • CONTAINER_NAME: o nome do contentor no agrupamento
    • LOCATION
    • PROJECT_NAME

    Por exemplo, 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
      imagePullSecrets:
      - name: registry-secret
    
  2. Aplique a configuração ao cluster com kubectl.

    kubectl apply -f hello-pod.yaml
    
  3. Confirme que 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
    

Criar uma implementação

  1. Para usar um repositório privado numa implementação, especifica o imagePullSecret no modelo.

    Por exemplo, para configurar uma Implementação que usa a imagem hello-app, 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"
          imagePullSecrets:
          - name: registry-secret
    

    Substitua o seguinte:

    • LOCATION
    • PROJECT_NAME
  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 três contentores 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
    

Limpar

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

kubectl apply -f hello-pod.yaml
kubectl delete -f hello-deployment.yaml

O que se segue?