Kubernetesで認証が必要なdocker registoryを操作するためにdocker registoryの認証情報を安全に保管する方法を検討しました。
kubernetesでdocker registoryの認証情報を設定する方法は、下記の2つがあります。
kubernetes.io/basic-auth
にbase64エンコードしたユーザ名とパスワードをsecretに設定kubernetes.io/dockerconfigjson
にローカル環境で認証済みの情報をsecretに設定
kubernetes.io/basic-authに設定する方法
kubernetes.io/basic-auth
に設定する場合には、下記のようなmanifestを準備します。
apiVersion: v1 kind: Secret metadata: name: docker-hub-auth annotations: build.knative.dev/docker-0: https://index.docker.io/v1/ type: kubernetes.io/basic-auth data: username: # Use 'echo -n "username" | base64' to generate this string password: # Use 'echo -n "password" | base64' to generate this string
username:
とpassword:
にbase64でエンコードしたユーザ名、パスワードを設定してkubectl apply -f docker-hub-auth.yaml
で認証情報を設定できます。
この方法では、ユーザ名、パスワードはbase64エンコードされているだけなので安全ではなく、gitにpushすることはできません。
kubernetes.io/dockerconfigjsonに設定する方法
docker login
コマンドでdocker registoryにログインすると$HOME/.docker/config.json
に認証情報が記録されます。この情報をsecretに設定するには、下記のコマンドを実行します。
kubectl create secret generic docker-hub-auth --from-file=.dockerconfigjson=$HOME/.docker/config.json --type=kubernetes.io/dockerconfigjson
docker login
と、この手順をセットでスクリプトにすることで、安全に認証情報をkubernetesに設定することができます。
認証情報の使い方
下記のserviceaccountをデプロイします。
apiVersion: v1 kind: ServiceAccount metadata: name: docker-hub secrets: - name: docker-hub-auth
下記のmanifestでknative build
でビルドしたイメージをdockerhubにpushすることができます。
apiVersion: build.knative.dev/v1alpha1 kind: Build metadata: name: docker-build spec: serviceAccountName: docker-hub source: git: url: https://github.com/<gitアカウント>/<gitリポジトリ>.git revision: master steps: - name: build-and-push image: gcr.io/kaniko-project/executor:v0.1.0 args: - --dockerfile=/workspace/Dockerfile - --destination=<dockerhubユーザ>/<コンテナ名>
考察
dockerの認証情報は、ローカル環境で人手でログインした$HOME/.docker/config.json
をsecretのkubernetes.io/dockerconfigjson
に設定するのが良さそうです。
$HOME/.docker/config.json
には、複数のdocker registoryの認証情報が記録されています。設定時には、このファイルを一時的に退避して操作する必要があります。
従って、下記の点について留意する必要があります。
- 設定するときに
$HOME/.docker/config.json
を退避する - ログイン先を間違えない