シークレット PropertySource
Kubernetes には、パスワードや OAuth トークンなどの機密データを保存するためのシークレット (英語) の概念があります。このプロジェクトは、Secrets
との統合を提供し、Spring Boot アプリケーションからシークレットにアクセスできるようにします。spring.cloud.kubernetes.secrets.enabled
プロパティを設定することで、この機能を明示的に有効または無効にできます。
有効にすると、Fabric8SecretsPropertySource
は次のソースから Secrets
の Kubernetes を検索します。
シークレットマウントから再帰的に読み取る
アプリケーションにちなんで名付けられました (
spring.application.name
による定義)いくつかのラベルの一致
注:
デフォルトでは、セキュリティ上の理由から、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
消費するシークレットはさまざまな方法で選択できます。
シークレットがマップされているディレクトリをリストすると、次のようになります。
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql
すべてのシークレットを共通のルートにマッピングしている場合は、次のように設定できます。
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
名前付きシークレットを設定すると、次のようになります。
-Dspring.cloud.kubernetes.secrets.name=db-secret
ラベルのリストを定義すると、次のようになります。
-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 を設定することで、Secrets PropertySources の再試行を無効にできます。 |
Secrets から送信されるデータは通常機密情報として扱われるため、アクチュエーター /env
および /configprops
のエンドポイントでデータをサニタイズして、プレーンテキストで表示されないようにすることができます。そのためには、以下を設定する必要があります。
spring.cloud.kubernetes.sanitize.secrets=true
この設定は 3.0.6
以降でサポートされています。
名前 | タイプ | デフォルト | 説明 |
---|---|---|---|
|
|
| シークレットを有効にする |
|
|
| 検索するシークレットの名前を設定します |
|
| クライアント名前空間 | Kubernetes 名前空間を検索する場所を設定します |
|
|
| シークレットの検索に使用されるラベルを設定します |
|
|
| シークレットがマウントされるパスを設定します (例 1) |
|
|
| API を介したシークレットの消費を有効または無効にします (例 2 と 3) |
|
|
|
|
|
|
| シークレットの再試行を有効または無効にします。 |
|
|
| ミリ秒単位の初期再試行間隔。 |
|
|
| 最大試行回数。 |
|
|
| バックオフの最大間隔。 |
|
|
| 次の区間の乗数。 |
注:
spring.cloud.kubernetes.secrets.labels
プロパティは、マップベースのバインディング [GitHub] (英語) で定義されたように動作します。spring.cloud.kubernetes.secrets.paths
プロパティは、コレクションベースのバインディング [GitHub] (英語) で定義されたように動作します。API を介したシークレットへのアクセスは、セキュリティ上の理由から制限される場合があります。推奨される方法は、シークレットを Pod にマウントすることです。
シークレットを使用するアプリケーションの例 (ただし、新しい spring-cloud-kubernetes
プロジェクトを使用するように更新されていません) は、spring-boot-camel-config [GitHub] (英語) で見つけることができます。