Secret

このページでは、Kubernetes の Secret オブジェクトと Google Kubernetes Engine(GKE)でのその使用方法について説明します。

Secret とは

Secret は、パスワード、OAuth トークン、SSH 認証鍵などの機密データをクラスタに格納する安全なオブジェクトです。機密データを Secret に保存することは、平文の ConfigMap や Pod 仕様よりも安全です。Secret を使用すると、機密データの使用方法を制御し、権限のないユーザーにデータが公開されるリスクを軽減できます。

Cloud KMS で管理する鍵を使用して Secret を暗号化することもできます。詳しくはアプリケーション レイヤでの Secret の暗号化をご覧ください。

Secret の作成

Secret は、コマンドラインまたは YAML ファイルを使用して作成できます。

kubectl

Secret を作成するには、次のコマンドを実行します。

kubectl create secret SECRET_TYPE SECRET_NAME DATA

次のように置き換えます。

  • SECRET_TYPE: Secret タイプ。次のいずれかになります。

    • generic: ローカル ファイル、ディレクトリ、またはリテラル値から Secret を作成します。
    • docker-registry: Docker レジストリで使用する dockercfg Secret を作成します。Docker レジストリに対する認証に使用されます。
    • tls: 指定された公開鍵/秘密鍵のペアから TLS Secret を作成します。公開鍵と秘密鍵のペアがすでに存在している必要があります。公開鍵証明書は.PEM エンコードされ、指定された秘密鍵と一致する必要があります。

    ほとんどの Secret では、generic 型を使用します。

  • SECRET_NAME: 作成する Secret の名前。

  • DATA: Secret に追加するデータ。次のいずれかになります。

    • --from-file または --from-env-file フラグに指定された 1 つ以上の構成ファイルを含むディレクトリへのパス。
    • それぞれが --from-literal フラグを使用して指定された Key-Value ペア

kubectl create の詳細については、リファレンス ドキュメントをご覧ください。

YAML ファイル

YAML ファイルを使用して Secret を作成するには、ファイル内で Secret オブジェクトを定義し、次のコマンドを使用してデプロイします。

kubectl create -f FILE_NAME.yaml

例については、Secret を使用して認証情報を安全に配布するをご覧ください。

ファイルから Secret を作成する

1 つ以上のファイルから Secret を作成するには、--from-file または --from-env-file を使用します。ファイルは平文である必要がありますが、ファイルの拡張子は関係ありません。

--from-file を使用して Secret を作成する

--from-file を使用して Secret を作成すると、Secret の値はファイルの内容になります。Secret の値に複数の Key-Value ペアが含まれている場合は、代わりに --from-env-file を使用します。

単一のファイルまたは複数のファイルを渡すことができます。

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_FILE1 \
  --from-file PATH_TO_FILE2

次のように置き換えます。

  • SECRET_TYPE: Secret タイプ。次のいずれかになります。

    • generic: ローカル ファイル、ディレクトリ、またはリテラル値から Secret を作成します。
    • docker-registry: Docker レジストリで使用する dockercfg Secret を作成します。Docker レジストリに対する認証に使用されます。
    • tls: 指定された公開鍵/秘密鍵のペアから TLS Secret を作成します。公開鍵と秘密鍵のペアがすでに存在している必要があります。公開鍵証明書は.PEM エンコードされ、指定された秘密鍵と一致する必要があります。

      ほとんどの Secret では、generic 型を使用します。

  • SECRET_NAME: 作成する Secret の名前。

  • PATH_TO_FILE: ファイルのパス

複数のファイルを含むディレクトリを渡すこともできます。

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_DIRECTORY

PATH_TO_DIRECTORY はディレクトリへのパスに置き換えます。

たとえば、次のコマンドでは、2 つのファイル(username.txtpassword.txt)から credentials という名前の generic Secret を作成し、それぞれの鍵を username.txtpassword.txt に設定します。

kubectl create secret generic credentials \
  --from-file ./username.txt \
  --from-file ./password.txt

Secret の値は Kubernetes で base64 でエンコードされます。

kubectl get secret credentials -o yaml を実行すると、次の出力が返されます。

apiVersion: v1
data:
  password.txt: MTIzNAo=
  username.txt: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: ...
  name: credentials
  namespace: default
  resourceVersion: "2011810"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: ...
type: Opaque

デフォルトでは、鍵はファイル名です。この例では、鍵は password.txtusername.txt です。デフォルトの鍵は、--from-file フラグの拡張構文を使用してオーバーライドできます。

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file=KEY_NAME=PATH_TO_DIRECTORY

KEY_NAME は、鍵に設定する名前に置き換えます。

次の例では、ファイル名を使用するのではなく、2 つのファイル(username.txtpassword.txt)から credentials という名前の generic Secret を作成し、鍵に usernamepassword を設定します。

kubectl create secret generic credentials \
  --from-file=username=./username.txt \
  --from-file=password=./password.txt

--from-env-file を使用して Secret を作成する

複数の Key-Value ペアを単一の Secret に読み込むには、1 つ以上の平文ファイルに Key-Value ペアを保存してから、--from-file ではなく --from-env-file を使用してそれらを読み込みます。フラグを複数回指定することで複数のファイルを読み込むことができます。--from-file と同じ制限が適用されます。

次の例では、複数の Key-Value ペアを含む単一ファイル(credentials.txt)から credentials という generic Secret を作成します。

  1. credentials.txt ファイルを作成します。

    # Each of these key-value pairs is loaded into the Secret
    username=jane
    password=d7xnNss7EGCFZusG
    

    Secret の値は Kubernetes で base64 でエンコードされます。

  2. Secret を作成します。

    kubectl create secret generic credentials \
      --from-env-file ./credentials.txt
    

kubectl get secret credentials -o yaml を実行すると、次の出力が返されます。

apiVersion: v1
data:
  password: ZDd4bk5zczdFR0NGWnVzRw==
  username: amFuZQ==
kind: Secret
metadata:
  creationTimestamp: 2019-06-04T15:39:27Z
  name: credentials
  namespace: default
  resourceVersion: "14507319"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque

制限事項

シンボリック リンク、デバイス、パイプなどの非正規ファイルは kubectl によって無視されます。サブディレクトリも無視されます。kubectl create secret は、サブディレクトリへの再帰適用を行いません。

リテラル値から

リテラル値から Secret を作成するには、--from-literal を使用します。

たとえば、次のコマンドは、2 つの Key-Value ペアを含む literal-token という generic タイプの Secret を作成します。

kubectl create secret generic literal-token \
  --from-literal user=admin \
  --from-literal password=1234

各 Key-Value ペアに対して --from-literal を指定します。値は自動的に base64 でエンコードされます。

kubectl get secret literal-token -o yaml を実行すると、次の出力が返されます。

apiVersion: v1
data:
  password: MTIzNA==
  user: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: ...
  name: literal-token
  namespace: default
  resourceVersion: "2012831"
  selfLink: /api/v1/namespaces/default/secrets/literal-token
  uid: ...
type: Opaque

この出力では、passworduser の両方が base64 でエンコードされています。base64 でエンコードすることで、特定の文字を処理できないアプリやサービスに情報が認識されるようになります。base64 エンコードではセキュリティは保証されません。

Secret の使用

ワークロードで Secret を使用するには、Secret の値を参照する環境変数を指定するか、Secret を含むボリュームをマウントします。

Secret の使用方法については、Secret の使用をご覧ください。

次のステップ