Kubernetes シークレットの理解
分散アプリケーションを使用する際の最大の考慮事項の 1 つは、パスワード、接続、それらに類するデータなど、機密情報を管理する方法です。 Kubernetes を使用すると、シークレットと呼ばれるリソースを使用して、このデータをセキュリティで保護することができます。
シークレットの理解
Kubernetes では、シークレットを使用すると、ポッドやデプロイのプレーンテキスト形式よりも安全な方法で機密情報を格納できます。 シークレットは、パスワードやその他の機密データを格納するように設計されています。
Kubernetes シークレットでは、データは base64 形式でエンコードされます。 base64 は暗号化アルゴリズムではありませんが、Kubernetes では情報がエンコードされていることを確認でき、kubectl describe
などのコマンド出力でこの情報を非表示にすることができます。 このプロセスは、プレーン テキスト構成では発生しません。 シークレットのスコープは常に 1 つの名前空間です。これにより、クラスター内の他のワークロードに機密データが漏洩するのを防ぐことができます。
シークレットの種類
シークレットにはさまざまな種類があります。 最も一般的な種類 (既定) は Opaque
で、ユーザー定義の任意のデータを保持します。 他の一般的な種類には、次のようなものがあります。
kubernetes.io/service-account-token
:サービス アカウント トークンを定義します。これは、新しいサービス アカウントの作成時に自動的に作成されます。kubernetes.io/basic-auth
: 基本認証の資格情報。kubernetes.io/tls
: TLS クライアントまたはサーバー データ。たとえば、イングレス リソース内から HTTPS 接続を提供するために使用されます。
ヒント
詳細については、公式の Kubernetes シークレットのドキュメントを参照してください。
シークレットを作成して使用する
公式の Kubernetes シークレットに関するドキュメントによると、シークレットは次の 3 つの方法で使用できます。
- ポッド内またはデプロイ内のコンテナー上のボリュームにファイルとしてマウントされます。
- ポッドまたはデプロイの指定で環境変数として参照されます。
- ポッド指定で
imagePullSecret
キーを介してプライベート レジストリからイメージをプルするときに Kubelet によって使用されます。
他の Kubernetes リソースと同様に、YAML マニフェスト ファイルまたは kubectl
コマンドを使用してシークレットを作成できます。 シークレットは次のように指定されます。
apiVersion: v1
kind: Secret
metadata:
name: secret-name
namespace: secret-namespace
type: Opaque
data:
key_name: "key value in base64 format"
この仕様のシークレットの場合は、シークレットを作成する "前に" 値をエンコードする必要があります。 プレーンテキスト値を使用してシークレットを作成し、Kubernetes で自動的にエンコードする場合は、data
ではなく stringData
を使用します。
apiVersion: v1
kind: Secret
metadata:
name: secret-name
namespace: secret-namespace
type: Opaque
stringData:
key_name: "key value in plain format"
エンコードされた文字列ではなく値が渡されるため、アプリケーションは "デコードされた" シークレット文字列を受け取ります。
シークレットの更新
ポッド内に "ボリュームとしてマウントされた" すべてのシークレットは、値が変更されると自動的に更新されます。 この変更は、Kubelet の構成が原因ですぐには行われないことがありますが、自動的に行われるので、ポッドを再起動する必要はありません。
シークレットが "環境変数にバインドされている" 場合、それらは自動的に更新されないので、変更を有効にするにはポッドを再起動する必要があります。