Como usar um registro de imagem particular

Neste tópico, mostramos como usar o GKE na AWS com um repositório de imagem de contêiner particular, como o Container Registry (GCR).

Antes de começar

Antes de começar a usar o GKE na AWS, verifique se você executou as seguintes tarefas:

  • Instale um serviço de gerenciamento.
  • Crie um cluster de usuário.
  • No diretório anthos-aws, use anthos-gke para alternar o contexto para o cluster de usuário.
    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 usuário.
  • Crie e envie uma imagem do Docker ao Container Registry. Os exemplos neste tópico usam o contêiner hello-app, criado com as etapas de Como implantar um aplicativo em contêiner na documentação do GKE no Google Cloud.

Registros de contêiner particular

Um registro de contêiner armazena e distribui imagens de contêiner. Por padrão, sua instalação do GKE na AWS pode acessar imagens públicas.

Verificar imagens no Container Registry

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

  1. Configure a ferramenta de linha de comando do Docker para autenticação no Container Registry com a Google Cloud CLI:

    gcloud auth configure-docker
    

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

  2. Confirme se o Container Registry inclui uma imagem com docker images.

    docker images
    

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

Criar uma conta de serviço

Os clusters de usuário são autenticados usando uma conta de serviço do Identity & Access Management (IAM).

Para criar uma nova conta de serviço, execute as seguintes etapas:

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

    gcloud iam service-accounts create account-name
    

    Substitua account-name pelo nome da nova conta de serviço do Google Cloud.

  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:

    • project-id pelo projeto do Google Cloud
    • account-name pelo nome da conta de serviço do Google Cloud
  3. Faça o download da chave da conta de serviço.

    gcloud iam service-accounts keys create key.json \
      --iam-account account-name@project-id.iam.gserviceaccount.com
    

    Substitua:

    • project-id pelo projeto do Google Cloud
    • account-name pelo nome da conta de serviço do Google Cloud

Agora está tudo pronto para configurar o cluster de usuário para se conectar ao Container Registry.

Definir um Secret do Kubernetes

Para fornecer a chave para autenticação no Container Registry, salve a chave da conta de serviço como um Secret do Kubernetes. Para isso, execute as seguintes etapas:

  1. Use kubectl para criar a chave secreta.

    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:

    • project-id pelo projeto do Google Cloud
    • account-name pelo nome da conta de serviço do Google Cloud
  2. Exclua a cópia local da chave da conta de serviço.

    rm key.json
    

Agora você pode referir-se a esse secret nas suas cargas de trabalho.

Criar uma carga de trabalho com uma imagem particular

Para usar uma imagem de um repositório de contêiner particular com uma carga de trabalho, defina o campo spec.imagePullSecrets como seu nome do secret. Esse campo está em locais diferentes para pods e implantações.

Como criar um pod

Para criar um pod, que pode acessar o registro de contêiner, defina o campo spec.imagePullSecrets como o nome do secret.

  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:

    • pod-name pelo nome do pod
    • container-name pelo nome do contêiner dentro do pod
    • project-id pelo projeto do Google Cloud
    • secret-name pelo nome do secret do registro

    Por exemplo, para extrair a imagem hello-app, copie o YAML a seguir em um arquivo chamado 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 se o pod está sendo executado com kubectl get.

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

    Como criar uma implantação

  4. Para usar um repositório particular em uma implantação, especifique o imagePullSecret dentro do modelo.

    Por exemplo, para criar uma implantação da imagem hello-app, 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: "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 implantação está em execução com kubectl pods.

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

    A saída contém 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
    

A seguir