category

minikubeからレジストリログイン

minikubeなどのkubernetesクラスタ上でプライベートレジストリのコンテナイメージを起動させるためには、イメージpull時の認証設定が必要です。

認証は以下の2段階でセットアップできます。

  1. docker-registryのsecretを作成
  2. serviceaccountから認証用secretを参照

準備:認証アカウントを取得

あらかじめ、プライベートレジストリ側でminikubeがアクセスするためのアカウントを作成しておきます。

たとえばGoogle Container Registryの場合、サービスアカウントを作成し、JSON形式のクレデンシャルファイルを取得しておきます。

docker-registryのsecretを作成

minikubeクラスタへの認証情報登録は、kubectl create secret docker-registryという長いコマンドで実行できます。

Google Container Registryの設定例は以下のような書式になります。

kubectl create secret docker-registry gcr-credential \
	--docker-server=gcr.io \
	--docker-username=_json_key \
	--docker-email=SERVICEACCOUNT@PROJECTNAME.iam.gserviceaccount.com \
	--docker-password="$(cat credential.json)"

オプションの概要は以下のとおりです。フィールドに入力すべき値はレジストリのサービスごとに異なります。

  • docker-server: プライベートレジストリのドメイン
  • docker-username: プライベートレジストリのID。GCRはJSONクレデンシャルを参照するため_json_keyという固定値とのこと
  • docker-email: GCRの場合、サービスアカウントのメールアドレス
  • docker-password: プライベートレジストリのパスワード。GCRの場合、JSONクレデンシャルの文字列を全投入するためファイルをcatした出力を登録

登録が成功していれば、kubectl describe secret gcr-credentialで確認でき、Data部に.dockercfgというキーでデータを保持している様子が観察できます(中身は非表示)。

serviceaccountから認証用secretを参照

kubectl patchコマンドでminikubeのserviceaccountを更新します。

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "gcr-credential"}]}'

imagePullSecretsはArray型なので、おそらく複数のsecretを登録可能でしょう。

Pod起動時の設定ファイルにアカウント指定

複数のレジストリを利用している場合など、個別のPodにsecretを設定したい場合、Create a Pod that uses your Secretのような設定も可能です。

Pod SpecのimagePullSecrets.nameに指定します。

まとめ

kubernetesのプライベートレジストリアクセスにはdocker-registry secretの登録が必要です。
MacOS上のminikubeなどは、minikube VM上で動作しているためホスト(MacOS)のdocker / kubernetesの認証設定にはアクセスできません。