Я пытаюсь извлечь личное изображение изРеестр артефактоврепозиторий в 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.
- Обязательно укажите роль
artifactregistry.reader
в проекте B (не A) - Убедитесь, что вы назначаете эту роль правильному аккаунту службы. Аккаунт службы, который извлекает образ, — это аккаунт службы Node, а не аккаунт службы Pod. В моем случае я использовал GKE Autopilot, настроенный через TerraForm. Из-за ошибки в модуле Terraform аккаунт службы, используемый узлом, — это
default
(который является аккаунтом службы вычислений по умолчанию, например, <project_number>@cloudservices.gserviceaccount.com)
Проверить, какая учетная запись службы запущена в вашем nodepool, можно с помощью gcloud container clusters describe ...
команды.
Надеюсь, это поможет!
решение2
Использование изображений из других проектов в вашей конфигурации
На этой странице описывается, как настроить проект, чтобы Deployment Manager мог создавать экземпляры виртуальных машин Compute Engine с использованием образов операционных систем, принадлежащих другому проекту.
Надеюсь, вы сможете использовать это для обновления реестра между проектами.