9.15. 外部ソースからの設定値の読み込み
設定プロバイダーを使用して、外部ソースから設定データを読み込みます。プロバイダーは、Streams for Apache Kafka とは独立して動作します。これを使用して、プロデューサーやコンシューマーを含む、すべての Kafka コンポーネントの設定データを読み込むことができます。コンポーネントの設定で外部ソースを参照し、アクセス権を提供します。プロバイダーは、新しい外部ソースを参照する場合でも、Kafka コンポーネントの再起動やファイルの抽出を必要とせずにデータを読み込みます。たとえば、プロバイダーを使用して、Kafka Connect コネクター設定の認証情報を提供します。設定には、外部ソースへのアクセス権が含まれている必要があります。
9.15.1. 設定プロバイダーの有効化
コンポーネントの spec
設定で config.providers
プロパティーを使用して、1 つ以上の設定プロバイダーを有効にできます。
設定プロバイダーを有効にするための設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: env config.providers.env.class: org.apache.kafka.common.config.provider.EnvVarConfigProvider # ...
- KubernetesSecretConfigProvider
- OpenShift シークレットから設定データを読み込みます。シークレットの名前と、設定データが保存されるシークレット内のキーを指定します。このプロバイダーは、パスワードやその他のユーザー認証情報などの機密設定データを保存するのに役立ちます。
- KubernetesConfigMapConfigProvider
- OpenShift config map から設定データを読み込みます。config map の名前と、設定データが保存される config map 内のキーを指定します。このプロバイダーは、機密性のない設定データを保存するのに役立ちます。
- EnvVarConfigProvider
- 環境変数から設定データを読み込みます。設定データが保存される環境変数の名前を指定します。このプロバイダーは、コンテナー内で実行されるアプリケーションを設定する場合、たとえば、シークレットからマップされた環境変数から証明書や JAAS 設定をロードする場合に役立ちます。
- FileConfigProvider
- ファイルから設定データを読み込みます。設定データが保存されているファイルへのパスを指定します。このプロバイダーは、コンテナーにマウントされたファイルから設定データをロードする場合に役立ちます。
- DirectoryConfigProvider
- ディレクトリー内のファイルから設定データを読み込みます。設定ファイルが保存されているディレクトリーへのパスを指定します。このプロバイダーは、複数の設定ファイルを読み込んだり、設定データを個別のファイルに整理したりする場合に役立ちます。
OpenShift Configuration Provider プラグインの一部である KubernetesSecretConfigProvider
および KubernetesConfigMapConfigProvider
を使用するには、設定ファイルを含む namespace へのアクセス権を設定する必要があります。
アクセス権を設定せずに他のプロバイダーを使用できます。次の手順を実行することで、この方法で Kafka Connect または MirrorMaker 2 のコネクター設定を提供できます。
- config map またはシークレットを環境変数またはボリュームとして Kafka Connect Pod にマウントします
-
Kafka Connect または MirrorMaker 2 設定で
EnvVarConfigProvider
、FileConfigProvider
、またはDirectoryConfigProvider
を有効にする -
KafkaConnect
またはKafkaMirrorMaker2
リソースのspec
のexternalConfiguration
プロパティーを使用してコネクター設定を渡します。
プロバイダーを使用すると、Kafka Connect REST インターフェイスを介して制限された情報が渡されるのを防ぐことができます。このアプローチは次のシナリオで使用できます。
- コネクターがデータソースとの接続と通信に使用する値を使用して環境変数をマウントする
- Kafka Connect コネクターの設定に使用される値を含むプロパティーファイルをマウントする
- コネクターが使用する TLS トラストストアとキーストアの値を含むディレクトリーにファイルをマウントする
コネクターに新しい Secret
または ConfigMap
を使用する場合は再起動が必要であり、他のコネクターが中断される可能性があります。
9.15.2. シークレットまたは config map から設定値を読み込む
KubernetesSecretConfigProvider
を使用してシークレットから設定プロパティーを提供するか、KubernetesConfigMapConfigProvider
を使用して config map から設定プロパティーを提供します。
この手順では、config map はコネクターの設定プロパティーを提供します。プロパティーは、config map のキー値として指定されます。config map は、Kafka Connect Pod にボリュームとしてマウントされます。
前提条件
- 稼働中の Kafka クラスター
- Cluster Operator が稼働中である。
- コネクター設定を含む config map がある。
コネクタープロパティーを含む config map の例
apiVersion: v1 kind: ConfigMap metadata: name: my-connector-configuration data: option1: value1 option2: value2
手順
KafkaConnect
リソースを設定します。-
KubernetesConfigMapConfigProvider
を有効にする
ここに示す仕様は、config map およびシークレットからの値のロードをサポートできます。
config map とシークレットを使用するための Kafka Connect 設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: secrets,configmaps 1 config.providers.configmaps.class: io.strimzi.kafka.KubernetesConfigMapConfigProvider 2 config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider 3 # ...
-
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
外部の config map の値へのアクセスを許可するロールを作成します。
config map の値にアクセスするロールの例
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: connector-configuration-role rules: - apiGroups: [""] resources: ["configmaps"] resourceNames: ["my-connector-configuration"] verbs: ["get"] # ...
このルールは、
my-connector-configuration
config map にアクセスする権限をロールに付与します。config map が含まれる namespace へのアクセスを許可するロールバインディングを作成します。
config map が含まれる namespace にアクセスするためのロールバインディングの例
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: connector-configuration-role-binding subjects: - kind: ServiceAccount name: my-connect-connect namespace: my-project roleRef: kind: Role name: connector-configuration-role apiGroup: rbac.authorization.k8s.io # ...
ロールバインディングにより、
my-project
namespace にアクセスする権限がロールに付与されます。サービスアカウントは、Kafka Connect デプロイメントによって使用されるものと同じである必要があります。サービスアカウント名の形式は
<cluster_name>-connect
で、<cluster_name>
はKafkaConnect
のカスタムリソースの名前です。コネクター設定で config map を参照します。
config map を参照するコネクター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-connector labels: strimzi.io/cluster: my-connect spec: # ... config: option: ${configmaps:my-project/my-connector-configuration:option1} # ... # ...
プレースホルダー構造は、
configmaps:<path_and_file_name>:<property>
です。KubernetesConfigMapConfigProvider
は、外部の ConfigMap からoption1
プロパティーの値を読み込んで抽出します。
9.15.3. 環境変数から設定値の読み込み
EnvVarConfigProvider
を使用して、設定プロパティーを環境変数として提供します。環境変数には、config map またはシークレットの値を含めることができます。
この手順では、環境変数は、Amazon AWS と通信するためのコネクターの設定プロパティーを提供します。コネクターは AWS_ACCESS_KEY_ID
および AWS_SECRET_ACCESS_KEY
の読み取みを可能にする必要があります。環境変数の値は、Kafka Connect Pod にマウントされたシークレットから派生します。
ユーザー定義の環境変数に、KAFKA_
または STRIMZI_
で始まる名前を付けることはできません。
前提条件
- 稼働中の Kafka クラスター
- Cluster Operator が稼働中である。
- コネクター設定を含むシークレットがある。
環境変数の値を含むシークレットの例
apiVersion: v1 kind: Secret metadata: name: aws-creds type: Opaque data: awsAccessKey: QUtJQVhYWFhYWFhYWFhYWFg= awsSecretAccessKey: Ylhsd1lYTnpkMjl5WkE=
手順
KafkaConnect
リソースを設定します。-
EnvVarConfigProvider
を有効にする -
externalConfiguration
プロパティーを使用して環境変数を指定します。
外部環境変数を使用するための Kafka Connect 設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: env 1 config.providers.env.class: org.apache.kafka.common.config.provider.EnvVarConfigProvider 2 # ... externalConfiguration: env: - name: AWS_ACCESS_KEY_ID 3 valueFrom: secretKeyRef: name: aws-creds 4 key: awsAccessKey 5 - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey # ...
注記SecretKeyRef
プロパティーは、シークレット内のキーを参照します。シークレットの代わりに config map を使用している場合は、configMapKeyRef
プロパティーを使用します。-
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
コネクター設定の環境変数を参照してください。
環境変数を参照するコネクター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-connector labels: strimzi.io/cluster: my-connect spec: # ... config: option: ${env:AWS_ACCESS_KEY_ID} option: ${env:AWS_SECRET_ACCESS_KEY} # ... # ...
プレースホルダー構造は
env:<environment_variable_name>
です。EnvVarConfigProvider
は、マウントされたシークレットから環境変数値を読み取り、抽出します。
9.15.4. ディレクトリー内のファイルから設定値を読み込む
FileConfigProvider
を使用して、ディレクトリー内のファイルから設定プロパティーを提供します。ファイルは config map またはシークレットにすることができます。
この手順では、ファイルによりコネクターの設定プロパティーが提供されます。データベース名とパスワードはシークレットのプロパティーとして指定されます。シークレットは、Kafka Connect Pod にボリュームとしてマウントされます。ボリュームはパス /opt/kafka/external-configuration/<volume-name>
にマウントされます。
前提条件
- 稼働中の Kafka クラスター
- Cluster Operator が稼働中である。
- コネクター設定を含むシークレットがある。
データベースプロパティーのあるシークレットの例
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque stringData: connector.properties: |- 1 dbUsername: my-username 2 dbPassword: my-password
手順
KafkaConnect
リソースを設定します。-
FileConfigProvider
を有効にする -
externalConfiguration
プロパティーを使用してファイルを指定します。
外部プロパティーファイルを使用するための Kafka Connect 設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: config.providers: file 1 config.providers.file.class: org.apache.kafka.common.config.provider.FileConfigProvider 2 #... externalConfiguration: volumes: - name: connector-config 3 secret: secretName: mysecret 4
-
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
コネクター設定内のファイルプロパティーをプレースホルダーとして参照します。
ファイルを参照するコネクター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: io.debezium.connector.mysql.MySqlConnector tasksMax: 2 config: database.hostname: 192.168.99.1 database.port: "3306" database.user: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbUsername}" database.password: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbPassword}" database.server.id: "184054" #...
プレースホルダー構造は、
file:<path_and_file_name>:<property>
です。FileConfigProvider
は、マウントされたシークレットからデータベースのユーザー名とパスワードのプロパティー値を読み取り、抽出します。
9.15.5. ディレクトリー内の複数のファイルから設定値を読み込む
DirectoryConfigProvider
を使用して、ディレクトリー内の複数のファイルから設定プロパティーを提供します。ファイルは config map またはシークレットにすることができます。
この手順では、シークレットによって、コネクターの TLS キーストアとトラストストアのユーザー認証情報が提供されます。認証情報は別のファイルにあります。シークレットは、Kafka Connect Pod にボリュームとしてマウントされます。ボリュームはパス /opt/kafka/external-configuration/<volume-name>
にマウントされます。
前提条件
- 稼働中の Kafka クラスター
- Cluster Operator が稼働中である。
- ユーザー認証情報を含むシークレットを持っている。
ユーザー認証情報を含むシークレットの例
apiVersion: v1 kind: Secret metadata: name: my-user labels: strimzi.io/kind: KafkaUser strimzi.io/cluster: my-cluster type: Opaque data: ca.crt: <public_key> # Public key of the clients CA user.crt: <user_certificate> # Public key of the user user.key: <user_private_key> # Private key of the user user.p12: <store> # PKCS #12 store for user certificates and keys user.password: <password_for_store> # Protects the PKCS #12 store
my-user
シークレットは、コネクターのキーストア認証情報 (user.crt
および user.key
) を提供します。
Kafka クラスターのデプロイ時に生成される <cluster_name>-cluster-ca-cert
シークレットは、クラスター CA 証明書をトラストストア認証情報 (ca.crt
) として提供します。
手順
KafkaConnect
リソースを設定します。-
DirectoryConfigProvider
を有効にする -
externalConfiguration
プロパティーを使用してファイルを指定します。
外部プロパティーファイルを使用するための Kafka Connect 設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: config.providers: directory 1 config.providers.directory.class: org.apache.kafka.common.config.provider.DirectoryConfigProvider 2 #... externalConfiguration: volumes: 3 - name: cluster-ca 4 secret: secretName: my-cluster-cluster-ca-cert 5 - name: my-user secret: secretName: my-user 6
-
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
コネクター設定内のファイルプロパティーをプレースホルダーとして参照します。
ファイルを参照するコネクター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: io.debezium.connector.mysql.MySqlConnector tasksMax: 2 config: # ... database.history.producer.security.protocol: SSL database.history.producer.ssl.truststore.type: PEM database.history.producer.ssl.truststore.certificates: "${directory:/opt/kafka/external-configuration/cluster-ca:ca.crt}" database.history.producer.ssl.keystore.type: PEM database.history.producer.ssl.keystore.certificate.chain: "${directory:/opt/kafka/external-configuration/my-user:user.crt}" database.history.producer.ssl.keystore.key: "${directory:/opt/kafka/external-configuration/my-user:user.key}" #...
プレースホルダー構造は
directory:<path>:<file_name>
です。DirectoryConfigProvider
は、マウントされたシークレットから認証情報を読み取り、抽出します。