9.5. PropertySource reload の使用

アプリケーションによっては、外部プロパティーソースで変更を検出し、内部の状況を更新して、新しい設定を反映する必要があります。Spring Cloud Kubernetes のリロード機能は、関連する ConfigMap または Secret の変更時にアプリケーションのリロードをトリガーできます。

9.5.1. PropertySource reload の有効化

Spring Cloud Kubernetes の PropertySource reload 機能は、デフォルトで無効になっています。

手順

  1. クイックスタートの src/main/resources ディレクトリーに移動し、bootstrap.yml ファイルを開きます。
  2. 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 の例

以下の例では、リロード機能が有効になっている場合の動作について説明します。

手順

  1. リロード機能がデフォルト設定 (refresh モード) で有効になっていることを仮定します。ConfigMap の変更時に以下の Bean が更新されます。

    @Configuration
    @ConfigurationProperties(prefix = "bean")
    public class MyConfig {
    
        private String message = "a message that can be changed live";
    
        // getter and setters
    
    }
  2. 変更の詳細を確認するには、以下のようにメッセージを定期的に出力する別の Bean を作成します。

    @Component
    public class MyBean {
    
        @Autowired
        private MyConfig config;
    
        @Scheduled(fixedDelay = 5000)
        public void hello() {
            System.out.println("The message is: " + config.getMessage());
        }
    }
  3. 以下のように 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
リロードの実行時に使用するストラテジー (refreshrestart_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 は元の状態に復元されません。