Traffine I/O

日本語

2022-07-01

KubernetesのSecret

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を起動するには、次のコマンドを使用します。

bash
$ minikube start

Secretの作成

Secretの作成手順は、ConfigMapの作成手順と似ています。ここでは、kubectl create secretコマンドを使用します。

ドライランを行うための便利な--dry-runコマンドと、マニフェストを生成するための-o yamlコマンドを使用します。次のコマンドを実行してください。

bash
$ 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ファイルに保存します。

bash
$ 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を作成します。

bash
$ kubectl apply -f secret.yaml

secret/my-secret created

Secretの表示と検査

Secretが作成された後、次のコマンドを使用してYAML形式で情報を表示したり、詳細を確認したりできます。

bash
$ 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: ""
bash
$ 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でエンコードされていることを覚えておいてください。これは暗号化ではなく、エンコードされているだけです。つまり、エンコードされたデータにアクセス権限がある人は、それをデコードして元の値を取得できます。

bash
$ echo U0VDUkVUX1ZBTFVFMQ== | base64 --decode

SECRET_VALUE1

これにより、Secretキーのオリジナルの値が表示されます。

PodにSecretをボリュームとしてマウント

ここでは、KubernetesのSecretをPodのボリュームとしてマウントする方法をデモンストレーションします。前の章で作成したSecretを使用します。

PodマニフェストでSecretへの参照を定義

まず、Podマニフェストを定義します。ここでは、Pod内でSecretをボリュームとしてマウントする方法を指定します。以下は、Secret my-secretへの参照を含むPodマニフェストの例です。

pod_secret_volume.yaml
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を作成します。

bash
$ kubectl apply -f pod_secret_volume.yaml

Pod内でSecretの値を確認

Podが起動している状態で、次のコマンドを使用してPod内でSecretの値を確認できます。

bash
$ kubectl exec -it helloworld-secret-volume -- cat /my-secret/SECRET_KEY1

SECRET_VALUE1%

これにより、Secretの元の値が表示され、Pod内でボリュームとして正常にマウントされ、Pod内で実行されているアプリケーションで使用できることが示されます。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!