ドキュメント定義ファイルからのシークレット生成
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 で直接編集することもできます。重要なのは apiVersion や metadata.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"