GCR(Google Container Registry)のプライベートイメージを取得しk8sにデプロイする

GCR に登録されたプライベートイメージを minikube で利用しようとしましたが、イメージの Pull に失敗します。

minikube にプライベートレジストリを使うためのアドオンが用意されていましたがうまくいきませんでした。
エラー原因の調査方法がわからなかったので諦めています。
https://minikube.sigs.k8s.io/docs/handbook/registry/

そこで、k8s の ImagePullSecrets を利用します。
https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod

  1. docker login コマンドで GCR にログインできることを確認する
  2. 確認できた認証情報を k8s に設定する

1. docker login コマンドで GCR にログインできることを確認する

以下のコマンドでアクセストークンを確認します。

1
gcloud auth print-access-token

以下のコマンドでGCRにログインします。パスワードには上記のアクセストークンを使います。

1
docker login -u oauth2accesstoken  https://gcr.io

Login Succeeded と表示されることを確認します。

2. 確認できた認証情報を k8s に設定する

以下のコマンドで secret リソースを作成します。
その際、 pod が実行されるネームスペースを指定します。メールアドレスも指定する必要があるみたいです。

ドキュメント:
https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod

1
2
3
4
5
kubectl create secret docker-registry gcr-access-token -n <NAMESPACE> \
--docker-server=gcr.io \
--docker-username=oauth2accesstoken \
--docker-password="$(gcloud auth print-access-token)" \
--docker-email=<EMAIL>

続いて、作成したシークレットを default サービスアカウントに設定します。
先程指定したネームスペースをここでも指定します。

ドキュメント:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account

1
2
kubectl patch serviceaccount default \                 
-p '{"imagePullSecrets": [{"name": "gcr-access-token"}]}' -n <NAMESPACE>

以上で完了です。