Kubernetes ポッドによるプライベートレジストリの認証設定手順

ドキュメント定義ファイルからのシークレット生成

Docker デフォルトの構成ファイルを基盤として認証情報をシークレット化します。既存の ~/.docker/config.json ファイルに含まれる資格情報を使用することで、複数のレジストリに対応できます。

# .docker/config.json の中身を確認
{
  "auths": {
    "private.registry.internal": {
      "auth": "dXNlcjpwYXNzd29yZA=="
    }
  }
}

# 生成した秘密情報を k8s シークレットに登録
# 型は kubernetes.io/dockerconfigjson を指定
$ kubectl create secret generic regcred-kube 
  --from-file=.dockerconfigjson=~/docker-config.json 
  --type=kubernetes.io/dockerconfigjson -n blueking

このように作成されたシークレットは、ポッド定義内で imagePullSecrets フィールドを通じて参照可能です。

CLI を使用した手動シークレット作成

個別のレジストリに対して、サーバーアドレス、ユーザー名、パスワードを直接的に指定してシークレットオブジェクトを作成する標準的なアプローチです。

$ kubectl create secret docker-registry internal-creds 
  --docker-server=private.registry.internal 
  --docker-username=admin_user 
  --docker-password=S3cr3tP@ss 
  --dry-run=client -o yaml | kubectl apply -f -

これにより生成された認証情報は、該当する画像のプッシュ時やプル時にクラスタノードのカーネルレベルで利用されます。

サービスアカウントへの連携

特定のポッドごとに imagePullSecrets を記述するのは手間がかかります。そのため、デフォルトやカスタムサービスアカウント自体にシークレットを紐付ける運用も一般的です。

まず対象となるサービスアカウントを確認し、状態を把握します。

$ kubectl get sa default -n blueking -o yaml

以下のような YML エディタ操作またはパッチ操作によって、imagePullSecrets リストにシークレット名を追加します。

kubectl patch serviceaccount default \
  --namespace blueking \
  -p '{"imagePullSecrets": [{"name": "internal-creds"}]}'

もしくは、以下の YAML で直接編集することもできます。重要なのは apiVersionmetadata.creationTimestamp 等のシステム管理フィールドを保持することです。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: blueking
  # system-generated fields omitted
imagePullSecrets:
  - name: internal-creds
secrets:
  - name: default-token-wzxy
automountServiceAccountToken: true

最後に、このサービスアカウントを利用するポッド定義を作成すれば、自動的に認証情報が付与されます。

apiVersion: v1
kind: Pod
metadata:
  name: private-app
  namespace: blueking
spec:
  serviceAccountName: default
  containers:
    - name: backend
      image: private.registry.internal/myapp:v1.0.2
      resources:
        limits:
          memory: "128Mi"

タグ: Kubernetes docker-registry kubectl service-account container-security

7月24日 05:45 投稿