今日は、GCRとGKEで遊ぶ最初の日です。だから私の質問が幼稚に聞こえるなら謝罪します。
そこで、GCRに新しいレジストリを作成しました。プライベートです。 this documentationを使用して、コマンドを使用してアクセストークンを取得しました
gcloud auth print-access-token
#<MY-ACCESS_TOKEN>
ユーザー名がoauth2accesstoken
試したときにローカルのラップトップで
docker login https://eu.gcr.io/v2
Username: oauth2accesstoken
Password: <MY-ACCESS_TOKEN>
私は得る:
Login Successful
それでは、docker-registry
Kubernetesの秘密。
以下のコマンドを実行しました:
kubectl create secret docker-registry eu-gcr-io-registry --docker-server='https://eu.gcr.io/v2' --docker-username='oauth2accesstoken' --docker-password='<MY-ACCESS_TOKEN>' --docker-email='<MY_EMAIL>'
そして、私のポッドの定義は次のようになります。
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app
image: eu.gcr.io/<my-gcp-project>/<repo>/<my-app>:latest
ports:
- containerPort: 8090
imagePullSecrets:
- name: eu-gcr-io-registry
しかし、ポッドをスピンアップすると、エラーが発生します:
Warning Failed 4m (x4 over 6m) kubelet, node-3 Failed to pull image "eu.gcr.io/<my-gcp-project>/<repo>/<my-app>:latest": rpc error: code = Unknown desc = Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
YAMLファイルをチェックし、base64 --decode
上の.dockerconfigjson
そしてそれは正しい。
だから私はここで何を見逃しましたか?
GKEクラスターとGCRレジストリが同じプロジェクトにある場合:認証を設定する必要はありません。 GKEクラスターは、設定なしで同じプロジェクトのプライベートGCRレジストリからプルすることを許可されています。 (おそらくあなたはこれだ!)
GKEクラスターとGCRレジストリが異なるGCPプロジェクトにある場合:以下の手順に従って、GKEクラスターの「サービスアカウント」にプライベートイメージを読み込むアクセス権を付与します。 GCRクラスター: https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry
一言で言えば、これは次の方法で実行できます。
gsutil iam ch serviceAccount:[PROJECT_NUMBER][email protected]:objectViewer gs://[BUCKET_NAME]
どこ [BUCKET_NAME]
は、GCR画像を保存するGCSバケットです(artifacts.[PROJECT-ID].appspot.com
)および[PROJECT_NUMBER]
は、GKEクラスターをホストするnumericGCPプロジェクトIDです。