検索

第9章 Spring Boot と Kubernetes の統合

download PDF

現在、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 ファイルに追加します。

手順

  1. 以下の Maven 依存関係を Spring Boot Maven プロジェクトの pom.xml ファイルに追加して、Kubernetes インテグレーションを有効にします。

    <project ...>
      ...
      <dependencies>
        ...
        <dependency>
          <groupId>io.fabric8</groupId>
          <artifactId>spring-cloud-kubernetes-core</artifactId>
        </dependency>
        ...
      </dependencies>
      ...
    </project>
  2. インテグレーションを完了するには以下を行います。

    • アノテーションを Java ソースコードに追加します。
    • Kubernetes ConfigMap オブジェクトを作成します。
    • アプリケーションが ConfigMap オブジェクトを読み取りできるようにするため、OpenShift サービスアカウントのパーミッションを編集します。

その他のリソース

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 を基にしています。

手順

  1. 新しいシェルプロンプトを開き、以下の 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.fisartifactId の値には fuse74-configmap を入力します。残りのフィールドにはデフォルト値を使用します。

  2. OpenShift にログインし、アプリケーションをデプロイする OpenShift プロジェクトに切り替えます。たとえば、developer ユーザーとしてログインし、test プロジェクトにデプロイする場合は、以下のコマンドを入力します。

    oc login -u developer -p developer
    oc project test
  3. コマンドラインで、新しい fuse74-configmap プロジェクトのディレクトリーに移動し、このアプリケーションの Secret オブジェクトを作成します。

    oc create -f sample-secret.yml
    注記

    アプリケーションをデプロイする に Secret オブジェクトを作成する必要があります。そうでないと、Secret が利用できるようになるまでデプロイされたコンテナーが待機状態になります。続けて Secret を作成すると、コンテナーは待機状態ではなくなります。Secret オブジェクトの設定方法に関する詳細は「Secret の設定」を参照してください。

  4. クイックスタートアプリケーションをビルドおよびデプロイします。fuse74-configmap プロジェクトのトップレベルで以下を入力します。

    mvn fabric8:deploy -Popenshift
  5. 次のようにアプリケーションログを確認します。

    1. ブラウザーで OpenShift コンソールを開き、該当するプロジェクト namespace を選択します (例: test)。
    2. fuse74-configmap サービスの円形 Pod アイコンの中心をクリックします。
    3. Pods ビューで Name Pod をクリックし、実行中の Pod の詳細を表示します (1 つの Pod のみが実行中である場合は直接詳細ページが表示されます)。
    4. Logs タグをクリックしてアプリケーションログを表示し、下方向にスクロールして Camel アプリケーションによって生成されたログメッセージを見つけます。
  6. 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
  7. 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_NAMEqs-camel-config に定義します。

  8. ライブリロード機能の動作を確認するには、以下のように ConfigMap オブジェクトを作成します。

    oc create -f sample-configmap.yml

    新しい ConfigMap は、実行中のアプリケーションにある Camel ルートの受信者リストをオーバーライドし、生成されたメッセージを 3 つ のダミーエンドポイントである direct:async-queuedirect: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 の外部化設定がどのように動作するかを示しています。

kube spring boot 01

設定メカニズムには以下の 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 を設定するには、以下を行います。

  1. サンプル Secret オブジェクトの作成
  2. Secret のボリュームマウントの設定
  3. 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 }}}'

1
デプロイメントは volumes セクションで、camel-config という名前の Secret を参照する camel-config という名前の新しいボリュームを宣言します。
2
デプロイメントは volumeMounts セクションで、新しいボリュームマウントを宣言します。これは、camel-config ボリュームを参照し、Secret ボリュームが Pod のファイルシステムの /etc/secrets/camel-config パスにマウントする必要があることを指定します。

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
1
metadata.name: ConfigMap を識別します。OpenShift システムの他の部分はこの識別子を使用して ConfigMap を参照します。
2
data.application.properties: このセクションは、アプリケーションとデプロイされた application.properties ファイルの設定をオーバーライドできるプロパティー設定をリストします。
3
quickstart.recipients: quickstartConfiguration Bean の recipients プロパティーにインジェクトすることを目的とします。

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 アプリケーションにアクセスできるようにするには、以下の手順を実行します。

手順

  1. Spring Boot アプリケーションで 外部化設定 メカニズムを使用し、ConfigMap プロパティーソースへアクセスします。たとえば、Java Bean に @Configuration アノテーションを付けると、ConfigMap による Bean のプロパティー値のインジェクションが可能になります。
  2. プロジェクトの bootstrap.properties ファイル (または bootstrap.yaml ファイル) で、spring.application.name プロパティーが ConfigMap の名前と一致するよう設定します。
  3. アプリケーションに関連するサービスアカウントの 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 が見つかった場合、アプリケーションはそのデータを利用できます。

  1. Secret マウントからの再帰的な読み取り
  2. アプリケーションにちなんだ名前の付与 (spring.application.name を参照)
  3. 一部のラベルとの一致

デフォルトでは、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 機能は、デフォルトで無効になっています。

手順

  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 ロールが必要です。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
リロードの実行時に使用するストラテジー (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 は元の状態に復元されません。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.