私はプライベートイメージを取得しようとしていますアーティファクトレジストリkubectl を使用して、別の Google Cloud プロジェクトで実行されている Kubernetes クラスタから Google Cloud のリポジトリを作成します。
kubernetes version 1.20.15-gke.1000
イメージは Kubernetes サービス アカウントとは別のプロジェクトにあるため、Kubernetes のサービス アカウントにはすでに artifactregistry.reader および storageobject.viewer 権限が付与されています。
以下の 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ではなく)での役割を必ず与えてください- このロールを正しいサービス アカウントに付与するようにしてください。イメージをプルするサービス アカウントは、Pod のサービス アカウントではなく、ノードのサービス アカウントです。私の場合は、TerraForm で構成された GKE Autopilot を使用していました。Terraform モジュールのバグのため、ノードが使用するサービス アカウントは
default
(デフォルトのコンピューティング サービス アカウント、例: <project_number>@cloudservices.gserviceaccount.com)です。
コマンドを使用して、ノードプールが実行しているサービス アカウントを確認できますgcloud container clusters describe ...
。
これが役に立つことを願っています!
答え2
このページでは、Deployment Manager が別のプロジェクトに属するオペレーティング システム イメージを使用して Compute Engine 仮想マシン インスタンスを作成できるようにプロジェクトを構成する方法について説明します。
これを使用して、プロジェクト間でレジストリを更新できることを願っています。