KubernetesのSecretとは
Kubernetesにおいて、Secretはエンコードされた形式でキーと値のペアを保存するためのリソースです。特に、Base64形式で保存されます。Secretは、アプリケーションが実行中に必要とするパスワード、トークン、またはキーなどの機密データを管理する手段として機能します。保存されるデータがBase64エンコードされているため、直接読み取ることはできませんが、実際には暗号化されているわけではありません。エンコードされた値を持っている人は、復号化キーなしでそれをデコードすることができます。つまり、Secretはアプリケーション内の機密データを平文で保存することを回避するのに役立ちますが、機密情報を保護するための単独のソリューションではありません。
SecretとConfigMapの違い
SecretとConfigMapの両方は、コンテナ化されたアプリケーションコードから設定の詳細を切り離すことができますが、それぞれ異なる種類のデータに使用されます。
ConfigMapは、キーと値のペアの形式で非機密の静的な設定データを保存および共有するのに適しています。ConfigMapを使用して、設定ファイルやプロパティファイル、JSONの塊などを保存できます。
一方、Secretは機密情報のために特に設計されています。機密データを保存する際に、ConfigMapよりもセキュアで柔軟なソリューションを提供します。Secretはデフォルトでは暗号化されていませんが、Kubernetesはクラウドプロバイダーのキーマネジメントシステムとの統合を提供し、安全にSecretを保存することができます。
Kubernetes Secretのデモ
KubernetesのSecretの作成と使用方法をデモンストレーションします。
Minikubeの起動
始める前に、マシン上でMinikubeが実行されていることを確認してください。Minikubeを起動するには、次のコマンドを使用します。
$ minikube start
Secretの作成
Secretの作成手順は、ConfigMapの作成手順と似ています。ここでは、kubectl create secret
コマンドを使用します。
ドライランを行うための便利な--dry-run
コマンドと、マニフェストを生成するための-o yaml
コマンドを使用します。次のコマンドを実行してください。
$ kubectl create secret generic my-secret \
--from-literal=SECRET_KEY1=SECRET_VALUE1 \
--from-literal=SECRET_KEY2=SECRET_VALUE2 \
--dry-run=client -o yaml
これにより、次のような出力が生成されます。
apiVersion: v1
data:
SECRET_KEY1: U0VDUkVUX1ZBTFVFMQ==
SECRET_KEY2: U0VDUkVUX1ZBTFVFMg==
kind: Secret
metadata:
creationTimestamp: null
name: my-secret
マニフェストを確認した後、次のコマンドでsecret.yaml
ファイルに保存します。
$ kubectl create secret generic my-secret \
--from-literal=SECRET_KEY1=SECRET_VALUE1 \
--from-literal=SECRET_KEY2=SECRET_VALUE2 \
--dry-run=client -o yaml > secret.yaml
マニフェストからSecretの作成
次に、kubectl apply
を使用してマニフェストを適用し、Secretを作成します。
$ kubectl apply -f secret.yaml
secret/my-secret created
Secretの表示と検査
Secretが作成された後、次のコマンドを使用してYAML形式で情報を表示したり、詳細を確認したりできます。
$ kubectl get secret -o yaml
apiVersion: v1
items:
- apiVersion: v1
data:
SECRET_KEY1: U0VDUkVUX1ZBTFVFMQ==
SECRET_KEY2: U0VDUkVUX1ZBTFVFMg==
kind: Secret
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","data":{"SECRET_KEY1":"U0VDUkVUX1ZBTFVFMQ==","SECRET_KEY2":"U0VDUkVUX1ZBTFVFMg=="},"kind":"Secret","metadata":{"annotations":{},"creationTimestamp":null,"name":"my-secret","namespace":"default"}}
creationTimestamp: "2022-06-25T02:01:34Z"
name: my-secret
namespace: default
resourceVersion: "644"
uid: f46d9fae-afeb-46e5-8fbd-eff006a59993
type: Opaque
kind: List
metadata:
resourceVersion: ""
$ kubectl describe secret my-secret
Name: my-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
SECRET_KEY2: 13 bytes
SECRET_KEY1: 13 bytes
Secretのデコード
Secretの値はBase64でエンコードされていることを覚えておいてください。これは暗号化ではなく、エンコードされているだけです。つまり、エンコードされたデータにアクセス権限がある人は、それをデコードして元の値を取得できます。
$ echo U0VDUkVUX1ZBTFVFMQ== | base64 --decode
SECRET_VALUE1
これにより、Secretキーのオリジナルの値が表示されます。
PodにSecretをボリュームとしてマウント
ここでは、KubernetesのSecretをPodのボリュームとしてマウントする方法をデモンストレーションします。前の章で作成したSecretを使用します。
PodマニフェストでSecretへの参照を定義
まず、Podマニフェストを定義します。ここでは、Pod内でSecretをボリュームとしてマウントする方法を指定します。以下は、Secret my-secret
への参照を含むPodマニフェストの例です。
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: helloworld-secret-volume
name: helloworld-secret-volume
spec:
containers:
- image: bhargavshah86/kube-test:v0.1
name: helloworld-secret-volume
ports:
- containerPort: 8080
resources: {}
volumeMounts:
# Specify the volume name
- name: my-secret-volume
# Specify the path in the container where the volume should be mounted
mountPath: /my-secret
readOnly: true
volumes:
# Specify the volume name to be created
- name: my-secret-volume
secret:
# Specify the Secret name
secretName: my-secret
status: {}
Podの作成
Podマニフェストを定義した後、次のコマンドでPodを作成します。
$ kubectl apply -f pod_secret_volume.yaml
Pod内でSecretの値を確認
Podが起動している状態で、次のコマンドを使用してPod内でSecretの値を確認できます。
$ kubectl exec -it helloworld-secret-volume -- cat /my-secret/SECRET_KEY1
SECRET_VALUE1%
これにより、Secretの元の値が表示され、Pod内でボリュームとして正常にマウントされ、Pod内で実行されているアプリケーションで使用できることが示されます。