Usar um registo de imagens privado

Este tópico descreve como usar o GKE na AWS com um repositório de imagens de contentores privado, como o Container Registry (GCR).

Antes de começar

Antes de começar a usar o GKE on AWS, certifique-se de que realizou as seguintes tarefas:

  • Instale um serviço de gestão.
  • Crie um cluster de utilizadores.
  • No diretório do anthos-aws, use anthos-gke para mudar o contexto para o cluster de utilizadores.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Substitua CLUSTER_NAME pelo nome do cluster de utilizadores.
  • Ter uma imagem Docker criada e enviada para o Container Registry. Os exemplos neste tópico usam o contentor hello-app, criado com os passos de Implementar uma aplicação em contentores na documentação do GKE on Google Cloud .

Registos de contentores privados

Um registo de contentores armazena e distribui imagens de contentores. Por predefinição, a instalação do GKE no AWS pode aceder a imagens públicas.

Verifique a existência de imagens no Container 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 Container Registry com a CLI do Google Cloud:

    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 que o seu Container Registry inclui uma imagem com docker images.

    docker images
    

    O Docker liga-se ao Container Registry e devolve as imagens disponíveis no seu repositório do Container Registry. Por exemplo, a resposta abaixo mostra uma imagem de contentor denominada hello-app no repositório project-id.

    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    gcr.io/project-id/hello-app   v1                  732f02cea7cb        12 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 de utilizadores autenticam-se através de uma conta de serviço de 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 acesso ao Container Registry.

    gcloud projects add-iam-policy-binding project-id \
      --member serviceAccount:account-name@project-id.iam.gserviceaccount.com \
      --role roles/storage.objectViewer
    

    Substitua o seguinte:

    • project-id 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 key.json \
      --iam-account account-name@project-id.iam.gserviceaccount.com
    

    Substitua o seguinte:

    • project-id com o seu Google Cloud projeto
    • account-name com o nome da sua Google Cloud conta de serviço

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

Defina um segredo do Kubernetes

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

  1. Use kubectl para criar o segredo.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl create secret docker-registry gcr-secret \
      --docker-server=gcr.io \
      --docker-username=_json_key \
      --docker-email=account-name@project-id.iam.gserviceaccount.com \
      --docker-password="$(cat key.json)"
    

    Substitua o seguinte:

    • project-id com o seu Google Cloud projeto
    • account-name com o nome da sua Google Cloud conta de serviço
  2. Elimine a cópia local da chave da conta de serviço.

    rm 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: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: secret-name
    

    Substitua o seguinte:

    • pod-name com o nome do seu Pod
    • container-name com o nome do contentor no Pod
    • project-id com o seu Google Cloud projeto
    • secret-name com o nome do segredo do registo

    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: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: gcr-secret
    
  2. Aplique a configuração ao cluster com kubectl.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-pod.yaml
    
  3. Confirme que o pod está em execução com kubectl get.

    env HTTPS_PROXY=http://localhost:8118 \
      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

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

    Por exemplo, para criar uma Implementação, da 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: "gcr.io/project-id/hello-app:v1"
            env:
            - name: "PORT"
              value: "50001"
          imagePullSecrets:
          - name: gcr-secret
    
  5. Aplique a configuração ao cluster com kubectl.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-deployment.yaml
    
  6. Confirme se a implementação está a ser executada com o kubectl pods.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    

    O resultado contém três recipientes 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
    

O que se segue?