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.
- Certifique-se de atribuir a
artifactregistry.reader
função no projeto B (não A) - 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.