Estoy intentando sacar una imagen privada deRegistro de artefactosrepositorio en Google Cloud desde un clúster de Kubernetes que se ejecuta en un proyecto de Google Cloud diferente usando kubectl.
kubernetes version 1.20.15-gke.1000
A la cuenta de servicio de Kubernetes ya se le han otorgado permisos artefactoregistry.reader y Storageobject.viewer ya que la imagen está en un proyecto diferente al de la cuenta de servicio de Kubernetes.
Aplico el siguiente yaml al 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
La imagen cloud-sql-proxy se está extrayendo y el contenedor se está ejecutando, pero la imagen en el repositorio privado no se extrae "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1 "
cuando reviso los pods me muestra este error:
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
¿Alguien puede decirme cómo solucionar esto?
Respuesta1
Tuve un problema similar esta semana. Supongamos que su GKE y su cuenta de servicio están en el proyecto A y que el registro de artefactos está en el proyecto B.
- Asegúrate de asignar el
artifactregistry.reader
rol en el proyecto B (no en el A) - Asegúrese de asignar esta función a la cuenta de servicio correcta. La cuenta de servicio que extrae la imagen es la cuenta de servicio del Nodo, no la cuenta de servicio del Pod. En mi caso, estaba usando GKE Autopilot que se configuró a través de TerraForm. Debido a un error en el módulo Terraform, la cuenta de servicio utilizada por el nodo es
default
(que es la cuenta de servicio informático predeterminada, por ejemplo, <número_proyecto>@cloudservices.gserviceaccount.com)
Puede verificar qué cuenta de servicio está ejecutando su grupo de nodos con el gcloud container clusters describe ...
comando.
¡Espero que esto ayude!
Respuesta2
Usar imágenes de otros proyectos en su configuración
Esta página describe cómo configurar su proyecto para que Deployment Manager pueda crear instancias de máquinas virtuales de Compute Engine usando imágenes del sistema operativo que pertenecen a otro proyecto.
Espero que puedas usar esto para actualizar el registro entre proyectos.