Secretは、Kubernetesクラスタ内で機密情報を安全に管理するためのネイティブリソースです。パスワード、APIトークン、TLS証明書など、平文で扱いたくないデータを、Base64エンコーディングを経て保存・配布できます。ただし、Secretは暗号化ストレージを提供するものではなく、アクセス制御とライフサイクル管理の基盤として設計されています。
Secretの生成手法
Secretは宣言的(YAML)および命令的(CLI)の両方の方法で作成可能です。
コマンドラインによる即時作成
以下のコマンドで、ユーザー名とパスワードを含むauth-credentialsというSecretを作成できます:
kubectl create secret generic auth-credentials \
--from-literal=username=svc-admin \
--from-literal=api-key=sk_live_8a9b7c1d2e3f4g5h
この操作により、Opaque型のSecretがデフォルト命名空間に生成され、各キーは自動的にBase64エンコードされます。
YAMLマニフェストによる定義
より再現性とバージョン管理を重視する場合は、以下のようなYAMLファイル(例:config-secret.yaml)を用意します:
apiVersion: v1
kind: Secret
metadata:
name: config-secret
labels:
app: backend-service
type: Opaque
data:
db-host: cHJvZC1kYi5jbHVzdGVyLmxvY2Fs
db-port: NzMwMw==
ssl-mode: cmVxdWlyZWQ=
上記のdataフィールドには事前にエンコード済みの値を指定します。エンコードは次のように実行可能です:
echo -n "prod-db.cluster.local" | base64
echo -n "7303" | base64
echo -n "required" | base64
適用はkubectl apply -f config-secret.yamlで行います。
Secretの確認と検証
作成後のSecretは以下のように確認できます:
- 一覧表示:
kubectl get secrets - 構造情報(エンコードされたキーのみ):
kubectl describe secret auth-credentials - 生データのデコード(例):
kubectl get secret auth-credentials -o jsonpath='{.data.username}' | base64 -d
Pod内での利用パターン
Secretは以下の3つの主要な方法でコンテナに提供されます:
1. ボリュームマウント(推奨)
Secretの全キーをファイルとしてマウントし、アプリケーションがファイルI/Oで読み込みます:
apiVersion: v1
kind: Pod
metadata:
name: secure-app-pod
spec:
containers:
- name: app
image: nginx:alpine
volumeMounts:
- name: creds-volume
mountPath: /run/secrets
readOnly: true
volumes:
- name: creds-volume
secret:
secretName: auth-credentials
この設定では、/run/secrets/usernameと/run/secrets/api-keyが存在し、それぞれデコード済みの値を含みます。
2. 環境変数として注入
特定のキーだけを環境変数に展開する場合:
env:
- name: APP_USERNAME
valueFrom:
secretKeyRef:
name: auth-credentials
key: username
- name: APP_API_KEY
valueFrom:
secretKeyRef:
name: auth-credentials
key: api-key
3. イメージプル時の認証情報として使用
プライベートRegistryへのアクセスにはdocker-registry型のSecretが必要です:
kubectl create secret docker-registry regcred \
--docker-server=https://index.docker.io/v1/ \
--docker-username=your-name \
--docker-password=your-pat \
--docker-email=you@example.com
その後、Pod仕様にimagePullSecretsを追加して参照します。
運用上の留意点
- SecretリソースはNamespaceスコープであり、他のNamespaceから直接参照できません。
- etcd内ではBase64エンコードされた状態で保存されるため、静的暗号化(Encryption at Rest)を有効化することを強く推奨します。
- RBACで
secretsリソースへのget/list権限を厳密に制御してください。 - Secretの更新は、既存のPodに自動反映されません。新しいSecretを参照するには、Podの再起動またはローリングアップデートが必要です。