第9章 Spring Boot と Kubernetes の統合
現在、Spring Cloud Kubernetes プラグインは Spring Boot と Kubernetes の以下の機能を統合できます。
9.1. Spring Boot の外部化設定
Spring Boot の 外部化設定 (externalized configuration) は、外部ソースの設定値を Java コードにインジェクトできるメカニズムです。Java コードでインジェクションを有効にするには、通常 @Value
アノテーション (単一のフィールドにインジェクトする場合) または @ConfigurationProperties
アノテーション(Java Bean クラスの複数のプロパティーにインジェクトする場合) をつけます。
設定データはさまざまなソース (プロパティーソース) から取得できます。特に、設定プロパティーは多くの場合でプロジェクトの application.properties
ファイル (または application.yaml
ファイル) で設定されます。
9.1.1. Kubernetes の ConfigMap
Kubernetes の ConfigMap は、設定データをデプロイされたアプリケーションに提供できるメカニズムです。ConfigMap オブジェクトは、通常 YAML ファイルに定義され、Kubernetes クラスターにアップロードされるため、デプロイされたアプリケーションで設定データを利用できるようになります。
9.1.2. Kubernetes の Secret
Kubernetes の Secretは、機密データ (パスワード、証明書など) をデプロイされたアプリケーションに提供するメカニズムです。
9.1.3. Spring Cloud Kubernetes プラグイン
Spring Cloud Kubernetes プラグインは、Kubernetes と Spring Boot 間のインテグレーションを実装します。原則では、Kubernetes API を使用して ConfigMap から設定データにアクセスできます。しかし、Kubernetes の ConfigMap が Spring Boot 設定の代替プロパティーソースとして動作するように Kubernetes の ConfigMap を直接 Spring Boot の外部化設定メカニズムで統合した方がはるかに便利です。Spring Cloud Kubernetes プラグインは基本的にこの機能を提供します。
9.1.4. Kubernetes インテグレーションでの Spring Boot の有効化
Kubernetes インテグレーションを有効にするには、そのインテグレーションを Maven 依存関係として pom.xml
ファイルに追加します。
手順
以下の Maven 依存関係を Spring Boot Maven プロジェクトの pom.xml ファイルに追加して、Kubernetes インテグレーションを有効にします。
<project ...> ... <dependencies> ... <dependency> <groupId>io.fabric8</groupId> <artifactId>spring-cloud-kubernetes-core</artifactId> </dependency> ... </dependencies> ... </project>
インテグレーションを完了するには以下を行います。
- アノテーションを Java ソースコードに追加します。
- Kubernetes ConfigMap オブジェクトを作成します。
- アプリケーションが ConfigMap オブジェクトを読み取りできるようにするため、OpenShift サービスアカウントのパーミッションを編集します。
その他のリソース
- 詳細は、「ConfigMap プロパティーソースのチュートリアルの実行」を参照してください。
9.2. ConfigMap プロパティーソースのチュートリアルの実行
以下のチュートリアルでは、Kubernetes の Secret および ConfigMap の設定を試すことができます。「Kubernetes インテグレーションでの Spring Boot の有効化」の説明どおりに、Spring Cloud Kubernetes プラグインを有効にして、Kubernetes 設定オブジェクトを Spring Boot 外部化設定と統合します。
9.2.1. Spring Boot Camel Config クイックスタートの実行
以下のチュートリアルは、Kubernetes の Secret と ConfigMap の設定を可能にする spring-boot-camel-config-archetype
Maven archetype を基にしています。
手順
新しいシェルプロンプトを開き、以下の Maven コマンドを入力して簡単な Camel Spring Boot プロジェクトを作成します。
mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate \ -DarchetypeCatalog=https://maven.repository.redhat.com/ga/io/fabric8/archetypes/archetypes-catalog/2.2.0.fuse-740017-redhat-00003/archetypes-catalog-2.2.0.fuse-740017-redhat-00003-archetype-catalog.xml \ -DarchetypeGroupId=org.jboss.fuse.fis.archetypes \ -DarchetypeArtifactId=spring-boot-camel-config-archetype \ -DarchetypeVersion=2.2.0.fuse-740017-redhat-00003
archetype プラグインは対話モードに切り替わり、残りのフィールドを追加するよう要求します。
Define value for property 'groupId': : org.example.fis Define value for property 'artifactId': : fuse74-configmap Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': org.example.fis: : [INFO] Using property: spring-boot-version = 1.5.17.RELEASE Confirm properties configuration: groupId: org.example.fis artifactId: fuse74-configmap version: 1.0-SNAPSHOT package: org.example.fis spring-boot-version: 1.5.17.RELEASE Y: :
プロンプトが表示されたら、
groupId
の値にはorg.example.fis
、artifactId
の値にはfuse74-configmap
を入力します。残りのフィールドにはデフォルト値を使用します。OpenShift にログインし、アプリケーションをデプロイする OpenShift プロジェクトに切り替えます。たとえば、
developer
ユーザーとしてログインし、test
プロジェクトにデプロイする場合は、以下のコマンドを入力します。oc login -u developer -p developer oc project test
コマンドラインで、新しい
fuse74-configmap
プロジェクトのディレクトリーに移動し、このアプリケーションの Secret オブジェクトを作成します。oc create -f sample-secret.yml
注記アプリケーションをデプロイする 前 に Secret オブジェクトを作成する必要があります。そうでないと、Secret が利用できるようになるまでデプロイされたコンテナーが待機状態になります。続けて Secret を作成すると、コンテナーは待機状態ではなくなります。Secret オブジェクトの設定方法に関する詳細は「Secret の設定」を参照してください。
クイックスタートアプリケーションをビルドおよびデプロイします。
fuse74-configmap
プロジェクトのトップレベルで以下を入力します。mvn fabric8:deploy -Popenshift
次のようにアプリケーションログを確認します。
-
ブラウザーで OpenShift コンソールを開き、該当するプロジェクト namespace を選択します (例:
test
)。 -
fuse74-configmap
サービスの円形 Pod アイコンの中心をクリックします。 - Pods ビューで Name Pod をクリックし、実行中の Pod の詳細を表示します (1 つの Pod のみが実行中である場合は直接詳細ページが表示されます)。
- Logs タグをクリックしてアプリケーションログを表示し、下方向にスクロールして Camel アプリケーションによって生成されたログメッセージを見つけます。
-
ブラウザーで OpenShift コンソールを開き、該当するプロジェクト namespace を選択します (例:
src/main/resources/application.properties
で設定されるデフォルトの受信者リストは、生成されたメッセージを 2 つのダミーエンドポイントであるdirect:async-queue
およびdirect:file
に送信します。これにより、以下のようなメッセージがアプリケーションログに書き込まれます。5:44:57.376 [Camel (camel) thread #0 - timer://order] INFO generate-order-route - Generating message message-44, sending to the recipient list 15:44:57.378 [Camel (camel) thread #0 - timer://order] INFO target-route-queue - ----> message-44 pushed to an async queue (simulation) 15:44:57.379 [Camel (camel) thread #0 - timer://order] INFO target-route-queue - ----> Using username 'myuser' for the async queue 15:44:57.380 [Camel (camel) thread #0 - timer://order] INFO target-route--file - ----> message-44 written to a file
ConfigMap オブジェクトを使用して
fuse74-configmap
アプリケーションの設定を更新する前に、OpenShift ApiServer からデータを確認するパーミッションをfuse74-configmap
アプリケーションに付与する必要があります。以下のコマンドを入力し、fuse74-configmap
アプリケーションのサービスアカウントにview
パーミッションを付与します。oc policy add-role-to-user view system:serviceaccount:test:qs-camel-config
注記構文
system:serviceaccount:PROJECT_NAME:SERVICE_ACCOUNT_NAME
を使用してサービスアカウントが指定されます。fis-config
デプロイメント記述子は、SERVICE_ACCOUNT_NAME
をqs-camel-config
に定義します。ライブリロード機能の動作を確認するには、以下のように ConfigMap オブジェクトを作成します。
oc create -f sample-configmap.yml
新しい ConfigMap は、実行中のアプリケーションにある Camel ルートの受信者リストをオーバーライドし、生成されたメッセージを 3 つ のダミーエンドポイントである
direct:async-queue
、direct:file
、およびdirect:mail
に送信するよう設定します。ConfigMap オブジェクトの詳細は、「ConfigMap の設定」を参照してください。これにより、以下のようなメッセージがアプリケーションログに書き込まれます。16:25:24.121 [Camel (camel) thread #0 - timer://order] INFO generate-order-route - Generating message message-9, sending to the recipient list 16:25:24.124 [Camel (camel) thread #0 - timer://order] INFO target-route-queue - ----> message-9 pushed to an async queue (simulation) 16:25:24.125 [Camel (camel) thread #0 - timer://order] INFO target-route-queue - ----> Using username 'myuser' for the async queue 16:25:24.125 [Camel (camel) thread #0 - timer://order] INFO target-route--file - ----> message-9 written to a file (simulation) 16:25:24.126 [Camel (camel) thread #0 - timer://order] INFO target-route--mail - ----> message-9 sent via mail
9.2.2. 設定プロパティー Bean
設定プロパティー Bean は、インジェクションによって設定を受け取ることができる標準の Java Bean です。Java コードと外部設定メカニズムの間の基本的なインターフェースを提供します。
外部化設定および Bean レジストリー
以下のイメージは、spring-boot-camel-config
クイックスタートで Spring Boot の外部化設定がどのように動作するかを示しています。
設定メカニズムには以下の 2 つの主要部分があります。
- プロパティーソース
-
設定へのインジェクションのプロパティー設定を提供します。デフォルトのプロパティーソースはアプリケーションの
application.properties
ファイルで、任意で ConfigMap オブジェクトまたは Secret オブジェクトによるオーバーライドが可能です。 - 設定プロパティー Bean
-
プロパティーソースから設定の更新を受け取ります。設定プロパティー Bean は、
@Configuration
または@ConfigurationProperties
アノテーションが付けられた Java Bean です。 - Spring Bean レジストリー
- 必要なアノテーションが付けられた 設定プロパティー Bean は、Spring Bean レジストリーに登録されます。
- Camel Bean レジストリー
- Camel Bean レジストリーは、自動的に Spring Bean レジストリーと統合されるため、登録された Spring Bean を Camel ルートで参照できます。
QuickstartConfiguration クラス
fuse74-configmap
プロジェクトの設定プロパティー Bean は、以下のように QuickstartConfiguration
Java クラス (src/main/java/org/example/fis/
ディレクトリー下) として定義されます。
package org.example.fis; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration 1 @ConfigurationProperties(prefix = "quickstart") 2 public class QuickstartConfiguration { /** * A comma-separated list of routes to use as recipients for messages. */ private String recipients; 3 /** * The username to use when connecting to the async queue (simulation) */ private String queueUsername; 4 /** * The password to use when connecting to the async queue (simulation) */ private String queuePassword; 5 // Setters and Getters for Bean properties // NOT SHOWN ... }
- 1
@Configuration
アノテーションによって、QuickstartConfiguration
クラスはインスタンス化され、quickstartConfiguration
を ID として持つ Beanとして Spring に登録されます。これにより、Bean は自動的に Camel からアクセスできるようになります。たとえば、Camel 構文${bean:quickstartConfiguration?method=getQueueUsername}
を使用すると、target-route-queue
ルートはqueueUserName
プロパティーにアクセスできるようになります。- 2
@ConfigurationProperties
アノテーションは、プロパティーソースのプロパティー値を定義するときに使用する必要がある接頭辞quickstart
を定義します。たとえば、プロパティーファイルはrecipients
プロパティーをquickstart.recipients
として参照します。- 3
recipient
プロパティーはプロパティーソースからインジェクトできます。- 4
queueUsername
プロパティーはプロパティーソースからインジェクトできます。- 5
queuePassword
プロパティーはプロパティーソースからインジェクトできます。
9.2.3. Secret の設定
このクイックスタートの Kubernetes Secret は、必要な 1 つの追加ステップ以外は標準の方法でセットアップされています。追加ステップとして、Spring Cloud Kubernetes プラグインを Secret のマウントパスで設定し、起動時に Secret が読み取れるようにする必要があります。Secret を設定するには、以下を行います。
- サンプル Secret オブジェクトの作成
- Secret のボリュームマウントの設定
- Secret プロパティーを読み取るため spring-cloud-kubernetes を設定
サンプル Secret オブジェクト
クイックスタートプロジェクトによって、以下のようなサンプル Secret sample-secret.yml
が提供されます。Secret オブジェクトのプロパティー値は常に base64 でエンコードされます (base64
コマンドラインユーティリティーを使用)。Secret が Pod のファイルシステムにマウントされると、値は自動的に元のプレーンテキストにデコードされます。
sample-secret.yml ファイル
apiVersion: v1 kind: Secret metadata: 1 name: camel-config type: Opaque data: # The username is 'myuser' quickstart.queue-username: bXl1c2VyCg== 2 quickstart.queue-password: MWYyZDFlMmU2N2Rm 3
- 1
- metadata.name: Secret を識別します。OpenShift システムの他の部分はこの識別子を使用して Secret を参照します。
- 2
- quickstart.queue-username:
quickstartConfiguration
Bean のqueueUsername
プロパティーにインジェクトすることを目的とします。値は base64 でエンコードする 必要 があります。 - 3
- quickstart.queue-password:
quickstartConfiguration
Bean のqueuePassword
プロパティーにインジェクトすることを目的とします。値は base64 でエンコードする 必要 があります。
Kubernetes では、プロパティー名を CamelCase で定義できません (プロパティー名をすべて小文字にする必要があります)。この制限を回避するには、ハイフンを使用した形式 queue-username
を使用します。Spring はこれを queueUsername
と一致します。これは、外部化設定に対して Spring Boot の リラックスバインディングルールを利用します。
Secret のボリュームマウントの設定
Secret をボリュームマウントとして設定し、起動時に Secret がロードされるようにアプリケーションを設定する必要があります。アプリケーションの起動後、Secret プロパティーはファイルシステムの指定の場所で利用可能になります。アプリケーションの deployment.yml
ファイルは、Secret のボリュームマウントを定義する src/main/fabric8/
ディレクトリー下にあります。
deployment.yml ファイル
spec: template: spec: serviceAccountName: "qs-camel-config" volumes: 1 - name: "camel-config" secret: # The secret must be created before deploying this application secretName: "camel-config" containers: - volumeMounts: 2 - name: "camel-config" readOnly: true # Mount the secret where spring-cloud-kubernetes is configured to read it # see src/main/resources/bootstrap.yml mountPath: "/etc/secrets/camel-config" resources: # requests: # cpu: "0.2" # memory: 256Mi # limits: # cpu: "1.0" # memory: 256Mi env: - name: SPRING_APPLICATION_JSON value: '{"server":{"undertow":{"io-threads":1, "worker-threads":2 }}}'
Secret プロパティーを読み取るため spring-cloud-kubernetes を設定
Secret を Spring Boot の外部化設定と統合するには、Spring Cloud Kubernetes プラグインを Secret のマウントパスで設定する必要があります。Spring Cloud Kubernetes は指定の場所から Secret を読み取り、Spring Boot はそれをプロパティーソースとして利用できるようになります。Spring Cloud Kubernetes プラグインを設定するには、クイックスタートプロジェクトの src/main/resources
下にある bootstrap.yml
ファイルを設定します。
bootstrap.yml ファイル
# Startup configuration of Spring-cloud-kubernetes spring: application: name: camel-config cloud: kubernetes: reload: # Enable live reload on ConfigMap change (disabled for Secrets by default) enabled: true secrets: paths: /etc/secrets/camel-config
spring.cloud.kubernetes.secrets.paths
プロパティーは、Pod の Secret ボリュームマウントのパスリストを指定します。
bootstrap.properties
ファイル (または bootstrap.yml
ファイル) は、application.properties
ファイルと同様に動作しますが、アプリケーションの起動時により前の段階でロードされます。bootstrap.properties
ファイルの Spring Cloud Kubernetes プラグインに関連するプロパティーを設定した方が信頼性が高くなります。
9.2.4. ConfigMap の設定
Spring Cloud Kubernetes との統合には、ConfigMap オブジェクトの作成と適切な view パーミッションの設定の他に、ConfigMap の metadata.name
がプロジェクトの bootstrap.yml
ファイルに設定された spring.application.name
プロパティーの値と一致するようにする必要があります。ConfigMap を設定するには、以下を行います。
- サンプル ConfigMap オブジェクトの作成
- view パーミッションの設定
- Spring Cloud Kubernetes プラグインの設定
サンプル ConfigMap オブジェクト
クイックスタートオブジェクトは、サンプル ConfigMap sample-configmap.yml
を提供します。
kind: ConfigMap apiVersion: v1 metadata: 1 # Must match the 'spring.application.name' property of the application name: camel-config data: application.properties: | 2 # Override the configuration properties here quickstart.recipients=direct:async-queue,direct:file,direct:mail 3
view パーミッションの設定
Secret の deployment.yml ファイルで説明したとおり、serviceAccountName
はプロジェクトの deployment.yml
ファイルで qs-camel-config
に設定されます。そのため、以下のコマンドを実行して、クイックスタートアプリケーションで view
パーミッションを有効にします (test
プロジェクト namespace にデプロイされることを仮定します)。
oc policy add-role-to-user view system:serviceaccount:test:qs-camel-config
Spring Cloud Kubernetes プラグインの設定
Spring Cloud Kubernetes プラグインは、bootstrap.yml
ファイルの以下の設定によって指定されます。
- spring.application.name
-
この値は、ConfigMap オブジェクトの
metadata.name
と一致する必要があります (たとえば、クイックスタートのsample-configmap.yml
で定義された値)。デフォルトはapplication
です。 - spring.cloud.kubernetes.reload.enabled
-
これを
true
に設定すると、ConfigMap オブジェクトの動的リロードが有効になります。
サポートされるプロパティーに関する詳細は「PropertySource リロード設定プロパティー」を参照してください。
9.3. ConfigMap PropertySource の使用
Kubernetes には、設定をアプリケーションに渡すための ConfigMap という概念があります。Spring Cloud Kubernetes プラグインは、ConfigMap
とのインテグレーションを提供し、Spring Boot が ConfigMap にアクセスできるようにします。
有効な場合、ConfigMap
PropertySource
はアプリケーションの名前が付いた ConfigMap
を Kubernetes で検索します (spring.application.name
を参照)。その ConfigMap が見つかった場合は、そのデータを読み取り、以下を行います。
9.3.1. 個々のプロパティーの適用
プロパティーを使用してそのスレッドプール設定を読み取る demo
という名前の Spring Boot アプリケーションがあるとします。
-
pool.size.core
-
pool.size.max
これを YAML 形式で ConfigMap に外部化することができます。
kind: ConfigMap apiVersion: v1 metadata: name: demo data: pool.size.core: 1 pool.size.max: 16
9.3.2. application.yaml というプロパティーの適用
ほとんどの場合で個々のプロパティーは適切に動作しますが、YAML を使用した方が便利であることがあります。ここでは、application.yaml
という名前の単一のプロパティーを使用し、YAML を内部に組み込みします。
kind: ConfigMap apiVersion: v1 metadata: name: demo data: application.yaml: |- pool: size: core: 1 max:16
9.3.3. application.properties というプロパティーの適用
Spring Boot の application.properties
ファイルのスタイルで ConfigMap プロパティーを定義することもできます。ここでは、application.properties
という名前の単一のプロパティーを使用し、内部にプロパティー設定をリストします。
kind: ConfigMap apiVersion: v1 metadata: name: demo data: application.properties: |- pool.size.core: 1 pool.size.max: 16
9.3.4. ConfigMap のデプロイ
ConfigMap をデプロイし、Spring Boot アプリケーションにアクセスできるようにするには、以下の手順を実行します。
手順
-
Spring Boot アプリケーションで 外部化設定 メカニズムを使用し、ConfigMap プロパティーソースへアクセスします。たとえば、Java Bean に
@Configuration
アノテーションを付けると、ConfigMap による Bean のプロパティー値のインジェクションが可能になります。 -
プロジェクトの
bootstrap.properties
ファイル (またはbootstrap.yaml
ファイル) で、spring.application.name
プロパティーが ConfigMap の名前と一致するよう設定します。 アプリケーションに関連するサービスアカウントの
view
パーミッションを有効にします (デフォルトでは、default
というサービスアカウントになります)。たとえば、view
パーミッションをdefault
サービスアカウントに追加するには、以下を実行します。oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)
9.4. Secrets PropertySource の使用
Kubernetes には、パスワードや OAuth トークンなどの機密データを格納するための Secret という概念があります。Spring Cloud Kubernetes プラグインは Secrets
とのインテグレーションを提供し、Spring Boot が Secret へアクセスできるようにします。
有効になっている Secrets
プロパティーソースは、以下のソースから Kubernetes の Secrets
を検索します。Secret が見つかった場合、アプリケーションはそのデータを利用できます。
- Secret マウントからの再帰的な読み取り
-
アプリケーションにちなんだ名前の付与 (
spring.application.name
を参照) - 一部のラベルとの一致
デフォルトでは、API 経由の Secret の消費 (上記の 2 および 3) は 有効になっていない ことに注意してください。
9.4.1. Secret の設定例
プロパティーを使用して ActiveMQ および PostreSQL 設定を読み取る demo
という名前の Spring Boot アプリケーションがあるとします。
amq.username amq.password pg.username pg.password
これらの Secret は YAML 形式で Secrets
に対して外部化できます。
- ActiveMQ の Secret
apiVersion: v1 kind: Secret metadata: name: activemq-secrets labels: broker: activemq type: Opaque data: amq.username: bXl1c2VyCg== amq.password: MWYyZDFlMmU2N2Rm
- PostreSQL の Secret
apiVersion: v1 kind: Secret metadata: name: postgres-secrets labels: db: postgres type: Opaque data: pg.username: dXNlcgo= pg.password: cGdhZG1pbgo=
9.4.2. Secret の消費
消費する Secret を選択する方法は複数あります。
Secret がマップされたディレクトリーをリストする方法
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/activemq,etc/secrets/postgres
すべての Secret が共通のルートにマップされている場合は、以下のように設定できます。
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
名前付きの Secret を設定する方法
-Dspring.cloud.kubernetes.secrets.name=postgres-secrets
ラベルのリストを定義する方法
-Dspring.cloud.kubernetes.secrets.labels.broker=activemq -Dspring.cloud.kubernetes.secrets.labels.db=postgres
9.4.3. Secrets PropertySource の設定プロパティー
以下のプロパティーを使用して、Secrets プロパティーソースを設定できます。
- spring.cloud.kubernetes.secrets.enabled
-
Secrets プロパティーソースを有効にします。タイプは
Boolean
で、デフォルトはtrue
です。 - spring.cloud.kubernetes.secrets.name
-
検索する Secret の名前を設定します。タイプは
String
で、デフォルトは${spring.application.name}
です。 - spring.cloud.kubernetes.secrets.labels
-
Secret の検索に使用されるラベルを設定します。このプロパティーは マップベースのバインディング による定義どおりに動作します。タイプは
java.util.Map
で、デフォルトはnull
です。 - spring.cloud.kubernetes.secrets.paths
-
Secret がマウントされるパスを設定します。このプロパティーは コレクションベースのバインディング による定義どおりに動作します。タイプは
java.util.List
で、デフォルトはnull
です。 - spring.cloud.kubernetes.secrets.enableApi
-
API 経由で Secret の消費を有効または無効にします。タイプは
Boolean
で、デフォルトはfalse
です。
API 経由でシークレットにアクセスすることは、セキュリティー上の理由で制限されることがあります。シークレットを POD にマウントする方法が推奨されます。
9.5. PropertySource reload の使用
アプリケーションによっては、外部プロパティーソースで変更を検出し、内部の状況を更新して、新しい設定を反映する必要があります。Spring Cloud Kubernetes のリロード機能は、関連する ConfigMap または Secret の変更時にアプリケーションのリロードをトリガーできます。
9.5.1. PropertySource reload の有効化
Spring Cloud Kubernetes の PropertySource reload
機能は、デフォルトで無効になっています。
手順
-
クイックスタートの
src/main/resources
ディレクトリーに移動し、bootstrap.yml
ファイルを開きます。 -
設定プロパティー
spring.cloud.kubernetes.reload.enabled=true
を変更します。
9.5.2. PropertySource reload のレベル
spring.cloud.kubernetes.reload.strategy
プロパティーでは以下のリロードレベルがサポートされます。
- refresh
(デフォルト):
@ConfigurationProperties
または@RefreshScope
アノテーションが付けられた設定 Bean のみがリロードされます。このリロードレベルは、Spring Cloud コンテキストの更新機能を利用します。注記PropertySource reload 機能は、リロードストラテジーが
refresh
に設定されている場合に シンプルな プロパティー (コレクションではない) のみに使用できます。コレクションによって対応されるプロパティーは起動時に変更しないでください。- restart_context
- Spring の ApplicationContext 全体が正常に再起動されます。Bean は新しい設定で再作成されます。
- shutdown
- Spring の ApplicationContext がシャットダウンされ、コンテナーの再起動がアクティベートされます。このレベルを使用する場合は、デーモンでないすべてのスレッドが ApplicationContext にバインドされ、レプリケーションコントローラーまたはレプリカのセットが Pod を再起動するよう設定されているようにしてください。
9.5.3. PropertySource reload の例
以下の例では、リロード機能が有効になっている場合の動作について説明します。
手順
リロード機能がデフォルト設定 (refresh モード) で有効になっていることを仮定します。ConfigMap の変更時に以下の Beanが更新されます。
@Configuration @ConfigurationProperties(prefix = "bean") public class MyConfig { private String message = "a message that can be changed live"; // getter and setters }
変更の詳細を確認するには、以下のようにメッセージを定期的に出力する別の Bean を作成します。
@Component public class MyBean { @Autowired private MyConfig config; @Scheduled(fixedDelay = 5000) public void hello() { System.out.println("The message is: " + config.getMessage()); } }
以下のように ConfigMap を使用すると、アプリケーションによって出力されるメッセージを変更できます。
apiVersion: v1 kind: ConfigMap metadata: name: reload-example data: application.properties: |- bean.message=Hello World!
Pod に関連する ConfigMap の
bean.message
という名前のプロパティーに変更を加えると、プログラムの出力に反映されます。
9.5.4. PropertySource reload の操作モード
リロード機能は 2 つの操作モードをサポートします。
- event
-
(デフォルト): Kubernetes API (Web ソケット) を使用して ConfigMap または Secret の変更を監視します。イベントによって設定の再チェックが実行され、変更があった場合はリロードが実行されます。ConfigMap の変更をリッスンするには、サービスアカウントに
view
ロールが必要です。Secret にはより高いレベルのロール ( など) が必要になります (Secret はデフォルトでは監視されません)。 - polling
-
ConfigMap と Secret から定期的に設定を再作成し、設定の変更を確認します。ポーリングの期間は
spring.cloud.kubernetes.reload.period
プロパティーを使用して設定でき、デフォルトは 15 秒 です。監視対象のプロパティーソースと同じロールが必要です。たとえば、ファイルにマウントされた Secret ソースにポーリングを使用する場合は特定の権限は必要ありません。
9.5.5. PropertySource リロード設定プロパティー
リロード機能の設定には、以下のプロパティーを使用できます。
- spring.cloud.kubernetes.reload.enabled
-
プロパティーソースおよび設定リロードの監視を有効にします。タイプは
Boolean
で、デフォルトはfalse
です。 - spring.cloud.kubernetes.reload.monitoring-config-maps
-
ConfigMap の変更の監視を許可します。タイプは
Boolean
で、デフォルトはtrue
です。 - spring.cloud.kubernetes.reload.monitoring-secrets
-
Secret の変更の監視を許可します。タイプは
Boolean
で、デフォルトはfalse
です。 - spring.cloud.kubernetes.reload.strategy
-
リロードの実行時に使用するストラテジー (
refresh
、restart_context
、またはshutdown
)。タイプはEnum
で、デフォルトはrefresh
です。 - spring.cloud.kubernetes.reload.mode
-
プロパティーソースの変更をリッスンする方法を指定します (
event
またはpolling
)。タイプはEnum
で、デフォルトはevent
です。 - spring.cloud.kubernetes.reload.period
-
polling
ストラテジーの使用時に変更の検証を行う期間をミリ秒単位で指定します。タイプはLong
で、デフォルトは15000
です。
以下の点に注意してください。
-
spring.cloud.kubernetes.reload.*
プロパティーは ConfigMap または Secret で使用しないでください。起動時にこのようなプロパティーを変更すると、予期せぬ結果が発生する可能性があります。 -
refresh
レベルの使用時に、プロパティーまたは ConfigMap 全体を削除しても、Bean は元の状態に復元されません。