ImagePullBackOff erra ao extrair a imagem do docker em um projeto diferente no Google Cloud

ImagePullBackOff erra ao extrair a imagem do docker em um projeto diferente no Google Cloud

Estou tentando extrair uma imagem privada deRegistro de artefatorepositório no Google Cloud de um cluster Kubernetes em execução em um projeto diferente do Google Cloud usando kubectl.

kubernetes version 1.20.15-gke.1000 

A conta de serviço do kubernetes já recebeu as permissões artefatoregistry.reader e storageobject.viewer, pois a imagem está em um projeto diferente da conta de serviço do kubernetes

Eu aplico o yaml abaixo ao comando kubectl.

kubectl apply -f proxy_with_workload_identity.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  selector:
    matchLabels:
      app: app-project
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: app-project
    spec:
      containers:
        - env:
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  key: username
                  name: db-credentials
            - name: DB_PASS
              valueFrom:
                secretKeyRef:
                  key: password
                  name: db-credentials
            - name: DB_NAME
              value: postgres
          image: "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1" 
          name: app-project
          ports:
            - containerPort: 9376
              protocol: TCP
        - command:
            - /cloud_sql_proxy 
            - "-instances=demo-dev:us-central1:1-sql-1=tcp:5432"
          image: "gcr.io/cloudsql-docker/gce-proxy:latest"
          name: cloud-sql-proxy
          resources:
            requests:
              cpu: 200m
              memory: 32Mi
          securityContext:
            runAsNonRoot: true
      serviceAccountName: testapp

A imagem cloud-sql-proxy está sendo extraída e o contêiner está em execução, mas a imagem no repositório privado não está sendo extraída "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1 "

quando verifico os pods, recebo este erro:

code = Unknown desc = failed to pull and unpack image "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1:v1": failed to resolve reference "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1": failed to authorize: failed to fetch oauth token: unexpected status: 403 Forbidden

Alguém pode me dizer como resolver isso?

Responder1

Eu tive um problema semelhante esta semana. Vamos supor que seu GKE e sua conta de serviço estejam no projeto A, e o registro do artefato esteja no projeto B.

  1. Certifique-se de atribuir a artifactregistry.readerfunção no projeto B (não A)
  2. Certifique-se de atribuir essa função à conta de serviço correta. A conta de serviço que extrai a imagem é a conta de serviço do nó, não a conta de serviço do pod. No meu caso, eu estava usando o GKE Autopilot configurado via TerraForm. Devido a um bug no módulo Terraform, a conta de serviço usada pelo nó é default(que é a conta de serviço de computação padrão, por exemplo, <project_number>@cloudservices.gserviceaccount.com)

Você pode verificar qual conta de serviço seu nodepool está executando com o gcloud container clusters describe ...comando.

Eu espero que isso ajude!

Responder2

Usando imagens de outros projetos em sua configuração

Esta página descreve como configurar seu projeto para que o Deployment Manager possa criar instâncias de máquinas virtuais do Compute Engine usando imagens do sistema operacional que pertencem a outro projeto.

Espero que você possa usar isso para atualizar o registro entre projetos.

informação relacionada