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
ロールが必要です。より高いレベルのロール (例:edit
) が Secret には必要になります (Secret はデフォルトでは監視されません)。 - ポーリング
-
ConfigMap と Secret から定期的に設定を再作成し、設定の変更を確認します。ポーリングの期間は
spring.cloud.kubernetes.reload.period
プロパティーを使用して設定でき、デフォルトは 15 秒 です。監視対象のプロパティーソースと同じロールが必要です。たとえば、ファイルにマウントされた Secret ソースにポーリングを使用する場合は特定の権限は必要ありません。
9.5.5. PropertySource reload 設定プロパティー
リロード機能の設定には、以下のプロパティーを使用できます。
- 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 は元の状態に復元されません。