シークレット PropertySource

Kubernetes には、パスワードや OAuth トークンなどの機密データを保存するためのシークレット (英語) の概念があります。このプロジェクトは、Secrets との統合を提供し、Spring Boot アプリケーションからシークレットにアクセスできるようにします。spring.cloud.kubernetes.secrets.enabled プロパティを設定することで、この機能を明示的に有効または無効にできます。

有効にすると、Fabric8SecretsPropertySource は次のソースから Secrets の Kubernetes を検索します。

  1. シークレットマウントから再帰的に読み取る

  2. アプリケーションにちなんで名付けられました (spring.application.name による定義)

  3. いくつかのラベルの一致

注:

デフォルトでは、セキュリティ上の理由から、API を介したシークレットの使用 (上記のポイント 2 および 3) は有効になっていません。シークレットに対するアクセス許可「リスト」を使用すると、クライアントは指定された名前空間内のシークレット値をインスペクションできます。さらに、コンテナーはマウントされたボリュームを通じてシークレットを共有することをお勧めします。

API を介したシークレットの使用を有効にする場合は、RBAC などの認可ポリシーを使用してシークレットへのアクセスを制限することをお勧めします。API を通じてシークレットを使用する場合のリスクとベストプラクティスの詳細については、このドキュメント (英語) を参照してください。

シークレットが見つかると、そのデータがアプリケーションで利用できるようになります。

プロパティを使用してデータベース構成を読み取る demo という名前の spring boot アプリケーションがあるとします。次のコマンドを使用して、Kubernetes シークレットを作成できます。

kubectl create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd

前述のコマンドにより、次のシークレットが作成されます (これは kubectl get secrets db-secret -o yaml を使用して確認できます)。

apiVersion: v1
data:
  password: cDQ1NXcwcmQ=
  username: dXNlcg==
kind: Secret
metadata:
  creationTimestamp: 2017-07-04T09:15:57Z
  name: db-secret
  namespace: default
  resourceVersion: "357496"
  selfLink: /api/v1/namespaces/default/secrets/db-secret
  uid: 63c89263-6099-11e7-b3da-76d6186905a8
type: Opaque

データには、create コマンドによって提供されるリテラルの Base64 エンコードバージョンが含まれることに注意してください。

その後、アプリケーションでこのシークレットを使用できるようになります。たとえば、シークレットの値を環境変数としてエクスポートします。

apiVersion: v1
kind: Deployment
metadata:
  name: ${project.artifactId}
spec:
   template:
     spec:
       containers:
         - env:
            - name: DB_USERNAME
              valueFrom:
                 secretKeyRef:
                   name: db-secret
                   key: username
            - name: DB_PASSWORD
              valueFrom:
                 secretKeyRef:
                   name: db-secret
                   key: password

消費するシークレットはさまざまな方法で選択できます。

  1. シークレットがマップされているディレクトリをリストすると、次のようになります。

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql

    すべてのシークレットを共通のルートにマッピングしている場合は、次のように設定できます。

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
  2. 名前付きシークレットを設定すると、次のようになります。

    -Dspring.cloud.kubernetes.secrets.name=db-secret
  3. ラベルのリストを定義すると、次のようになります。

    -Dspring.cloud.kubernetes.secrets.labels.broker=activemq
    -Dspring.cloud.kubernetes.secrets.labels.db=postgresql

ConfigMap の場合と同様、複数の Secret インスタンスを使用できる、より高度な構成も可能です。spring.cloud.kubernetes.secrets.sources リストはこれを可能にします。例: 次の Secret インスタンスを定義できます。

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      secrets:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
         - name: s1
         # Spring Cloud Kubernetes looks up a Secret named default-name in namespace n2
         - namespace: n2
         # Spring Cloud Kubernetes looks up a Secret named s3 in namespace n3
         - namespace: n3
           name: s3

前述の例では、spring.cloud.kubernetes.secrets.namespace が設定されていない場合、アプリケーションが実行する名前空間で s1 という名前の Secret が検索されます。アプリケーションの名前空間がどのように解決されるかをより深く理解するには、namespace-resolution を参照してください。

ConfigMaps と同様 Secrets プロパティソースをロードできないときにアプリケーションの起動が失敗するようにするには、spring.cloud.kubernetes.secrets.fail-fast=true を設定します。

ConfigMaps などの Secret プロパティソースの再試行を有効にすることもできます。ConfigMap プロパティソースと同様に、最初に spring.cloud.kubernetes.secrets.fail-fast=true を設定する必要があります。次に、クラスパスに spring-retry と spring-boot-starter-aop を追加する必要があります。Secret プロパティソースの再試行動作は、spring.cloud.kubernetes.secrets.retry.* プロパティを設定することで構成できます。

何らかの理由ですでにクラスパス上に spring-retry および spring-boot-starter-aop があり、フェイルファストを有効にしたいが、再試行は有効にしたくない場合。spring.cloud.kubernetes.secrets.retry.enabled=false を設定することで、SecretsPropertySources の再試行を無効にできます。

Secrets から送信されるデータは通常機密情報として扱われるため、アクチュエーター /env および /configprops のエンドポイントでデータをサニタイズして、プレーンテキストで表示されないようにすることができます。そのためには、以下を設定する必要があります。

spring.cloud.kubernetes.sanitize.secrets=true

この設定は 3.0.6 以降でサポートされています。

表 1: プロパティ:
名前 タイプ デフォルト 説明

spring.cloud.kubernetes.secrets.enabled

Boolean

true

シークレットを有効にする PropertySource

spring.cloud.kubernetes.secrets.name

String

${spring.application.name}

検索するシークレットの名前を設定します

spring.cloud.kubernetes.secrets.namespace

String

クライアント名前空間

Kubernetes 名前空間を検索する場所を設定します

spring.cloud.kubernetes.secrets.labels

Map

null

シークレットの検索に使用されるラベルを設定します

spring.cloud.kubernetes.secrets.paths

List

null

シークレットがマウントされるパスを設定します (例 1)

spring.cloud.kubernetes.secrets.enableApi

Boolean

false

API を介したシークレットの消費を有効または無効にします (例 2 と 3)

spring.cloud.kubernetes.secrets.fail-fast

Boolean

false

Secret のロード中にエラーが発生した場合のアプリケーションの起動の失敗を有効または無効にします

spring.cloud.kubernetes.secrets.retry.enabled

Boolean

true

シークレットの再試行を有効または無効にします。

spring.cloud.kubernetes.secrets.retry.initial-interval

Long

1000

ミリ秒単位の初期再試行間隔。

spring.cloud.kubernetes.secrets.retry.max-attempts

Integer

6

最大試行回数。

spring.cloud.kubernetes.secrets.retry.max-interval

Long

2000

バックオフの最大間隔。

spring.cloud.kubernetes.secrets.retry.multiplier

Double

1.1

次の区間の乗数。

注:

シークレットを使用するアプリケーションの例 (ただし、新しい spring-cloud-kubernetes プロジェクトを使用するように更新されていません) は、spring-boot-camel-config [GitHub] (英語) で見つけることができます。