ksaitoの日記

日々試したことの覚え書き

kubeにdockerhubの認証情報を安全に保管する

移転しました。

自動的にリダイレクトします。

Kubernetesで認証が必要なdocker registoryを操作するためにdocker registoryの認証情報を安全に保管する方法を検討しました。

kubernetesでdocker registoryの認証情報を設定する方法は、下記の2つがあります。

  1. kubernetes.io/basic-authbase64エンコードしたユーザ名とパスワードをsecretに設定
  2. 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を退避する
  • ログイン先を間違えない

参考

knative.dev