Ошибка ImagePullBackOff при извлечении образа Docker в другой проект в Google Cloud

Ошибка ImagePullBackOff при извлечении образа Docker в другой проект в Google Cloud

Я пытаюсь извлечь личное изображение изРеестр артефактоврепозиторий в Google Cloud из кластера Kubernetes, работающего в другом проекте Google Cloud, с использованием kubectl.

kubernetes version 1.20.15-gke.1000 

Учетной записи службы Kubernetes уже предоставлены разрешения artifactregistry.reader и storageobject.viewer, поскольку изображение находится в другом проекте, нежели учетная запись службы Kubernetes.

Я применяю приведенный ниже yaml к команде 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

Образ cloud-sql-proxy извлекается, и контейнер работает, но образ в частном репозитории не извлекается "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1"

Когда я проверяю модули, мне показывается эта ошибка:

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

Может ли кто-нибудь подсказать, как решить эту проблему?

решение1

У меня была похожая проблема на этой неделе. Предположим, что ваш GKE и учетная запись службы находятся в проекте A, а реестр артефактов — в проекте B.

  1. Обязательно укажите роль artifactregistry.readerв проекте B (не A)
  2. Убедитесь, что вы назначаете эту роль правильному аккаунту службы. Аккаунт службы, который извлекает образ, — это аккаунт службы Node, а не аккаунт службы Pod. В моем случае я использовал GKE Autopilot, настроенный через TerraForm. Из-за ошибки в модуле Terraform аккаунт службы, используемый узлом, — это default(который является аккаунтом службы вычислений по умолчанию, например, <project_number>@cloudservices.gserviceaccount.com)

Проверить, какая учетная запись службы запущена в вашем nodepool, можно с помощью gcloud container clusters describe ...команды.

Надеюсь, это поможет!

решение2

Использование изображений из других проектов в вашей конфигурации

На этой странице описывается, как настроить проект, чтобы Deployment Manager мог создавать экземпляры виртуальных машин Compute Engine с использованием образов операционных систем, принадлежащих другому проекту.

Надеюсь, вы сможете использовать это для обновления реестра между проектами.

Связанный контент