OpenShift 上の Streams for Apache Kafka のデプロイと管理
OpenShift Container Platform で Streams for Apache Kafka 2.7 をデプロイおよび管理する
概要
はじめに
Red Hat ドキュメントへのフィードバック (英語のみ)
Red Hat ドキュメントに関するご意見やご感想をお寄せください。
改善を提案するには、Jira 課題を作成し、変更案を説明してください。ご要望に迅速に対応できるよう、できるだけ詳細にご記入ください。
前提条件
-
Red Hat カスタマーポータルのアカウントがある。このアカウントを使用すると、Red Hat Jira Software インスタンスにログインできます。
アカウントをお持ちでない場合は、アカウントを作成するように求められます。
手順
- 以下の Create issue をクリックします。
- Summary テキストボックスに、問題の簡単な説明を入力します。
Description テキストボックスに、次の情報を入力します。
- 問題が見つかったページの URL
-
問題の詳細情報
他のフィールドの情報はデフォルト値のままにすることができます。
- レポーター名を追加します。
- Create をクリックして、Jira 課題をドキュメントチームに送信します。
フィードバックをご提供いただきありがとうございました。
第1章 デプロイメントの概要
Streams for Apache Kafka は、OpenShift クラスターで Apache Kafka を実行するプロセスを簡素化します。
このガイドでは、Streams for Apache Kafka のデプロイと管理の手順について説明します。デプロイメントオプションと手順については、Streams for Apache Kafka に付属するサンプルインストールファイルを使用して説明します。このガイドでは設定に関する重要な考慮事項を強調していますが、利用可能なすべてのオプションを網羅しているわけではありません。Kafka コンポーネントの設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
このガイドでは、デプロイメント手順に加えて、デプロイメント前およびデプロイメント後のガイダンスも提供されます。Kafka クラスターへのクライアントアクセスのセットアップとセキュリティー保護について説明します。さらに、メトリクス統合、分散トレーシング、クラスター管理ツール (Cruise Control や Streams for Apache Kafka Drain Cleaner など) といった追加のデプロイメントオプションについても説明します。また、Streams for Apache Kafka の管理と、最適なパフォーマンスを実現するための Kafka 設定の微調整に関する推奨事項も紹介します。
デプロイメントを最新の状態に保てるように、Streams for Apache Kafka と Kafka の両方のアップグレード手順を記載しています。
Streams for Apache Kafka は、ディストリビューションに関係なく、すべてのタイプの OpenShift クラスターと互換性があるように設計されています。デプロイメントにパブリッククラウドまたはプライベートクラウドが含まれるかどうか、ローカル開発環境をセットアップしている場合、このガイドの手順はすべての場合に当てはまります。
1.1. Streams for Apache Kafka カスタムリソース
Streams for Apache Kafka を使用した OpenShift クラスターへの Kafka コンポーネントのデプロイは、カスタムリソースを使用することで詳細に設定できます。これらのリソースは、OpenShift リソースを拡張するカスタムリソース定義 (CRD) によって導入される API のインスタンスとして作成されます。
CRD は、OpenShift クラスターでカスタムリソースを記述するための設定手順として機能し、デプロイメントで使用する Kafka コンポーネントごとに Streams for Apache Kafka で、ユーザーおよびトピックと共に提供されます。CRD およびカスタムリソースは YAML ファイルとして定義されます。YAML ファイルのサンプルは、Streams for Apache Kafka ディストリビューションで提供されます。
CRD を使用すると、Streams for Apache Kafka リソースは、CLI アクセシビリティーや設定検証などのネイティブ OpenShift 機能の恩恵を受けることができます。
1.1.1. Streams for Apache Kafka カスタマムリソースの例
Streams for Apache Kafka 固有リソースのインスタンス化および管理に使用されるスキーマを定義するため、CRD をクラスターに一度インストールする必要があります。
CRD をインストールして新規カスタムリソースタイプをクラスターに追加した後に、その仕様に基づいてリソースのインスタンスを作成できます。
クラスターの設定によりますが、インストールには通常、クラスター管理者権限が必要です。
カスタムリソースの管理は、Streams for Apache Kafka 管理者に限定されます。詳細は、「Streams for Apache Kafka 管理者の指定」 を参照してください。
kind:Kafka
などの新しい kind
リソースは、OpenShift クラスター内で CRD によって定義されます。
Kubernetes API サーバーを使用すると、kind
を基にしたカスタムリソースの作成が可能になり、カスタムリソースが OpenShift クラスターに追加されたときにカスタムリソースの検証および格納方法を CRD から判断します。
Streams for Apache Kafka 固有のカスタムリソースはそれぞれ、リソースの kind
の CRD によって定義されるスキーマに準拠します。Streams for Apache Kafka コンポーネントのカスタムリソースには、spec
で定義される共通の設定プロパティーがあります。
CRD とカスタムリソースの関係を理解するため、Kafka トピックの CRD の例を見てみましょう。
Kafka トピックの CRD
apiVersion: kafka.strimzi.io/v1beta2 kind: CustomResourceDefinition metadata: name: kafkatopics.kafka.strimzi.io labels: app: strimzi spec: group: kafka.strimzi.io versions: v1beta2 scope: Namespaced names: # ... singular: kafkatopic plural: kafkatopics shortNames: - kt additionalPrinterColumns: # ... subresources: status: {} validation: openAPIV3Schema: properties: spec: type: object properties: partitions: type: integer minimum: 1 replicas: type: integer minimum: 1 maximum: 32767 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: CustomResourceDefinition
metadata:
name: kafkatopics.kafka.strimzi.io
labels:
app: strimzi
spec:
group: kafka.strimzi.io
versions:
v1beta2
scope: Namespaced
names:
# ...
singular: kafkatopic
plural: kafkatopics
shortNames:
- kt
additionalPrinterColumns:
# ...
subresources:
status: {}
validation:
openAPIV3Schema:
properties:
spec:
type: object
properties:
partitions:
type: integer
minimum: 1
replicas:
type: integer
minimum: 1
maximum: 32767
# ...
- 1
- CRD を識別するためのトピック CRD、その名前および名前のメタデータ。
- 2
- グループ (ドメイン) 名、複数名、サポート対象のスキーマバージョンなど、この CRD の仕様。トピックの API にアクセスするために URL で使用されます。他の名前は、CLI のインスタンスリソースを識別するために使用されます。たとえば、
oc get kafkatopic my-topic
やoc get kafkatopics
です。 - 3
- CLI コマンドでは短縮名を使用できます。たとえば、
oc get kafkatopic
の代わりにoc get kt
を略名として使用できます。 - 4
- カスタムリソースで
get
コマンドを使用する場合に示される情報。 - 5
- リソースの スキーマリファレンス に記載されている CRD の現在のステータス。
- 6
- openAPIV3Schema 検証によって、トピックカスタムリソースの作成が検証されます。たとえば、トピックには 1 つ以上のパーティションと 1 つのレプリカが必要です。
Streams for Apache Kafka インストールファイルと提供される CRD YAML ファイルを識別できます。ファイル名には、インデックス番号とそれに続く Crd が含まれるからです。
KafkaTopic
カスタムリソースに該当する例は次のとおりです。
Kafka トピックカスタムリソース
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 1 config: retention.ms: 7200000 segment.bytes: 1073741824 status: conditions: lastTransitionTime: "2019-08-20T11:37:00.706Z" status: "True" type: Ready observedGeneration: 1 / ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 1
replicas: 1
config:
retention.ms: 7200000
segment.bytes: 1073741824
status:
conditions:
lastTransitionTime: "2019-08-20T11:37:00.706Z"
status: "True"
type: Ready
observedGeneration: 1
/ ...
- 1
kind
およびapiVersion
によって、インスタンスであるカスタムリソースの CRD が特定されます。- 2
- トピックまたはユーザーが属する Kafka クラスターの名前 (
Kafka
リソースの名前と同じ) を定義する、KafkaTopic
およびKafkaUser
リソースのみに適用可能なラベル。 - 3
- 指定内容には、トピックのパーティション数およびレプリカ数や、トピック自体の設定パラメーターが示されています。この例では、メッセージがトピックに保持される期間や、ログのセグメントファイルサイズが指定されています。
- 4
KafkaTopic
リソースのステータス条件。lastTransitionTime
でtype
条件がReady
に変更されています。
プラットフォーム CLI からカスタムリソースをクラスターに適用できます。カスタムリソースが作成されると、Kubernetes API の組み込みリソースと同じ検証が使用されます。
KafkaTopic
カスタムリソースの作成後、Topic Operator は通知を受け取り、対応する Kafka トピックが Streams for Apache Kafka に作成されます。
1.1.2. カスタムリソースでの oc
操作の実施
oc
コマンドを使用して、Streams for Apache Kafka カスタムリソースの情報を取得するなどの操作を実行できます。リソースタイプに対して操作を行うには、get
、describe
、edit
、delete
などの oc
コマンドを使用します。たとえば、oc get kafkatopics
はすべての Kafka トピックのリストを取得し、oc get kafkas
はデプロイされたすべての Kafka クラスターを取得します。
リソースタイプを参照する際には、単数形と複数形の両方の名前を使うことができます。oc get kafkas
は oc get kafka
と同じ結果になります。
リソースの 短縮名 を使用することもできます。短縮名を覚えておくと、Streams for Apache Kafka を管理するときに時間を節約できます。Kafka
の短縮名は k
であるため、oc get k
を実行してすべての Kafka クラスターをリスト表示することもできます。
Kafka クラスターのリスト表示
oc get k NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS my-cluster 3 3
oc get k
NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS
my-cluster 3 3
Streams for Apache Kafka リソース | 正式名 | 短縮名 |
---|---|---|
Kafka | kafka | k |
Kafka Node Pool | kafkanodepool | knp |
Kafka Topic | kafkatopic | kt |
Kafka User | kafkauser | ku |
Kafka Connect | kafkaconnect | kc |
Kafka Connector | kafkaconnector | kctr |
Kafka Mirror Maker | kafkamirrormaker | kmm |
Kafka Mirror Maker 2 | kafkamirrormaker2 | kmm2 |
Kafka Bridge | kafkabridge | kb |
Kafka Rebalance | kafkarebalance | kr |
1.1.2.1. リソースカテゴリー
oc
コマンドでは、カスタムリソースのカテゴリーも使用できます。
Streams for Apache Kafka カスタムリソースは、すべて strimzi
カテゴリーに属しています。そのため、strimzi
を使用すると、1 つのコマンドですべての Streams for Apache Kafka リソースを取得できます。
たとえば、oc get strimzi
を実行すると、指定した namespace 内の Streams for Apache Kafka がリスト表示されます。
すべてのカスタムリソースのリスト表示
oc get strimzi NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS kafka.kafka.strimzi.io/my-cluster 3 3 NAME PARTITIONS REPLICATION FACTOR kafkatopic.kafka.strimzi.io/kafka-apps 3 3 NAME AUTHENTICATION AUTHORIZATION kafkauser.kafka.strimzi.io/my-user tls simple
oc get strimzi
NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS
kafka.kafka.strimzi.io/my-cluster 3 3
NAME PARTITIONS REPLICATION FACTOR
kafkatopic.kafka.strimzi.io/kafka-apps 3 3
NAME AUTHENTICATION AUTHORIZATION
kafkauser.kafka.strimzi.io/my-user tls simple
oc get strimzi -o name
コマンドは、すべてのリソースタイプとリソース名を返します。-o name
オプションは type/name 形式で出力を取得します。
すべてのリソースタイプとリソース名のリスト表示
oc get strimzi -o name kafka.kafka.strimzi.io/my-cluster kafkatopic.kafka.strimzi.io/kafka-apps kafkauser.kafka.strimzi.io/my-user
oc get strimzi -o name
kafka.kafka.strimzi.io/my-cluster
kafkatopic.kafka.strimzi.io/kafka-apps
kafkauser.kafka.strimzi.io/my-user
この strimzi
コマンドを他のコマンドと組み合わせることができます。たとえば、これを oc delete
コマンドに渡して、単一のコマンドですべてのリソースを削除できます。
すべてのカスタムリソースの削除
oc delete $(oc get strimzi -o name) kafka.kafka.strimzi.io "my-cluster" deleted kafkatopic.kafka.strimzi.io "kafka-apps" deleted kafkauser.kafka.strimzi.io "my-user" deleted
oc delete $(oc get strimzi -o name)
kafka.kafka.strimzi.io "my-cluster" deleted
kafkatopic.kafka.strimzi.io "kafka-apps" deleted
kafkauser.kafka.strimzi.io "my-user" deleted
1 つの操作ですべてのリソースを削除することは、Streams for Apache Kafka の新機能をテストする場合などに役立ちます。
1.1.2.2. サブリソースのステータスのクエリー
-o
オプションに渡すことのできる他の値もあります。たとえば、-o yaml
を使用すると、YAML 形式で出力されます。-o json
を使用すると JSON として返されます。
oc get --help
のすべてのオプションが表示されます。
最も便利なオプションの 1 つは JSONPath サポート で、JSONPath 式を渡して Kubernetes API にクエリーを実行できます。JSONPath 式は、リソースの特定部分を抽出または操作できます。
たとえば、JSONPath 式 {.status.listeners[?(@.name=="tls")].bootstrapServers}
を使用して、Kafka カスタムリソースのステータスからブートストラップアドレスを取得し、Kafka クライアントで使用できます。
この場合、コマンドは tls
という名前のリスナーの bootstrapServers
値を取得します。
ブートストラップアドレスの取得
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="tls")].bootstrapServers}{"\n"}' my-cluster-kafka-bootstrap.myproject.svc:9093
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="tls")].bootstrapServers}{"\n"}'
my-cluster-kafka-bootstrap.myproject.svc:9093
名前の条件を変更することで、他の Kafka リスナーのアドレスも取得できます。
jsonpath
を使用して、カスタムリソースから他のプロパティーまたはプロパティーのグループを抽出できます。
1.1.3. Streams for Apache Kafka カスタムリソースのステータス情報
ステータスプロパティーは、特定のカスタムリソースのステータス情報を提供します。
次の表に、ステータス情報 (デプロイ時) を提供するカスタムリソースと、ステータスプロパティーを定義するスキーマを示します。
スキーマの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
Streams for Apache Kafka リソース | スキーマリファレンス | ステータス情報が公開される場所 |
---|---|---|
|
| Kafka クラスター、そのリスナー、およびノードプール |
|
| ノードプール内のノード、そのロール、および関連する Kafka クラスター |
|
| Kafka クラスター内の Kafka トピック |
|
| Kafka クラスター内の Kafka ユーザー |
|
| Kafka Connect クラスターとコネクタープラグイン |
|
|
|
|
| Kafka MirrorMaker 2 クラスターと内部コネクター |
|
| Kafka MirrorMaker クラスター |
|
| Streams for Apache Kafka Bridge |
|
| リバランスの状況と結果 |
|
| 管理され、現在のバージョンを使用し、準備完了状態にある Pod の数 |
リソースの status
プロパティーは、リソースの状態に関する情報を提供します。status.conditions
および status.observedGeneration
プロパティーは、すべてのリソースに共通です。
status.conditions
-
ステータス条件は、リソースの 現在の状態 を表します。ステータス条件プロパティーは、
仕様
で指定された設定で定義されているように、リソースが 目的の状態 に到達することに関連する進行状況を追跡するのに役立ちます。状況条件プロパティーは、リソースの状態が変更された時間と理由、および Operator が目的の状態を実現するのを妨げたり遅らせたりするイベントの詳細を提供します。 status.observedGeneration
-
最後に観察された世代は、Cluster Operator によるリソースの最新の調整を示します。
observedGeneration
の値がmetadata.generation
(デプロイメントの現在のバージョン)(の値と異なる場合、リソースの最新の更新が Operator によって処理されていません。これらの値が同じである場合、リソースの最新の変更がステータス情報に反映されます。
status
プロパティーは、リソース固有の情報も提供します。たとえば、KafkaStatus
はリスナーアドレスに関する情報と Kafka クラスターの ID を提供します。
KafkaStatus
は、使用されている Kafka および Streams for Apache Kafka のバージョンに関する情報も提供します。operatorLastSuccessfulVersion
と kafkaVersion
の値を確認すると、AMQ Streams for Apache Kafka または Kafka のアップグレードが完了したかどうかを判断できます。
Streams for Apache Kafka は、カスタムリソースのステータスを作成および維持し、カスタムリソースの現在の状態を定期的に評価し、それに応じてステータスを更新します。たとえば、oc edit
を使用してカスタムリソースで更新を行う場合、その status
は編集不可能です。さらに、status
の変更は Kafka クラスターステータスの設定に影響しません。
ここでは、Kafka
カスタムリソースの status
プロパティーを確認します。
Kafka カスタムリソースのステータス
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: spec: # ... status: clusterId: XP9FP2P-RByvEy0W4cOEUA conditions: - lastTransitionTime: '2023-01-20T17:56:29.396588Z' status: 'True' type: Ready kafkaMetadataState: KRaft kafkaVersion: 3.7.0 kafkaNodePools: - name: broker - name: controller listeners: - addresses: - host: my-cluster-kafka-bootstrap.prm-project.svc port: 9092 bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9092' name: plain - addresses: - host: my-cluster-kafka-bootstrap.prm-project.svc port: 9093 bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9093' certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: tls - addresses: - host: >- 2054284155.us-east-2.elb.amazonaws.com port: 9095 bootstrapServers: >- 2054284155.us-east-2.elb.amazonaws.com:9095 certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external3 - addresses: - host: ip-10-0-172-202.us-east-2.compute.internal port: 31644 bootstrapServers: 'ip-10-0-172-202.us-east-2.compute.internal:31644' certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external4 observedGeneration: 3 operatorLastSuccessfulVersion: 2.7
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
spec:
# ...
status:
clusterId: XP9FP2P-RByvEy0W4cOEUA
conditions:
- lastTransitionTime: '2023-01-20T17:56:29.396588Z'
status: 'True'
type: Ready
kafkaMetadataState: KRaft
kafkaVersion: 3.7.0
kafkaNodePools:
- name: broker
- name: controller
listeners:
- addresses:
- host: my-cluster-kafka-bootstrap.prm-project.svc
port: 9092
bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9092'
name: plain
- addresses:
- host: my-cluster-kafka-bootstrap.prm-project.svc
port: 9093
bootstrapServers: 'my-cluster-kafka-bootstrap.prm-project.svc:9093'
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: tls
- addresses:
- host: >-
2054284155.us-east-2.elb.amazonaws.com
port: 9095
bootstrapServers: >-
2054284155.us-east-2.elb.amazonaws.com:9095
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: external3
- addresses:
- host: ip-10-0-172-202.us-east-2.compute.internal
port: 31644
bootstrapServers: 'ip-10-0-172-202.us-east-2.compute.internal:31644'
certificates:
- |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
name: external4
observedGeneration: 3
operatorLastSuccessfulVersion: 2.7
- 1
- Kafka クラスター ID。
- 2
- ステータス
conditions
は、Kafka クラスターの現在の状態を表します。 - 3
Ready
状態は、Cluster Operator が Kafka クラスターがトラフィックを処理できると見なしていることを示します。- 4
- Kafka メタデータの管理と操作の調整に使用されるメカニズム (KRaft または ZooKeeper) を示す Kafka メタデータの状態。
- 5
- Kafka クラスターによって使用されている Kafka のバージョン。
- 6
- Kafka クラスターに属するノードプール。
- 7
listeners
は、Kafka ブートストラップアドレスをタイプ別に記述します。- 8
observedGeneration
値は、Cluster Operator によるKafka
カスタムリソースの最後の調整を示します。- 9
- 最後の調整を正常に完了した Operator のバージョン。
Kafka ブートストラップアドレスがステータスに一覧表示されても、それらのエンドポイントまたは Kafka クラスターが Ready
状態であるとは限りません。
1.1.4. カスタムリソースのステータスの検出
カスタムリソースの status
サブリソースで oc
を使用して、リソースに関する情報を取得します。
前提条件
- OpenShift クラスター
- Cluster Operator が稼働中である。
手順
カスタムリソースを指定し、
-o jsonpath
オプションを使用して標準の JSONPath 式を適用してstatus
プロパティーを選択します。oc get kafka <kafka_resource_name> -o jsonpath='{.status}' | jq
oc get kafka <kafka_resource_name> -o jsonpath='{.status}' | jq
Copy to Clipboard Copied! この式は、指定されたカスタムリソースのすべてのステータス情報を返します。
status.listeners
またはstatus.observedGeneration
などのドット表記を使用すると、表示するステータス情報を微調整できます。jq
コマンドライン JSON パーサーツール を使用すると、出力が読みやすくなります。
1.2. Streams for Apache Kafka Operator
Streams for Apache Kafka Operator は、OpenShift 上の Kafka を効果的に管理するための専門的な運用知識をベースに特別に構築されています。各 Operator は個別の関数を実行します。
- Cluster Operator
- Cluster Operator は、OpenShift での Apache Kafka クラスターのデプロイメントおよび管理を処理します。Kafka ブローカーおよびその他の Kafka コンポーネントおよびリソースの設定を自動化します。
- Topic Operator
- Topic Operator は、Kafka クラスター内でのトピックの作成、設定、および削除を管理します。
- User Operator
- User Operator は、Kafka ブローカーへのアクセスを必要とする Kafka ユーザーを管理します。
Streams for Apache Kafka をデプロイするときは、まず Cluster Operator をデプロイします。その後、Cluster Operator が Kafka のデプロイメントを処理する準備が整います。Cluster Operator を使用して、またはスタンドアロン Operator として Topic Operator および User Operator をデプロイすることもできます。Cluster Operator によって管理されない Kafka クラスターでは、スタンドアロンの Operator を使用します。
Topic Operator および User Operator は Entity Operator の一部です。Cluster Operator は、Entity Operator 設定に基づいて Operator を 1 つまたは両方デプロイできます。
スタンドアロン Operator をデプロイするには、環境変数を設定して Kafka クラスターに接続する必要があります。これらの環境変数は、Cluster Operator によって設定されるため、Cluster Operator を使用して Operator をデプロイする場合に設定する必要はありません。
1.2.1. OpenShift namespace 内の Streams for Apache Kafka リソースの監視
Operator は、OpenShift namespace 内の Streams for Apache Kafka リソースを監視および管理します。Cluster Operator は、OpenShift クラスター内の 1 つの namespace、複数の namespace、またはすべての namespace を監視できます。Topic Operator と User Operator は、1 つの namespace を監視できます。
-
Cluster Operator は
Kafka
リソースを監視します -
Topic Operator は
KafkaTopic
リソースを監視します -
User Operator は
KafkaUser
リソースを監視します
Topic Operator と User Operator は、namespace 内の 1 つの Kafka クラスターのみを監視できます。また、1 つの Kafka クラスターにのみ接続できます。
複数の Topic Operator が同じ namespace を監視すると、名前の競合やトピックの削除が発生する可能性があります。これは、各 Kafka クラスターが同じ名前 (__consumer_offsets
など) を持つ Kafka トピックを使用するためです。特定の namespace を監視する Topic Operator が 1 つだけであることを確認してください。
1 つの namespace で複数の User Operator を使用する場合、特定のユーザー名を持つユーザーが複数の Kafka クラスターに存在できます。
Cluster Operator を使用して Topic Operator と User Operator をデプロイすると、デフォルトで Cluster Operator によってデプロイされた Kafka クラスターが監視されます。Operator 設定で watchedNamespace
を使用して namespace を指定することもできます。
各 Operator のスタンドアロンデプロイメントの場合、設定で監視する namespace と Kafka クラスターへの接続を指定します。
1.2.2. RBAC リソースの管理
Cluster Operator は、OpenShift リソースへのアクセスを必要とする Streams for Apache Kafka コンポーネントのロールベースアクセス制御 (RBAC) リソースを作成および管理します。
Cluster Operator が機能するには、Kafka
および KafkaConnect
などの Kafka リソースや ConfigMap
、Pod
、Deployment
、Service
などの管理リソースと対話するために OpenShift クラスター内でパーミッションが必要です。
権限は、以下の OpenShift RBAC リソースを使用して指定します。
-
ServiceAccount
-
Role
およびClusterRole
-
RoleBinding
およびClusterRoleBinding
1.2.2.1. Streams for Apache Kafka コンポーネントへの権限委譲
Cluster Operator は strimzi-cluster-operator
という名前のサービスアカウントで実行されます。このアカウントには、Streams for Apache Kafka コンポーネントの RBAC リソースを作成する権限を付与するクラスターロールが割り当てられます。クラスターロールは、ロールバインディングによってサービスアカウントに関連付けられます。
OpenShift は、ある ServiceAccount
の下で動作するコンポーネントが、付与元の ServiceAccount
に含まれていない、別の ServiceAccount
権限を付与するのを防ぎます。Cluster Operator は管理するリソースが必要とする RoleBinding
および ClusterRoleBinding
RBAC リソースを作成するため、これに同じ権限を付与するロールが必要です。
以下のセクションでは、Cluster Operator で必要な RBAC リソースについて説明します。
1.2.2.2. ClusterRole
リソース
Cluster Operator は ClusterRole
リソースを使用して、リソースに必要なアクセスを提供します。OpenShift クラスターの設定によっては、クラスター管理者がクラスターロールを作成する必要になる場合があります。
クラスター管理者の権限は ClusterRole
リソースの作成にのみ必要です。Cluster Operator はクラスター管理者アカウントでは実行されません。
RBAC リソースは 最小権限の原則 に従い、Cluster Operator が Kafka コンポーネントのクラスターを操作するために必要な権限のみを含みます。
Cluster Operator が権限を委任するには、すべてのクラスターロールが必要です。
名前 | 説明 |
---|---|
| Cluster Operator がオペランドのデプロイと管理に使用する namespace スコープのリソースへのアクセス権。 |
| Cluster Operator がオペランドのデプロイと管理に使用するクラスタースコープのリソースへのアクセス権。 |
| Cluster Operator がリーダーの選出に使用するアクセス権。 |
| Cluster Operator が Streams for Apache Kafka カスタムリソースの監視と管理に使用するアクセス権。 |
| ラックアウェアネスが使用されている場合に、Kafka ブローカーが OpenShift ワーカーノードからトポロジーラベルを取得できるようにするアクセス権。 |
| Kafka ユーザーとトピックを管理するためにトピックおよびユーザー Operator によって使用されるアクセス権。 |
| ラックアウェアネスが使用されている場合に、Kafka Connect、MirrorMaker (1 および 2)、および Kafka Bridge が OpenShift ワーカーノードからトポロジーラベルを取得できるようにするアクセス権限。 |
1.2.2.3. ClusterRoleBinding
リソース
Cluster Operator は、ClusterRoleBinding
および RoleBinding
リソースを使用して、ClusterRole
を ServiceAccount
に関連付けます。クラスターロールバインディングは、クラスタースコープのリソースを含むクラスターロールで必要です。
名前 | 説明 |
---|---|
|
Cluster Operator に |
|
Cluster Operator に |
|
Cluster Operator に |
名前 | 説明 |
---|---|
|
Cluster Operator に |
|
Cluster Operator に |
|
Cluster Operator に |
|
Cluster Operator に |
1.2.2.4. ServiceAccount
リソース
Cluster Operator は strimzi-cluster-operator
ServiceAccount
を使用して実行されます。このサービスアカウントは、オペランドを管理するために必要な特権を付与します。Cluster Operator は、追加の ClusterRoleBinding
リソースと RoleBinding
リソースを作成して、これらの RBAC 権限の一部をオペランドに委任します。
各オペランドは、Cluster Operator によって作成される独自のサービスアカウントを使用します。これにより、Cluster Operator は最小特権の原則に従い、本当に必要なアクセス権のみをオペランドに与えることができます。
名前 | ユーザー |
---|---|
| ZooKeeper Pod |
| Kafka ブローカー Pod |
| Entitiy Operator |
| Cruise Control Pod |
| Kafka Exporter Pod |
| Kafka Connect Pod |
| MirrorMaker Pod |
| MirrorMaker 2 Pod |
| Kafka Bridge Pod |
1.2.3. Pod リソースの管理
StrimziPodSet
カスタムリソースは、Streams for Apache Kafka が Kafka Pod、Kafka Connect Pod、および MirrorMaker 2 Pod を作成および管理するために使用します。ZooKeeper を使用している場合、ZooKeeper Pod も StrimziPodSet
リソースを使用して作成および管理されます。
StrimziPodSet
リソースを作成、更新、削除することはできません。StrimziPodSet
カスタムリソースは内部で使用され、リソースの管理は Cluster Operator のみが行います。したがって、Pod が起動しなかったり、Kafka クラスターが使用できなくなったりする可能性を避けるために、Cluster Operator が適切に実行されている必要があります。
OpenShift Deployment
リソースは、他のコンポーネント (Kafka Bridge、Kafka Exporter、Cruise Control、(非推奨) MirrorMaker 1、User Operator、および Topic Operator) の Pod の作成と管理に使用されます。
1.3. Kafka Bridge を使用した Kafka クラスターへの接続
Streams for Apache Kafka Bridge API を使用すると、コンシューマーを作成および管理し、ネイティブの Kafka プロトコルではなく HTTP を介してレコードを送受信できます。
Kafka Bridge を設定する場合、Kafka クラスターへの HTTP アクセスを設定します。その後、Kafka Bridge を使用して、クラスターからのメッセージを生成および消費したり、REST インターフェイスを介して他の操作を実行することができます。
1.4. シームレスな FIPS サポート
FIPS (Federal Information Processing Standards) は、コンピューターセキュリティーおよび相互運用性の標準です。FIPS 対応の OpenShift クラスターで Streams for Apache Kafka を実行すると、Streams for Apache Kafka コンテナーイメージで使用される OpenJDK が自動的に FIPS モードに切り替わります。バージョン 2.3 以降、Streams for Apache Kafka は、変更や特別な設定を行わなくても、FIPS 対応の OpenShift クラスター上で実行できるようになりました。OpenJDK の FIPS 準拠のセキュリティーライブラリーのみを使用します。
FIPS 対応の OpenShift クラスターを使用している場合は、通常の OpenShift クラスターと比較してメモリー消費量が増加する可能性があります。問題を回避するには、メモリー要求を少なくとも 512Mi に増やすことを推奨します。
NIST 検証プログラムおよび検証済みモジュールの詳細は、NIST Web サイトの Cryptographic Module Validation Program を参照してください。
FIPS のサポートに関しては、テクノロジープレビューである Streams for Apache Kafka Proxy および Streams for Apache Kafka Console との互換性はテストされていません。正常に機能することが期待されますが、現時点では完全なサポートを保証することはできません。
1.4.1. パスワードの最小長
FIPS モードで実行する場合、SCRAM-SHA-512 パスワードは 32 文字以上にする必要があります。Streams for Apache Kafka 2.3 からは、Streams for Apache Kafka User Operator のデフォルトのパスワード長も 32 文字に設定されています。32 文字未満のパスワード長を使用するカスタム設定の Kafka クラスターがある場合は、設定を更新する必要があります。32 文字未満のパスワードを持つユーザーがいる場合は、必要な長さのパスワードを再生成する必要があります。これを行うには、たとえば、ユーザーシークレットを削除し、User Operator が適切な長さの新しいパスワードを作成するのを待ちます。
1.5. 本書の表記慣例
ユーザー置換値
ユーザーが置き換える値は、置き換え可能 な値とも呼ばれ、山かっこ (<>) を付けて表示されます。アンダースコア ( _ ) は、複数単語の値に使用されます。値がコードまたはコマンドを参照する場合は monospace
も使用されます。
たとえば、次のコードは、<my_namespace>
を正しい namespace 名に置き換える必要があることを示しています。
sed -i 's/namespace: .*/namespace: <my_namespace>/' install/cluster-operator/*RoleBinding*.yaml
sed -i 's/namespace: .*/namespace: <my_namespace>/' install/cluster-operator/*RoleBinding*.yaml
第2章 Streams for Apache Kafka のインストール方法
OpenShift 4.12 - 4.15 に Streams for Apache Kafka をインストールするには、2 つの方法があります。
インストール方法 | 説明 |
---|---|
Streams for Apache Kafka ソフトウェアダウンロードページ から、Red Hat Streams for Apache Kafka 2.7 OpenShift インストールおよびサンプルファイル をダウンロードします。
| |
OperatorHub の Streams for Apache Kafka Operator を使用して、Streams for Apache Kafka を 1 つまたはすべての namespace にデプロイします。 |
できるだけ柔軟性を確保するには、アーティファクトのインストール方法を選択してください。OperatorHub メソッドは標準的な設定を提供し、自動更新を活用できるようにします。
Helm を使用した Streams for Apache Kafka のインストールはサポートされていません。
第3章 Streams for Apache Kafka でのデプロイ対象
Apache Kafka コンポーネントは、Streams for Apache Kafka ディストリビューションを使用して、OpenShift にデプロイするために提供されます。Kafka コンポーネントは通常、クラスターとして実行され、可用性を確保します。
Kafka コンポーネントが組み込まれた通常のデプロイメントには以下が含まれます。
- ブローカーノードの Kafka クラスター
- レプリケートされた ZooKeeper インスタンスの ZooKeeper クラスター
- 外部データ接続用の Kafka Connect クラスター
- セカンダリークラスターで Kafka クラスターをミラーリングする Kafka MirrorMaker クラスター
- 監視用に追加の Kafka メトリクスデータを抽出する Kafka Exporter
- Kafka クラスターに対して HTTP ベースの要求を行う Kafka Bridge
- Cruise Control によるブローカーノード間のトピックパーティションの再バランス
少なくとも Kafka および ZooKeeper は必要ですが、上記のコンポーネントがすべて必須なわけではありません。MirrorMaker や Kafka Connect など、一部のコンポーネントでは Kafka なしでデプロイできます。
3.1. デプロイメントの順序
OpenShift クラスターへのデプロイで必要とされる順序は、次のとおりです。
- Cluster Operator をデプロイし、Kafka クラスターを管理します。
- ZooKeeper クラスターとともに Kafka クラスターをデプロイし、Topic Operator および User Operator がデプロイメントに含まれるようにします。
任意で以下をデプロイします。
- Topic Operator および User Operator (Kafka クラスターとともにデプロイしなかった場合)
- Kafka Connect
- Kafka MirrorMaker
- Kafka Bridge
- メトリクスを監視するためのコンポーネント
Cluster Operator は、 Deployment
、Service
、および Pod
リソースなど、コンポーネントの OpenShift リソースを作成します。OpenShift リソース名には、デプロイ時にコンポーネントに指定された名前が追加されます。たとえば、my-kafka-cluster
という名前の Kafka クラスターには、 my-kafka-cluster-kafka
という名前のサービスがあります。
3.2. (プレビュー) Streams for Apache Kafka Proxy のデプロイ
Streams for Apache Kafka Proxy は、Kafka ベースのシステムを強化するために設計された Apache Kafka プロトコル対応プロキシーです。そのフィルターメカニズムにより、アプリケーションや Kafka クラスター自体を変更することなく、Kafka ベースのシステムに追加の動作を導入できます。
Streams for Apache Kafka Proxy への接続と使用の詳細は、Streams for Apache Kafka ドキュメント のプロキシーガイドを参照してください。
Streams for Apache Kafka Proxy は現在、テクノロジープレビューとして利用できます。
3.3. (プレビュー) Streams for Apache Kafka Console のデプロイ
Streams for Apache Kafka によって管理される Kafka クラスターをデプロイした後、Streams for Apache Kafka Console をデプロイしてクラスターを接続できます。Streams for Apache Kafka Console は、Kafka クラスターの管理を容易にし、ユーザーインターフェイスから各クラスターを監視、管理、最適化するためのリアルタイムの分析情報を提供します。
Streams for Apache Kafka Console への接続と使用の詳細は、Streams for Apache Kafka ドキュメント のコンソールガイドを参照してください。
Streams for Apache Kafka Console は現在、テクノロジープレビューとして利用できます。
第4章 Streams for Apache Kafka のデプロイの準備
必要なデプロイ前のタスクを完了して、Streams for Apache Kafka のデプロイの準備をします。具体的な要件に応じて、次のような必要な準備手順を実行します。
本ガイドのコマンドを実行するには、クラスターユーザーに RBAC (ロールベースアクセス制御) および CRD を管理する権限を付与する必要があります。
4.1. デプロイメントの前提条件
Streams for Apache Kafka をデプロイするには、次のものが必要です。
OpenShift 4.12 から 4.16 のクラスター。
Streams for Apache Kafka は Strimzi 0.40.x をベースにしています。
-
oc
コマンドラインツールがインストールされ、稼働中のクラスターに接続するように設定されている。
4.2. Operator デプロイメントのベストプラクティス
特に異なるバージョンを使用している場合、同じ OpenShift クラスターに複数の Streams for Apache Kafka Operator をインストールすると、問題が発生する可能性があります。各 Streams for Apache Kafka Operator は、OpenShift クラスター内のリソースのセットを管理します。複数の Streams for Apache Kafka Operator をインストールすると、それらが同じリソースを同時に管理しようとする場合があります。これにより、クラスター内で競合や予期しない動作が発生する可能性があります。同じ OpenShift クラスター内の異なる namespace に Streams for Apache Kafka Operator をデプロイした場合でも、競合が発生する可能性があります。namespace はある程度リソースを分離しますが、カスタムリソース定義 (CRD) やロールなど、Streams for Apache Kafka Operator によって管理される一部のリソースのスコープは、クラスター全体となっています。
さらに、バージョンが異なる複数の Operator をインストールすると、Operator と Operator が管理する Kafka クラスター間の互換性の問題が発生する可能性があります。Streams for Apache Kafka Operator の各バージョンで、下位互換性のない変更、バグ修正、または改善が導入される場合があります。
OpenShift クラスターに複数の Streams for Apache Kafka Operator をインストールする際に発生する問題を回避するには、次のガイドラインに従うことを推奨します。
- Streams for Apache Kafka Operator を、Kafka クラスターおよび Operator が管理するその他の Kafka コンポーネントとは別の namespace にインストールして、リソースと設定を明確に分離します。
- 1 つの Streams for Apache Kafka Operator を使用して、OpenShift クラスター内のすべての Kafka インスタンスを管理します。
- Streams for Apache Kafka Operator とサポートされる Kafka バージョンをできるだけ頻繁に更新、最新の機能と拡張機能を反映します。
これらのベストプラクティスに従い、1 つの Streams for Apache Kafka Operator を一貫して更新することで、OpenShift クラスター内の Kafka インスタンス管理の安定性を向上させることができます。このアプローチにより、Streams for Apache Kafka の最新機能を最大限に活用することもできます。
Streams for Apache Kafka は Strimzi をベースとしているため、OpenShift クラスターで Streams for Apache Kafka Operator と Strimzi Operator を組み合わせた場合にも、同じ問題が発生する可能性があります。
4.3. Streams for Apache Kafka リリースアーティファクトのダウンロード
デプロイメントファイルを使用して Streams for Apache Kafka をインストールするには、Streams for Apache Kafka ソフトウェアダウンロードページ からファイルをダウンロードして展開します。
Streams for Apache Kafka リリースアーティファクトには、Streams for Apache Kafka コンポーネントの OpenShift へのデプロイ、共通の操作の実行、Kafka クラスターの設定に役立つ YAML ファイルのサンプルが含まれています。
oc
を使用して、ダウンロードした ZIP ファイルの install/cluster-operator
フォルダーから Cluster Operator をデプロイします。Cluster Operator のデプロイメントおよび設定に関する詳細は、「Cluster Operator のデプロイ」 を参照してください。
また、Streams for Apache Kafka Cluster Operator によって管理されない Kafka クラスターを Topic Operator および User Operator のスタンドアロンインストールと共に使用する場合は、install/topic-operator
および install/user-operator
フォルダーからデプロイできます。
Streams for Apache Kafka のコンテナーイメージを Red Hat Ecosystem Catalog から利用することもできます。ただし、付属の YAML ファイルを使用して Streams for Apache Kafka をデプロイすることを推奨します。
4.4. コンテナーイメージの独自のレジストリーへのプッシュ
Streams for Apache Kafka のコンテナーイメージは、Red Hat Ecosystem Catalog にあります。Streams for Apache Kafka に付属するインストール YAML ファイルは、Red Hat Ecosystem Catalog から直接イメージをプルします。
Red Hat Ecosystem Catalog にアクセスできない場合や独自のコンテナーリポジトリーを使用する場合は以下を行います。
- リストにある すべての コンテナーイメージをプルします。
- 独自のレジストリーにプッシュします。
- インストール YAML ファイルのイメージ名を更新します。
リリースに対してサポートされる各 Kafka バージョンには別のイメージがあります。
コンテナーイメージ | namespace/リポジトリー | 説明 |
---|---|---|
Kafka |
| 次を含む、Kafka を実行するための Streams for Apache Kafka イメージ
|
Operator |
| Operator を実行するための Streams for Apache Kafka イメージ
|
Kafka Bridge |
| Streams for Apache Kafka Bridge を実行するための Streams for Apache Kafka イメージ |
Streams for Apache Kafka Drain Cleaner |
| Streams for Apache Kafka Drain Cleaner を実行するための Streams for Apache Kafka イメージ |
Streams for Apache Kafka Proxy |
| Streams for Apache Kafka Proxy を実行するための Streams for Apache Kafka イメージ |
Streams for Apache Kafka Console |
| Streams for Apache Kafka Console を実行するための Streams for Apache Kafka イメージ |
4.5. コンテナーイメージレジストリーに対する認証用のプルシークレットの作成
Streams for Apache Kafka に付属するインストール YAML ファイルは、Red Hat Ecosystem Catalog からコンテナーイメージを直接プルします。Streams for Apache Kafka のデプロイメントに認証が必要な場合は、シークレットに認証情報を設定し、それをインストール YAML に追加します。
通常、認証は必要ありませんが、特定のプラットフォームでは要求される場合があります。
前提条件
- Red Hat のユーザー名とパスワード、または Red Hat レジストリーサービスアカウントのログイン情報。
Red Hat サブスクリプションを使用して、Red Hat カスタマーポータル からレジストリーサービスアカウントを作成できます。
手順
ログイン詳細と、Streams for Apache Kafka イメージのプル元のコンテナーレジストリーを含むプルシークレットを作成します。
oc create secret docker-registry <pull_secret_name> \ --docker-server=registry.redhat.io \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
oc create secret docker-registry <pull_secret_name> \ --docker-server=registry.redhat.io \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
Copy to Clipboard Copied! ユーザー名とパスワードを追加します。メールアドレスは任意です。
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
デプロイメントファイルを編集し、STRIMZI_IMAGE_PULL_SECRETS
環境変数を使用してプルシークレットを指定します。apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: - name: STRIMZI_IMAGE_PULL_SECRETS value: "<pull_secret_name>" # ...
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: - name: STRIMZI_IMAGE_PULL_SECRETS value: "<pull_secret_name>" # ...
Copy to Clipboard Copied! シークレットは、Cluster Operator によって作成されたすべての Pod に適用されます。
4.6. Streams for Apache Kafka 管理者の指定
Streams for Apache Kafka では、デプロイメントの設定にカスタムリソースが提供されます。デフォルトでは、これらのリソースの表示、作成、編集、および削除権限は OpenShift クラスター管理者に限定されます。Streams for Apache Kafka では、これらの権限を他のユーザーに割り当てるのに使用できる 2 つのクラスターロールが提供されます。
-
strimzi-view
を使用すると、ユーザーは Streams for Apache Kafka リソースを表示およびリスト表示できます。 -
strimzi-admin
を使用すると、ユーザーは Streams for Apache Kafka リソースを作成、編集、または削除することもできます。
これらのロールをインストールすると、これらの権限が自動的にデフォルトの OpenShift クラスターロールに集約 (追加) されます。strimzi-view
は view
ロールに、strimzi-admin
は edit
および admin
ロールに集約されます。このように集約することで、すでに同様の権限を持つユーザーに、これらのロールを割り当てる必要がなくなる可能性があります。
以下の手順では、クラスター管理者でないユーザーが Streams for Apache Kafka リソースを管理できるようにする strimzi-admin
ロールの割り当て方法を説明します。
システム管理者は、Cluster Operator のデプロイ後に Streams for Apache Kafka の管理者を指定できます。
前提条件
- Streams for Apache Kafka CRD (カスタムリソース定義) および CRD を管理するためのロールベースアクセス制御 (RBAC) リソースは、Cluster Operator でデプロイ されています。
手順
OpenShift で
strimzi-view
およびstrimzi-admin
クラスターロールを作成します。oc create -f install/strimzi-admin
oc create -f install/strimzi-admin
Copy to Clipboard Copied! 必要な場合は、ユーザーに必要なアクセス権限を付与するロールを割り当てます。
oc create clusterrolebinding strimzi-admin --clusterrole=strimzi-admin --user=user1 --user=user2
oc create clusterrolebinding strimzi-admin --clusterrole=strimzi-admin --user=user1 --user=user2
Copy to Clipboard Copied!
第5章 Web コンソールを使用した OperatorHub からの Streams for Apache Kafka のインストール
OpenShift Container Platform Web コンソールの OperatorHub から Streams for Apache Kafka Operator をインストールします。
このセクションの手順では、次の方法を説明します。
5.1. OperatorHub からの Streams for Apache Kafka Operator のインストール
OpenShift Container Platform Web コンソールの OperatorHub を使用して、Streams for Apache Kafka Operator をインストールし、サブスクライブすることができます。
この手順では、プロジェクトを作成し、そのプロジェクトに Streams for Apache Kafka Operator をインストールする方法を説明します。プロジェクトは namespace を表します。namespace を使用して機能を分離することで管理性を確保することを推奨します。
必ず適切な更新チャネルを使用してください。サポート対象の OpenShift のバージョンを使用している場合は、デフォルトの stable チャネルから安全に Streams for Apache Kafka をインストールできます。ただし、stable チャネルで自動更新を有効にすることは推奨されません。自動アップグレードでは、アップグレード前の必要手順がスキップされます。バージョン固有のチャネルでのみ自動アップグレードを使用します。
前提条件
-
cluster-admin
またはstrimzi-admin
パーミッションを持つアカウントを使用して OpenShift Container Platform Web コンソールにアクセスできる。
手順
OpenShift Web コンソールで Home > Projects ページに移動し、インストール用のプロジェクト (namespace) を作成します。
この例では、
amq-streams-kafka
という名前のプロジェクトを使用します。- Operators > OperatorHub ページに移動します。
Filter by keyword ボックスにスクロールするかキーワードを入力して、Streams for Apache Kafka Operator を見つけます。
Operator は、Streaming & Messaging カテゴリーにあります。
- Streams for Apache Kafka をクリックして、Operator の情報を表示します。
- Operator に関する情報を確認し、Install をクリックします。
Install Operator ページで、次のインストールおよび更新オプションから選択します。
Update Channel: Operator の更新チャネルを選択します。
- stable チャネル (デフォルト) には最新の更新とリリースがすべて含まれます。これには、十分なテストを行った上、安定していることが想定される、メジャー、マイナー、およびマイクロリリースが含まれます。
- amq-streams-X.x チャネルには、メジャーリリースのマイナーリリースの更新およびマイクロリリースの更新が含まれます。X は、メジャーリリースのバージョン番号に置き換えてください。
- amq-streams-X.Y.x チャネルには、マイナーリリースのマイクロリリースの更新が含まれます。X はメジャーリリースのバージョン番号、Y はマイナーリリースのバージョン番号に置き換えてください。
Installation Mode: 作成したプロジェクトを選択して、特定の namespace に Operator をインストールします。
Streams for Apache Kafka Operator は、クラスター内のすべての namespace (デフォルトのオプション) か、特定の namespace にインストールできます。Kafka クラスターとその他の Streams for Apache Kafka コンポーネントに特定の namespace を割り当てることを推奨します。
- Update approval: デフォルトでは、Streams for Apache Kafka Operator は、Operator Lifecycle Manager (OLM) によって最新の Streams for Apache Kafka バージョンに自動的にアップグレードされます。今後のアップグレードを手動で承認する場合は、Manual を選択します。Operator の詳細は、OpenShift ドキュメント を参照してください。
Install をクリックして、選択した namespace に Operator をインストールします。
Streams for Apache Kafka Operator は、選択した namespace に Cluster Operator、CRD、およびロールベースアクセス制御 (RBAC) リソースをデプロイします。
Operator を使用する準備ができたら、Operators > Installed Operators に移動して、Operator が選択した namespace にインストールされていることを確認します。
ステータスは Succeeded と表示されます。
これで、Streams for Apache Kafka Operator を使用して、Kafka クラスターから順に Kafka コンポーネントをデプロイできるようになりました
Workloads > Deployments に移動すると、Cluster Operator および Entity Operator のデプロイメントの詳細を確認できます。Cluster Operator の名前には、バージョン番号 amq-streams-cluster-operator-<version>
が含まれています。Streams for Apache Kafka インストールアーティファクトを使用して Cluster Operator をデプロイする場合、名前は異なります。この場合、名前は strimzi-cluster-operator
です。
5.2. Streams for Apache Kafka Operator を使用した Kafka コンポーネントのデプロイ
Openshift に Streams for Apache Kafka Operator をインストールすると、この Operator によって、ユーザーインターフェイスから Kafka コンポーネントをインストールできるようになります。
次の Kafka コンポーネントをインストールできます。
- Kafka
- Kafka Connect
- Kafka MirrorMaker
- Kafka MirrorMaker 2
- Kafka Topic
- Kafka User
- Kafka Bridge
- Kafka Connector
- Kafka Rebalance
コンポーネントを選択して、インスタンスを作成します。少なくとも、Kafka インスタンスを作成します。この手順では、デフォルト設定を使用して Kafka インスタンスを作成する方法を説明します。インストールを実行する前に、デフォルトのインストール仕様を設定できます。
プロセスは、他の Kafka コンポーネントのインスタンスを作成する場合と同じです。
前提条件
- Streams for Apache Kafka Operator が OpenShift クラスターにインストール されている。
手順
Web コンソールで Operators > Installed Operators ページに移動し、Streams for Apache Kafka をクリックして Operator の詳細を表示します。
提供されている API から、Kafka コンポーネントのインスタンスを作成できます。
Kafka の下の Create instance をクリックして、Kafka インスタンスを作成します。
デフォルトでは、3 つの Kafka ブローカーノードと 3 つの ZooKeeper ノードを持つ
my-cluster
という名の Kafka クラスターを作成します。クラスターはエフェメラルストレージを使用します。Create をクリックして、Kafka のインストールを開始します。
ステータスが Ready に変わるまで待ちます。
第6章 インストールアーティファクトを使用した Streams for Apache Kafka のデプロイ
Streams for Apache Kafka のデプロイメント用に環境を準備したら、Streams for Apache Kafka を OpenShift クラスターにデプロイできます。リリースアーティファクトで提供されるインストールファイルを使用します。
Streams for Apache Kafka は Strimzi 0.40.x をベースにしています。OpenShift 4.12 - 4.15 に Streams for Apache Kafka 2.7 をデプロイできます。
インストールファイルを使用して Streams for Apache Kafka をデプロイする手順は次のとおりです。
- Cluster Operator をデプロイします。
Cluster Operator を使用して、以下をデプロイします。
任意で、要件に応じて以下の Kafka コンポーネントをデプロイします。
本ガイドのコマンドを実行するには、OpenShift ユーザーに RBAC (ロールベースアクセス制御) および CRD を管理する権限を付与する必要があります。
6.1. 基本的なデプロイメントパス
Streams for Apache Kafka が同じ namespace 内の 1 つの Kafka クラスターを管理するデプロイメントを設定できます。この設定は、開発またはテストに使用できます。または、実稼働環境で Streams for Apache Kafka を使用して、さまざまな namespace 内の複数の Kafka クラスターを管理することもできます。
Streams for Apache Kafka のデプロイの最初のステップは、install/cluster-operator
ファイルを使用して Cluster Operator をインストールすることです。
1 つのコマンド (oc apply -f ./install/cluster-operator
) で、cluster-operator
フォルダー内のすべてのインストールファイルに適用されます。
このコマンドは、以下を含む、Kafka デプロイメントの作成および管理に必要な内容をすべて設定します。
-
Cluster Operator (
Deployment
、ConfigMap
) -
Streams for Apache Kafka CRD (
CustomResourceDefinition
) -
RBAC リソース (
ClusterRole
、ClusterRoleBinding
、RoleBinding
) -
サービスアカウント (
ServiceAccount
)
基本的なデプロイメントパスは次のとおりです。
- リリースアーティファクトをダウンロードする
- Cluster Operator をデプロイする OpenShift namespace を作成する
-
Cluster Operator 用に作成された namespace を使用するように
install/cluster-operator
ファイルを更新します。 - Cluster Operator をインストールして、1 つ、複数、またはすべての namespace を監視します
-
Cluster Operator 用に作成された namespace を使用するように
- Kafka クラスターを作成する
その後、他の Kafka コンポーネントをデプロイし、デプロイのモニタリングを設定できます。
6.2. Cluster Operator のデプロイ
Cluster Operator は、OpenShift クラスター内で Kafka クラスターのデプロイおよび管理を行います。
Cluster Operator の稼働中に、Kafka リソースの更新に対する監視が開始されます。
デフォルトでは、Cluster Operator の単一のレプリカがデプロイされます。リーダーの選択でレプリカを追加し、中断が発生した場合に追加の Cluster Operator がスタンバイ状態になるようにすることができます。詳細は、「リーダーの選択による複数の Cluster Operator レプリカの実行」 を参照してください。
6.2.1. Cluster Operator が監視する namespace の指定
Cluster Operator は、Kafka リソースがデプロイされている namespace の更新を監視します。Cluster Operator をデプロイするときは、OpenShift クラスター内で監視する namespace を指定します。次の namespace を指定できます。
- 選択された単一の namespace (Cluster Operator を含む同じ namespace)
- 複数の選択された namespace
- クラスター内のすべての namespace
選択した複数の namespace を監視すると、処理オーバーヘッドが増加するため、パフォーマンスに最も大きな影響を与えます。namespace の監視のパフォーマンスを最適化するには、通常、単一の namespace を監視するか、クラスター全体を監視することが推奨されます。単一の namespace を監視すると、namespace 固有のリソースを集中的に監視することができますが、すべての namespace を監視すると、すべての namespace にわたるクラスターのリソースの包括的なビューが提供されます。
Cluster Operator では、以下のリソースの変更が監視されます。
-
Kafka クラスターの
Kafka
。 -
Kafka Connect クラスターの
KafkaConnect
。 -
Kafka Connect クラスターでコネクターを作成および管理するための
KafkaConnector
。 -
Kafka MirrorMaker インスタンスの
KafkaMirrorMaker
。 -
KafkaMirrorMaker2
(Kafka MirrorMaker 2 インスタンスの場合)。 -
Kafka Bridge インスタンスの
KafkaBridge
。 -
Cruise Control の最適化リクエストの
KafkaRebalance
。
OpenShift クラスターでこれらのリソースの 1 つが作成されると、Operator がクラスターの詳細をリソースから取得します。さらに、Deployment、Pod、Service、および ConfigMap などの必要な OpenShift リソースが作成され、リソースの新しいクラスターの作成が開始されます。
Kafka リソースが更新されるたびに、リソースのクラスターを設定する OpenShift リソースで該当する更新が Operator によって実行されます。
リソースは、パッチを適用するか削除してから、再作成して、目的とするクラスターの状態を、リソースのクラスターに反映させます。この操作は、サービスの中断を引き起こすローリング更新の原因となる可能性があります。
リソースが削除されると、Operator によってクラスターがアンデプロイされ、関連する OpenShift リソースがすべて削除されます。
Cluster Operator は OpenShift クラスター内の 1 つ、複数、またはすべての namespace を監視できますが、Topic Operator と User Operator は単一の namespace 内の KafkaTopic
リソースと KafkaUser
リソースを監視します。詳細は、「OpenShift namespace 内の Streams for Apache Kafka リソースの監視」 を参照してください。
6.2.2. 単一の namespace を監視対象とする Cluster Operator のデプロイメント
この手順では、OpenShift クラスターの単一の namespace で Streams for Apache Kafka リソースを監視するように Cluster Operator をデプロイする方法を説明します。
前提条件
-
CustomResourceDefinition
および RBAC (ClusterRole
およびRoleBinding
) リソースを作成および管理する権限を持つアカウント。
手順
Cluster Operator がインストールされる namespace を使用するように、Streams for Apache Kafka インストールファイルを編集します。
たとえば、この手順では Cluster Operator は
my-cluster-operator-namespace
という namespace にインストールされます。Linux の場合は、以下を使用します。
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! MacOS の場合は、以下を使用します。
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! Cluster Operator をデプロイします。
oc create -f install/cluster-operator -n my-cluster-operator-namespace
oc create -f install/cluster-operator -n my-cluster-operator-namespace
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get deployments -n my-cluster-operator-namespace
oc get deployments -n my-cluster-operator-namespace
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
Copy to Clipboard Copied! READY
は、Ready/expected 状態のレプリカ数を表示します。AVAILABLE
出力に1
が表示されれば、デプロイメントは成功しています。
6.2.3. 複数の namespace を監視対象とする Cluster Operator のデプロイメント
この手順では、OpenShift クラスターの複数の namespace にまたがって Streams for Apache Kafka リソースを監視するように Cluster Operator をデプロイする方法を説明します。
前提条件
-
CustomResourceDefinition
および RBAC (ClusterRole
およびRoleBinding
) リソースを作成および管理する権限を持つアカウント。
手順
Cluster Operator がインストールされる namespace を使用するように、Streams for Apache Kafka インストールファイルを編集します。
たとえば、この手順では Cluster Operator は
my-cluster-operator-namespace
という namespace にインストールされます。Linux の場合は、以下を使用します。
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! MacOS の場合は、以下を使用します。
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
ファイルを編集し、Cluster Operator が監視するすべての namespace のリストをSTRIMZI_NAMESPACE
環境変数に追加します。たとえば、この手順では Cluster Operator は
watched-namespace-1
、watched-namespace-2
、およびwatched-namespace-3
という namespace を監視します。apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: watched-namespace-1,watched-namespace-2,watched-namespace-3
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: watched-namespace-1,watched-namespace-2,watched-namespace-3
Copy to Clipboard Copied! リストした各 namespace に
RoleBindings
をインストールします。この例では、コマンドの
watched-namespace
を前述のステップでリストした namespace に置き換えます。watched-namespace-1
、watched-namespace-2
、およびwatched-namespace-3
にも、繰り返し同様の操作を実行します。oc create -f install/cluster-operator/020-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/023-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/031-RoleBinding-strimzi-cluster-operator-entity-operator-delegation.yaml -n <watched_namespace>
oc create -f install/cluster-operator/020-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/023-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/031-RoleBinding-strimzi-cluster-operator-entity-operator-delegation.yaml -n <watched_namespace>
Copy to Clipboard Copied! Cluster Operator をデプロイします。
oc create -f install/cluster-operator -n my-cluster-operator-namespace
oc create -f install/cluster-operator -n my-cluster-operator-namespace
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get deployments -n my-cluster-operator-namespace
oc get deployments -n my-cluster-operator-namespace
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
Copy to Clipboard Copied! READY
は、Ready/expected 状態のレプリカ数を表示します。AVAILABLE
出力に1
が表示されれば、デプロイメントは成功しています。
6.2.4. すべての namespace を対象とする Cluster Operator のデプロイメント
この手順では、OpenShift クラスターのすべての namespace にまたがって Streams for Apache Kafka リソースを監視するように Cluster Operator をデプロイする方法を説明します。
このモードで実行している場合、Cluster Operator は、新規作成された namespace でクラスターを自動的に管理します。
前提条件
-
CustomResourceDefinition
および RBAC (ClusterRole
およびRoleBinding
) リソースを作成および管理する権限を持つアカウント。
手順
Cluster Operator がインストールされる namespace を使用するように、Streams for Apache Kafka インストールファイルを編集します。
たとえば、この手順では Cluster Operator は
my-cluster-operator-namespace
という namespace にインストールされます。Linux の場合は、以下を使用します。
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! MacOS の場合は、以下を使用します。
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
ファイルを編集し、STRIMZI_NAMESPACE
環境変数の値を*
に設定します。apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: # ... serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: "*" # ...
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: # ... serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: "*" # ...
Copy to Clipboard Copied! クラスター全体ですべての namespace にアクセスできる権限を Cluster Operator に付与する
ClusterRoleBindings
を作成します。oc create clusterrolebinding strimzi-cluster-operator-namespaced --clusterrole=strimzi-cluster-operator-namespaced --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator oc create clusterrolebinding strimzi-cluster-operator-watched --clusterrole=strimzi-cluster-operator-watched --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator oc create clusterrolebinding strimzi-cluster-operator-entity-operator-delegation --clusterrole=strimzi-entity-operator --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator
oc create clusterrolebinding strimzi-cluster-operator-namespaced --clusterrole=strimzi-cluster-operator-namespaced --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator oc create clusterrolebinding strimzi-cluster-operator-watched --clusterrole=strimzi-cluster-operator-watched --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator oc create clusterrolebinding strimzi-cluster-operator-entity-operator-delegation --clusterrole=strimzi-entity-operator --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator
Copy to Clipboard Copied! Cluster Operator を OpenShift クラスターにデプロイします。
oc create -f install/cluster-operator -n my-cluster-operator-namespace
oc create -f install/cluster-operator -n my-cluster-operator-namespace
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get deployments -n my-cluster-operator-namespace
oc get deployments -n my-cluster-operator-namespace
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
Copy to Clipboard Copied! READY
は、Ready/expected 状態のレプリカ数を表示します。AVAILABLE
出力に1
が表示されれば、デプロイメントは成功しています。
6.3. Kafka のデプロイ
Cluster Operator で Kafka クラスターを管理できるようにするには、これを Kafka
リソースとしてデプロイする必要があります。Streams for Apache Kafka では、これを行うためにデプロイメントファイルのサンプルが提供されます。これらのファイルを使用して、Topic Operator および User Operator を同時にデプロイできます。
Cluster Operator をデプロイしたら、Kafka
リソースを使用して次のコンポーネントをデプロイします。
KRaft または ZooKeeper を使用する Kafka クラスター:
- Topic Operator
- User Operator
ノードプールは、Kafka ノードのセットの設定を提供します。ノードプールを使用すると、同じ Kafka クラスター内でノードに異なる設定を持たせることができます。
Kafka クラスターを Kafka
リソースとしてデプロイしていない場合は、Cluster Operator を使用してこのクラスターを管理できません。これには、OpenShift 外で実行されている Kafka クラスターなどが該当します。ただし、Topic Operator と User Operator を スタンドアロンコンポーネントとしてデプロイ することで、それらを Streams for Apache Kafka によって 管理されていない Kafka クラスターで使用できます。また、Streams for Apache Kafka によって管理されていない Kafka クラスターで、その他の Kafka コンポーネントをデプロイして使用することもできます。
6.3.1. ノードプールを使用した Kafka クラスターのデプロイ
この手順では、Cluster Operator を使用して、ノードプールを持つ Kafka を OpenShift クラスターにデプロイする方法を示します。ノードプールは、同じ設定を共有する Kafka クラスター内の Kafka ノードの個別のグループを表します。ノードプール内の各 Kafka ノードについて、ノードプールで定義されていない設定は、kafka
リソースのクラスター設定から継承されます。
デプロイメントでは、YAML ファイルの仕様を使用して KafkaNodePool
リソースが作成されます。クラスター管理に KRaft (Kafka Raft メタデータ) モードまたは ZooKeeper を使用する Kafka クラスターでノードプールを使用できます。Kafka クラスターを KRaft モードでデプロイするには、KafkaNodePool
リソースを使用する必要があります。
Streams for Apache Kafka には、ノードプールを使用する Kafka クラスターの作成に使用できる次の サンプルファイル が用意されています。
kafka-with-dual-role-kraft-nodes.yaml
- ブローカーとコントローラーのロールを共有する KRaft ノードの 1 つのプールを備えた Kafka クラスターをデプロイします。
kafka-with-kraft.yaml
- コントローラーノードの 1 つのプールとブローカーノードの 1 つのプールを備えた永続的な Kafka クラスターをデプロイします。
kafka-with-kraft-ephemeral.yaml
- コントローラーノードの 1 つのプールとブローカーノードの 1 つのプールを備えた一時的な Kafka クラスターをデプロイします。
kafka.yaml
- 3 つのノードと 2 つの異なる Kafka ブローカープールを備えた ZooKeeper をデプロイします。各プールには 3 つのブローカーがあります。この例のプールは、異なるストレージ設定を使用しています。
ここで説明する手順を実行して、KafkaNodePool
リソースを使用して新しい Kafka クラスターをデプロイしたり、既存の Kafka クラスターを移行 したりできます。
手順
KRaft ベースの Kafka クラスターをデプロイします。
デュアルロールノードを使用する単一ノードプールを備えた Kafka クラスターを KRaft モードでデプロイするには、次の手順を実行します。
oc apply -f examples/kafka/kraft/kafka-with-dual-role-nodes.yaml
oc apply -f examples/kafka/kraft/kafka-with-dual-role-nodes.yaml
Copy to Clipboard Copied! ブローカーノードとコントローラーノードに個別のノードプールを使用して永続的な Kafka クラスターを KRaft モードでデプロイするには、次の手順を実行します。
oc apply -f examples/kafka/kraft/kafka.yaml
oc apply -f examples/kafka/kraft/kafka.yaml
Copy to Clipboard Copied! ブローカーノードとコントローラーノードに個別のノードプールを使用して KRaft モードでエフェメラル Kafka クラスターをデプロイするには、以下を実行します。
oc apply -f examples/kafka/kraft/kafka-ephemeral.yaml
oc apply -f examples/kafka/kraft/kafka-ephemeral.yaml
Copy to Clipboard Copied! 3 つのブローカーの 2 つのノードプールを備えた Kafka クラスターと ZooKeeper クラスターをデプロイするには、次の手順を実行します。
oc apply -f examples/kafka/kafka-with-node-pools.yaml
oc apply -f examples/kafka/kafka-with-node-pools.yaml
Copy to Clipboard Copied!
デプロイメントのステータスを確認します。
oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! 出力にはノードプール名と準備状況が表示されます
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-4 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-4 1/1 Running 0
Copy to Clipboard Copied! -
my-cluster
は Kafka クラスターの名前です。 pool-a
はノードプールの名前です。0
で始まる連続したインデックス番号は、作成された各 Kafka Pod を識別します。ZooKeeper を使用している場合は、ZooKeeper Pod も表示されます。READY
は、Ready/expected 状態のレプリカ数を表示します。STATUS
がRunning
と表示されれば、デプロイメントは成功です。デプロイに関する情報は、プール内のノードの ID のリストなど、
KafkaNodePool
リソースのステータスにも表示されます。注記ノード ID は、クラスター内のすべてのノードプールにわたって 0 (ゼロ) から順番に割り当てられます。これは、ノード ID が特定のノードプール内で連続して実行されない可能性があることを意味します。クラスター全体のノード ID のシーケンスにギャップがある場合、追加される次のノードにはギャップを埋める ID が割り当てられます。スケールダウンすると、プール内で最も大きな数のノード ID を持つノードが削除されます。
-
6.3.2. ノードプールを使用しない ZooKeeper ベースの Kafka クラスターのデプロイ
この手順では、Cluster Operator を使用して ZooKeeper ベースの Kafka クラスターを OpenShift クラスターにデプロイする方法を示します。
デプロイメントでは、YAML ファイルの仕様を使用して Kafka
リソースが作成されます。
Streams for Apache Kafka には、クラスター管理に ZooKeeper を使用する Kafka クラスターを作成するための次の サンプルファイル が用意されています。
kafka-persistent.yaml
- 3 つの Zookeeper ノードと 3 つの Kafka ノードを使用して永続クラスターをデプロイします。
kafka-jbod.yaml
- それぞれが複数の永続ボリューを使用する、3 つの ZooKeeper ノードと 3 つの Kafka ノードを使用して、永続クラスターをデプロイします。
kafka-persistent-single.yaml
- 1 つの ZooKeeper ノードと 1 つの Kafka ノードを使用して、永続クラスターをデプロイします。
kafka-ephemeral.yaml
- 3 つの ZooKeeper ノードと 3 つの Kafka ノードを使用して、一時クラスターをデプロイします。
kafka-ephemeral-single.yaml
- 3 つの ZooKeeper ノードと 1 つの Kafka ノードを使用して、一時クラスターをデプロイします。
この手順では、一時 および 永続 Kafka クラスターデプロイメントの例を使用します。
- 一時クラスター
-
通常、Kafka の一時クラスターは開発およびテスト環境での使用に適していますが、本番環境での使用には適していません。このデプロイメントでは、ブローカー情報 (ZooKeeper) と、トピックまたはパーティション (Kafka) を格納するための
emptyDir
ボリュームが使用されます。emptyDir
ボリュームを使用すると、その内容は Pod のライフサイクルと厳密な関係を持つため、Pod がダウンすると削除されます。 - 永続クラスター
Kafka の永続クラスターでは、永続ボリュームを使用して ZooKeeper および Kafka データを格納します。
PersistentVolumeClaim
を使用してPersistentVolume
が取得され、PersistentVolume
の実際のタイプには依存しません。PersistentVolumeClaim
でStorageClass
を使用し、自動ボリュームプロビジョニングをトリガーすることができます。StorageClass
が指定されていない場合、OpenShift はデフォルトのStorageClass
を使用しようとします。次の例では、一般的なタイプの永続ボリュームを一部紹介しています。
- OpenShift クラスターが Amazon AWS で実行されている場合、OpenShift は Amazon EBS ボリュームをプロビジョニングできます。
- OpenShift クラスターが Microsoft Azure で実行されている場合、OpenShift は Azure Disk Storage ボリュームをプロビジョニングできます。
- OpenShift クラスターが Google Cloud で実行されている場合、OpenShift は永続ディスクボリュームをプロビジョニングできます
- OpenShift クラスターがベアメタルで実行されている場合、OpenShift はローカル永続ボリュームをプロビジョニングできます
このサンプル YAML ファイルは、最新のサポート対象 Kafka バージョン、サポート対象のログメッセージ形式バージョンとブローカー間のプロトコルバージョンの設定を指定します。Kafka config
の inter.broker.protocol.version
プロパティーは、指定された Kafka バージョン (spec.kafka.version
) によってサポートされるバージョンである必要があります。このプロパティーは、Kafka クラスターで使用される Kafka プロトコルのバージョンを表します。
Kafka 3.0.0 以降、inter.broker.protocol.version
が 3.0
以上に設定されていると、log.message.format.version
オプションは無視されるため、設定する必要はありません。
サンプルクラスターの名前はデフォルトで my-cluster
になります。クラスター名はリソースの名前によって定義され、クラスターがデプロイされた後に変更できません。クラスターをデプロイする前にクラスター名を変更するには、関連する YAML ファイルにある Kafka
リソースの Kafka.metadata.name
プロパティーを編集します。
デフォルトのクラスター名および指定された Kafka バージョン
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: version: 3.7.0 #... config: #... log.message.format.version: "3.7" inter.broker.protocol.version: "3.7" # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.7.0
#...
config:
#...
log.message.format.version: "3.7"
inter.broker.protocol.version: "3.7"
# ...
手順
ZooKeeper ベースの Kafka クラスターをデプロイします。
一時クラスターをデプロイするには、以下を実行します。
oc apply -f examples/kafka/kafka-ephemeral.yaml
oc apply -f examples/kafka/kafka-ephemeral.yaml
Copy to Clipboard Copied! 永続クラスターをデプロイするには、以下を実行します。
oc apply -f examples/kafka/kafka-persistent.yaml
oc apply -f examples/kafka/kafka-persistent.yaml
Copy to Clipboard Copied!
デプロイメントのステータスを確認します。
oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! Pod 名および readiness が表示される出力
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-zookeeper-0 1/1 Running 0 my-cluster-zookeeper-1 1/1 Running 0 my-cluster-zookeeper-2 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-zookeeper-0 1/1 Running 0 my-cluster-zookeeper-1 1/1 Running 0 my-cluster-zookeeper-2 1/1 Running 0
Copy to Clipboard Copied! my-cluster
は Kafka クラスターの名前です。0
で始まる連続インデックス番号は、作成された各 Kafka および ZooKeeper Pod を識別します。デフォルトのデプロイメントでは、Entity Operator クラスター、3 つの Kafka Pod、および 3 つの ZooKeeper Pod を作成します。
READY
は、Ready/expected 状態のレプリカ数を表示します。STATUS
がRunning
と表示されれば、デプロイメントは成功です。
6.3.3. Cluster Operator を使用した Topic Operator のデプロイ
この手順では、Cluster Operator を使用して Topic Operator をデプロイする方法を説明します。Topic Operator は、双方向モードまたは一方向モードのいずれかで使用するためにデプロイメントできます。双方向および一方向のトピック管理の詳細は、「トピック管理モード」 を参照してください。
Kafka
リソースの entityOperator
プロパティーを設定し、topicOperator
が含まれるようにします。デフォルトでは、Topic Operator は Cluster Operator によってデプロイされた Kafka クラスターの namespace で KafkaTopic
リソースを監視します。Topic Operator spec
で watchedNamespace
を使用して namespace を指定することもできます。1 つの Topic Operator が監視できるのは、namespace 1 つです。1 つの namespace を監視するのは、Top Operator 1 つのみとします。
Streams for Apache Kafka を使用して複数の Kafka クラスターを同じ namespace にデプロイする場合は、1 つの Kafka クラスターに対してのみ Topic Operator を有効にするか、watchedNamespace
プロパティーを使用して Topic Operator が他の namespace を監視するように設定します。
Streams for Apache Kafka によって管理されない Kafka クラスターを Topic Operator と使用する場合は、Topic Operator をスタンドアロンコンポーネントとしてデプロイ する必要があります。
entityOperator
および topicOperator
プロパティーの設定に関する詳細は、Configuring the Entity Operator を参照してください。
手順
Kafka
リソースのentityOperator
プロパティーを編集し、topicOperator
が含まれるようにします。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
Copy to Clipboard Copied! EntityTopicOperatorSpec
スキーマリファレンス で説明されているプロパティーを使用して、Topic Operator のspec
を設定します。すべてのプロパティーにデフォルト値を使用する場合は、空のオブジェクト (
{}
) を使用します。リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! Pod 名と準備状況が表示される出力
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
Copy to Clipboard Copied! my-cluster
は Kafka クラスターの名前です。READY
は、Ready/expected 状態のレプリカ数を表示します。STATUS
がRunning
と表示されれば、デプロイメントは成功です。
6.3.4. Cluster Operator を使用した User Operator のデプロイ
この手順では、Cluster Operator を使用して User Operator をデプロイする方法を説明します。
Kafka
リソースの entityOperator
プロパティーを設定し、userOperator
が含まれるようにします。デフォルトでは、User Operator は Kafka クラスターデプロイメントの namespace で KafkaUser
リソースを監視します。User Operator spec
で watchedNamespace
を使用して namespace を指定することもできます。1 つの User Operator が監視できるのは、namespace 1 つです。1 つの namespace を監視するのは、User Operator 1 つのみとします。
Streams for Apache Kafka によって管理されていない Kafka クラスターを User Operator と使用する場合は、User Operator をスタンドアロンコンポーネントとしてデプロイ する必要があります。
entityOperator
および userOperator
プロパティーの設定に関する詳細は、Configuring the Entity Operator を参照してください。
手順
Kafka
リソースのentityOperator
プロパティーを編集し、userOperator
が含まれるようにします。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
Copy to Clipboard Copied! EntityUserOperatorSpec
スキーマリファレンス に記載されているプロパティーを使用して、User Operator のspec
を設定します。すべてのプロパティーにデフォルト値を使用する場合は、空のオブジェクト (
{}
) を使用します。リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! Pod 名と準備状況が表示される出力
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
Copy to Clipboard Copied! my-cluster
は Kafka クラスターの名前です。READY
は、Ready/expected 状態のレプリカ数を表示します。STATUS
がRunning
と表示されれば、デプロイメントは成功です。
6.3.5. ターミナルからの ZooKeeper への接続
ZooKeeper サービスは暗号化と認証によって保護されており、Streams for Apache Kafka の一部でない外部アプリケーションでの使用は想定されていません。
ただし、ZooKeeper への接続が必要な CLI ツールを使用する場合は、ZooKeeper Pod 内の端末を使用して、ZooKeeper アドレスとして localhost:12181
に接続できます。
前提条件
- 利用可能な OpenShift クラスター
- 稼働中の Kafka クラスター
- Cluster Operator が稼働中である。
手順
OpenShift コンソールを使用してターミナルを開くか、CLI から
exec
コマンドを実行します。以下に例を示します。
oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181 ls /
oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181 ls /
Copy to Clipboard Copied! 必ず
localhost:12181
を使用してください。
6.3.6. Kafka クラスターリソースのリスト
以下のリソースは、OpenShift クラスターの Cluster Operator によって作成されます。
共有リソース
<kafka_cluster_name>-cluster-ca
- クラスター通信の暗号化に使用されるクラスター CA プライベートキーのあるシークレット。
<kafka_cluster_name>-cluster-ca-cert
- クラスター CA 公開鍵のあるシークレット。このキーは、Kafka ブローカーのアイデンティティーの検証に使用できます。
<kafka_cluster_name>-clients-ca
- ユーザー証明書に署名するために使用されるクライアント CA 秘密鍵のあるシークレット。
<kafka_cluster_name>-clients-ca-cert
- クライアント CA 公開鍵のあるシークレット。このキーは、Kafka ユーザーのアイデンティティーの検証に使用できます。
<kafka_cluster_name>-cluster-operator-certs
- Kafka および ZooKeeper と通信するための Cluster Operator キーのあるシークレット。
ZooKeeper ノード
<kafka_cluster_name>-zookeeper
以下の ZooKeeper リソースに指定された名前。
- ZooKeeper ノード Pod を管理するための StrimziPodSet。
- ZooKeeper ノードで使用されるサービスアカウント。
- ZooKeeper ノードに設定された PodDisruptionBudget。
<kafka_cluster_name>-zookeeper-<pod_id>
- StrimziPodSet によって作成された Pod。
<kafka_cluster_name>-zookeeper-nodes
- DNS が ZooKeeper Pod の IP アドレスを直接解決するのに必要なヘッドレスサービス。
<kafka_cluster_name>-zookeeper-client
- Kafka ブローカーがクライアントとして ZooKeeper ノードに接続するために使用するサービス。
<kafka_cluster_name>-zookeeper-config
- ZooKeeper 補助設定が含まれ、ZooKeeper ノード Pod によってボリュームとしてマウントされる ConfigMap。
<kafka_cluster_name>-zookeeper-nodes
- ZooKeeper ノードキーがあるシークレット。
<kafka_cluster_name>-network-policy-zookeeper
- ZooKeeper サービスへのアクセスを管理するネットワークポリシー。
data-<kafka_cluster_name>-zookeeper-<pod_id>
- 特定の ZooKeeper ノードのデータを保存するために使用されるボリュームの永続ボリューム要求。このリソースは、データを保存するために永続ボリュームのプロビジョニングに永続ストレージが選択された場合のみ作成されます。
Kafka ブローカー
<kafka_cluster_name>-kafka
以下の Kafka リソースに指定された名前。
- Kafka ブローカー Pod を管理するための StrimziPodSet。
- Kafka Pod によって使用されるサービスアカウント。
- Kafka ブローカーに設定された PodDisruptionBudget。
<kafka_cluster_name>-kafka-<pod_id>
以下の Kafka リソースに指定された名前。
- StrimziPodSet によって作成された Pod。
- Kafka ブローカー設定を使用した ConfigMap。
<kafka_cluster_name>-kafka-brokers
- DNS が Kafka ブローカー Pod の IP アドレスを直接解決するのに必要なサービス。
<kafka_cluster_name>-kafka-bootstrap
- サービスは、OpenShift クラスター内から接続する Kafka クライアントのブートストラップサーバーとして使用できます。
<kafka_cluster_name>-kafka-external-bootstrap
-
OpenShift クラスター外部から接続するクライアントのブートストラップサービス。このリソースは、外部リスナーが有効な場合にのみ作成されます。リスナー名が
external
でポートが9094
の場合、後方互換性のために古いサービス名が使用されます。 <kafka_cluster_name>-kafka-<pod_id>
-
トラフィックを OpenShift クラスターの外部から個別の Pod にルーティングするために使用されるサービス。このリソースは、外部リスナーが有効な場合にのみ作成されます。リスナー名が
external
でポートが9094
の場合、後方互換性のために古いサービス名が使用されます。 <kafka_cluster_name>-kafka-external-bootstrap
-
OpenShift クラスターの外部から接続するクライアントのブートストラップルート。このリソースは、外部リスナーが有効でタイプが
route
に設定されている場合にのみ作成されます。リスナー名がexternal
でポートが9094
の場合、後方互換性のために古いルート名が使用されます。 <kafka_cluster_name>-kafka-<pod_id>
-
OpenShift クラスターの外部から個別の Pod へのトラフィックに対するルート。このリソースは、外部リスナーが有効でタイプが
route
に設定されている場合にのみ作成されます。リスナー名がexternal
でポートが9094
の場合、後方互換性のために古いルート名が使用されます。 <kafka_cluster_name>-kafka-<listener_name>-bootstrap
- OpenShift クラスター外部から接続するクライアントのブートストラップサービス。このリソースは、外部リスナーが有効な場合にのみ作成されます。新しいサービス名はその他すべての外部リスナーに使用されます。
<kafka_cluster_name>-kafka-<listener_name>-<pod_id>
- トラフィックを OpenShift クラスターの外部から個別の Pod にルーティングするために使用されるサービス。このリソースは、外部リスナーが有効な場合にのみ作成されます。新しいサービス名はその他すべての外部リスナーに使用されます。
<kafka_cluster_name>-kafka-<listener_name>-bootstrap
-
OpenShift クラスターの外部から接続するクライアントのブートストラップルート。このリソースは、外部リスナーが有効でタイプが
route
に設定されている場合にのみ作成されます。新しいルート名はその他すべての外部リスナーに使用されます。 <kafka_cluster_name>-kafka-<listener_name>-<pod_id>
-
OpenShift クラスターの外部から個別の Pod へのトラフィックに対するルート。このリソースは、外部リスナーが有効でタイプが
route
に設定されている場合にのみ作成されます。新しいルート名はその他すべての外部リスナーに使用されます。 <kafka_cluster_name>-kafka-config
-
Kafka の補助設定を含む ConfigMap。
UseStrimziPodSets
フィーチャーゲートが無効な場合、ブローカー Pod によってボリュームとしてマウントされます。 <kafka_cluster_name>-kafka-brokers
- Kafka ブローカーキーのあるシークレット。
<kafka_cluster_name>-network-policy-kafka
- Kafka サービスへのアクセスを管理するネットワークポリシー。
strimzi-namespace-name-<kafka_cluster_name>-kafka-init
- Kafka ブローカーによって使用されるクラスターロールバインディング。
<kafka_cluster_name>-jmx
- Kafka ブローカーポートのセキュア化に使用される JMX ユーザー名およびパスワードのあるシークレット。このリソースは、Kafka で JMX が有効になっている場合にのみ作成されます。
data-<kafka_cluster_name>-kafka-<pod_id>
- 特定の Kafka ブローカーのデータを保存するために使用されるボリュームの永続ボリューム要求。このリソースは、データを保存するために永続ボリュームのプロビジョニングに永続ストレージが選択された場合のみ作成されます。
data-<id>-<kafka_cluster_name>-kafka-<pod_id>
-
特定の Kafka ブローカーのデータを保存するために使用されるボリューム
id
の永続ボリューム要求。このリソースは、永続ボリュームをプロビジョニングしてデータを保存するときに、JBOD ボリュームに永続ストレージが選択された場合のみ作成されます。
Kafka ノードプール
Kafka ノードプールを使用している場合、作成されたリソースは、ノードがブローカー、コントローラー、またはその両方として動作しているかどうかに関係なく、ノードプールで管理されているノードに適用されます。命名規則には、Kafka クラスターとノードプールの名前が含まれます (<kafka_cluster_name>-<pool_name>
)。
<kafka_cluster_name>-<pool_name>
- Kafka ノードプールを管理するために StrimziPodSet に指定された名前。
<kafka_cluster_name>-<pool_name>-<pod_id>
次の Kafka ノードプールリソースに与えられた名前。
- StrimziPodSet によって作成された Pod。
- Kafka ノード設定を使用した ConfigMap。
data-<kafka_cluster_name>-<pool_name>-<pod_id>
- 特定のノードのデータを保存するために使用されるボリュームに対する永続ボリューム要求。このリソースは、データを保存するために永続ボリュームのプロビジョニングに永続ストレージが選択された場合のみ作成されます。
data-<id>-<kafka_cluster_name>-<pool_name>-<pod_id>
-
特定のノードのデータを保存するために使用されるボリューム
id
に対する永続ボリューム要求。このリソースは、永続ボリュームをプロビジョニングしてデータを保存するときに、JBOD ボリュームに永続ストレージが選択された場合のみ作成されます。
Entitiy Operator
これらのリソースは、Cluster Operator を使用して Entity Operator がデプロイされる場合にのみ作成されます。
<kafka_cluster_name>-entity-operator
以下の Entity Operator リソースに指定された名前:
- Topic および User Operator とのデプロイメント。
- Entity Operator によって使用されるサービスアカウント。
- Entity Operator メトリックへのアクセスを管理するネットワークポリシー。
<kafka_cluster_name>-entity-operator-<random_string>
- Entity Operator デプロイメントによって作成された Pod。
<kafka_cluster_name>-entity-topic-operator-config
- Topic Operator の補助設定のある ConfigMap。
<kafka_cluster_name>-entity-user-operator-config
- User Operator の補助設定のある ConfigMap。
<kafka_cluster_name>-entity-topic-operator-certs
- Kafka および ZooKeeper と通信するための Topic Operator キーのあるシークレット。
<kafka_cluster_name>-entity-user-operator-certs
- Kafka および ZooKeeper と通信するための User Operator キーのあるシークレット。
strimzi-<kafka_cluster_name>-entity-topic-operator
- Entity Topic Operator によって使用されるロールバインディング。
strimzi-<kafka_cluster_name>-entity-user-operator
- Entity User Operator によって使用されるロールバインディング。
Kafka Exporter
これらのリソースは、Cluster Operator を使用して Kafka Exporter がデプロイされる場合にのみ作成されます。
<kafka_cluster_name>-kafka-exporter
以下の Kafka Exporter リソースに指定された名前。
- Kafka Exporter でのデプロイメント。
- コンシューマーラグメトリックの収集に使用されるサービス。
- Kafka Exporter によって使用されるサービスアカウント。
- Kafka Exporter メトリックへのアクセスを管理するネットワークポリシー。
<kafka_cluster_name>-kafka-exporter-<random_string>
- Kafka Exporter デプロイメントによって作成された Pod。
Cruise Control
これらのリソースは、Cluster Operator を使用して Cruise Control がデプロイされた場合のみ作成されます。
<kafka_cluster_name>-cruise-control
以下の Cruise Control リソースに指定された名前。
- Cruise Control でのデプロイメント。
- Cruise Control との通信に使用されるサービス。
- Cruise Control によって使用されるサービスアカウント。
<kafka_cluster_name>-cruise-control-<random_string>
- Cruise Control デプロイメントによって作成された Pod。
<kafka_cluster_name>-cruise-control-config
- Cruise Control の補助設定が含まれ、Cruise Control Pod によってボリュームとしてマウントされる ConfigMap。
<kafka_cluster_name>-cruise-control-certs
- Kafka および ZooKeeper と通信するための Cruise Control キーのあるシークレット。
<kafka_cluster_name>-network-policy-cruise-control
- Cruise Control サービスへのアクセスを管理するネットワークポリシー。
6.4. Kafka Connect のデプロイ
Kafka Connect は、コネクタープラグインを使用して Kafka ブローカーと他のシステムの間でデータをストリーミングする統合ツールです。Kafka Connect は、Kafka と、データベースやメッセージングシステムなどの外部データソースまたはターゲットを統合するためのフレームワークを提供し、コネクターを使用してデータをインポートまたはエクスポートします。コネクターは、必要な接続設定を提供するプラグインです。
Streams for Apache Kafka では、Kafka Connect は分散モードでデプロイされます。Kafka Connect はスタンドアロンモードでも動作しますが、Streams for Apache Kafka ではサポートされません。
Kafka Connect は、コネクター の概念を使用し、スケーラビリティーと信頼性を維持しながら Kafka クラスターで大量のデータを移動するフレームワークを提供します。
Cluster Operator は、KafkaConnect
リソースを使用してデプロイされた Kafka Connect クラスターと、KafkaConnector
リソースを使用して作成されたコネクターを管理します。
Kafka Connect を使用するには、次のことを行う必要があります。
コネクター という用語は、Kafka Connect クラスター内で実行されているコネクターインスタンスや、コネクタークラスと同じ意味で使用されます。本ガイドでは、本文の内容で意味が明確である場合に コネクター という用語を使用します。
6.4.1. Kafka Connect の OpenShift クラスターへのデプロイ
この手順では、Cluster Operator を使用して Kafka Connect クラスターを OpenShift クラスターにデプロイする方法を説明します。
Kafka Connect クラスターのデプロイメントは、コネクターのワークロードを タスク として分散する設定可能な数のノード (ワーカー とも呼ばれます) を使用して実装されるため、メッセージフローのスケーラビリティと信頼性が高くなります。
デプロイメントでは、YAML ファイルの仕様を使用して KafkaConnect
リソースが作成されます。
Streams for Apache Kafka は、設定ファイルのサンプル を提供します。この手順では、以下のサンプルファイルを使用します。
-
examples/connect/kafka-connect.yaml
Kafka Connect クラスターをデプロイして並列実行する場合、各インスタンスは内部 Kafka Connect トピックに一意の名前を使用する必要があります。これを行うには、デフォルトを置き換えるように各 Kafka Connect インスタンスを設定 します。
手順
Kafka Connect を OpenShift クラスターにデプロイします。
examples/connect/kafka-connect.yaml
ファイルを使用して Kafka Connect をデプロイします。oc apply -f examples/connect/kafka-connect.yaml
oc apply -f examples/connect/kafka-connect.yaml
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY STATUS RESTARTS my-connect-cluster-connect-<pod_id> 1/1 Running 0
NAME READY STATUS RESTARTS my-connect-cluster-connect-<pod_id> 1/1 Running 0
Copy to Clipboard Copied! my-connect-cluster
は、Kafka Connect クラスターの名前です。Pod ID は、作成された各 Pod を識別します。
デフォルトのデプロイでは、単一の Kafka Connect Pod を作成します。
READY
は、Ready/expected 状態のレプリカ数を表示します。STATUS
がRunning
と表示されれば、デプロイメントは成功です。
6.4.2. Kafka Connect クラスターリソースのリスト
以下のリソースは、OpenShift クラスターの Cluster Operator によって作成されます。
- <connect_cluster_name>-connect
次の Kafka Connect リソースに付けられた名前:
- Kafka Connect ワーカーノード Pod を作成する StrimziPodSet。
- Kafka Connect Pod に安定した DNS 名を提供するヘッドレスサービス。
- Kafka Connect Pod によって使用されるサービスアカウント。
- Kafka Connect ワーカーノードに設定された Pod の Disruption Budget。
- Kafka Connect REST API へのアクセスを管理するネットワークポリシー。
- <connect_cluster_name>-connect-<pod_id>
- Kafka Connect StrimziPodSet によって作成された Pod。
- <connect_cluster_name>-connect-api
- Kafka Connect クラスターを管理するために REST インターフェイスを公開するサービス。
- <connect_cluster_name>-connect-config
- Kafka Connect 補助設定が含まれ、Kafka Connect Pod によってボリュームとしてマウントされる ConfigMap。
- strimzi-<namespace-name>-<connect_cluster_name>-connect-init
- Kafka Connect クラスターによって使用されるクラスターロールバインディング。
- <connect_cluster_name>-connect-build
- Pod は、追加のコネクタープラグインを使用して新しいコンテナーイメージを構築するために使用されます (Kafka Connect Build 機能が使用されている場合のみ)。
- <connect_cluster_name>-connect-dockerfile
- 追加のコネクタープラグインを使用して新しいコンテナーイメージをビルドするために生成された Dockerfile を含む ConfigMap (Kafka Connect ビルド機能が使用されている場合のみ)。
6.5. Kafka Connect コネクターの追加
Kafka Connect はコネクターを使用して他のシステムと統合し、データをストリーミングします。コネクターは Kafka Connector
クラスのインスタンスであり、次のいずれかのタイプになります。
- ソースコネクター
- ソースコネクターは、外部システムからデータを取得し、それをメッセージとして Kafka に提供するランタイムエンティティーです。
- シンクコネクター
- シンクコネクターは、Kafka トピックからメッセージを取得し、外部システムに提供するランタイムエンティティーです。
Kafka Connect はプラグインアーキテクチャーを使用して、コネクターの実装アーティファクトを提供します。プラグインは他のシステムへの接続を可能にし、データを操作するための追加の設定を提供します。プラグインには、コネクターや、データコンバーターや変換などの他のコンポーネントが含まれます。コネクターは、特定のタイプの外部システムで動作します。各コネクターは、その設定のスキーマを定義します。設定を Kafka Connect に指定して、Kafka Connect 内にコネクターインスタンスを作成します。次に、コネクターインスタンスは、システム間でデータを移動するための一連のタスクを定義します。
次のいずれかの方法で、コネクタープラグインを Kafka Connect に追加します。
コンテナーイメージにプラグインを追加したら、次の方法でコネクターインスタンスを開始、停止、および管理できます。
これらのオプションを使用して、新しいコネクターインスタンスを作成することもできます。
6.5.1. コネクタープラグインを使用して新しいコンテナーイメージを自動的にビルドする
Streams for Apache Kafka が追加のコネクターを使用して新しいコンテナーイメージを自動的にビルドするように Kafka Connect を設定します。コネクタープラグインは、KafkaConnect
カスタムリソースの .spec.build.plugins
プロパティーを使用して定義します。Streams for Apache Kafka はコネクタープラグインを自動的にダウンロードし、新しいコンテナーイメージに追加します。コンテナーは、.spec.build.output
に指定されたコンテナーリポジトリーにプッシュされ、Kafka Connect デプロイメントで自動的に使用されます。
前提条件
- Cluster Operator がデプロイされている。
- コンテナーレジストリー。
イメージをプッシュ、保存、およびプルできる独自のコンテナーレジストリーを提供する必要があります。Streams for Apache Kafka は、プライベートコンテナーレジストリーだけでなく、Quay や Docker Hub などのパブリックレジストリーもサポートします。
手順
.spec.build.output
でコンテナーレジストリーを、.spec.build.plugins
で追加のコネクターを指定して、KafkaConnect
カスタムリソースを設定します。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: #... build: output: type: docker image: my-registry.io/my-org/my-connect-cluster:latest pushSecret: my-registry-credentials plugins: - name: connector-1 artifacts: - type: tgz url: <url_to_download_connector_1_artifact> sha512sum: <SHA-512_checksum_of_connector_1_artifact> - name: connector-2 artifacts: - type: jar url: <url_to_download_connector_2_artifact> sha512sum: <SHA-512_checksum_of_connector_2_artifact> #...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec:
1 #... build: output:
2 type: docker image: my-registry.io/my-org/my-connect-cluster:latest pushSecret: my-registry-credentials plugins:
3 - name: connector-1 artifacts: - type: tgz url: <url_to_download_connector_1_artifact> sha512sum: <SHA-512_checksum_of_connector_1_artifact> - name: connector-2 artifacts: - type: jar url: <url_to_download_connector_2_artifact> sha512sum: <SHA-512_checksum_of_connector_2_artifact> #...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_connect_configuration_file>
$ oc apply -f <kafka_connect_configuration_file>
Copy to Clipboard Copied! - 新しいコンテナーイメージがビルドされ、Kafka Connect クラスターがデプロイされるまで待ちます。
-
Kafka Connect REST API または
KafkaConnector
カスタムリソースを使用して、追加したコネクタープラグインを使用します。
6.5.2. Kafka Connect ベースイメージからコネクタープラグインを使用して新しいコンテナーイメージをビルドする
Kafka Connect 基本イメージからコネクタープラグインを使用してカスタム Docker イメージを作成します。カスタムイメージを /opt/kafka/plugins
ディレクトリーに追加します。
Red Hat Ecosystem Catalog の Kafka コンテナーイメージは、追加のコネクタープラグインで独自のカスタムイメージを作成するためのベースイメージとして使用できます。
起動時に、Streams for Apache Kafka バージョンの Kafka Connect は、/opt/kafka/plugins
ディレクトリーに含まれるサードパーティーのコネクタープラグインをロードします。
手順
ベースイメージとして
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
を使用して、新しいDockerfile
を作成します。FROM registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 USER root:root COPY ./my-plugins/ /opt/kafka/plugins/ USER 1001
FROM registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 USER root:root COPY ./my-plugins/ /opt/kafka/plugins/ USER 1001
Copy to Clipboard Copied! プラグインファイルの例
tree ./my-plugins/
$ tree ./my-plugins/ ./my-plugins/ ├── debezium-connector-mongodb │ ├── bson-<version>.jar │ ├── CHANGELOG.md │ ├── CONTRIBUTE.md │ ├── COPYRIGHT.txt │ ├── debezium-connector-mongodb-<version>.jar │ ├── debezium-core-<version>.jar │ ├── LICENSE.txt │ ├── mongodb-driver-core-<version>.jar │ ├── README.md │ └── # ... ├── debezium-connector-mysql │ ├── CHANGELOG.md │ ├── CONTRIBUTE.md │ ├── COPYRIGHT.txt │ ├── debezium-connector-mysql-<version>.jar │ ├── debezium-core-<version>.jar │ ├── LICENSE.txt │ ├── mysql-binlog-connector-java-<version>.jar │ ├── mysql-connector-java-<version>.jar │ ├── README.md │ └── # ... └── debezium-connector-postgres ├── CHANGELOG.md ├── CONTRIBUTE.md ├── COPYRIGHT.txt ├── debezium-connector-postgres-<version>.jar ├── debezium-core-<version>.jar ├── LICENSE.txt ├── postgresql-<version>.jar ├── protobuf-java-<version>.jar ├── README.md └── # ...
Copy to Clipboard Copied! COPY コマンドは、コンテナーイメージにコピーするプラグインファイルを指します。
この例では、Debezium コネクター (MongoDB、MySQL、および PostgreSQL) のプラグインを追加しますが、簡潔にするためにすべてのファイルがリストされているわけではありません。Kafka Connect で実行されている Debezium は、他の Kafka Connect タスクと同じように表示されます。
- コンテナーイメージをビルドします。
- カスタムイメージをコンテナーレジストリーにプッシュします。
新しいコンテナーイメージを示します。
次のいずれかの方法でイメージを指定できます。
KafkaConnect
カスタムリソースのKafkaConnect.spec.image
プロパティーを編集します。設定されている場合、このプロパティーは Cluster Operator の
STRIMZI_KAFKA_CONNECT_IMAGES
環境変数をオーバーライドします。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: #... image: my-new-container-image config: #...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec:
1 #... image: my-new-container-image
2 config:
3 #...
Copy to Clipboard Copied! -
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
ファイルのSTRIMZI_KAFKA_CONNECT_IMAGES
環境変数を編集して、新しいコンテナーイメージを指すようにし、Cluster Operator を再インストールします。
6.5.3. KafkaConnector リソースのデプロイ
コネクターを管理するために KafkaConnector
リソースをデプロイします。KafkaConnector
カスタムリソースは、Cluster Operator によるコネクターの管理に OpenShift ネイティブのアプローチを提供します。Kafka Connect REST API のように、コネクターを管理するために HTTP 要求を送信する必要はありません。該当する KafkaConnector
リソースを更新して稼働中のコネクターインスタンスを管理した後、更新を適用します。Cluster Operator は、実行中のコネクターインスタンスの設定を更新します。該当する KafkaConnector
を削除して、コネクターを削除します。
KafkaConnector
リソースは、リンク先の Kafka Connect クラスターと同じ namespace にデプロイする必要があります。
この手順で示す設定では、失敗したコネクターとタスクを自動的に再起動するために autoRestart
機能が有効になっています (enabled: true
)。KafkaConnector
リソースにアノテーションを付けて、コネクターを 再起動 するか、コネクタータスクの再起動 を手動で行うこともできます。
コネクターの例
独自のコネクターを使用することも、Streams for Apache Kafka に付属する例を試すこともできます。Apache Kafka 3.1.0 までは、サンプルファイルコネクタープラグインが Apache Kafka に含まれていました。Apache Kafka の 3.1.1 および 3.2.0 リリースから、例を他のコネクターと同様にプラグインパスに追加する必要があります。
Streams for Apache Kafka には、サンプルファイルコネクタープラグイン用の サンプル KafkaConnector
設定ファイル (examples/connect/source-connector.yaml
) が用意されています。このファイルでは、次のコネクターインスタンスが KafkaConnector
リソースとして作成されます。
-
Kafka ライセンスファイル (ソース) から各行を読み取り、データをメッセージとして単一の Kafka トピックに書き込む
FileStreamSourceConnector
インスタンス。 -
Kafka トピックからメッセージを読み取り、メッセージを一時ファイル (シンク) に書き込む
FileStreamSinkConnector
インスタンス。
この手順では、サンプルファイルを使用してコネクターを作成します。
サンプルコネクターは、運用環境での使用を意図したものではありません。
前提条件
- Kafka Connect デプロイメント。
- Cluster Operator が稼働している。
手順
次のいずれかの方法で、
FileStreamSourceConnector
およびFileStreamSinkConnector
プラグインを Kafka Connect に追加します。Kafka Connect 設定で
strimzi.io/use-connector-resources annotation
をtrue
に設定します。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ...
Copy to Clipboard Copied! KafkaConnector
リソースを有効にすると、Cluster Operator はそれらを監視します。examples/connect/source-connector.yaml
ファイルを編集します。KafkaConnector ソースコネクター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: org.apache.kafka.connect.file.FileStreamSourceConnector tasksMax: 2 autoRestart: enabled: true config: file: "/opt/kafka/LICENSE" topic: my-topic # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector
1 labels: strimzi.io/cluster: my-connect-cluster
2 spec: class: org.apache.kafka.connect.file.FileStreamSourceConnector
3 tasksMax: 2
4 autoRestart:
5 enabled: true config:
6 file: "/opt/kafka/LICENSE"
7 topic: my-topic
8 # ...
Copy to Clipboard Copied! - 1
- コネクターの名前として使用される
KafkaConnector
リソースの名前。OpenShift リソースで有効な名前を使用します。 - 2
- コネクターインスタンスを作成する Kafka Connect クラスターの名前。コネクターは、リンク先の Kafka Connect クラスターと同じ namespace にデプロイする必要があります。
- 3
- コネクタークラスのフルネーム。これは、Kafka Connect クラスターによって使用されているイメージに存在するはずです。
- 4
- コネクターが作成できる Kafka Connect タスクの最大数。
- 5
- 失敗したコネクターとタスクの自動再起動を有効にします。デフォルトでは、再起動の回数は無制限ですが、
maxRestarts
プロパティーを使用して自動再起動の最大回数を設定できます。 - 6
- キーと値のペア形式の コネクター設定。
- 7
- 外部データファイルの場所。この例では、
/opt/kafka/LICENSE
ファイルから読み取るようにFileStreamSourceConnector
を設定しています。 - 8
- ソースデータのパブリッシュ先となる Kafka トピック。
OpenShift クラスターでソース
KafkaConnector
を作成します。oc apply -f examples/connect/source-connector.yaml
oc apply -f examples/connect/source-connector.yaml
Copy to Clipboard Copied! examples/connect/sink-connector.yaml
ファイルを作成します。touch examples/connect/sink-connector.yaml
touch examples/connect/sink-connector.yaml
Copy to Clipboard Copied! 以下の YAML を
sink-connector.yaml
ファイルに貼り付けます。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-sink-connector labels: strimzi.io/cluster: my-connect spec: class: org.apache.kafka.connect.file.FileStreamSinkConnector tasksMax: 2 config: file: "/tmp/my-file" topics: my-topic
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-sink-connector labels: strimzi.io/cluster: my-connect spec: class: org.apache.kafka.connect.file.FileStreamSinkConnector
1 tasksMax: 2 config:
2 file: "/tmp/my-file"
3 topics: my-topic
4 Copy to Clipboard Copied! OpenShift クラスターにシンク
KafkaConnector
を作成します。oc apply -f examples/connect/sink-connector.yaml
oc apply -f examples/connect/sink-connector.yaml
Copy to Clipboard Copied! コネクターリソースが作成されたことを確認します。
oc get kctr --selector strimzi.io/cluster=<my_connect_cluster> -o name my-source-connector my-sink-connector
oc get kctr --selector strimzi.io/cluster=<my_connect_cluster> -o name my-source-connector my-sink-connector
Copy to Clipboard Copied! <my_connect_cluster> を Kafka Connect クラスターの名前に置き換えます。
コンテナーで、
kafka -console-consumer.sh
を実行して、ソースコネクターによってトピックに書き込まれたメッセージを読み取ります。oc exec <my_kafka_cluster>-kafka-0 -i -t -- bin/kafka-console-consumer.sh --bootstrap-server <my_kafka_cluster>-kafka-bootstrap.NAMESPACE.svc:9092 --topic my-topic --from-beginning
oc exec <my_kafka_cluster>-kafka-0 -i -t -- bin/kafka-console-consumer.sh --bootstrap-server <my_kafka_cluster>-kafka-bootstrap.NAMESPACE.svc:9092 --topic my-topic --from-beginning
Copy to Clipboard Copied! <my_kafka_cluster> を Kafka クラスターの名前に置き換えます。
ソースおよびシンクコネクターの設定オプション
コネクター設定は、KafkaConnector
リソースの spec.config
プロパティーで定義されます。
FileStreamSourceConnector
クラスおよび FileStreamSinkConnector
クラスは、Kafka Connect REST API と同じ設定オプションをサポートします。他のコネクターは異なる設定オプションをサポートします。
名前 | 型 | デフォルト値 | 説明 |
---|---|---|---|
| 文字列 | Null | メッセージを書き込むソースファイル。指定のない場合は、標準入力が使用されます。 |
| List | Null | データのパブリッシュ先となる Kafka トピック。 |
名前 | 型 | デフォルト値 | 説明 |
---|---|---|---|
| 文字列 | Null | メッセージを書き込む宛先ファイル。指定のない場合は標準出力が使用されます。 |
| List | Null | データの読み取り元となる 1 つ以上の Kafka トピック。 |
| 文字列 | Null | データの読み取り元となる 1 つ以上の Kafka トピックと一致する正規表現。 |
6.5.4. Kafka Connect API の公開
KafkaConnector
リソースを使用してコネクターを管理する代わりに、Kafka Connect REST API を使用します。Kafka Connect REST API は、<connect_cluster_name>-connect-api:8083
で実行しているサービスとして利用できます。ここで、<connect_cluster_name> は、お使いの Kafka Connect クラスターの名前になります。サービスは、Kafka Connect インスタンスの作成時に作成されます。
Kafka Connect REST API でサポートされる操作は、Apache Kafka Connect API のドキュメント で説明されています。
strimzi.io/use-connector-resources
アノテーションは KafkaConnectors を有効にします。アノテーションを KafkaConnect
リソース設定に適用した場合、そのアノテーションを削除して Kafka Connect API を使用する必要があります。それ以外の場合、Kafka Connect REST API を使用して直接行われた手動による変更は、 Cluster Operator によって元に戻されます。
コネクター設定を JSON オブジェクトとして追加できます。
コネクター設定を追加するための curl 要求の例
curl -X POST \ http://my-connect-cluster-connect-api:8083/connectors \ -H 'Content-Type: application/json' \ -d '{ "name": "my-source-connector", "config": { "connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector", "file": "/opt/kafka/LICENSE", "topic":"my-topic", "tasksMax": "4", "type": "source" } }'
curl -X POST \
http://my-connect-cluster-connect-api:8083/connectors \
-H 'Content-Type: application/json' \
-d '{ "name": "my-source-connector",
"config":
{
"connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector",
"file": "/opt/kafka/LICENSE",
"topic":"my-topic",
"tasksMax": "4",
"type": "source"
}
}'
API には OpenShift クラスター内でのみアクセスできます。OpenShift クラスター外部で実行しているアプリケーションに Kafka Connect API がアクセスできるようにする場合は、以下の機能のいずれかを使用して Kafka Connect API を手動で公開できます。
-
LoadBalancer
またはNodePort
タイプのサービス -
Ingress
リソース (Kubernetes のみ) - OpenShift ルート (OpenShift のみ)
接続はセキュアではないため、外部からのアクセスはよく考えてから許可してください。
サービスを作成する場合には、<connect_cluster_name>-connect-api
サービスの selector
からラベルを使用して、サービスがトラフィックをルーティングする Pod を設定します。
サービスのセレクター設定
# ... selector: strimzi.io/cluster: my-connect-cluster strimzi.io/kind: KafkaConnect strimzi.io/name: my-connect-cluster-connect #...
# ...
selector:
strimzi.io/cluster: my-connect-cluster
strimzi.io/kind: KafkaConnect
strimzi.io/name: my-connect-cluster-connect
#...
また、外部クライアントからの HTTP 要求を許可する NetworkPolicy
を作成する必要もあります。
Kafka Connect API への要求を許可する NetworkPolicy の例
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: my-custom-connect-network-policy spec: ingress: - from: - podSelector: matchLabels: app: my-connector-manager ports: - port: 8083 protocol: TCP podSelector: matchLabels: strimzi.io/cluster: my-connect-cluster strimzi.io/kind: KafkaConnect strimzi.io/name: my-connect-cluster-connect policyTypes: - Ingress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: my-custom-connect-network-policy
spec:
ingress:
- from:
- podSelector:
matchLabels:
app: my-connector-manager
ports:
- port: 8083
protocol: TCP
podSelector:
matchLabels:
strimzi.io/cluster: my-connect-cluster
strimzi.io/kind: KafkaConnect
strimzi.io/name: my-connect-cluster-connect
policyTypes:
- Ingress
- 1
- API への接続が許可される Pod のラベル。
クラスター外でコネクター設定を追加するには、curl コマンドで API を公開するリソースの URL を使用します。
6.5.5. Kafka Connect API へのアクセスの制限
Kafka Connect API へのアクセスを信頼できるユーザーのみに制限して、不正なアクションや潜在的なセキュリティーの問題を防ぐことが重要です。Kafka Connect API は、コネクター設定を変更するための広範な機能を提供するため、セキュリティー対策を講じることがさらに重要になります。管理者によりセキュアであると想定されている機密情報が、Kafka Connect API にアクセスできるユーザーに取得されてしまう可能性があります。
Kafka Connect REST API には、OpenShift クラスターへのアクセスが認証されており、ホスト名/IP アドレス、ポート番号など、エンドポイント URL を知っている場合には、アクセスできます。
たとえば、組織が Kafka Connect クラスターとコネクターを使用して、機密データを顧客データベースから中央データベースにストリーミングするとします。管理者は設定プロバイダープラグインを使用して、顧客データベースと中央データベースへの接続に関連する機密情報 (データベース接続の詳細や認証情報など) を保存します。設定プロバイダーは、この機密情報が許可されていないユーザーに公開されるのを防ぎます。ただし、Kafka Connect API にアクセスできるユーザーは、管理者の同意なしに顧客データベースにアクセスできます。これを行うには、偽のデータベースをセットアップし、それに接続するコネクターを設定します。次に、顧客データベースを参照するようにコネクター設定を変更しますが、データを中央データベースに送信する代わりに、偽のデータベースに送信します。偽のデータベースに接続するようにコネクターを設定すると、設定プロバイダーにセキュアに保存されているにもかかわらず、顧客データベースに接続するためのログインの詳細と認証情報が傍受されます。
KafkaConnector
カスタムリソースを使用している場合、デフォルトでは、OpenShift RBAC ルールにより、OpenShift クラスター管理者のみがコネクターに変更を加えることが許可されます。Streams for Apache Kafka リソースを管理するクラスター管理者以外のユーザーを指定 することもできます。Kafka Connect 設定で KafkaConnector
リソースを有効にすると、Kafka Connect REST API を使用して直接行われた変更は Cluster Operator によって元に戻されます。KafkaConnector
リソースを使用していない場合、デフォルトの RBAC ルールは Kafka Connect API へのアクセスを制限しません。OpenShift RBAC を使用して Kafka Connect REST API への直接アクセスを制限する場合は、KafkaConnector
リソースを有効にして使用する必要があります。
セキュリティーを強化するために、Kafka Connect API の次のプロパティーを設定することを推奨します。
org.apache.kafka.disallowed.login.modules
(Kafka 3.4 以降)
org.apache.kafka.disallowed.login.modules
Java システムプロパティーを設定して、セキュアではないログインモジュールの使用を防止します。たとえば、com.sun.security.auth.module.JndiLoginModule
を指定すると、KafkaJndiLoginModule
が使用できなくなります。ログインモジュールを禁止する設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ... jvmOptions: javaSystemProperties: - name: org.apache.kafka.disallowed.login.modules value: com.sun.security.auth.module.JndiLoginModule, org.apache.kafka.common.security.kerberos.KerberosLoginModule # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ... jvmOptions: javaSystemProperties: - name: org.apache.kafka.disallowed.login.modules value: com.sun.security.auth.module.JndiLoginModule, org.apache.kafka.common.security.kerberos.KerberosLoginModule # ...
Copy to Clipboard Copied! 信頼できるログインモジュールのみを許可し、使用しているバージョンに対する Kafka からの最新のアドバイスに従ってください。ベストプラクティスとして、
org.apache.kafka.disallowed.login.modules
システムプロパティーを使用して、Kafka Connect 設定でセキュアではないログインモジュールを明示的に禁止する必要があります。connector.client.config.override.policy
connector.client.config.override.policy
プロパティーをNone
に設定して、コネクター設定が Kafka Connect 設定とそれが使用するコンシューマーおよびプロデューサーをオーバーライドしないようにします。コネクターオーバーライドポリシーを指定する設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: connector.client.config.override.policy: None # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: connector.client.config.override.policy: None # ...
Copy to Clipboard Copied!
6.5.6. Kafka Connect API の使用から KafkaConnector カスタムリソースの使用への切り替え
Kafka Connect API の使用から KafkaConnector
カスタムリソースの使用に切り替えて、コネクターを管理できます。スイッチの作成は、次の作業を以下の順序で行います。
-
設定で
KafkaConnector
リソースをデプロイし、コネクターインスタンスを作成します。 -
strimzi.io/use-connector-resources
アノテーションをtrue
に設定して、Kafka Connect 設定でKafkaConnector
リソースを有効にします。
作成する前に KafkaConnector
リソースを有効にすると、すべてのコネクターが削除されます。
KafkaConnector
リソースの使用から Kafka Connect API の使用に切り替えるには、最初に KafkaConnector
リソースを有効にするアノテーションを Kafka Connect 設定から削除します。それ以外の場合、Kafka Connect REST API を使用して直接行われた手動による変更は、 Cluster Operator によって元に戻されます。
切り替えを行うときは、KafkaConnect
リソースのステータスを確認 してください。metadata.generation
(デプロイの現在のバージョン) の値は、status.observedGeneration
(リソースの最新の調整) と一致する必要があります。Kafka Connect クラスターが Ready
になったら、KafkaConnector
リソースを削除できます。
6.6. Kafka MirrorMaker のデプロイ
Kafka MirrorMaker は、データセンター内またはデータセンター全体の 2 台以上の Kafka クラスター間でデータをレプリケーションします。Kafka パーティションレプリケーションの概念との混同を避けるために、このプロセスはミラーリングと呼ばれます。MirrorMaker は、ソースクラスターからのメッセージを消費し、それらのメッセージをターゲットクラスターに再パブリッシュします。
クラスター間のデータレプリケーションは、以下を必要とするシナリオをサポートします。
- システム障害時のデータの復旧
- 集中分析のための複数のソースクラスターからのデータの統合
- 特定のクラスターへのデータアクセスの制限
- レイテンシーを改善するための特定場所でのデータのプロビジョニング
6.6.1. Kafka MirrorMaker の OpenShift クラスターへのデプロイ
この手順では、Cluster Operator を使用して Kafka MirrorMaker クラスターを OpenShift クラスターにデプロイする方法を説明します。
デプロイメントでは、YAML ファイルの仕様を使用して、デプロイされた MirrorMaker のバージョンに応じて KafkaMirrorMaker
または KafkaMirrorMaker2
リソースが作成されます。MirrorMaker 2 は Kafka Connect に基づいており、その設定プロパティーを使用します。
Kafka MirrorMaker 1 (ドキュメントでは単に MirrorMaker と呼ばれる) は Apache Kafka 3.0.0 で非推奨となり、Apache Kafka 4.0.0 で削除されます。そのため、Kafka MirrorMaker 1 のデプロイに使用される KafkaMirrorMaker
カスタムリソースも、Streams for Apache Kafka で非推奨となりました。KafkaMirrorMaker
リソースは、Apache Kafka 4.0.0 の導入時に Streams for Apache Kafka から削除されます。代わりに、IdentityReplicationPolicy
で KafkaMirrorMaker2
カスタムリソースを使用します。
Streams for Apache Kafka は、設定ファイルのサンプル を提供します。この手順では、以下のサンプルファイルを使用します。
-
examples/mirror-maker/kafka-mirror-maker.yaml
-
examples/mirror-maker/kafka-mirror-maker-2.yaml
同じターゲット Kafka クラスターを使用して、MirrorMaker 2 クラスターを並列実行するようにデプロイする場合、各インスタンスは内部 Kafka Connect トピックに一意の名前を使用する必要があります。これを行うには、デフォルトを置き換えるように各 MirrorMaker 2 インスタンスを設定 します。
手順
Kafka MirrorMaker を OpenShift クラスターにデプロイします。
MirrorMaker の場合
oc apply -f examples/mirror-maker/kafka-mirror-maker.yaml
oc apply -f examples/mirror-maker/kafka-mirror-maker.yaml
Copy to Clipboard Copied! MirrorMaker 2 の場合:
oc apply -f examples/mirror-maker/kafka-mirror-maker-2.yaml
oc apply -f examples/mirror-maker/kafka-mirror-maker-2.yaml
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY STATUS RESTARTS my-mirror-maker-mirror-maker-<pod_id> 1/1 Running 1 my-mm2-cluster-mirrormaker2-<pod_id> 1/1 Running 1
NAME READY STATUS RESTARTS my-mirror-maker-mirror-maker-<pod_id> 1/1 Running 1 my-mm2-cluster-mirrormaker2-<pod_id> 1/1 Running 1
Copy to Clipboard Copied! my-mirror-maker
は、Kafka MirrorMaker クラスターの名前です。my-mm2-cluster
は、Kafka MirrorMaker 2 クラスターの名前です。Pod ID は、作成された各 Pod を識別します。
デフォルトのデプロイメントでは、単一の MirrorMaker または MirrorMaker 2 Pod をインストールします。
READY
は、Ready/expected 状態のレプリカ数を表示します。STATUS
がRunning
と表示されれば、デプロイメントは成功です。
6.6.2. Kafka MirrorMaker 2 クラスターリソースのリスト
以下のリソースは、OpenShift クラスターの Cluster Operator によって作成されます。
- <mirrormaker2_cluster_name>-mirrormaker2
次の MirrorMaker 2 リソースに指定された名前。
- MirrorMaker 2 ワーカーノード Pod を作成する StrimziPodSet。
- MirrorMaker 2 Pod に安定した DNS 名を提供するヘッドレスサービス。
- MirrorMaker 2 Pod によって使用されるサービスアカウント。
- MirrorMaker 2 ワーカーノードに設定された Pod の Disruption Budget。
- MirrorMaker 2 REST API へのアクセスを管理するネットワークポリシー。
- <mirrormaker2_cluster_name>-mirrormaker2-<pod_id>
- MirrorMaker 2 StrimziPodSet によって作成された Pod。
- <mirrormaker2_cluster_name>-mirrormaker2-api
- MirrorMaker 2 クラスターを管理するための REST インターフェイスを公開するサービス。
- <mirrormaker2_cluster_name>-mirrormaker2-config
- MirrorMaker 2 の補助設定が含まれ、MirrorMaker 2 Pod によってボリュームとしてマウントされる ConfigMap。
- strimzi-<namespace-name>-<mirrormaker2_cluster_name>-mirrormaker2-init
- MirrorMaker 2 クラスターによって使用されるクラスターのロールバインディング。
6.6.3. Kafka MirrorMaker クラスターリソースのリスト
以下のリソースは、OpenShift クラスターの Cluster Operator によって作成されます。
- <mirrormaker_cluster_name>-mirror-maker
次の MirrorMaker リソースに指定された名前。
- MirrorMaker Pod を作成するデプロイメント。
- MirrorMaker ノードで使用されるサービスアカウント。
- MirrorMaker ワーカーノードに設定された Pod の Disruption Budget。
- <mirrormaker_cluster_name>-mirror-maker-config
- MirrorMaker の補助設定が含まれ、MirrorMaker Pod によってボリュームとしてマウントされる ConfigMap。
6.7. Kafka Bridge のデプロイ
Kafka Bridge には、HTTP ベースのクライアントと Kafka クラスターを統合する API が含まれています。
6.7.1. Kafka Bridge を OpenShift クラスターへデプロイ
この手順では、Cluster Operator を使用して Kafka Bridge クラスターを OpenShift クラスターにデプロイする方法を説明します。
デプロイメントでは、YAML ファイルの仕様を使用して KafkaBridge
リソースが作成されます。
Streams for Apache Kafka は、設定ファイルのサンプル を提供します。この手順では、以下のサンプルファイルを使用します。
-
examples/bridge/kafka-bridge.yaml
手順
Kafka Bridge を OpenShift クラスターにデプロイします。
oc apply -f examples/bridge/kafka-bridge.yaml
oc apply -f examples/bridge/kafka-bridge.yaml
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY STATUS RESTARTS my-bridge-bridge-<pod_id> 1/1 Running 0
NAME READY STATUS RESTARTS my-bridge-bridge-<pod_id> 1/1 Running 0
Copy to Clipboard Copied! my-bridge
は、Kafka Bridge クラスターの名前です。Pod ID は、作成された各 Pod を識別します。
デフォルトのデプロイメントでは、単一の Kafka Bridge Pod をインストールします。
READY
は、Ready/expected 状態のレプリカ数を表示します。STATUS
がRunning
と表示されれば、デプロイメントは成功です。
6.7.2. Kafka Bridge サービスのローカルマシンへの公開
ポート転送を使用して、Streams for Apache Kafka Bridge サービスを http://localhost:8080 でローカルマシンに公開します。
ポート転送は、開発およびテストの目的でのみ適切です。
手順
OpenShift クラスターの Pod の名前をリストします。
oc get pods -o name pod/kafka-consumer # ... pod/my-bridge-bridge-<pod_id>
oc get pods -o name pod/kafka-consumer # ... pod/my-bridge-bridge-<pod_id>
Copy to Clipboard Copied! ポート
8080
で Kafka Bridge Pod に接続します。oc port-forward pod/my-bridge-bridge-<pod_id> 8080:8080 &
oc port-forward pod/my-bridge-bridge-<pod_id> 8080:8080 &
Copy to Clipboard Copied! 注記ローカルマシンのポート 8080 がすでに使用中の場合は、代わりの HTTP ポート (
8008
など) を使用します。
これで、API リクエストがローカルマシンのポート 8080 から Kafka Bridge Pod のポート 8080 に転送されるようになります。
6.7.3. OpenShift 外部の Kafka Bridge へのアクセス
デプロイ後の Streams for Apache Kafka Bridge には、同じ OpenShift クラスターで実行されているアプリケーションのみがアクセスできます。これらのアプリケーションは、<kafka_bridge_name>-bridge-service
サービスを使用して API にアクセスします。
OpenShift クラスター外部で実行しているアプリケーションに Kafka Bridge がアクセスできるようにする場合は、以下の機能のいずれかを作成して Kafka Bridge を手動で公開できます。
-
LoadBalancer
またはNodePort
タイプのサービス -
Ingress
リソース (Kubernetes のみ) - OpenShift ルート (OpenShift のみ)
サービスを作成する場合には、<kafka_bridge_name>-bridge-service
サービスの selector
からラベルを使用して、サービスがトラフィックをルーティングする Pod を設定します。
# ... selector: strimzi.io/cluster: kafka-bridge-name strimzi.io/kind: KafkaBridge #...
# ...
selector:
strimzi.io/cluster: kafka-bridge-name
strimzi.io/kind: KafkaBridge
#...
- 1
- OpenShift クラスターでの Kafka Bridge カスタムリソースの名前。
6.7.4. Kafka Bridge クラスターリソースのリスト
以下のリソースは、OpenShift クラスターの Cluster Operator によって作成されます。
- <bridge_cluster_name>-bridge
- Kafka Bridge ワーカーノード Pod の作成するデプロイメント。
- <bridge_cluster_name>-bridge-service
- Kafka Bridge クラスターの REST インターフェイスを公開するサービス。
- <bridge_cluster_name>-bridge-config
- Kafka Bridge の補助設定が含まれ、Kafka ブローカー Pod によってボリュームとしてマウントされる ConfigMap。
- <bridge_cluster_name>-bridge
- Kafka Bridge ワーカーノードに設定された Pod の Disruption Budget。
6.8. Streams for Apache Kafka Operator のスタンドアロンデプロイメントを代替的に実行する方法
Topic Operator および User Operator のスタンドアロンデプロイメントを実行できます。Cluster Operator によって管理されない Kafka クラスターを使用している場合は、これらの Operator のスタンドアロンデプロイメントを検討してください。
Operator を OpenShift にデプロイします。Kafka は OpenShift 外で実行できます。たとえば、Kafka をマネージドサービスとして使用する場合があります。スタンドアロン Operator のデプロイメント設定を調整し、Kafka クラスターのアドレスと一致するようにします。
6.8.1. スタンドアロン Topic Operator のデプロイ
この手順では、Topic Operator をトピック管理用のスタンドアロンコンポーネントとして一方向モードでデプロイメントする方法を示します。スタンドアロン Topic Operator を Cluster Operator によって管理されない Kafka クラスターと使用できます。一方向トピック管理では、KafkaTopic
リソースのみを通じてトピックを維持します。一方向トピック管理の詳細は、「トピック管理モード」 を参照してください。Topic Operator を双方向モードでデプロイメントするための代替設定も示されています。
スタンドアロンデプロイメントファイルは、Streams for Apache Kafka で提供されます。05-Deployment-strimzi-topic-operator.yaml
デプロイメントファイルを使用して、Topic Operator をデプロイします。Kafka クラスターへの接続に必要な環境変数を追加または設定します。
Topic Operator は、単一の namespace で KafkaTopic
リソースを監視します。Topic Operator 設定で、監視する namespace と Kafka クラスターへの接続を指定します。1 つの Topic Operator が監視できるのは、namespace 1 つです。1 つの namespace を監視するのは、Top Operator 1 つのみとします。複数の Topic Operator を使用する場合は、それぞれが異なる namespace を監視するように設定します。このようにして、Topic Operator を複数の Kafka クラスターで使用できます。
前提条件
Topic Operator の接続先となる Kafka クラスターを実行している。
スタンドアロンの Topic Operator が接続用に正しく設定されている限り、Kafka クラスターはベアメタル環境、仮想マシン、またはマネージドクラウドアプリケーションサービスで実行できます。
手順
install/topic-operator/05-Deployment-strimzi-topic-operator.yaml
スタンドアロンデプロイメントファイルのenv
プロパティーを編集します。スタンドアロンの Topic Operator デプロイメント設定の例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" - name: STRIMZI_LOG_LEVEL value: INFO - name: STRIMZI_TLS_ENABLED value: "false" - name: STRIMZI_JAVA_OPTS value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA value: "false" - name: STRIMZI_TLS_AUTH_ENABLED value: "false" - name: STRIMZI_SASL_ENABLED value: "false" - name: STRIMZI_SASL_USERNAME value: "admin" - name: STRIMZI_SASL_PASSWORD value: "password" - name: STRIMZI_SASL_MECHANISM value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL value: "SSL" - name: STRIMZI_USE_FINALIZERS value: "false"
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE
1 valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS
2 value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS
3 value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
4 value: "120000" - name: STRIMZI_LOG_LEVEL
5 value: INFO - name: STRIMZI_TLS_ENABLED
6 value: "false" - name: STRIMZI_JAVA_OPTS
7 value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES
8 value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA
9 value: "false" - name: STRIMZI_TLS_AUTH_ENABLED
10 value: "false" - name: STRIMZI_SASL_ENABLED
11 value: "false" - name: STRIMZI_SASL_USERNAME
12 value: "admin" - name: STRIMZI_SASL_PASSWORD
13 value: "password" - name: STRIMZI_SASL_MECHANISM
14 value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL
15 value: "SSL" - name: STRIMZI_USE_FINALIZERS value: "false"
16 Copy to Clipboard Copied! - 1
KafkaTopic
リソースを監視する Topic Operator の OpenShift namespace。Kafka クラスターの namespace を指定します。- 2
- Kafka クラスターのすべてのブローカーを検出し、接続するブートストラップブローカーアドレスのホストとポートのペア。サーバーがダウンした場合に備えて、コンマ区切りリストを使用して 2 つまたは 3 つのブローカーアドレスを指定します。
- 3
- Topic Operator によって管理される
KafkaTopic
リソースを識別するラベル。これは、Kafka クラスターの名前である必要はありません。KafkaTopic
リソースに割り当てられたラベルにすることができます。複数の Topic Operator をデプロイする場合、ラベルはそれぞれに一意である必要があります。つまり、Operator は同じリソースを管理できません。 - 4
- 定期的な調整の間隔 (秒単位)。デフォルトは
120000
(2 分) です。 - 5
- ロギングメッセージの出力レベル。レベルを、
ERROR
、WARNING
、INFO
、DEBUG
、またはTRACE
に設定できます。 - 6
- Kafka ブローカーとの暗号化された通信の TLS サポートを有効にします。
- 7
- (任意) Topic Operator を実行する JVM に使用される Java オプション。
- 8
- (任意) Topic Operator に設定されたデバッグ (
-D
) オプション。 - 9
- (オプション)TLS が
STRIMZI_TLS_ENABLED
によって有効になっている場合、トラストストア証明書の生成を省略します。この環境変数が有効になっている場合、ブローカーは TLS 証明書に公的に信頼できる認証局を使用する必要があります。デフォルトはfalse
です。 - 10
- (オプション) mTLS 認証用のキーストア証明書を生成します。これを
false
に設定すると、mTLS を使用した Kafka ブローカーへのクライアント認証が無効になります。デフォルトはtrue
です。 - 11
- (オプション)Kafka ブローカーに接続するときにクライアント認証の SASL サポートを有効にします。デフォルトは
false
です。 - 12
- (任意) クライアント認証用の SASL ユーザー名。SASL が
STRIMZI_SASL_ENABLED
によって有効化された場合のみ必須です。 - 13
- (任意) クライアント認証用の SASL パスワード。SASL が
STRIMZI_SASL_ENABLED
によって有効化された場合のみ必須です。 - 14
- (任意) クライアント認証用の SASL メカニズム。SASL が
STRIMZI_SASL_ENABLED
によって有効化された場合のみ必須です。この値はplain
、scram-sha-256
、またはscram-sha-512
に設定できます。 - 15
- (任意)Kafka ブローカーとの通信に使用されるセキュリティープロトコル。デフォルト値は PLAINTEXT です。値は
PLAINTEXT
、SSL
、SASL_PLAINTEXT
、またはSASL_SSL
に設定できます。 - 16
-
公開認証局から証明書を使用している Kafka ブ ローカーに接続する場合は、
STRIMZI_PUBLIC_CA
をtrue
に設定します。たとえば、Amazon AWS MSK サービスを使用している場合は、このプロパティーをtrue
に設定します。 STRIMZI_TLS_ENABLED
環境変数で mTLS を有効にした場合は、Kafka クラスターへの接続認証に使用されるキーストアおよびトラストストアを指定します。mTLS 設定の例
.... ...
# .... env: - name: STRIMZI_TRUSTSTORE_LOCATION
1 value: "/path/to/truststore.p12" - name: STRIMZI_TRUSTSTORE_PASSWORD
2 value: "TRUSTSTORE-PASSWORD" - name: STRIMZI_KEYSTORE_LOCATION
3 value: "/path/to/keystore.p12" - name: STRIMZI_KEYSTORE_PASSWORD
4 value: "KEYSTORE-PASSWORD" # ...
Copy to Clipboard Copied! -
変更を
Deployment
設定に適用して、Topic Operator をデプロイします。 デプロイメントのステータスを確認します。
oc get deployments
oc get deployments
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY UP-TO-DATE AVAILABLE strimzi-topic-operator 1/1 1 1
NAME READY UP-TO-DATE AVAILABLE strimzi-topic-operator 1/1 1 1
Copy to Clipboard Copied! READY
は、Ready/expected 状態のレプリカ数を表示します。AVAILABLE
出力に1
が表示されれば、デプロイメントは成功しています。
6.8.1.1. 双方向トピック管理のためのスタンドアロン Topic Operator のデプロイ
双方向トピック管理では、クラスター管理に ZooKeeper が必要で、KafkaTopic
リソースを通じて、および Kafka クラスター内でトピックを維持します。このモードで Topic Operator の使用に切り替える場合は、次の手順に従ってスタンドアロン Topic Operator をデプロイメントします。
Topic Operator を単方向モードで実行できるようにする機能ゲートが一般提供に進むにつれて、双方向モードは段階的に廃止されます。この移行は、特に KRaft モードでの Kafka のサポートにおいて、ユーザーエクスペリエンスを向上させることを目的としています。
現在のスタンドアロン Topic Operator のデプロイを解除します。
KafkaTopic
リソースを保持します。これは、Topic Operator が再度デプロイされるときに Toppic Operator によって選択されます。スタンドアロン Topic Operator の
Deployment
設定を編集して、ZooKeeper 関連の環境変数を含めます。-
STRIMZI_ZOOKEEPER_CONNECT
-
STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS
-
TC_ZK_CONNECTION_TIMEOUT_MS
STRIMZI_USE_ZOOKEEPER_TOPIC_STORE
双方向 Topic Operator が使用されるかどうかを定義するのは、ZooKeeper 変数の有無です。一方向のトピック管理は ZooKeeper を使用しません。ZooKeeper 環境変数が存在しない場合は、一方向の Topic Operator が使用されます。それ以外の場合は、双方向の Topic Operator が使用されます。
必要に応じて、一方向モードで使用されない他の環境変数を追加できます。
-
STRIMZI_REASSIGN_THROTTLE
-
STRIMZI_REASSIGN_VERIFY_INTERVAL_MS
-
STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS
-
STRIMZI_TOPICS_PATH
-
STRIMZI_STORE_TOPIC
-
STRIMZI_STORE_NAME
-
STRIMZI_APPLICATION_ID
STRIMZI_STALE_RESULT_TIMEOUT_MS
双方向トピック管理のためのスタンドアロン Topic Operator デプロイメント設定の例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_ZOOKEEPER_CONNECT value: my-cluster-zookeeper-client:2181 - name: STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS value: "18000" - name: STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS value: "6" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" - name: STRIMZI_LOG_LEVEL value: INFO - name: STRIMZI_TLS_ENABLED value: "false" - name: STRIMZI_JAVA_OPTS value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA value: "false" - name: STRIMZI_TLS_AUTH_ENABLED value: "false" - name: STRIMZI_SASL_ENABLED value: "false" - name: STRIMZI_SASL_USERNAME value: "admin" - name: STRIMZI_SASL_PASSWORD value: "password" - name: STRIMZI_SASL_MECHANISM value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL value: "SSL"
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_ZOOKEEPER_CONNECT
1 value: my-cluster-zookeeper-client:2181 - name: STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS
2 value: "18000" - name: STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS
3 value: "6" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" - name: STRIMZI_LOG_LEVEL value: INFO - name: STRIMZI_TLS_ENABLED value: "false" - name: STRIMZI_JAVA_OPTS value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA value: "false" - name: STRIMZI_TLS_AUTH_ENABLED value: "false" - name: STRIMZI_SASL_ENABLED value: "false" - name: STRIMZI_SASL_USERNAME value: "admin" - name: STRIMZI_SASL_PASSWORD value: "password" - name: STRIMZI_SASL_MECHANISM value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL value: "SSL"
Copy to Clipboard Copied! - 1
- (ZooKeeper) ZooKeeper クラスターに接続するためのアドレスのホストおよびポートのペア。これは、Kafka クラスターが使用する ZooKeeper クラスターと同じである必要があります。
- 2
- (ZooKeeper) ZooKeeper セッションのタイムアウト (ミリ秒単位)。デフォルトは
18000
(18 秒) です。 - 3
- Kafka からトピックメタデータの取得を試行する回数。各試行の間隔は、指数バックオフとして定義されます。パーティションまたはレプリカの数が原因で、トピックの作成に時間がかかる場合は、この値を大きくすることを検討してください。デフォルトの試行回数は
6
回です。
-
-
変更を
Deployment
設定に適用して、Topic Operator をデプロイします。
6.8.2. スタンドアロン User Operator のデプロイ
この手順では、ユーザー管理のスタンドアロンコンポーネントとして User Operator をデプロイする方法を説明します。Cluster Operator の管理対象外となっている Kafka クラスターでは、スタンドアロンの User Operator を使用します。
スタンドアロンデプロイメントは、任意の Kafka クラスターと操作できます。
スタンドアロンデプロイメントファイルは、Streams for Apache Kafka で提供されます。05-Deployment-strimzi-user-operator.yaml
デプロイメントファイルを使用して、User Operator をデプロイします。Kafka クラスターへの接続に必要な環境変数を追加または設定します。
User Operator は、単一の namespace で KafkaUser
リソースを監視します。User Operator 設定で、監視する namespace と Kafka クラスターへの接続を指定します。1 つの User Operator が監視できるのは、namespace 1 つです。1 つの namespace を監視するのは、User Operator 1 つのみとします。複数の User Operator を使用する場合は、それぞれが異なる namespace を監視するように設定します。このようにして、User Operator を複数の Kafka クラスターで使用できます。
前提条件
User Operator の接続先となる Kafka クラスターを実行している。
スタンドアロンの User Operator が接続用に正しく設定されている限り、Kafka クラスターはベアメタル環境、仮想マシン、またはマネージドクラウドアプリケーションサービスで実行できます。
手順
以下の
env
プロパティーをinstall/user-operator/05-Deployment-strimzi-user-operator.yaml
スタンドアロンデプロイメントファイルで編集します。スタンドアロン User Operator デプロイメント設定の例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-user-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-user-operator # ... env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS value: my-kafka-bootstrap-address:9092 - name: STRIMZI_CA_CERT_NAME value: my-cluster-clients-ca-cert - name: STRIMZI_CA_KEY_NAME value: my-cluster-clients-ca - name: STRIMZI_LABELS value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" - name: STRIMZI_WORK_QUEUE_SIZE value: 10000 - name: STRIMZI_CONTROLLER_THREAD_POOL_SIZE value: 10 - name: STRIMZI_USER_OPERATIONS_THREAD_POOL_SIZE value: 4 - name: STRIMZI_LOG_LEVEL value: INFO - name: STRIMZI_GC_LOG_ENABLED value: "true" - name: STRIMZI_CA_VALIDITY value: "365" - name: STRIMZI_CA_RENEWAL value: "30" - name: STRIMZI_JAVA_OPTS value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_SECRET_PREFIX value: "kafka-" - name: STRIMZI_ACLS_ADMIN_API_SUPPORTED value: "true" - name: STRIMZI_MAINTENANCE_TIME_WINDOWS value: '* * 8-10 * * ?;* * 14-15 * * ?' - name: STRIMZI_KAFKA_ADMIN_CLIENT_CONFIGURATION value: | default.api.timeout.ms=120000 request.timeout.ms=60000
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-user-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-user-operator # ... env: - name: STRIMZI_NAMESPACE
1 valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS
2 value: my-kafka-bootstrap-address:9092 - name: STRIMZI_CA_CERT_NAME
3 value: my-cluster-clients-ca-cert - name: STRIMZI_CA_KEY_NAME
4 value: my-cluster-clients-ca - name: STRIMZI_LABELS
5 value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
6 value: "120000" - name: STRIMZI_WORK_QUEUE_SIZE
7 value: 10000 - name: STRIMZI_CONTROLLER_THREAD_POOL_SIZE
8 value: 10 - name: STRIMZI_USER_OPERATIONS_THREAD_POOL_SIZE
9 value: 4 - name: STRIMZI_LOG_LEVEL
10 value: INFO - name: STRIMZI_GC_LOG_ENABLED
11 value: "true" - name: STRIMZI_CA_VALIDITY
12 value: "365" - name: STRIMZI_CA_RENEWAL
13 value: "30" - name: STRIMZI_JAVA_OPTS
14 value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES
15 value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_SECRET_PREFIX
16 value: "kafka-" - name: STRIMZI_ACLS_ADMIN_API_SUPPORTED
17 value: "true" - name: STRIMZI_MAINTENANCE_TIME_WINDOWS
18 value: '* * 8-10 * * ?;* * 14-15 * * ?' - name: STRIMZI_KAFKA_ADMIN_CLIENT_CONFIGURATION
19 value: | default.api.timeout.ms=120000 request.timeout.ms=60000
Copy to Clipboard Copied! - 1
KafkaUser
リソースを監視する User Operator の OpenShift namespace。指定できる namespace は 1 つだけです。- 2
- Kafka クラスターのすべてのブローカーを検出し、接続するブートストラップブローカーアドレスのホストとポートのペア。サーバーがダウンした場合に備えて、コンマ区切りリストを使用して 2 つまたは 3 つのブローカーアドレスを指定します。
- 3
- mTLS 認証用の新しいユーザー証明書に署名する認証局の公開鍵 (
ca.crt
) 値を含む OpenShiftSecret
。 - 4
- mTLS 認証用の新しいユーザー証明書に署名する CA の秘密鍵 (
ca.key
) 値を含む OpenShiftSecret
。 - 5
- User Operator によって管理される
KafkaUser
リソースを識別するラベル。これは、Kafka クラスターの名前である必要はありません。KafkaUser
リソースに割り当てられたラベルにすることができます。複数の User Operator をデプロイする場合、ラベルはそれぞれに一意である必要があります。つまり、Operator は同じリソースを管理できません。 - 6
- 定期的な調整の間隔 (秒単位)。デフォルトは
120000
(2 分) です。 - 7
- コントローラーイベントキューのサイズ。キューのサイズは、User Operator が操作すると予想されるユーザーの最大数と少なくとも同じ大きさにする必要があります。デフォルトは
1024
です。 - 8
- ユーザーを調整するためのワーカープールのサイズ。プールを大きくすると、より多くのリソースが必要になる可能性がありますが、より多くの
KafkaUser
リソースも処理されます。デフォルトは50
です。 - 9
- Kafka Admin API および OpenShift 操作のワーカープールのサイズ。プールを大きくすると、より多くのリソースが必要になる可能性がありますが、より多くの
KafkaUser
リソースも処理されます。デフォルトは4
です。 - 10
- ロギングメッセージの出力レベル。レベルを、
ERROR
、WARNING
、INFO
、DEBUG
、またはTRACE
に設定できます。 - 11
- ガベッジコレクション (GC) ロギングを有効にします。デフォルトは
true
です。 - 12
- CA の有効期間。デフォルトは
365
日です。 - 13
- CA の更新期間。更新期間は、現在の証明書の有効期日から逆算されます。デフォルトでは、古い証明書が期限切れになる前の証明書の更新期間は
30
日です。 - 14
- (任意) User Operator を実行する JVM に使用される Java オプション。
- 15
- (任意) User Operator に設定されたデバッグ (
-D
) オプション。 - 16
- (オプション)User Operator によって作成される OpenShift シークレットの名前の接頭辞。
- 17
- (任意)Kafka クラスターが Kafka Admin API を使用した認可 ACL ルールの管理をサポートするかどうかを示します。
false
に設定すると、User Operator はsimple
認可 ACL ルールを持つすべてのリソースを拒否します。これは、Kafka クラスターログで不要な例外を回避するのに役立ちます。デフォルトはtrue
です。 - 18
- (オプション) 期限切れのユーザー証明書が更新されるメンテナンス時間枠を定義する Cron 式のセミコロンで区切られたリスト。
- 19
- (オプション) プロパティー形式で User Operator が使用する Kafka Admin クライアントを設定するための設定オプション。
mTLS を使用して Kafka クラスターに接続する場合は、接続の認証に使用されるシークレットを指定します。それ以外の場合は、次のステップに進みます。
mTLS 設定の例
.... ..."
# .... env: - name: STRIMZI_CLUSTER_CA_CERT_SECRET_NAME
1 value: my-cluster-cluster-ca-cert - name: STRIMZI_EO_KEY_SECRET_NAME
2 value: my-cluster-entity-operator-certs # ..."
Copy to Clipboard Copied! User Operator をデプロイします。
oc create -f install/user-operator
oc create -f install/user-operator
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get deployments
oc get deployments
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY UP-TO-DATE AVAILABLE strimzi-user-operator 1/1 1 1
NAME READY UP-TO-DATE AVAILABLE strimzi-user-operator 1/1 1 1
Copy to Clipboard Copied! READY
は、Ready/expected 状態のレプリカ数を表示します。AVAILABLE
出力に1
が表示されれば、デプロイメントは成功しています。
第7章 フィーチャーゲート
Streams for Apache Kafka Operator は、フィーチャーゲートを使用して特定の機能を有効または無効にします。フィーチャーゲートを有効にすると、関連す Operator の動作が変更され、対応する機能が Streams for Apache Kafka デプロイメントに導入されます。
フィーチャーゲートの目的は、機能を完全に採用する前に、その機能を容易に試用およびテストできるようにすることです。フィーチャーゲートの状態 (有効または無効) は、その成熟度レベルに応じてデフォルトで異なる場合があります。
フィーチャーゲートが一般公開 (GA) になると、デフォルトで有効な状態に移行し、Streams for Apache Kafka デプロイメントの永続的な部分になります。GA ステージのフィーチャーゲートを無効にすることはできません。
7.1. 成熟フィーチャーゲート (GA)
成熟フィーチャーゲートは、一般提供 (GA) として永続的に有効化された機能です。
7.1.1. ControlPlaneListener フィーチャーゲート
ControlPlaneListener
フィーチャーゲートは、データのレプリケーションと調整のためにリスナーを分離します。
- Kafka コントローラーとブローカー間の接続は、ポート 9090 で内部 コントロールプレーンリスナー を使用します。
- ブローカー間のデータのレプリケーション、および Streams for Apache Kafka Operator、Cruise Control、または Kafka Exporter からの内部接続では、ポート 9091 で レプリケーションリスナー を使用します。
ControlPlaneListener
フィーチャーゲートを永続的に有効にすると、Streams for Apache Kafka 1.7 以前と Streams for Apache Kafka 2.3 以降の間で直接アップグレードまたはダウングレードすることができなくなります。まず、Streams for Apache Kafka のいずれかの中間バージョンを介してアップグレードまたはダウングレードし、ControlPlaneListener
フィーチャーゲートを無効にしてから、(フィーチャーゲートを有効にして) ターゲットバージョンにダウングレードまたはアップグレードする必要があります。
7.1.2. ServiceAccountPatching フィーチャーゲート
ServiceAccountPatching
フィーチャーゲートは、Cluster Operator が常にサービスアカウントを調整し、必要に応じてサービスアカウントを更新するようにします。たとえば、カスタムリソースの template
プロパティーを使用してサービスアカウントのラベルまたはアノテーションを変更すると、Operator はそれらを既存のサービスアカウントリソースで自動的に更新します。
7.1.3. UseStrimziPodSets フィーチャーゲート
UseStrimziPodSets
フィーチャーゲートでは、OpenShift StatefulSet
リソースの使用に置き換わる形で、Kafka および ZooKeeper Pod を管理するための StrimziPodSet
カスタムリソースが導入されました。
UseStrimziPodSets
フィーチャーゲートを永続的に有効にすると、Streams for Apache Kafka 2.5 以降から Streams for Apache Kafka 2.0 以前に直接ダウングレードすることができなくなります。まず、Streams for Apache Kafka のいずれかのバージョンを介してダウングレードし、UseStrimziPodSets
フィーチャーゲートを無効にしてから、Streams for Apache Kafka 2.0 以前にダウングレードする必要があります。
7.1.4. StableConnectIdentities フィーチャーゲート
StableConnectIdentities
フィーチャーゲートでは、OpenShift Deployment
リソースの使用に置き換わる形で、Kafka Connect および Kafka MirrorMaker 2 Pod を管理するための StrimziPodSet
カスタムリソースが導入されました。
StrimziPodSet
リソースは Pod に安定した名前と安定したアドレスを与えます。これらはローリングアップグレード中に変更されず、OpenShift Deployment
リソースの使用を置き換えます。
StableConnectIdentities
フィーチャーゲートを永続的に有効にすると、Streams for Apache Kafka 2.7 以降から Streams for Apache Kafka 2.3 以前に直接ダウングレードすることができなくなります。まず、Streams for Apache Kafka のいずれかのバージョンを介してダウングレードし、StableConnectIdentities
フィーチャーゲートを無効にしてから、Streams for Apache Kafka 2.3 以前にダウングレードする必要があります。
7.2. 安定フィーチャーゲート (Beta)
安定フィーチャーゲートは Beta レベルの成熟度に達しており、通常はすべてのユーザーに対してデフォルトで有効になっています。安定フィーチャーゲートは実稼働環境に対応していますが、無効にすることもできます。
7.2.1. UseKRaft フィーチャーゲート
UseKRaft
フィーチャーゲートのデフォルト状態は enabled です。
UseKRaft
フィーチャーゲートは、ZooKeeper なしで KRaft (Kafka Raft メタデータ) モードで Kafka クラスターをデプロイします。ZooKeeper と KRaft は、Kafka クラスター内のメタデータを管理し、操作を調整するために使用されるメカニズムです。KRaft モードでは、ZooKeeper などの外部調整サービスが必要なくなります。KRaft モードでは、Kafka ノードはブローカー、コントローラー、またはその両方のロールを引き受けます。これらは、パーティション間でレプリケートされるメタデータを集合的に管理します。コントローラーは、操作を調整し、クラスターの状態を維持する責任があります。
UseKRaft
フィーチャーゲートを使用するには、KafkaNodePools
フィーチャーゲートも有効にする必要があります。Kafka クラスターを KRaft モードでデプロイするには、KafkaNodePool
リソースを使用する必要があります。詳細と例は、「ノードプールを使用した Kafka クラスターのデプロイ」 を参照してください。KRaft モードを使用する Kafka
カスタムリソースには、アノテーション strimzi.io/kraft="enabled"
も必要です。
現在、Streams for Apache Kafka の KRaft モードには、次の主要な制限があります。
-
KRaft モードでは Unidirectional Topic Operator のみがサポートされます。Bidirectional Topic Operator はサポートされていないため、
UnidirectionTopicOperator
フィーチャーゲートが無効になっている場合は、spec.entityOperator.topicOperator
プロパティーをKafka
カスタムリソースから 削除する必要があります。 -
JBOD ストレージはサポートされていません。
type: jbod
ストレージを使用できますが、JBOD アレイに含めることができるディスクは 1 つだけです。 - KRaft コントローラー専用ノードのスケールアップまたはスケールダウンはサポートされていません。
- Kafka クラスターから削除された Kafka ノードの登録解除。
UseKRaft フィーチャーゲートの無効化
UseKRaft
フィーチャーゲートを無効にするには、Cluster Operator 設定の STRIMZI_FEATURE_GATES
環境変数に -UseKRaft
を指定します。
7.2.2. KafkaNodePools フィーチャーゲート
KafkaNodePools
フィーチャーゲートのデフォルト状態は enabled です。
KafkaNodePools
フィーチャーゲートでは、Apache Kafka ノードのさまざまな プール の設定を可能にする新しい KafkaNodePool
カスタムリソースが導入されています。
ノードプールは、Kafka クラスター内の Kafka ノードの個別のグループを指します。各プールには独自の固有の設定があり、これにはレプリカの数、ストレージ設定、割り当てられたロールのリストなどの必須設定が含まれます。.spec.roles
フィールドで、コントローラー ロール、ブローカー ロール、または両方のロールをプール内のすべてのノードに割り当てることができます。ZooKeeper ベースの Apache Kafka クラスターで使用する場合は、broker
ロールに設定する必要があります。UseKRaft
フィーチャーゲートと一緒に使用する場合は、Broker
、Controller
、またはその両方に設定できます。
さらに、ノードプールは、リソースのリクエストと制限、Java JVM オプション、およびリソーステンプレートの独自の設定を持つことができます。KafkaNodePool
リソースに設定されていない設定オプションは、Kafka
カスタムリソースから継承されます。
KafkaNodePool
リソースは、strimzi.io/cluster
ラベルを使用して、どの Kafka クラスターに属しているかを示します。ラベルは、Kafka
カスタムリソースの名前に設定する必要があります。
KafkaNodePool
リソースの例は、Streams for Apache Kafka に付属の サンプル設定ファイル にあります。
KafkaNodePools フィーチャーゲートの無効化
KafkaNodePools
フィーチャーゲートを無効にするには、Cluster Operator 設定の STRIMZI_FEATURE_GATES
環境変数に -KafkaNodePools
を指定します。ノードプールを使用する Kafka
カスタムリソースには、strimzi.io/node-pools: Enabled
アノテーションも必要です。
KafkaNodePools からのダウングレード
クラスターがすでに KafkaNodePool
カスタムリソースを使用していて、それをサポートしていない、または KafkaNodePools
フィーチャーゲートが無効な古いバージョンの Streams for Apache Kafka にダウングレードする場合は、まず KafkaNodePool
カスタムリソースから、Kafka
カスタムリソースのみを使用した Kafka ノード管理に移行する必要があります。
7.2.3. UnidirectionalTopicOperator フィーチャーゲート
UnidirectionalTopicOperator
フィーチャーゲートのデフォルト状態は enabled になっています。
UnidirectionalTopicOperator
フィーチャーゲートは、KafkaTopic
リソースを使用して Kafka トピックを作成するための単方向トピック管理モードを導入します。一方向モードは、クラスター管理での KRaft の使用と互換性があります。一方向モードでは、KafkaTopic
リソースを使用して Kafka トピックを作成し、Topic Operator によって管理されます。KafkaTopic
リソース外のトピックに対する設定変更はすべて元に戻されます。トピック管理の詳細は、「トピック管理モード」 を参照してください。
UnidirectionalTopicOperator
フィーチャーゲートの無効化
UnidirectionalTopicOperator
フィーチャーゲートを無効にするには、Cluster Operator 設定の STRIMZI_FEATURE_GATES
環境変数に -UnidirectionalTopicOperator
を指定します。
7.3. 早期アクセスフィーチャーゲート (Alpha)
早期アクセスフィーチャーゲートはまだ Beta ステージに達しておらず、デフォルトでは無効になっています。早期アクセスフィーチャーゲートは、その機能を Streams for Apache Kafka に永続的に組み込む前に評価する機会を提供します。
現在、Alpha ステージのフィーチャーゲートはありません。
7.4. フィーチャーゲートの有効化
フィーチャーゲートのデフォルト状態を変更するには、Operator の設定で STRIMZI_FEATURE_GATES
環境変数を使用します。この 1 つの環境変数を使用して、複数のフィーチャーゲートを変更することができます。フィーチャーゲート名と接頭辞のコンマ区切りリストを指定します。+
接頭辞はフィーチャーゲートを有効にし、-
接頭辞を無効にします。
FeatureGate1
を有効にし、FeatureGate2
を無効にするフィーチャーゲートの設定例
env: - name: STRIMZI_FEATURE_GATES value: +FeatureGate1,-FeatureGate2
env:
- name: STRIMZI_FEATURE_GATES
value: +FeatureGate1,-FeatureGate2
7.5. フィーチャーゲートリリース
フィーチャーゲートには、3 段階の成熟度があります。
- Alpha: 通常はデフォルトで無効
- Beta: 通常はデフォルトで有効
- General Availability(GA): 通常は常に有効
Alpha ステージの機能は実験的で不安定である可能性があり、変更される可能性があり、実稼働用に十分にテストされていない可能性があります。Beta ステージの機能は、十分にテストされており、その機能は変更されない可能性が高くなります。GA ステージの機能は安定しており、今後変更されることはありません。Alpha または Bata ステージの機能は、有用であることが証明されない場合は削除されます。
-
ControlPlaneListener
フィーチャーゲートは、Streams for Apache Kafka 2.3 で GA ステージに移行しました。現在は永続的に有効になっており、無効にすることはできません。 -
ServiceAccountPatching
フィーチャーゲートは、Streams for Apache Kafka 2.3 で GA ステージに移行しました。現在は永続的に有効になっており、無効にすることはできません。 -
UseStrimziPodSets
フィーチャーゲートは、Streams for Apache Kafka 2.5 で GA ステージに移行しました。StatefulSets のサポートは完全に削除されました。現在は永続的に有効になっており、無効にすることはできません。 -
StableConnectIdentities
フィーチャーゲートは、Streams for Apache Kafka 2.7 で GA ステージに移行しました。現在は永続的に有効になっており、無効にすることはできません。 -
UseKRaft
フィーチャーゲートは Beta ステージにあり、デフォルトで有効になっています。 -
KafkaNodePools
フィーチャーゲートは Beta ステージにあり、デフォルトで有効になっています。 -
UnidirectionalTopicOperator
フィーチャーゲートは Beta ステージにあり、デフォルトで有効になっています。
フィーチャーゲートは、GA に達した時点で削除される可能性があります。つまり、機能が Streams for Apache Kafka のコア機能に組み込まれ、無効にできなくなることがあります。
フィーチャーゲート | Alpha | Beta | GA |
---|---|---|---|
| 1.8 | 2.0 | 2.3 |
| 1.8 | 2.0 | 2.3 |
| 2.1 | 2.3 | 2.5 |
| 2.2 | 2.7 | - |
| 2.4 | 2.6 | 2.7 |
| 2.5 | 2.7 | - |
| 2.5 | 2.7 | - |
フィーチャーゲートが有効になっている場合は、Streams for Apache Kafka の特定のバージョンからアップグレードまたはダウングレードする前に、フィーチャーゲートを無効にする (または、フィーチャーゲートを無効にできる Streams for Apache Kafka のバージョンに先にアップグレードまたはダウングレードする) 必要がある場合があります。次の表は、Streams for Apache Kafka のバージョンのアップグレードまたはダウングレード時に無効にする必要があるフィーチャーゲートを示しています。
フィーチャーゲートの無効化 | アップグレード元の Streams for Apache Kafka バージョン | ダウングレード先の Streams for Apache Kafka バージョン |
---|---|---|
| 1.7 以前 | 1.7 以前 |
| - | 2.0 以前 |
| - | 2.3 以前 |
第8章 KRaft モードへの移行
Kafka クラスターでのメタデータ管理に ZooKeeper を使用している場合は、KRaft モードで Kafka を使用するように移行できます。KRaft モードは ZooKeeper を置き換えて分散調整を行い、信頼性、スケーラビリティー、およびスループットを強化します。
移行中に、クラスター管理用の ZooKeeper に代わるコントローラーノードのクォーラムをノードプールとしてインストールします。アノテーション strimzi.io/kraft="migration"
を適用することで、クラスター設定で KRaft 移行を有効にします。移行が完了したら、ブローカーを KRaft の使用に切り替え、アノテーション strimzi.io/kraft="enabled"
を使用してコントローラーを移行モードから外します。
多くの 制限 があるため、移行を開始する前に、ご使用の環境が KRaft モードで Kafka をサポートできることを確認してください。次の点にも注意してください。
- 移行は専用コントローラーノードでのみサポートされ、broker と controller の二重のロールを持つノードではサポートされません。
- 移行プロセス全体を通じて、ZooKeeper ノードとコントローラーノードは一定期間並行して動作するため、クラスター内に十分なコンピュートリソースが必要になります。
前提条件
- Kafka 3.7.0 以降と Streams for Apache Kafka 2.7 を使用している。以前のバージョンの Streams for Apache Kafka または Apache Kafka を使用している場合は、KRaft モードに移行する前にアップグレードしてください。
ZooKeeper ベースのデプロイメントが、次のものなしで動作していることが確認されている (KRaft モードではサポートされていないため)。
- 双方向モードで実行される Topic Operator。単方向モードであるか、無効になっている必要があります。
-
JBOD ストレージ。
jbod
ストレージタイプを使用できますが、JBOD アレイにはディスクが 1 つだけ含まれている必要があります。
- Kafka クラスターを管理する Cluster Operator が稼働している。
Kafka クラスターのデプロイメントで、Kafka ノードプールが使用されている。
ZooKeeper ベースのクラスターがすでにノードプールを使用している場合は、移行する準備ができています。そうでない場合は、ノードプールを使用するようにクラスターを移行 できます。クラスターがノードプールを使用していないときに移行するには、
broker
ロールが割り当てられ、kafka
という名前を持つKafkaNodePool
リソース設定にブローカーが含まれている必要があります。ノードプールのサポートは、Kafka
リソース設定でstrimzi.io/node-pools: enabled
アノテーションを使用して有効にします。
この手順では、Kafka クラスター名は my-cluster
であり、my-project
namespace にあります。作成されたコントローラーノードプールの名前は、controller
です。ブローカーのノードプールは kafka
と呼ばれます。
手順
Kafka クラスターの場合、
controller
ロールを持つノードプールを作成します。ノードプールは、コントローラーノードのクォーラムをクラスターに追加します。
コントローラーノードプールの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: controller labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: controller labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"
Copy to Clipboard Copied! 注記移行の場合、broker ロールと controller ロールを共有するノードのノードプールを使用することはできません。
新しい
KafkaNodePool
リソースを適用して、コントローラーを作成します。Cluster Operator ログに、ZooKeeper ベースの環境でのコントローラーの使用に関連するエラーが記録されることが予想されます。エラーにより調整がブロックされる可能性があります。これを防ぐには、すぐに次の手順を実行してください。
アノテーション
strimzi.io/kraft
をmigration
に設定して、Kafka
リソースで KRaft 移行を有効にします。oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwrite
Copy to Clipboard Copied! KRaft 移行の有効化
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="migration" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="migration" # ...
Copy to Clipboard Copied! アノテーションを
Kafka
リソース設定に適用すると、移行が開始します。コントローラーが起動し、ブローカーが起動したことを確認します。
oc get pods -n my-project
oc get pods -n my-project
Copy to Clipboard Copied! 出力には、ブローカーノードプールとコントローラーノードプール内のノードが表示されます
NAME READY STATUS RESTARTS my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-controller-3 1/1 Running 0 my-cluster-controller-4 1/1 Running 0 my-cluster-controller-5 1/1 Running 0 # ...
NAME READY STATUS RESTARTS my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-controller-3 1/1 Running 0 my-cluster-controller-4 1/1 Running 0 my-cluster-controller-5 1/1 Running 0 # ...
Copy to Clipboard Copied! 移行のステータスを確認します。
oc get kafka my-cluster -n my-project -w
oc get kafka my-cluster -n my-project -w
Copy to Clipboard Copied! メタデータ状態の更新
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration
Copy to Clipboard Copied! METADATA STATE
は、Kafka メタデータの管理と操作の調整に使用されるメカニズムを示します。移行の開始時点では、これはZooKeeper
です。-
ZooKeeper
は、メタデータが ZooKeeper にのみ保存されている場合の初期状態です。 -
KRaftMigration
は、移行が進行中の状態です。ZooKeeper から KRaft への移行を有効にするフラグ (zookeeper.metadata.migration.enable
) がブローカーに追加され、ブローカーがロールされてコントローラーに登録されます。この時点では、クラスター内のトピックとパーティションの数に応じて移行に時間がかかる場合があります。 -
KRaftDualWriting
は、Kafka クラスターが KRaft クラスターとして動作している一方で、メタデータは Kafka と ZooKeeper の両方に保存されているときの状態です。ブローカーは、フラグを削除して移行を有効にするために 2 回目のロールが行われます。 -
KRaftPostMigration
は、ブローカーに対して KRaft モードが有効になっているときの状態です。メタデータは引き続き Kafka と ZooKeeper の両方に保存されます。
移行ステータスは、
Kafka
リソースのstatus.kafkaMetadataState
プロパティーでも表されます。警告この時点から、ZooKeeper の使用にロールバック できます。次のステップは、KRaft を有効にすることです。KRaft を有効にした後はロールバックを実行できません。
-
メタデータの状態が
KRaftPostMigration
に達したら、アノテーションstrimzi.io/kraft
をenabled
に設定して、Kafka
リソース設定で KRaft を有効にします。oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwrite
Copy to Clipboard Copied! KRaft 移行の有効化
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="enabled" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="enabled" # ...
Copy to Clipboard Copied! 完全な KRaft モードへの移行のステータスを確認します。
oc get kafka my-cluster -n my-project -w
oc get kafka my-cluster -n my-project -w
Copy to Clipboard Copied! メタデータ状態の更新
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration my-cluster ... PreKRaft my-cluster ... KRaft
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration my-cluster ... PreKRaft my-cluster ... KRaft
Copy to Clipboard Copied! -
PreKRaft
は、ZooKeeper 関連のリソースがすべて自動的に削除された状態です。 -
KRaft
は、KRaft の移行が完了した最終状態 (コントローラーのロール後) です。
注記ZooKeeper の
deleteClaim
の設定によっては、その永続ボリューム要求 (PVC) および永続ボリューム (PV) が削除されない場合があります。deleteClaim
は、クラスターのアンインストール時に PVC を削除するかどうかを指定します。デフォルトはfalse
です。-
ZooKeeper 関連の設定を
Kafka
リソースから削除します。以下の設定が存在する場合は削除できます。
-
log.message.format.version
-
inter.broker.protocol.version
spec.zookeeper.*
プロパティーlog.message.format.version
とinter.broker.protocol.version
を削除すると、ブローカーとコントローラーが再びロールします。ZooKeeper プロパティーを削除すると、KRaft で操作されるクラスターに存在する ZooKeeper 設定に関連する警告メッセージが削除されます。
-
移行時のロールバックの実行
Kafka
リソースで KRaft を有効にして移行が完了し、状態が KRaft
状態となる前に、次のようにロールバック操作を実行できます。
アノテーション
strimzi.io/kraft="rollback"
をKafka
リソースに適用して、ブローカーをロールバックします。oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwrite
Copy to Clipboard Copied! KRaft 移行のロールバック
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="rollback" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="rollback" # ...
Copy to Clipboard Copied! 上記のロールバックを行うには、移行プロセスが
KRaftPostMigration
状態である必要があります。ブローカーはロールバックされ、再び ZooKeeper に接続できるようになり、状態はKRaftDualWriting
に戻ります。コントローラーノードプールを削除します。
oc delete KafkaNodePool controller -n my-project
oc delete KafkaNodePool controller -n my-project
Copy to Clipboard Copied! アノテーション
strimzi.io/kraft="disabled"
をKafka
リソースに適用して、メタデータの状態をZooKeeper
に返します。oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwrite
Copy to Clipboard Copied! ZooKeeper の使用への切り替え
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="disabled" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="disabled" # ...
Copy to Clipboard Copied!
第9章 デプロイメントの設定
Streams for Apache Kafka カスタムリソースを使用して、Streams for Apache Kafka デプロイメントをニーズに正確に合わせて設定および管理します。Streams for Apache Kafka では、リリースごとにサンプルのカスタムリソースが用意されており、サポートされている Kafka コンポーネントのインスタンスを設定および作成できます。特定の要件に応じて追加機能を組み込むようにカスタムリソースを設定することで、デプロイメントを微調整します。設定の特定の領域、つまりメトリクス、ロギング、Kafka Connect コネクターの外部設定については、ConfigMap
リソースを使用することもできます。ConfigMap
リソースを使用して設定を組み込むことで、メンテナンスを一元化できます。設定プロバイダーを使用して外部ソースから設定をロードすることもできます。これは、Kafka Connect コネクター設定の認証情報を提供するために推奨されます。
カスタムリソースを使用して、次のコンポーネントのインスタンスを設定および作成します。
- Kafka クラスター
- Kafka Connect クラスター
- Kafka MirrorMaker
- Kafka Bridge
- Cruise Control
カスタムリソース設定を使用してインスタンスを管理したり、デプロイメントを変更して追加機能を導入したりすることもできます。これには、以下をサポートする設定が含まれる場合があります。
- ノードプールの指定
- Kafka ブローカーへのクライアントアクセスの保護
- クラスター外からの Kafka ブローカーへのアクセス
- トピックの作成
- ユーザー (クライアント) の作成
- フィーチャーゲートの制御
- ロギングの頻度変更
- リソースの制限および要求の割り当て
- Streams for Apache Kafka Drain Cleaner、Cruise Control、分散トレーシングなどの機能の導入
Streams for Apache Kafka カスタムリソース API リファレンス では、設定で使用できるプロパティーを説明しています。
カスタムリソースに適用されるラベルは、クラスターを設定する OpenShift リソースにも適用されます。そのため、必要に応じてリソースに簡単にラベルを付けることができます。
カスタムリソース設定ファイルへの変更の適用
spec
プロパティーを使用してカスタムリソースに設定を追加します。設定を追加した後、oc
を使用して変更をカスタムリソース設定ファイルに適用できます。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
9.1. サンプル設定ファイルの使用
追加のサポートされる設定を組み込むことで、デプロイメントをさらに強化します。サンプル設定ファイルは、Streams for Apache Kafka ソフトウェアダウンロードページ からダウンロード可能なリリースアーティファクトに付属しています。
サンプルファイルには、デフォルトでカスタムリソースの必須のプロパティーと値のみが含まれています。oc
コマンドラインツールを使用してサンプルをダウンロードおよび適用できます。これらの例は、デプロイメントに独自の Kafka コンポーネント設定を構築する際の開始点として使用できます。
Operator を使用して Streams for Apache Kafka をインストールした場合でも、サンプルファイルをダウンロードし、それらを使用して設定をアップロードできます。
リリースアーティファクトには、examples
ディレクトリーがあり、そこに設定例が含まれています。
Streams for Apache Kafka で提供される設定ファイルの例
examples ├── user ├── topic ├── security │ ├── tls-auth │ ├── scram-sha-512-auth │ └── keycloak-authorization ├── mirror-maker ├── metrics ├── kafka │ └── nodepools ├── cruise-control ├── connect └── bridge
examples
├── user
├── topic
├── security
│ ├── tls-auth
│ ├── scram-sha-512-auth
│ └── keycloak-authorization
├── mirror-maker
├── metrics
├── kafka
│ └── nodepools
├── cruise-control
├── connect
└── bridge
- 1
- User Operator によって管理される
KafkaUser
カスタムリソース設定。 - 2
- Topic Operator によって管理される
KafkaTopic
カスタムリソースの設定。 - 3
- Kafka コンポーネントの認証および認可設定。TLS および SCRAM-SHA-512 認証の設定例が含まれています。Red Hat Single Sign-On の例には、
Kafka
カスタムリソース設定および Red Hat Single Sign-On レルム仕様が含まれています。この例を使用して、Red Hat Single Sign-On の認可サービスを試すことができます。また、oauth
認証とkeyloack
認可メトリクスを有効にした例もあります。 - 4
- Mirror Maker のデプロイメント用の
Kafka
カスタムリソース設定。レプリケーションポリシーおよび同期頻度の設定例が含まれます。 - 5
- Prometheus インストールおよび Grafana ダッシュボードファイルが含まれる メトリック設定。
- 6
- Kafka のデプロイメント用の
Kafka
カスタムリソース設定。一時的または永続的なシングルまたはマルチノードデプロイメントの設定例が含まれています。 - 7
- Kafka クラスター内の Kafka ノードの
KafkaNodePool
設定。KRaft (Kafka Raft メタデータ) モードまたは ZooKeeper を使用するクラスター内のノードの設定例が含まれています。 - 8
- Cruise Control のデプロイ設定を含む
Kafka
カスタムリソース。デフォルトまたはユーザー最適化ゴールを使用する設定の例とともに、Cruise Control から最適化プロポーザルを生成するためのKafkaRebalance
カスタムリソースが含まれます。 - 9
- Kafka Connect をデプロイするための
KafkaConnect
およびKafkaConnector
カスタムリソース設定。シングルまたはマルチノードデプロイメントの設定例が含まれています。 - 10
- Kafka Bridge をデプロイするための
KafkaBridge
カスタムリソース設定。
9.2. Kafka の設定
Kafka
カスタムリソースの spec
プロパティーを更新して、Kafka デプロイメントを設定します。
Kafka の設定に加えて、ZooKeeper と Streams for Apache Kafka Operator の設定を追加できます。ロギングやヘルスチェックなどの一般的な設定プロパティーは、コンポーネントごとに独立して設定されます。
特に重要な設定オプションには次のものがあります。
- リソース要求 (CPU/メモリー)
- 最大および最小メモリー割り当ての JVM オプション
- クライアントを Kafka ブローカーに接続するためのリスナー (およびクライアントの認証)
- 認証
- ストレージ
- ラックアウェアネス
- メトリック
- Cruise Control によるクラスターのリバランス
- KRaft ベースの Kafka クラスターのメタデータバージョン
- ZooKeeper ベースの Kafka クラスターのブローカー間プロトコルバージョン
config
の .spec.kafka.metadataVersion
プロパティーまたは inter.broker.protocol.version
プロパティーは、指定された Kafka バージョン (spec.kafka.version
) でサポートされるバージョンにする必要があります。このプロパティーは、Kafka クラスターで使用される Kafka メタデータまたはブローカー間プロトコルのバージョンを表します。これらのプロパティーのいずれかが設定で設定されていない場合、Cluster Operator はバージョンを、使用されている Kafka バージョンのデフォルトに更新します。
サポートされている最も古いメタデータのバージョンは 3.3 です。Kafka バージョンより古いメタデータバージョンを使用すると、一部の機能が無効になる可能性があります。
Kafka クラスターの設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
TLS 証明書の管理
Kafka をデプロイする場合、Cluster Operator は自動で TLS 証明書の設定および更新を行い、クラスター内での暗号化および認証を有効にします。必要な場合は、更新期間の開始前にクラスターおよびクライアント CA 証明書を手動で更新できます。クラスターおよびクライアント CA 証明書によって使用される鍵を置き換えることもできます。詳細は、CA 証明書の手動更新 および 秘密鍵の置換 を参照してください。
Kafka
カスタムリソース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 version: 3.7.0 logging: type: inline loggers: kafka.root.logger.level: INFO resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12" readinessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 jvmOptions: -Xms: 8192m -Xmx: 8192m image: my-org/my-image:latest listeners: - name: plain port: 9092 type: internal tls: false configuration: useServiceDnsDomain: true - name: tls port: 9093 type: internal tls: true authentication: type: tls - name: external1 port: 9094 type: route tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-certificate.crt key: my-key.key authorization: type: simple config: auto.create.topics.enable: "false" offsets.topic.replication.factor: 3 transaction.state.log.replication.factor: 3 transaction.state.log.min.isr: 2 default.replication.factor: 3 min.insync.replicas: 2 inter.broker.protocol.version: "3.7" storage: type: persistent-claim size: 10000Gi rack: topologyKey: topology.kubernetes.io/zone metricsConfig: type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: my-config-map key: my-key # ... zookeeper: replicas: 3 logging: type: inline loggers: zookeeper.root.logger: INFO resources: requests: memory: 8Gi cpu: "2" limits: memory: 8Gi cpu: "2" jvmOptions: -Xms: 4096m -Xmx: 4096m storage: type: persistent-claim size: 1000Gi metricsConfig: # ... entityOperator: tlsSidecar: resources: requests: cpu: 200m memory: 64Mi limits: cpu: 500m memory: 128Mi topicOperator: watchedNamespace: my-topic-namespace reconciliationIntervalSeconds: 60 logging: type: inline loggers: rootLogger.level: INFO resources: requests: memory: 512Mi cpu: "1" limits: memory: 512Mi cpu: "1" userOperator: watchedNamespace: my-topic-namespace reconciliationIntervalSeconds: 60 logging: type: inline loggers: rootLogger.level: INFO resources: requests: memory: 512Mi cpu: "1" limits: memory: 512Mi cpu: "1" kafkaExporter: # ... cruiseControl: # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
replicas: 3
version: 3.7.0
logging:
type: inline
loggers:
kafka.root.logger.level: INFO
resources:
requests:
memory: 64Gi
cpu: "8"
limits:
memory: 64Gi
cpu: "12"
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
jvmOptions:
-Xms: 8192m
-Xmx: 8192m
image: my-org/my-image:latest
listeners:
- name: plain
port: 9092
type: internal
tls: false
configuration:
useServiceDnsDomain: true
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external1
port: 9094
type: route
tls: true
configuration:
brokerCertChainAndKey:
secretName: my-secret
certificate: my-certificate.crt
key: my-key.key
authorization:
type: simple
config:
auto.create.topics.enable: "false"
offsets.topic.replication.factor: 3
transaction.state.log.replication.factor: 3
transaction.state.log.min.isr: 2
default.replication.factor: 3
min.insync.replicas: 2
inter.broker.protocol.version: "3.7"
storage:
type: persistent-claim
size: 10000Gi
rack:
topologyKey: topology.kubernetes.io/zone
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
# ...
zookeeper:
replicas: 3
logging:
type: inline
loggers:
zookeeper.root.logger: INFO
resources:
requests:
memory: 8Gi
cpu: "2"
limits:
memory: 8Gi
cpu: "2"
jvmOptions:
-Xms: 4096m
-Xmx: 4096m
storage:
type: persistent-claim
size: 1000Gi
metricsConfig:
# ...
entityOperator:
tlsSidecar:
resources:
requests:
cpu: 200m
memory: 64Mi
limits:
cpu: 500m
memory: 128Mi
topicOperator:
watchedNamespace: my-topic-namespace
reconciliationIntervalSeconds: 60
logging:
type: inline
loggers:
rootLogger.level: INFO
resources:
requests:
memory: 512Mi
cpu: "1"
limits:
memory: 512Mi
cpu: "1"
userOperator:
watchedNamespace: my-topic-namespace
reconciliationIntervalSeconds: 60
logging:
type: inline
loggers:
rootLogger.level: INFO
resources:
requests:
memory: 512Mi
cpu: "1"
limits:
memory: 512Mi
cpu: "1"
kafkaExporter:
# ...
cruiseControl:
# ...
- 1
- レプリカノードの数。
- 2
- Kafka バージョン。アップグレード手順に従うと、サポート対象のバージョンに変更できます。
- 3
- ConfigMap を介して直接 (
inline
) または間接 (external
) に追加された Kafka ロガーとログレベル。カスタム Log4j 設定は、ConfigMap のlog4j.properties
キーの下に配置する必要があります。Kafkakafka.root.logger.level
ロガーでは、ログレベルを INFO、ERROR、WARN、TRACE、DEBUG、FATAL または OFF に設定できます。 - 4
- 現在
cpu
およびmemory
である、サポートされるリソースの予約を要求し、消費可能な最大リソースを指定を制限します。 - 5
- コンテナーを再起動するタイミング (liveness) およびコンテナーがトラフィックを許可できるタイミング (readiness) を把握するためのヘルスチェック。
- 6
- Kafka を実行している仮想マシン (VM) のパフォーマンスを最適化するための JVM 設定オプション。
- 7
- 高度なオプション: コンテナーイメージの設定。特別な状況でのみ推奨されます。
- 8
- リスナーは、ブートストラップアドレスでクライアントが Kafka クラスターに接続する方法を設定します。リスナーは、OpenShift クラスター内部または外部からの接続の 内部 または 外部 リスナーとして設定されます。
- 9
- リスナーを識別するための名前。Kafka クラスター内で一意である必要があります。
- 10
- Kafka 内でリスナーによって使用されるポート番号。ポート番号は指定の Kafka クラスター内で一意である必要があります。許可されるポート番号は 9092 以上ですが、すでに Prometheus および JMX によって使用されているポート 9404 および 9999 以外になります。リスナーのタイプによっては、ポート番号は Kafka クライアントに接続するポート番号と同じではない場合があります。
- 11
- リスナーのタイプは、
internal
またはcluster-ip
(ブローカーごとのClusterIP
サービスを使用して Kafka を公開するため) として指定されるか、外部リスナーの場合は、route
(OpenShift のみ)、loadbalancer
、nodeport
またはingress
(Kubernetes のみ) として指定されます。 - 12
- 各リスナーの TLS 暗号化を有効または無効にします。
route
およびIngress
タイプのリスナーの場合、TLS 暗号化を常にtrue
に設定して有効にする必要があります。 - 13
- クラスターサービス接尾辞 (通常は
cluster.local
) を含む完全修飾 DNS 名が割り当てられているかどうかを定義します。 - 14
- mTLS、SCRAM-SHA-512、またはトークンベースの OAuth 2.0 として指定されるリスナー認証メカニズム。
- 15
- 外部リスナー設定は、
route
、loadbalancer
、またはnodeport
からなど、Kafka クラスターが外部の OpenShift に公開される方法を指定します。 - 16
- 外部 CA (認証局) によって管理される Kafka リスナー証明書のオプションの設定。
brokerCertChainAndKey
は、サーバー証明書および秘密鍵が含まれるSecret
を指定します。TLS による暗号化が有効な任意のリスナーで Kafka リスナー証明書を設定できます。 - 17
- 認可は Kafka ブローカーで簡易、OAUTH2.0、または OPA 認可を有効化します。簡易認可では、
AclAuthorizer
およびStandardAuthorizer
Kafka プラグインが使用されます。 - 18
- ブローカー設定。Streams for Apache Kafka によって直接管理されないプロパティーに限り、標準の Apache Kafka 設定を指定できます。
- 19
- 永続ボリュームのストレージサイズは拡張可能で、さらに JBOD ストレージへのボリューム追加が可能です。
- 20
- 永続ストレージには、動的ボリュームプロビジョニングのためのストレージ
id
やclass
など、追加の設定オプションがあります。 - 21
- 異なるラック、データセンター、またはアベイラビリティーゾーンにレプリカを分散させるためのラックアウェアネス設定。
topologyKey
は、ラック ID を含むノードラベルと一致する必要があります。この設定で使用される例では、標準のtopology.kubernetes.io/zone
ラベルを使用するゾーンを指定します。 - 22
- Prometheus メトリックが有効になりました。この例では、メトリクスは Prometheus JMX Exporter (デフォルトのメトリクスエクスポーター) に対して設定されます。
- 23
- Prometheus JMX Exporter 経由で Prometheus 形式のメトリクスを Grafana ダッシュボードにエクスポートするルール。Prometheus JMX Exporter の設定が含まれる ConfigMap を参照することで有効になります。
metricsConfig.valueFrom.configMapKeyRef.key
配下に空のファイルが含まれる ConfigMap の参照を使用して、追加設定なしでメトリックを有効にできます。 - 24
- Kafka 設定と似たプロパティーが含まれる、ZooKeeper 固有の設定。
- 25
- ZooKeeper ノードの数。通常、ZooKeeper クラスターまたはアンサンブルは、一般的に 3、5、7 個の奇数個のノードで実行されます。効果的なクォーラムを維持するには、過半数のノードが利用可能である必要があります。ZooKeeper クラスターでクォーラムを失うと、クライアントへの応答が停止し、Kafka ブローカーが機能しなくなります。Streams for Apache Kafka では、ZooKeeper クラスターの安定性および高可用性が重要です。
- 26
- ZooKeeper ロガーとログレベル。
- 27
- Topic Operator および User Operator の設定を指定する Entity Operator 設定。
- 28
- Entity Operator の TLS サイドカー設定。Entity Operator は、ZooKeeper とのセキュアな通信に TLS サイドカーを使用します。
- 29
- 指定された Topic Operator ロガーおよびログレベル。この例では、
inline
ロギングを使用します。 - 30
- 指定された User Operator ロガーおよびログレベル。
- 31
- Kafka Exporter の設定。Kafka Exporter は、Kafka ブローカーからメトリックデータ、特にコンシューマーラグデータを抽出するためのオプションのコンポーネントです。Kafka Exporter が適切に機能できるようにするには、コンシューマーグループを使用する必要があります。
- 32
- Kafka クラスターの再バランスに使用される Cruise Control のオプションの設定。
9.2.1. Kafka Static Quota プラグインを使用したブローカーへの制限の設定
Kafka Static Quota プラグインを使用して、Kafka クラスターのブローカーにスループットおよびストレージの制限を設定します。Kafka
リソースを設定して、プラグインを有効にし、制限を設定します。バイトレートのしきい値およびストレージクォータを設定して、ブローカーと対話するクライアントに制限を設けることができます。
プロデューサーおよびコンシューマー帯域幅にバイトレートのしきい値を設定できます。制限の合計は、ブローカーにアクセスするすべてのクライアントに分散されます。たとえば、バイトレートのしきい値として 40 MBps ををプロデューサーに設定できます。2 つのプロデューサーが実行されている場合、それぞれのスループットは 20MBps に制限されます。
ストレージクォータは、Kafka ディスクストレージの制限をソフト制限とハード制限間で調整します。この制限は、利用可能なすべてのディスク容量に適用されます。プロデューサーは、ソフト制限とハード制限の間で徐々に遅くなります。制限により、ディスクの使用量が急激に増加しないようにし、容量を超えないようにします。ディスクがいっぱいになると、修正が難しい問題が発生する可能性があります。ハード制限は、ストレージの上限です。
JBOD ストレージの場合、制限はすべてのディスクに適用されます。ブローカーが 2 つの 1 TB ディスクを使用し、クォータが 1.1 TB の場合は、1 つのディスクにいっぱいになり、別のディスクがほぼ空になることがあります。
前提条件
- Kafka クラスターを管理する Cluster Operator が稼働している。
手順
Kafka
リソースのconfig
にプラグインのプロパティーを追加します。プラグインプロパティーは、この設定例のとおりです。
Kafka Static Quota プラグインの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... config: client.quota.callback.class: io.strimzi.kafka.quotas.StaticQuotaCallback client.quota.callback.static.produce: 1000000 client.quota.callback.static.fetch: 1000000 client.quota.callback.static.storage.soft: 400000000000 client.quota.callback.static.storage.hard: 500000000000 client.quota.callback.static.storage.check-interval: 5
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... config: client.quota.callback.class: io.strimzi.kafka.quotas.StaticQuotaCallback
1 client.quota.callback.static.produce: 1000000
2 client.quota.callback.static.fetch: 1000000
3 client.quota.callback.static.storage.soft: 400000000000
4 client.quota.callback.static.storage.hard: 500000000000
5 client.quota.callback.static.storage.check-interval: 5
6 Copy to Clipboard Copied! リソースを更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
9.2.2. ZooKeeper のデフォルト設定値
Streams for Apache Kafka を使用して ZooKeeper をデプロイする場合、Streams for Apache Kafka によって設定されるデフォルト設定の一部が、標準の ZooKeeper のデフォルト設定と異なります。これは、Streams for Apache Kafka が、OpenShift 環境内で ZooKeeper を実行するために最適化された値を使用して、多数の ZooKeeper プロパティーを設定するためです。
Streams for Apache Kafka の主要な ZooKeeper プロパティーのデフォルト設定は次のとおりです。
プロパティー | デフォルト値 | 説明 |
---|---|---|
| 2000 | 1 ティックの長さ (ミリ秒単位)。これによってセッションタイムアウトの長さが決まります。 |
| 5 | ZooKeeper クラスター内で、フォロワーがリーダーに遅れることを許可される最大ティック数。 |
| 2 | ZooKeeper クラスター内でフォロワーがリーダーと同期していなくても許容される最大ティック数。 |
| 1 |
|
| false | ZooKeeper 管理サーバーを無効にするフラグ。管理サーバーは、Streams for Apache Kafka では使用されません。 |
Kafka
カスタムリソースの Zookeeper.config
としてこれらのデフォルト値を変更すると、ZooKeeper クラスターの動作とパフォーマンスに影響を与える可能性があります。
9.2.3. アノテーションを使用した Kafka ノードの削除
この手順では、OpenShift アノテーションを使用して既存の Kafka ノードを削除する方法を説明します。Kafka ノードの削除するには、Kafka ブローカーが稼働している Pod
と、関連する PersistentVolumeClaim
の両方を削除します (クラスターが永続ストレージでデプロイされた場合)。削除後、Pod
と関連する PersistentVolumeClaim
が自動的に再作成されます。
PersistentVolumeClaim
を削除すると、永久的なデータ損失が発生する可能性があり、クラスターの可用性は保証できません。以下の手順は、ストレージで問題が発生した場合にのみ実行してください。
前提条件
- 稼働中の Cluster Operator
手順
削除する
Pod
の名前を見つけます。Kafka ブローカー Pod の名前は
<cluster_name>-kafka-<index_number>
です。ここで、<index_number>
は 0 から始まり、レプリカの合計数から 1 を引いた値で終わります。例:my-cluster-kafka-0
oc annotate
を使用して、OpenShift でPod
リソースにアノテーションを付けます。oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/delete-pod-and-pvc="true"
oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/delete-pod-and-pvc="true"
Copy to Clipboard Copied! - 基盤となる永続ボリューム要求 (Persistent Volume Claim) でアノテーションが付けられた Pod が削除され、再作成されるときに、次の調整の実行を待ちます。
9.2.4. アノテーションを使用した ZooKeeper ノードの削除
この手順では、OpenShift アノテーションを使用して既存の ZooKeeper ノードを削除する方法を説明します。ZooKeeper ノードを削除するには、ZooKeeper が稼働している Pod
と、関連する PersistentVolumeClaim
の両方を削除します (クラスターが永続ストレージでデプロイされた場合)。削除後、Pod
と関連する PersistentVolumeClaim
が自動的に再作成されます。
PersistentVolumeClaim
を削除すると、永久的なデータ損失が発生する可能性があり、クラスターの可用性は保証できません。以下の手順は、ストレージで問題が発生した場合にのみ実行してください。
前提条件
- 稼働中の Cluster Operator
手順
削除する
Pod
の名前を見つけます。ZooKeeper Pod の名前は
<cluster_name>-zookeeper-<index_number>
です。ここで、<index_number>
は 0 から始まり、レプリカの合計数から 1 を引いた値で終わります。例:my-cluster-zookeeper-0
oc annotate
を使用して、OpenShift でPod
リソースにアノテーションを付けます。oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/delete-pod-and-pvc="true"
oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/delete-pod-and-pvc="true"
Copy to Clipboard Copied! - 基盤となる永続ボリューム要求 (Persistent Volume Claim) でアノテーションが付けられた Pod が削除され、再作成されるときに、次の調整の実行を待ちます。
9.3. ノードプールの設定
KafkaNodePool
カスタムリソースの spec
プロパティーを更新して、ノードプールデプロイメントを設定します。
ノードプールは、Kafka クラスター内の Kafka ノードの個別のグループを指します。各プールには独自の固有の設定があり、これにはレプリカの数、ロール、ストレージ割り当ての必須設定が含まれます。
オプションで、次のプロパティーの値を指定することもできます。
-
メモリーと CPU のリクエストと制限を指定する
resources
-
Pod およびその他の OpenShift リソースのカスタム設定を指定する
template
-
jvmOptions :
ヒープサイズ、ランタイム、その他のオプションのカスタム JVM 設定を指定します。
Kafka
リソースは、Kafka クラスター内のすべてのノードの設定を表します。KafkaNodePool
リソースは、ノードプール内のノードのみの設定を表します。設定プロパティーが KafkaNodePool
で指定されていない場合は、Kafka
リソースから継承されます。両方のリソースで設定されている場合は、KafkaNodePool
リソースで指定された設定が優先されます。たとえば、ノードプールと Kafka 設定の両方に jvmOptions
が含まれている場合、ノードプール設定で指定された値が使用されます。-Xmx: 1024m
が KafkaNodePool.spec.jvmOptions
に設定され、-Xms: 512m
が Kafka.spec.kafka.jvmOptions
に設定されている場合、ノードはノードプール設定の値を使用します。
Kafka
と KafkaNodePool
スキーマのプロパティーは組みわせることができません。明確にするために、KafkaNodePool.spec.template
に podSet.metadata.labels
のみが含まれており、Kafka.spec.kafka.template
に podSet.metadata.annotations
および pod.metadata.labels
が含まれている場合、ノードプール設定内のテンプレート値があるため、Kafka 設定のテンプレート値は無視されます。
ノードプールの設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
KRaft モードを使用したクラスター内のノードプールの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: kraft-dual-role labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: kraft-dual-role
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- controller
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
resources:
requests:
memory: 64Gi
cpu: "8"
limits:
memory: 64Gi
cpu: "12"
Kafka
リソースの設定は、KRaft モードに適している必要があります。現在、KRaft モードには 多くの制限 があります。
ZooKeeper を使用したクラスター内のノードプールの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-a
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
resources:
requests:
memory: 64Gi
cpu: "8"
limits:
memory: 64Gi
cpu: "12"
- 1
- ノードプール内のノードのロール。ZooKeeper で Kafka を使用する場合にのみ
broker
でありえます。
9.3.1. スケーリング操作のためのノードプールへの ID の割り当て
この手順では、ノードプールでスケーリング操作を実行するときに、Cluster Operator による高度なノード ID 処理にアノテーションを使用する方法について説明します。Cluster Operator が順番に次の ID を使用するのではなく、使用するノード ID を指定します。この方法でノード ID を管理すると、より詳細な制御が可能になります。
ID の範囲を追加するには、以下のアノテーションを KafkaNodePool
リソースに割り当てます。
-
新しいブローカーに使用される ID の範囲を追加する
strimzi.io/next-node-ids
-
既存のブローカーを削除するための ID の範囲を追加する
strimzi.io/remove-node-ids
個別のノード ID、ID 範囲、または両方の組み合わせを指定できます。たとえば、Kafka ノードプールをスケールアップするために [0, 1, 2, 10-20, 30]
の ID の範囲を指定できます。この形式では、個々のノード ID (0
、1
、2
、30
) の組み合わせと ID の範囲 (10-20
) を指定できます。
一般的なシナリオでは、スケールアップする場合は ID の範囲を指定し、スケールダウンする場合は特定のノードを削除する場合は単一のノード ID を指定します。
この手順では、次のようにスケーリングアノテーションをノードプールに追加します。
-
pool-a
にはスケールアップ用の ID 範囲が割り当てられます -
pool-b
には、スケールダウン用の ID 範囲が割り当てられます
スケーリング操作中、ID は次のように使用されます。
- スケールアップでは、新しいノードの範囲内で使用可能な最小の ID が選択されます。
- スケールダウンすると、範囲内で使用可能な最大の ID を持つノードが削除されます。
ノードプールに割り当てられたノード ID のシーケンスにギャップがある場合、次に追加されるノードにはギャップを埋める ID が割り当てられます。
アノテーションは、スケーリング操作のたびに更新する必要はありません。未使用の ID は、次のスケーリングイベントでも引き続き有効です。
Cluster Operator を使用すると、ID の範囲を昇順または降順で指定できるため、ノードがスケーリングされる順序で ID を定義できます。たとえば、スケールアップする場合、[1000-1999]
などの範囲を指定すると、次に低い ID (1000
、1001
、1002
、1003
など) が新しいノードに割り当てられます。逆に、スケールダウンする場合は、[1999-1000]
などの範囲を指定して、次に高い ID (1003
、1002
、1001
、1000
など) を持つノードが削除されるようにすることができます。
アノテーションを使用して ID 範囲を指定しない場合、Cluster Operator はスケーリング操作中に ID を処理するデフォルトの動作に従います。ノード ID は 0 (ゼロ) から始まり、Kafka クラスター全体で順番に実行されます。次に小さい ID が新しいノードに割り当てられます。ノード ID とのギャップはクラスター全体で埋められます。これは、ノードプール内で順番に実行できない可能性があることを意味します。スケールアップのデフォルトの動作では、クラスター全体で次に小さい使用可能なノード ID を追加します。スケールダウンの場合は、ノードプール内の使用可能なノード ID が最も大きいノードを削除します。デフォルトのアプローチは、割り当てられた ID 範囲の形式が間違っている場合、スケールアップ範囲で ID が不足する場合、またはスケールダウン範囲が使用中のノードに適用されない場合にも適用されます。
前提条件
- Cluster Operator がデプロイされている。
-
(オプション)
reserved.broker-max.id
設定プロパティーを使用して、ノードプール内のノード ID の許容範囲を拡張します。
デフォルトでは、Apache Kafka はノード ID を 0 ~ 999 の範囲の数値に制限します。999 より大きいノード ID 値を使用するには、reserved.broker-max.id
設定プロパティーを Kafka
カスタムリソースに追加し、必要な最大ノード ID 値を指定します。
この例では、最大ノード ID は 10000 に設定されます。その後、ノード ID をその値に割り当てることができます。
最大ノード ID 番号の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: config: reserved.broker.max.id: 10000 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
config:
reserved.broker.max.id: 10000
# ...
手順
次の例に示すように、スケールアップまたはスケールダウン時に使用する ID でノードプールにアノテーションを付けます。
スケールアップ用の ID は、ノードプール
pool-a
に割り当てられます。スケールアップ用の ID の割り当て
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"
Copy to Clipboard Copied! ノードを
pool-a
に追加するときに、この範囲内で使用可能な最小の ID が使用されます。スケールダウン用の ID はノードプール
pool-b
に割り当てられます。スケールダウン用の ID の割り当て
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"
Copy to Clipboard Copied! pool-b
をスケールダウンすると、この範囲内で使用可能な最大の ID が削除されます。注記特定のノードを削除する場合は、単一のノード ID をスケールダウンアノテーションに割り当てることができます (
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[3]"
)。ノードプールをスケーリングできるようになりました。
詳細は、以下を参照してください。
調整時に、アノテーションの形式が間違っている場合は警告が表示されます。
スケーリング操作の実行後に、アノテーションが不要になった場合は削除できます。
スケールアップ用のアノテーションの削除
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids-
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids-
Copy to Clipboard Copied! スケールダウン用のアノテーションの削除
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids-
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids-
Copy to Clipboard Copied!
9.3.2. ノードプールからノードを移動する場合のラックに与える影響
Kafka クラスターでラック認識が有効になっている場合、レプリカを異なるラック、データセンター、またはアベイラビリティーゾーンに分散できます。ノードプールからノードを移動する場合、特にラック認識に関して、クラスタートポロジーへの影響を考慮してください。特定の Pod をノードプールから削除すると (特に順序どおりに削除しない場合)、クラスタートポロジーが壊れたり、ラック間の分散に不均衡が生じたりする可能性があります。不均衡が発生すると、ノード自体の分散とクラスター内のパーティションレプリカの両方に影響を与える可能性があります。ラック間でのノードとパーティションで分散が不均一になると、Kafka クラスターのパフォーマンスと回復力に影響を与える可能性があります。
ラック全体で必要なバランスと復元力を維持するために、ノードの削除を戦略的に計画します。特定の ID を持つノードを慎重に移動するには、strimzi.io/remove-node-ids
アノテーションを使用します。パーティションのレプリカをラック全体に分散して、クライアントが最も近隣にあるレプリカから消費できるように、設定が壊れていなことを確認します。
RackAwareGoal
で Cruise Control と KafkaRebalance
リソースを使用して、レプリカが異なるラックに分散していることを確認します。
9.3.3. ノードプールへのノードの追加
この手順では、ノードプールをスケールアップして新しいノードを追加する方法について説明します。現在スケールアップが可能なのは、専用ブローカーとして実行されるノードを含む、ブローカー専用ノードプールのみです。
この手順では、ノードプール pool-a
の 3 つのノードから始めます。
ノードプール内の Kafka ノード
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
ノード ID は、作成時にノードの名前に追加されます。ノード ID が 3
であるノード my-cluster-pool-a-3
を追加します。
このプロセス中に、パーティションのレプリカを保持するノードの ID が変更されます。ノード ID を参照する依存関係を考慮してください。
前提条件
- Cluster Operator がデプロイされている。
- Cruise Control は Kafka とともにデプロイされている。
(オプション) スケールアップ操作の場合、操作で使用するノード ID を指定できます。
操作にノード ID の範囲を割り当てた場合、追加されるノードの ID は、指定されたノードの順序によって決まります。単一のノード ID を割り当てた場合は、指定した ID でノードが追加されます。それ以外の場合は、クラスター全体で使用可能な最小のノード ID が使用されます。
手順
ノードプールに新しいノードを作成します。
たとえば、ノードプール
pool-a
には 3 つのレプリカがあります。レプリカの数を増やしてノードを追加します。oc scale kafkanodepool pool-a --replicas=4
oc scale kafkanodepool pool-a --replicas=4
Copy to Clipboard Copied! デプロイメントのステータスを確認し、ノードプール内の Pod が作成されて準備完了 (
1/1
) となるまで待ちます。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! 出力には、ノードプール内の 4 つの Kafka ノードが表示されます
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-a-3 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-a-3 1/1 Running 0
Copy to Clipboard Copied! ノードプール内のノードの数を増やした後、パーティションを再割り当てします。
ノードプールをスケールアップした後、Cruise Control の
add-brokers
モードを使用して、パーティションレプリカを既存のブローカーから新しく追加したブローカーに移動します。Cruise Control を使用したパーティションレプリカの再割り当て
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: add-brokers brokers: [3]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: add-brokers brokers: [3]
Copy to Clipboard Copied! パーティションをノード
my-cluster-pool-a-3
に再割り当てしています。クラスター内のトピックとパーティションの数によっては、再割り当てに時間がかかる場合があります。
9.3.4. ノードプールからのノードの削除
この手順では、ノードプールをスケールダウンしてノードを削除する方法について説明します。現在スケールダウンが可能なのは、専用ブローカーとして実行されるノードを含む、ブローカー専用ノードプールのみです。
この手順では、ノードプール pool-a
の 4 つのノードから開始します。
ノードプール内の Kafka ノード
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-a-3 1/1 Running 0
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
my-cluster-pool-a-3 1/1 Running 0
ノード ID は、作成時にノードの名前に追加されます。ノード ID が 3
であるノード my-cluster-pool-a-3
を削除します。
このプロセス中に、パーティションのレプリカを保持するノードの ID が変更されます。ノード ID を参照する依存関係を考慮してください。
前提条件
- Cluster Operator がデプロイされている。
- Cruise Control は Kafka とともにデプロイされている。
(オプション) スケールダウン操作の場合、操作で使用するノード ID を指定できます。
操作にノード ID の範囲を割り当てた場合、削除されるノードの ID は、指定されたノードの順序によって決まります。単一のノード ID を割り当てた場合は、指定の ID が割り当てられたノードが削除されます。それ以外の場合は、ノードプール内で使用可能な ID が最も大きいノードが削除されます。
手順
ノードプール内のノードの数を減らす前に、パーティションを再割り当てします。
ノードプールをスケールダウンする前に、Cruise Control の
remove-brokers
モードを使用して、削除するブローカーからパーティションレプリカを移動します。Cruise Control を使用したパーティションレプリカの再割り当て
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [3]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [3]
Copy to Clipboard Copied! ノード
my-cluster-pool-a-3
からパーティションを再割り当てしています。クラスター内のトピックとパーティションの数によっては、再割り当てに時間がかかる場合があります。再割り当てプロセスが完了し、削除されるノードにライブパーティションがなくなったら、ノードプール内の Kafka ノードの数を減らします。
たとえば、ノードプール
pool-b
には 4 つのレプリカがあります。レプリカの数を減らしてノードを削除します。oc scale kafkanodepool pool-a --replicas=3
oc scale kafkanodepool pool-a --replicas=3
Copy to Clipboard Copied! 出力には、ノードプール内の 3 つの Kafka ノードが表示されます
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-0 1/1 Running 0 my-cluster-pool-b-kafka-1 1/1 Running 0 my-cluster-pool-b-kafka-2 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-0 1/1 Running 0 my-cluster-pool-b-kafka-1 1/1 Running 0 my-cluster-pool-b-kafka-2 1/1 Running 0
Copy to Clipboard Copied!
9.3.5. ノードプール間でのノードの移動
この手順では、ダウンタイムなしでソース Kafka ノードプールとターゲット Kafka ノードプール間でノードを移動する方法について説明します。ターゲットノードプールに新しいノードを作成し、パーティションを再割り当てして、ソースノードプールの古いノードからデータを移動します。新しいノード上のレプリカが同期している場合、古いノードを削除できます。
この手順では、2 つのノードプールから始めます。
-
3 つのレプリカを持つ
pool-a
がターゲットノードプールです -
4 つのレプリカを持つ
pool-b
がソースノードプールです
pool-a
をスケールアップし、パーティションを再割り当てして pool-b
をスケールダウンします。その結果、次のようになります。
-
4 つのレプリカを持つ
pool-a
-
3 つのレプリカを持つ
pool-b
このプロセス中に、パーティションのレプリカを保持するノードの ID が変更されます。ノード ID を参照する依存関係を考慮してください。
前提条件
- Cluster Operator がデプロイされている。
- Cruise Control は Kafka とともにデプロイされている。
(オプション) スケールアップおよびスケールダウン操作の場合は、使用するノード ID の範囲を指定できます。
操作にノード ID を割り当てた場合、追加または削除されるノードの ID は、指定されたノードの順序によって決まります。それ以外の場合は、ノードを追加するときにクラスター全体で使用可能な最小のノード ID が使用されます。そして、ノードプール内で使用可能な ID が最も大きいノードが削除されます。
手順
ターゲットノードプールに新しいノードを作成します。
たとえば、ノードプール
pool-a
には 3 つのレプリカがあります。レプリカの数を増やしてノードを追加します。oc scale kafkanodepool pool-a --replicas=4
oc scale kafkanodepool pool-a --replicas=4
Copy to Clipboard Copied! デプロイメントのステータスを確認し、ノードプール内の Pod が作成されて準備完了 (
1/1
) となるまで待ちます。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! 出力には、ソースノードプールとターゲットノードプール内の 4 つの Kafka ノードが表示されます
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-4 1/1 Running 0 my-cluster-pool-a-7 1/1 Running 0 my-cluster-pool-b-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0 my-cluster-pool-b-6 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-4 1/1 Running 0 my-cluster-pool-a-7 1/1 Running 0 my-cluster-pool-b-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0 my-cluster-pool-b-6 1/1 Running 0
Copy to Clipboard Copied! ノード ID は、作成時にノードの名前に追加されます。ノード ID が
7
であるノードmy-cluster-pool-a-7
を追加します。パーティションを古いノードから新しいノードに再割り当てします。
ソースノードプールをスケールダウンする前に、Cruise Control の
remove-broker
モードを使用して、削除するブローカーからパーティションレプリカを移動します。Cruise Control を使用したパーティションレプリカの再割り当て
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [6]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [6]
Copy to Clipboard Copied! ノード
my-cluster-pool-b-6
からパーティションを再割り当てしています。クラスター内のトピックとパーティションの数によっては、再割り当てに時間がかかる場合があります。再割り当てプロセスが完了したら、ソースノードプール内の Kafka ノードの数を減らします。
たとえば、ノードプール
pool-b
には 4 つのレプリカがあります。レプリカの数を減らしてノードを削除します。oc scale kafkanodepool pool-b --replicas=3
oc scale kafkanodepool pool-b --replicas=3
Copy to Clipboard Copied! プール内で最も数値の大きい ID (
6
) を持つノードが削除されます。出力には、ソースノードプール内の 3 つの Kafka ノードが表示されます
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-2 1/1 Running 0 my-cluster-pool-b-kafka-3 1/1 Running 0 my-cluster-pool-b-kafka-5 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-2 1/1 Running 0 my-cluster-pool-b-kafka-3 1/1 Running 0 my-cluster-pool-b-kafka-5 1/1 Running 0
Copy to Clipboard Copied!
9.3.6. ノードプールのロールの変更
ノードプールは、KRaft モード (Kafka Raft メタデータを使用) で動作する Kafka クラスターで使用することも、メタデータ管理に ZooKeeper を使用する Kafka クラスターで使用することもできます。KRaft モードを使用している場合は、ノードプール内のすべてのノードがブローカー、コントローラー、またはその両方として動作するようにロールを指定できます。ZooKeeper を使用している場合は、ノードをブローカーのみとして設定する必要があります。
状況により、ノードプールに割り当てられたロールを変更することが必要な場合があります。たとえば、broker と controller の二重のロールを実行するノードを含むノードプールがあり、それらのロールを 2 つのノードプール間で分割すると決定したとします。この場合、ブローカーとしてのみ機能するノードを含む新しいノードプールを作成し、二重のロールを持つノードから新しいブローカーにパーティションを再割り当てします。その後、古いノードプールのロールを controller 専用ロールに切り替えることができます。
controller 専用ロールを持つノードプールと broker 専用ロールを持つノードプールから、broker と controller の二重のロールを実行するノードを含むノードプールに移動することで、逆の操作を実行することもできます。この場合、broker
ロールを既存のコントローラー専用ノードプールに追加し、ブローカー専用ノードから二重のロールを持つノードにパーティションを再割り当てしてから、ブローカー専用ノードプールを削除します。
ノードプール設定で broker
ロールを削除する場合は、Kafka がパーティションを自動的に再割り当てしない点に注意してください。broker ロールを削除する前に、controller 専用ロールに変更するノードにパーティションが割り当てられていないことを確認してください。パーティションが割り当てられている場合、変更は妨げられます。broker ロールを削除する前に、ノードにレプリカが残っていないようにしてください。ロールを変更する前にパーティションを再割り当てする最良の方法は、remove-brokers
モードで Cruise Control の最適化プロポーザルを適用することです。詳細は、「最適化プロポーザルの生成」 を参照してください。
9.3.7. 個別の broker ロールと controller ロールへの移行
この手順では、別のロールを持つノードプールを使用するように移行する方法を説明します。Kafka クラスターが controller ロールと broker ロールを組み合わせたノードプールを使用している場合は、別のロールを持つ 2 つのノードプールを使用するように移行できます。そのためには、クラスターをリバランスして、パーティションレプリカを broker 専用ロールを持つノードプールに移動してから、古いノードプールを controller 専用ロールに切り替えます。
この手順では、controller
ロールと broker
ロールを持つノードプール pool-a
から始めます。
二重のロールを持つノードプール
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-a
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- controller
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 20Gi
deleteClaim: false
# ...
ノードプールには 3 つのノードがあります。
ノードプール内の Kafka ノード
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
各ノードは、broker と controller を組み合わせたロールを実行します。ブローカーとしてのみ機能する 3 つのノードを含む、pool-b
という 2 番目のノードプールを作成します。
このプロセス中に、パーティションのレプリカを保持するノードの ID が変更されます。ノード ID を参照する依存関係を考慮してください。
手順
broker
ロールを持つノードプールを作成します。ノードプール設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-b labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-b labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ...
Copy to Clipboard Copied! 新しいノードプールにも 3 つのノードがあります。ブローカー専用ノードプールがすでにある場合は、この手順をスキップできます。
-
新しい
KafkaNodePool
リソースを適用してブローカーを作成します。 デプロイメントのステータスを確認し、ノードプール内の Pod が作成されて準備完了 (
1/1
) となるまで待ちます。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! 出力には、2 つのノードプールで実行されている Pod が表示されます
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-4 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-4 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0
Copy to Clipboard Copied! ノード ID は、作成時にノードの名前に追加されます。
Cruise Control の
remove-brokers
モードを使用して、二重のロールを持つノードから新しく追加されたブローカーにパーティションレプリカを再割り当てします。Cruise Control を使用したパーティションレプリカの再割り当て
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [0, 1, 2]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [0, 1, 2]
Copy to Clipboard Copied! クラスター内のトピックとパーティションの数によっては、再割り当てに時間がかかる場合があります。
注記controller 専用のロールに変更するノードにパーティションが割り当てられている場合、変更は阻止されます。
Kafka
リソースのstatus.conditions
は、変更を妨げるイベントの詳細を提供します。元々ロールを組み合わせて有していたノードプールから
broker
ロールを削除します。二重のロールを持つノードの controller への切り替え
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false # ...
Copy to Clipboard Copied! - 設定変更を適用して、ノードプールを controller 専用ロールに切り替えます。
9.3.8. 二重のロールを持つノードへの移行
この手順では、broker 専用ロールと controller 専用ロールを持つ個別のノードプールから、二重のロールを持つノードプールの使用に移行する方法について説明します。Kafka クラスターが専用のコントローラーノードとブローカーノードを持つノードプールを使用している場合は、両方のロールを持つ単一のノードプールを使用するように移行できます。これを行うには、broker
ロールをコントローラー専用ノードプールに追加し、クラスターをリバランスしてパーティションレプリカを二重のロールを持つノードプールに移動してから、古いブローカー専用ノードプールを削除します。
この手順では、controller
ロールのみを持つ pool-a
と、broker
ロールのみを持つ pool-b
の 2 つのノードプールから始めます。
単一ロールのノードプール
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ... --- apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-b labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-a
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- controller
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
---
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: pool-b
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles:
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
Kafka クラスターには 6 つのノードがあります。
ノードプール内の Kafka ノード
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-4 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0
NAME READY STATUS RESTARTS
my-cluster-pool-a-0 1/1 Running 0
my-cluster-pool-a-1 1/1 Running 0
my-cluster-pool-a-2 1/1 Running 0
my-cluster-pool-b-3 1/1 Running 0
my-cluster-pool-b-4 1/1 Running 0
my-cluster-pool-b-5 1/1 Running 0
pool-a
ノードは controller のロールを実行します。pool-b
ノードは broker のロールを実行します。
このプロセス中に、パーティションのレプリカを保持するノードの ID が変更されます。ノード ID を参照する依存関係を考慮してください。
手順
ノードプール
pool-a
を編集し、それにbroker
ロールを追加します。ノードプール設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ...
Copy to Clipboard Copied! ステータスを確認し、ノードプール内の Pod が再起動して準備完了 (
1/1
) となるまで待ちます。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! 出力には、2 つのノードプールで実行されている Pod が表示されます
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-4 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0 my-cluster-pool-b-3 1/1 Running 0 my-cluster-pool-b-4 1/1 Running 0 my-cluster-pool-b-5 1/1 Running 0
Copy to Clipboard Copied! ノード ID は、作成時にノードの名前に追加されます。
Cruise Control の
remove-brokers
モードを使用して、ブローカー専用ノードから二重のロールを持つノードにパーティションレプリカを再割り当てします。Cruise Control を使用したパーティションレプリカの再割り当て
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [3, 4, 5]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [3, 4, 5]
Copy to Clipboard Copied! クラスター内のトピックとパーティションの数によっては、再割り当てに時間がかかる場合があります。
古いブローカー専用ノードが含まれる
pool-b
ノードプールを削除します。oc delete kafkanodepool pool-b -n <my_cluster_operator_namespace>
oc delete kafkanodepool pool-b -n <my_cluster_operator_namespace>
Copy to Clipboard Copied!
9.3.9. ノードプールを使用したストレージの管理
通常、Streams for Apache Kafka でのストレージ管理は簡単で、セットアップ時の変更はほとんど不要です。ただし、場合によっては、ストレージ設定を変更する必要があります。ノードプールを使用すると、新しいストレージ要件を指定する個別のノードプールを設定できるため、このプロセスが簡素化されます。
この手順では、3 つのノードを含む pool-a
というノードプールのストレージを作成および管理します。使用する永続ストレージのタイプを定義するストレージクラス (volume.class
) を変更する方法を示します。同じ手順を使用して、ストレージサイズ (volume.size
) を変更できます。
ブロックストレージを使用することを強く推奨します。Streams for Apache Kafka は、ブロックストレージでの使用についてのみテストされています。
前提条件
- Cluster Operator がデプロイされている。
- Cruise Control は Kafka とともにデプロイされている。
- 動的ボリューム割り当てに永続ボリューム要求を使用するストレージの場合、必要なストレージソリューションに対応するストレージクラスが OpenShift クラスターで定義され、使用可能になります。
手順
独自のストレージ設定でノードプールを作成します。
たとえば、ノードプール
pool-a
は永続ボリュームが含まれる JBOD ストレージを使用します。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: gp2-ebs # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a labels: strimzi.io/cluster: my-cluster spec: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: gp2-ebs # ...
Copy to Clipboard Copied! pool-a
のノードは、Amazon EBS (Elastic Block Store) GP2 ボリュームを使用するように設定されています。-
pool-a
のノードプール設定を適用します。 デプロイメントのステータスを確認し、
pool-a
内の Pod が作成されて準備完了 (1/1
) となるまで待ちます。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! 出力には、ノードプール内の 3 つの Kafka ノードが表示されます
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-a-0 1/1 Running 0 my-cluster-pool-a-1 1/1 Running 0 my-cluster-pool-a-2 1/1 Running 0
Copy to Clipboard Copied! 新しいストレージクラスに移行するには、必要なストレージ設定で新しいノードプールを作成します。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-b labels: strimzi.io/cluster: my-cluster spec: roles: - broker replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 1Ti class: gp3-ebs # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-b labels: strimzi.io/cluster: my-cluster spec: roles: - broker replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 1Ti class: gp3-ebs # ...
Copy to Clipboard Copied! pool-b
のノードは、Amazon EBS (Elastic Block Store) GP3 ボリュームを使用するように設定されています。-
pool-b
のノードプール設定を適用します。 -
デプロイメントのステータスを確認し、
pool-b
内の Pod が作成されて準備完了となるまで待ちます。 パーティションを
pool-a
からpool-b
に再割り当てします。新しいストレージ設定に移行する場合、Cruise Control の
remove-brokers
モードを使用して、削除するブローカーからパーティションレプリカを移動します。Cruise Control を使用したパーティションレプリカの再割り当て
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [0, 1, 2]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: # ... spec: mode: remove-brokers brokers: [0, 1, 2]
Copy to Clipboard Copied! pool-a
からパーティションを再割り当てしています。クラスター内のトピックとパーティションの数によっては、再割り当てに時間がかかる場合があります。再割り当てプロセスが完了したら、古いノードプールを削除します。
oc delete kafkanodepool pool-a
oc delete kafkanodepool pool-a
Copy to Clipboard Copied!
9.3.10. ノードプールを使用したストレージアフィニティーの管理
ローカル永続ボリュームなどのストレージリソースが特定のワーカーノードまたはアベイラビリティーゾーンに制限されている状況では、ストレージアフィニティーを設定すると、適切なノードを使用するように Pod をスケジュールする場合に役立ちます。
ノードプールを使用すると、アフィニティーを個別に設定できます。この手順では、zone-1
と zone-2
の 2 つのアベイラビリティゾーンのストレージアフィニティーを作成および管理します。
ノードプールを個別のアベイラビリティーゾーンに設定できますが、同じストレージクラスを使用します。各ゾーンで利用可能なストレージリソースを表す all-zones
永続ストレージクラスを定義します。
また、.spec.template.pod
プロパティーを使用してノードアフィニティーを設定し、zone-1
および zone-2
のワーカーノードで Kafka Pod をスケジュールします。
ストレージクラスとアフィニティーは、各アベイラビリティーゾーンのノードを表すノードプールで指定されます。
-
pool-zone-1
-
pool-zone-2
前提条件
- Cluster Operator がデプロイされている。
- アフィニティーの概念に詳しくない場合は、Kubernetes ノードと Pod のアフィニティーのドキュメント を参照してください。
手順
各アベイラビリティーゾーンで使用するストレージクラスを定義します。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: all-zones provisioner: kubernetes.io/my-storage parameters: type: ssd volumeBindingMode: WaitForFirstConsumer
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: all-zones provisioner: kubernetes.io/my-storage parameters: type: ssd volumeBindingMode: WaitForFirstConsumer
Copy to Clipboard Copied! all-zones
のストレージクラスと各ゾーンのアフィニティーを指定して、2 つのアベイラビリティーゾーンを表すノードプールを作成します。zone-1 のノードプール設定
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-zone-1 labels: strimzi.io/cluster: my-cluster spec: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: all-zones template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-1 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-zone-1 labels: strimzi.io/cluster: my-cluster spec: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: all-zones template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-1 # ...
Copy to Clipboard Copied! zone-2 のノードプール設定
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-zone-2 labels: strimzi.io/cluster: my-cluster spec: replicas: 4 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: all-zones template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-2 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-zone-2 labels: strimzi.io/cluster: my-cluster spec: replicas: 4 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 500Gi class: all-zones template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-2 # ...
Copy to Clipboard Copied! - ノードプール設定を適用します。
デプロイメントのステータスを確認し、ノードプール内の Pod が作成されて準備完了 (
1/1
) となるまで待ちます。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! 出力には、
pool-zone-1
の 3 つの Kafka ノードと、pool-zone-2
の 4 つの Kafka ノードが表示されますNAME READY STATUS RESTARTS my-cluster-pool-zone-1-kafka-0 1/1 Running 0 my-cluster-pool-zone-1-kafka-1 1/1 Running 0 my-cluster-pool-zone-1-kafka-2 1/1 Running 0 my-cluster-pool-zone-2-kafka-3 1/1 Running 0 my-cluster-pool-zone-2-kafka-4 1/1 Running 0 my-cluster-pool-zone-2-kafka-5 1/1 Running 0 my-cluster-pool-zone-2-kafka-6 1/1 Running 0
NAME READY STATUS RESTARTS my-cluster-pool-zone-1-kafka-0 1/1 Running 0 my-cluster-pool-zone-1-kafka-1 1/1 Running 0 my-cluster-pool-zone-1-kafka-2 1/1 Running 0 my-cluster-pool-zone-2-kafka-3 1/1 Running 0 my-cluster-pool-zone-2-kafka-4 1/1 Running 0 my-cluster-pool-zone-2-kafka-5 1/1 Running 0 my-cluster-pool-zone-2-kafka-6 1/1 Running 0
Copy to Clipboard Copied!
9.3.11. Kafka ノードプールを使用するための既存の Kafka クラスターの移行
この手順では、既存の Kafka クラスターを移行して Kafka ノードプールを使用する方法について説明します。Kafka クラスターを更新した後、ノードプールを使用して各プール内のノードの設定を管理できます。
現在、KafkaNodePool
リソースのレプリカとストレージ設定は Kafka
リソースにも存在する必要があります。ノードプールが使用されている場合、設定は無視されます。
手順
新しい
KafkaNodePool
リソースを作成します。-
リソースに
kafka
という名前を付けます。 -
strimzi.io/cluster
ラベルが既存のKafka
リソースを指すようにします。 - 現在の Kafka クラスターと一致するようにレプリカ数とストレージ設定を設定します。
-
ロールを
Broker
に設定します。
Kafka クラスターの移行で使用されるノードプールの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: kafka labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: kafka labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false
Copy to Clipboard Copied! 警告クラスターデータとそのノードおよびリソースの名前を保持するには、ノードプール名を
Kafka
にし、strimzi.io/cluster
ラベルを Kafka リソース名と一致させる必要があります。それ以外の場合、ノードとリソースは、ノードによって使用される永続ボリュームストレージを含めて、新しい名前で作成されます。そのため、以前のデータが利用できなくなる可能性があります。-
リソースに
KafkaNodePool
リソースを適用します。oc apply -f <node_pool_configuration_file>
oc apply -f <node_pool_configuration_file>
Copy to Clipboard Copied! このリソースを適用すると、Kafka がノードプールの使用に切り替わります。
変更やローリングアップデートはなく、リソースは以前と同じです。
strimzi.io/node-pools: enabled
アノテーションを使用して、Kafka
リソース内のノードプールのサポートを有効にします。ZooKeeper を使用したクラスター内のノードプールの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster annotations: strimzi.io/node-pools: enabled spec: kafka: # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster annotations: strimzi.io/node-pools: enabled spec: kafka: # ... zookeeper: # ...
Copy to Clipboard Copied! Kafka
リソースを適用します。oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! 変更やローリング更新はありません。リソースは、以前と同じままです。
-
Kafka
カスタムリソースから複製されたプロパティーを削除します。KafkaNodePool
リソースが使用されている場合、.spec.kafka.replicas
プロパティーや.spec.kafka.storage
プロパティーなど、KafkaNodePool
リソースにコピーしたプロパティーを削除できます。
移行の取り消し
Kafka
カスタムリソースのみを使用して Kafka ノードを管理するように戻すには以下を実行します。
-
複数のノードプールがある場合は、ノード ID が 0 から N に、
kafka
という名前の単一のKafkaNodePool
に連結します(N はレプリカの数です)。 -
Kafka
リソースの.spec.kafka
設定が、ストレージ、リソース、レプリカを含むKafkaNodePool
設定と一致していることを確認します。 -
strimzi.io/node-pools: disabled
アノテーションを使用して、Kafka
リソース内のノードプールのサポートを無効にします。 -
kafka
という名前の Kafka ノードプールを削除します。
9.4. Entity Operator の設定
Kafka.spec
の entityOperator
プロパティーを使用して Entity Operator を設定します。Entity Operator は、実行中の Kafka クラスターで Kafka 関連のエンティティーを管理します。これは次の Operator で構成されます。
- Kafka トピックを管理する Topic Operator
- Kafka ユーザーを管理する User Operator
Kafka
リソースを設定することにより、Cluster Operator は、一方または両方の Operator を含む Entity Operator をデプロイできます。デプロイが完了すると、Kafka クラスターのトピックとユーザーを処理するように Operator が自動的に設定されます。
各 Operator は 1 つの namespace のみを監視できます。詳細は、「OpenShift namespace 内の Streams for Apache Kafka リソースの監視」 を参照してください。
entityOperator
プロパティーでは複数のサブプロパティーがサポートされます。
-
tlsSidecar
-
topicOperator
-
userOperator
-
template
tlsSidecar
プロパティーには、ZooKeeper との通信に使用される TLS サイドカーコンテナーの設定が含まれます。
template
プロパティーには、ラベル、アノテーション、アフィニティー、および容認 (Toleration) などの Entity Operator Pod の設定が含まれます。テンプレートの設定に関する詳細は、「OpenShift リソースのカスタマイズ」 を参照してください。
topicOperator
プロパティーには、Topic Operator の設定が含まれます。このオプションがないと、Entity Operator は Topic Operator なしでデプロイされます。
userOperator
プロパティーには、User Operator の設定が含まれます。このオプションがないと、Entity Operator は User Operator なしでデプロイされます。
Entity Operator の設定に使用されるプロパティーの詳細は、EntityOperatorSpec
スキーマリファレンス を参照してください。
両方の Operator を有効にする基本設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: topicOperator: {} userOperator: {}
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
topicOperator: {}
userOperator: {}
topicOperator
および userOperator
に空のオブジェクト ({}
) が使用された場合、すべてのプロパティーでデフォルト値が使用されます。
topicOperator
および userOperator
プロパティーの両方がない場合、Entity Operator はデプロイされません。
9.4.1. Topic Operator の設定
Kafka.spec.entityOperator
の topicOperator
プロパティーを使用して、Topic Operator を設定します。
デフォルトで有効になっている一方向トピック管理を使用している場合、Kafka.spec.entityOperator.topicOperator.zookeeperSessionTimeoutSeconds
プロパティーおよび Kafka.spec.entityOperator.topicOperator.topicMetadataMaxAttempts
プロパティーは使用されず、無視されます。一方向のトピック管理に関する詳細は、「トピック管理モード」 を参照してください。
以下のプロパティーがサポートされます。
watchedNamespace
-
Topic Operator が
KafkaTopic
リソースを監視する OpenShift namespace。デフォルトは、Kafka クラスターがデプロイされた namespace です。 reconciliationIntervalSeconds
-
定期的な調整 (reconciliation) の間隔 (秒単位)。デフォルトは
120
です。 zookeeperSessionTimeoutSeconds
-
ZooKeeper セッションのタイムアウト (秒単位)。デフォルトは
18
です。 topicMetadataMaxAttempts
-
Kafka からトピックメタデータの取得を試行する回数。各試行の間隔は、指数バックオフとして定義されます。パーティションまたはレプリカの数によって、トピックの作成に時間がかかる可能性がある場合は、この値を大きくすることを検討してください。デフォルトは
6
です。 image
-
image
プロパティーを使用すると、使用されるコンテナーイメージを設定できます。詳細は、image
プロパティーの設定 に記載されている情報を参照してください。 resources
-
resources
プロパティーを使用すると、Topic Operator に割り当てられるリソースの量を設定できます。メモリー
およびcpu
リソースの要求および制限を指定できます。この要求は、Operator のパフォーマンスの安定性を確保するには十分なはずです。 logging
-
logging
プロパティーは、Topic Operator のロギングを設定します。詳細は、Topic Operator のロギング に記載されている情報を参照してください。
Topic Operator の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: # ... topicOperator: watchedNamespace: my-topic-namespace reconciliationIntervalSeconds: 60 resources: requests: cpu: "1" memory: 500Mi limits: cpu: "1" memory: 500Mi # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
# ...
topicOperator:
watchedNamespace: my-topic-namespace
reconciliationIntervalSeconds: 60
resources:
requests:
cpu: "1"
memory: 500Mi
limits:
cpu: "1"
memory: 500Mi
# ...
9.4.2. User Operator の設定
Kafka.spec.entityOperator
の userOperator
プロパティーを使用して、User Operator を設定します。以下のプロパティーがサポートされます。
watchedNamespace
-
User Operator が
KafkaUser
リソースを監視する OpenShift namespace。デフォルトは、Kafka クラスターがデプロイされた namespace です。 reconciliationIntervalSeconds
-
定期的な調整 (reconciliation) の間隔 (秒単位)。デフォルトは
120
です。 image
-
image
プロパティーを使用すると、使用されるコンテナーイメージを設定できます。詳細は、image
プロパティーの設定 に記載されている情報を参照してください。 resources
-
resources
プロパティーを使用すると、User Operator に割り当てられるリソースの量を設定できます。メモリー
およびcpu
リソースの要求および制限を指定できます。この要求は、Operator のパフォーマンスの安定性を確保するには十分なはずです。 logging
-
logging
プロパティーは、User Operator のロギングを設定します。詳細は、User Operator のロギング に記載されている情報を参照してください。 secretPrefix
-
secretPrefix
プロパティーは、KafkaUser リソースから作成されたすべての Secret の名前に接頭辞を追加します。たとえば、secretPrefix: kafka-
は、すべてのシークレット名の前にkafka-
を付けます。そのため、my-user
という名前の KafkaUser は、kafka-my-user
という名前の Secret を作成します。
User Operator の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: # ... userOperator: watchedNamespace: my-user-namespace reconciliationIntervalSeconds: 60 resources: requests: cpu: "1" memory: 500Mi limits: cpu: "1" memory: 500Mi # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
# ...
userOperator:
watchedNamespace: my-user-namespace
reconciliationIntervalSeconds: 60
resources:
requests:
cpu: "1"
memory: 500Mi
limits:
cpu: "1"
memory: 500Mi
# ...
9.5. Cluster Operator の設定
環境変数を使用して Cluster Operator を設定します。Cluster Operator のコンテナーイメージの環境変数を Deployment
設定ファイルに指定します。以下の環境変数を使用して Cluster Operator を設定できます。Cluster Operator レプリカをスタンバイモードで実行している場合、リーダーの選択を有効にする追加の環境変数 があります。
Kafka、Kafka Connect、および Kafka MirrorMaker では、複数のバージョンがサポートされます。STRIMZI_<COMPONENT_NAME>_IMAGES
環境変数を使用して、各バージョンで使用されるデフォルトのコンテナーイメージを設定します。この設定により、バージョンとイメージ間のマッピングが提供されます。必要な構文は空白またはコンマで区切られた <version> = <image>
のペアで、これによって特定のバージョンに使用するイメージが決まります。たとえば、3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 です。これらのデフォルトのイメージは、コンポーネントの設定で image
プロパティー値が指定されている場合にオーバーライドされます。コンポーネントの image
設定の詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
Streams for Apache Kafka リリースアーティファクトに付属する Deployment
設定ファイルは、install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
です。
STRIMZI_NAMESPACE
Operator が操作する namespace のコンマ区切りリスト。設定されていない場合や、空の文字列や
*
に設定されている場合には、Cluster Operator はすべての namespace で動作します。Cluster Operator デプロイメントでは downward API を使用して、これを Cluster Operator がデプロイされる namespace に自動設定することがあります。
Cluster Operator namespace の設定例
env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
Copy to Clipboard Copied! STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
- オプションです。デフォルトは 120000 ミリ秒です。定期的な調整の間隔 (秒単位)。
STRIMZI_OPERATION_TIMEOUT_MS
- オプションです。デフォルトは 300000 ミリ秒です。内部操作のタイムアウト (ミリ秒単位)。通常の OpenShift 操作に (コンテナーイメージのダウンロードに長時間かかるなどの要因により) 通常より時間がかかるクラスターで Streams for Apache Kafka を使用する場合は、この値を増やしてください。
STRIMZI_ZOOKEEPER_ADMIN_SESSION_TIMEOUT_MS
-
オプションです。デフォルトは 10000 ミリ秒です。Cluster Operator の ZooKeeper 管理クライアントのセッションタイムアウト (ミリ秒単位)。タイムアウトの問題が原因で Cluster Operator からの ZooKeeper 要求が定期的に失敗する場合は、この値を増やします。
maxSessionTimeout
設定で ZooKeeper サーバー側に最大許容セッション時間が設定されます。デフォルトでは、最大セッションタイムアウト値はデフォルトのtickTime
(デフォルトは 2000) の 20 倍、つまり 40000 ミリ秒です。タイムアウト時間を伸ばす必要がある場合は、maxSessionTimeout
ZooKeeper サーバー設定値を変更する必要があります。 STRIMZI_OPERATIONS_THREAD_POOL_SIZE
- オプションです。デフォルトは 10 です。Cluster Operator によって実行されるさまざまな非同期およびブロッキング操作に使用されるワーカースレッドのプールサイズです。
STRIMZI_OPERATOR_NAME
- オプションです。デフォルトは Pod のホスト名です。Operator 名により、OpenShift イベントを発行 するときに Streams for Apache Kafka インスタンスが識別されます。
STRIMZI_OPERATOR_NAMESPACE
Cluster Operator が稼働している namespace の名前。この変数は手動で設定しないでください。Downward API を使用します。
env: - name: STRIMZI_OPERATOR_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
env: - name: STRIMZI_OPERATOR_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
Copy to Clipboard Copied! STRIMZI_OPERATOR_NAMESPACE_LABELS
オプション: Streams for Apache Kafka Cluster Operator が実行されている namespace のラベル。namespace のラベルは、ネットワークポリシー で namespace セレクターを設定するために使用します。ネットワークポリシーを使用すると、AMQ Streams Cluster Operator がアクセスできるオペランドを、このラベルを持つ namespace のオペランドだけに限定できます。設定されていない場合、ネットワークポリシーの namespace セレクターは、OpenShift クラスターのすべての namespace から Cluster Operator にアクセスできるように設定されます。
env: - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2
env: - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2
Copy to Clipboard Copied! STRIMZI_LABELS_EXCLUSION_PATTERN
オプションです。デフォルトの正規表現パターンは
^app.kubernetes.io/(?!part-of).*
です。メインのカスタムリソースからサブリソースへのラベル伝搬をフィルターするために使用される正規表現除外パターン。ラベル除外フィルターは、spec.kafka.template.pod.metadata.labels
などのテンプレートセクションのラベルには適用されません。env: - name: STRIMZI_LABELS_EXCLUSION_PATTERN value: "^key1.*"
env: - name: STRIMZI_LABELS_EXCLUSION_PATTERN value: "^key1.*"
Copy to Clipboard Copied! STRIMZI_CUSTOM_<COMPONENT_NAME>_LABELS
オプション: コンポーネントのカスタムリソースによって作成されたすべての Pod に適用する 1 つ以上のカスタムラベル。Cluster Operator は、カスタムリソースの作成時か、次の調整時に Pod にラベルを付けます。
ラベルは以下のコンポーネントに適用できます。
-
KAFKA
-
KAFKA_CONNECT
-
KAFKA_CONNECT_BUILD
-
ZOOKEEPER
-
ENTITY_OPERATOR
-
KAFKA_MIRROR_MAKER2
-
KAFKA_MIRROR_MAKER
-
CRUISE_CONTROL
-
KAFKA_BRIDGE
-
KAFKA_EXPORTER
-
STRIMZI_CUSTOM_RESOURCE_SELECTOR
オプション: Cluster Operator によって処理されるカスタムリソースをフィルターするラベルセレクター。Operator は、指定されたラベルが設定されているカスタムリソースでのみ動作します。これらのラベルのないリソースは Operator によって認識されません。ラベルセレクターは、
Kafka
、KafkaConnect
、KafkaBridge
、KafkaMirrorMaker
、およびKafkaMirrorMaker2
リソースに適用されます。KafkaRebalance
とKafkaConnector
リソースは、対応する Kafka および Kafka Connect クラスターに一致するラベルがある場合にのみ操作されます。env: - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR value: label1=value1,label2=value2
env: - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR value: label1=value1,label2=value2
Copy to Clipboard Copied! STRIMZI_KAFKA_IMAGES
-
必須。Kafka バージョンから、そのバージョンの Kafka ブローカーが含まれる該当のイメージへのマッピング。たとえば、
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0、3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
です。 STRIMZI_KAFKA_CONNECT_IMAGES
-
必須。Kafka バージョンから、そのバージョンの Kafka Connect の該当のイメージに対するマッピング。たとえば、
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0、3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
です。 STRIMZI_KAFKA_MIRROR_MAKER2_IMAGES
-
必須。Kafka バージョンから、そのバージョンの MirrorMaker 2 の対応するイメージへのマッピング。たとえば、
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0、3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
です。 - (非推奨)
STRIMZI_KAFKA_MIRROR_MAKER_IMAGES
-
必須。Kafka バージョンから、そのバージョンの MirrorMakerの該当のイメージに対するマッピング。たとえば、
3.6.0=registry.redhat.io/amq-streams/kafka-36-rhel9:2.7.0、3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
です。 STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE
-
オプション: デフォルトは
registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0
です。Kafka
リソースでイメージがKafka.spec.entityOperator.topicOperator.image
として指定されていない場合に、Topic Operator のデプロイ時にデフォルトとして使用するイメージ名。 STRIMZI_DEFAULT_USER_OPERATOR_IMAGE
-
オプション: デフォルトは
registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0
です。Kafka
リソースのKafka.spec.entityOperator.userOperator.image
にイメージが指定されていない場合に、User Operator をデプロイする際にデフォルトで使用するイメージ名です。 STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE
-
オプション: デフォルトは
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
です。Kafka
リソースのKafka.spec.entityOperator.tlsSidecar.image
にイメージが指定されていない場合に、Entity Operator のサイドカーコンテナーをデプロイする際にデフォルトで使用するイメージ名です。サイドカーは TLS サポートを提供します。 STRIMZI_DEFAULT_KAFKA_EXPORTER_IMAGE
-
オプション: デフォルトは
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
です。Kafka
リソースでKafka.spec.kafkaExporter.image
としてイメージが指定されていない場合に、Kafka Exporter をデプロイするときにデフォルトとして使用するイメージ名。 STRIMZI_DEFAULT_CRUISE_CONTROL_IMAGE
-
オプション: デフォルトは
registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0
です。Kafka
リソースでKafka.spec.cruiseControl.image
としてイメージが指定されていない場合に、Cruise Control をデプロイするときにデフォルトとして使用するイメージ名。 STRIMZI_DEFAULT_KAFKA_BRIDGE_IMAGE
-
オプション: デフォルトは
registry.redhat.io/amq-streams/bridge-rhel9:2.7.0
です。Kafka
リソースでKafka.spec.kafkaBridge.image
としてイメージが指定されていない場合に、Kafka Bridge をデプロイするときにデフォルトとして使用するイメージ名。 STRIMZI_DEFAULT_KAFKA_INIT_IMAGE
-
オプション: デフォルトは
registry.redhat.io/amq-streams/strimzi-rhel9-operator:2.7.0
です。Kafka
リソースのbrokerRackInitImage
または Kafka Connect リソースのclientRackInitImage
でイメージが指定されていない場合に、Kafka イニシャライザーコンテナーのデフォルトとして使用するイメージ名。init コンテナーは、ラックサポートなどの初期設定作業のために、Kafka クラスターの前に起動します。 STRIMZI_IMAGE_PULL_POLICY
-
オプション: Cluster Operator によって管理されるすべての Pod のコンテナーに適用される
ImagePullPolicy
。有効な値はAlways
、IfNotPresent
、およびNever
です。指定のない場合は、OpenShift のデフォルトが使用されます。ポリシーを変更すると、すべての Kafka、Kafka Connect、および Kafka MirrorMaker クラスターのローリング更新が実行されます。 STRIMZI_IMAGE_PULL_SECRETS
-
オプション:
Secret
名のコンマ区切りのリスト。ここで参照されるシークレットには、コンテナーイメージがプルされるコンテナーレジストリーへのクレデンシャルが含まれます。シークレットは、Cluster Operator によって作成されるすべての Pod のimagePullSecrets
プロパティーで指定されます。このリストを変更すると、Kafka、Kafka Connect、および Kafka MirrorMaker のすべてのクラスターのローリング更新が実行されます。 STRIMZI_KUBERNETES_VERSION
オプション: API サーバーから検出された OpenShift バージョン情報をオーバーライドします。
OpenShift バージョンオーバーライドの設定例
env: - name: STRIMZI_KUBERNETES_VERSION value: | major=1 minor=16 gitVersion=v1.16.2 gitCommit=c97fe5036ef3df2967d086711e6c0c405941e14b gitTreeState=clean buildDate=2019-10-15T19:09:08Z goVersion=go1.12.10 compiler=gc platform=linux/amd64
env: - name: STRIMZI_KUBERNETES_VERSION value: | major=1 minor=16 gitVersion=v1.16.2 gitCommit=c97fe5036ef3df2967d086711e6c0c405941e14b gitTreeState=clean buildDate=2019-10-15T19:09:08Z goVersion=go1.12.10 compiler=gc platform=linux/amd64
Copy to Clipboard Copied! KUBERNETES_SERVICE_DNS_DOMAIN
オプション: デフォルトの OpenShift DNS 接尾辞を上書きします。
デフォルトでは、OpenShfit クラスターで割り当てられるサービスに、デフォルトの接尾辞
cluster.local
を使用する DNS ドメイン名があります。ブローカーが kafka-0 の場合の例は次のとおりです。
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc.cluster.local
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc.cluster.local
Copy to Clipboard Copied! DNS ドメイン名は、ホスト名の検証に使用される Kafka ブローカー証明書に追加されます。
クラスターで異なる DNS 接尾辞を使用している場合、Kafka ブローカーとの接続を確立するために、
KUBERNETES_SERVICE_DNS_DOMAIN
環境変数をデフォルトから現在使用中の DNS 接尾辞に変更します。STRIMZI_CONNECT_BUILD_TIMEOUT_MS
- オプションです。デフォルトは 300000 ミリ秒です。追加のコネクターで新しい Kafka Connect イメージをビルドする場合のタイムアウト (ミリ秒単位)。Streams for Apache Kafka を使用して多くのコネクターが含まれるコンテナーイメージをビルドする場合や、低速なコンテナーレジストリーを使用する場合は、この値を増やすことを検討してください。
STRIMZI_NETWORK_POLICY_GENERATION
オプションです。デフォルトは
true
です。リソースのネットワークポリシー。ネットワークポリシーにより、Kafka コンポーネント間の接続が許可されます。ネットワークポリシーの生成を無効にするには、この環境変数を
false
に設定します。たとえば、カスタムのネットワークポリシーを使用する場合は、これを行うことができます。カスタムネットワークポリシーを使用すると、コンポーネント間の接続をより詳細に制御できます。STRIMZI_DNS_CACHE_TTL
-
オプションです。デフォルトは
30
です。ローカル DNS リゾルバーで成功した名前のルックアップをキャッシュする秒数。負の値を指定すると、キャッシュの期限はありません。ゼロはキャッシュされないことを意味します。これは、長いキャッシュポリシーが適用されることが原因の接続エラーを回避する場合に便利です。 STRIMZI_POD_SET_RECONCILIATION_ONLY
-
オプションです。デフォルトは
false
です。true
に設定すると、Cluster Operator はStrimziPodSet
リソースのみを調整し、他のカスタムリソース (Kafka
、KafkaConnect
など) への変更は無視されます。このモードは、必要に応じて Pod が再作成されるようにするのに役立ちますが、クラスターに他の変更は加えられません。 STRIMZI_FEATURE_GATES
- オプション: フィーチャーゲートで制御される機能を有効または無効にします。
STRIMZI_POD_SECURITY_PROVIDER_CLASS
-
オプション: Pod とコンテナーのセキュリティーコンテキスト設定を提供するために使用できるプラグ可能な
PodSecurityProvider
クラスを設定します。
9.5.1. ネットワークポリシーを使用した Cluster Operator へのアクセス制限
STRIMZI_OPERATOR_NAMESPACE_LABELS
環境変数を使用して Cluster Operator のネットワークポリシーを確立するには、namespace ラベルを使用します。
Cluster Operator は、管理するリソースと同じ namespace または別の namespace で実行できます。デフォルトでは、STRIMZI_OPERATOR_NAMESPACE
環境変数は、Downward API を使用して、Cluster Operator がどの namespace で実行されているかを検索するように設定されています。Cluster Operator がリソースと同じ namespace で実行されている場合は、ローカルアクセスのみが必要で、Streams for Apache Kafka によって許可されます。
Cluster Operator が管理するリソースとは別の namespace で実行されている場合、ネットワークポリシーが設定されている場合を除き、OpenShift クラスターのすべての namespace は Cluster Operator へのアクセスが許可されます。namespace ラベルを追加すると、Cluster Operator へのアクセスは指定された namespace に限定されます。
Cluster Operator デプロイメントに設定されたネットワークポリシー
#... env: # ... - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2 #...
#...
env:
# ...
- name: STRIMZI_OPERATOR_NAMESPACE_LABELS
value: label1=value1,label2=value2
#...
9.5.2. カスタムリソースの定期的な調整の設定
STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
変数を使用して、Cluster Operator による定期的な調整の時間間隔を設定します。この値は、指定する間隔 (ミリ秒単位) に置き換えます。
Cluster Operator デプロイメント用に設定された調整期間
#... env: # ... - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" #...
#...
env:
# ...
- name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
value: "120000"
#...
Cluster Operator は、OpenShift クラスターから受信した対象のクラスターリソースに関するすべての通知に反応します。Operator が実行されていない場合や、何らかの理由で通知を受信しない場合に、リソースは実行中の OpenShift クラスターの状態と同期しなくなります。フェイルオーバーを適切に処理するために、Cluster Operator によって定期的な調整プロセスが実行され、リソースの状態を現在のクラスターデプロイメントと比較して、すべてのリソースで一貫した状態を保つことができます。
9.5.3. アノテーションを使用したカスタムリソースの調整の一時停止
場合によっては、修正や更新を実行できるように、Streams for Apache Kafka Operator によって管理されるカスタムリソースの調整を一時停止すると便利なことがあります。調整を一時停止すると、Operator は、一時停止が終了するまでカスタムリソースに加えた変更を無視します。
カスタムリソースの調整を一時停止するには、configure で strimzi.io/pause-reconciliation
アノテーションを true
に設定します。これにより、適切な Operator に対し、カスタムリソースの調整を一時停止するように指示します。たとえば、Cluster Operator による調整が一時停止されるように、アノテーションを KafkaConnect
リソースに適用できます。
pause アノテーションを有効にしてカスタムリソースを作成することもできます。カスタムリソースは作成されますが、無視されます。
前提条件
- カスタムリソースを管理する Streams for Apache Kafka Operator が実行中である。
手順
pause-reconciliation
をtrue
に設定して、OpenShift のカスタムリソースにアノテーションを付けます。oc annotate <kind_of_custom_resource> <name_of_custom_resource> strimzi.io/pause-reconciliation="true"
oc annotate <kind_of_custom_resource> <name_of_custom_resource> strimzi.io/pause-reconciliation="true"
Copy to Clipboard Copied! たとえば、
KafkaConnect
カスタムリソースの場合は以下のようになります。oc annotate KafkaConnect my-connect strimzi.io/pause-reconciliation="true"
oc annotate KafkaConnect my-connect strimzi.io/pause-reconciliation="true"
Copy to Clipboard Copied! カスタムリソースの status 条件で、
ReconciliationPaused
への変更が表示されることを確認し ます。oc describe <kind_of_custom_resource> <name_of_custom_resource>
oc describe <kind_of_custom_resource> <name_of_custom_resource>
Copy to Clipboard Copied! type
条件は、lastTransitionTime
でReconciliationPaused
に変わります。一時停止された調整条件タイプを持つカスタムリソースの例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: annotations: strimzi.io/pause-reconciliation: "true" strimzi.io/use-connector-resources: "true" creationTimestamp: 2021-03-12T10:47:11Z #... spec: # ... status: conditions: - lastTransitionTime: 2021-03-12T10:47:41.689249Z status: "True" type: ReconciliationPaused
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: annotations: strimzi.io/pause-reconciliation: "true" strimzi.io/use-connector-resources: "true" creationTimestamp: 2021-03-12T10:47:11Z #... spec: # ... status: conditions: - lastTransitionTime: 2021-03-12T10:47:41.689249Z status: "True" type: ReconciliationPaused
Copy to Clipboard Copied!
一時停止からの再開
-
調整を再開するには、アノテーションを
false
に設定するか、アノテーションを削除します。
9.5.4. リーダーの選択による複数の Cluster Operator レプリカの実行
デフォルトの Cluster Operator 設定では、リーダーの選択が有効になっており、Cluster Operator の並列レプリカを複数実行します。1 つのレプリカがアクティブなリーダーとして選択され、デプロイされたリソースを操作します。他のレプリカはスタンバイモードで実行されます。リーダーが停止またはクラッシュすると、スタンバイレプリカの 1 つが新しいリーダーとして選出され、デプロイされたリソースの操作を開始します。
デフォルトでは、Streams for Apache Kafka は、常にリーダーレプリカである単一の Cluster Operator レプリカで実行されます。単一の Cluster Operator レプリカが停止または失敗すると、OpenShift は新しいレプリカを起動します。
複数のレプリカを使用した Cluster Operator の実行は必須ではありません。ただし、重大な障害による大規模な中断が発生した場合に備えて、レプリカをスタンバイにしておくと便利です。たとえば、複数のワーカーノードまたはアベイラビリティーゾーン全体に障害が発生したとします。このような障害が発生すると、Cluster Operator Pod と多くの Kafka Pod が同時にダウンする可能性があります。後続の Pod スケジューリングがリソース不足によって輻輳を引き起こす場合、単一の Cluster Operator を実行しているときに操作が遅延する可能性があります。
9.5.4.1. Cluster Operator レプリカのリーダー選択の有効化
追加の Cluster Operator レプリカを実行する場合は、リーダー選出環境変数を設定します。以下の環境変数がサポートされています。
STRIMZI_LEADER_ELECTION_ENABLED
-
デフォルトでは無効 (
false
) になります (任意)。リーダーの選出を有効または無効にし、追加の Cluster Operator レプリカをスタンバイで実行できます。
リーダーの選択はデフォルトで無効になっています。インストール時にこの環境変数を適用する場合にのみ有効になります。
STRIMZI_LEADER_ELECTION_LEASE_NAME
-
リーダー選出が有効な場合に必要です。リーダーの選出に使用される OpenShift
Lease
リソースの名前。 STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE
リーダー選出が有効な場合に必要です。リーダー選出に使用される OpenShift
Lease
リソースが作成される namespace。Downward API を使用して、Cluster Operator がデプロイされている namespace に設定できます。env: - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
env: - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
Copy to Clipboard Copied! STRIMZI_LEADER_ELECTION_IDENTITY
リーダー選出が有効な場合に必要です。リーダーの選択中に使用される特定の Cluster Operator インスタンスのアイデンティティーを設定します。アイデンティティーは、Operator インスタンスごとに一意である必要があります。Downward API を使用して、Cluster Operator がデプロイされている Pod の名前に設定できます。
env: - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.name
env: - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.name
Copy to Clipboard Copied! STRIMZI_LEADER_ELECTION_LEASE_DURATION_MS
- オプションです。デフォルトは 15000 ミリ秒です。取得したリースの有効期間を設定します。
STRIMZI_LEADER_ELECTION_RENEW_DEADLINE_MS
- オプションです。デフォルトは 10000 ミリ秒です。リーダーがリーダーシップを維持しようと試行する期間を指定します。
STRIMZI_LEADER_ELECTION_RETRY_PERIOD_MS
- オプションです。デフォルトは 2000 ミリ秒です。リーダーによるリースロックへの更新頻度を指定します。
9.5.4.2. Cluster Operator レプリカの設定
追加の Cluster Operator レプリカをスタンバイモードで実行するには、レプリカ数を増やし、リーダーの選択を有効にする必要があります。リーダーの選択を設定するには、リーダー選択用の環境変数を使用します。
必要な変更を行うには、install/cluster-operator/
にある以下の Cluster Operator インストールファイルを設定します。
- 060-Deployment-strimzi-cluster-operator.yaml
- 022-ClusterRole-strimzi-cluster-operator-role.yaml
- 022-RoleBinding-strimzi-cluster-operator.yaml
リーダーの選出には、監視している namespace ではなく、Cluster Operator が実行されている namespace を対象とする独自の ClusterRole
および RoleBinding
RBAC リソースがあります。
デフォルトのデプロイメント設定は、strimzi-cluster-operator
という Lease
リソースを Cluster Operator と同じ namespace に作成します。Cluster Operator はリースを使用してリーダーの選択を管理します。RBAC リソースは、Lease
リソースを使用するためのパーミッションを提供します。別の Lease
名または namespace を使用する場合は、ClusterRole
および RoleBinding
ファイルを適宜更新します。
前提条件
-
CustomResourceDefinition
および RBAC (ClusterRole
およびRoleBinding
) リソースを作成および管理する権限を持つアカウント。
手順
Cluster Operator のデプロイに使用される Deployment
リソースを編集します。これは、060-Deployment-strimzi-cluster-operator.yaml
ファイルで定義します。
replicas
プロパティーの値は、デフォルトの (1) から、必要なレプリカ数に変更します。Cluster Operator レプリカの数の増加
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator labels: app: strimzi spec: replicas: 3
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator labels: app: strimzi spec: replicas: 3
Copy to Clipboard Copied! リーダー選択の
env
プロパティーが設定されていることを確認します。設定されていない場合には、設定を行います。
リーダーの選出を有効にするには、
STRIMZI_LEADER_ELECTION_ENABLED
をtrue
(デフォルト) に設定する必要があります。この例では、リースの名前は
my-strimzi-cluster-operator
に変更されています。Cluster Operator のリーダー選択用の環境変数の設定
# ... spec containers: - name: strimzi-cluster-operator # ... env: - name: STRIMZI_LEADER_ELECTION_ENABLED value: "true" - name: STRIMZI_LEADER_ELECTION_LEASE_NAME value: "my-strimzi-cluster-operator" - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.name
# ... spec containers: - name: strimzi-cluster-operator # ... env: - name: STRIMZI_LEADER_ELECTION_ENABLED value: "true" - name: STRIMZI_LEADER_ELECTION_LEASE_NAME value: "my-strimzi-cluster-operator" - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.name
Copy to Clipboard Copied! 利用可能な環境変数の説明は、「Cluster Operator レプリカのリーダー選択の有効化」 を参照してください。
リーダーの選択に使用する
Lease
リソースに別の名前または namespace を指定している場合は、RBAC リソースを更新します。(オプション)
022-ClusterRole-strimzi-cluster-operator-role.yaml
ファイルでClusterRole
リソースを編集します。resourceNames
は、Lease
リソースの名前に更新します。リースへの ClusterRole 参照の更新
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi rules: - apiGroups: - coordination.k8s.io resourceNames: - my-strimzi-cluster-operator # ...
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi rules: - apiGroups: - coordination.k8s.io resourceNames: - my-strimzi-cluster-operator # ...
Copy to Clipboard Copied! (オプション)
022-RoleBinding-strimzi-cluster-operator.yaml
ファイルでRoleBinding
リソースを編集します。subjects.name
およびsubjects.namespace
はLease
リソースの名前と、そのリソースが作成された namespace に更新します。RoleBinding 参照のリースへの更新
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi subjects: - kind: ServiceAccount name: my-strimzi-cluster-operator namespace: myproject # ...
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi subjects: - kind: ServiceAccount name: my-strimzi-cluster-operator namespace: myproject # ...
Copy to Clipboard Copied! Cluster Operator をデプロイします。
oc create -f install/cluster-operator -n myproject
oc create -f install/cluster-operator -n myproject
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get deployments -n myproject
oc get deployments -n myproject
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 3/3 3 3
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 3/3 3 3
Copy to Clipboard Copied! READY
は、Ready/expected 状態のレプリカ数を表示します。AVAILABLE
出力に正しい数のレプリカが表示されると、デプロイは成功です。
9.5.5. Cluster Operator HTTP プロキシーの設定
HTTP プロキシーの背後で Kafka クラスターを実行している場合は、クラスターとの間でデータを出し入れできます。たとえば、プロキシー外からデータをプッシュおよびプルするコネクターで Kafka Connect を実行できます。または、プロキシーを使用して認可サーバーに接続できます。
プロキシー環境変数を指定するように Cluster Operator デプロイメントを設定します。Cluster Operator は、標準のプロキシー設定 (HTTP_PROXY
、HTTPS_PROXY
、および NO_PROXY
) を環境変数として受け入れます。プロキシー設定はすべての Streams for Apache Kafka コンテナーに適用されます。
プロキシーアドレスの形式は http://<ip_address>:<port_number> です。名前とパスワードを使用してプロキシーを設定する場合、形式は http://<username>:<password>@<ip-address>:<port_number> です。
前提条件
-
CustomResourceDefinition
および RBAC (ClusterRole
およびRoleBinding
) リソースを作成および管理する権限を持つアカウント。
手順
Cluster Operator にプロキシー環境変数を追加するには、その
Deployment
設定 (install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
) を更新します。Cluster Operator のプロキシー設定の例
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "HTTP_PROXY" value: "http://proxy.com" - name: "HTTPS_PROXY" value: "https://proxy.com" - name: "NO_PROXY" value: "internal.com, other.domain.com" # ...
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "HTTP_PROXY" value: "http://proxy.com"
1 - name: "HTTPS_PROXY" value: "https://proxy.com"
2 - name: "NO_PROXY" value: "internal.com, other.domain.com"
3 # ...
Copy to Clipboard Copied! または、
Deployment
を直接編集します。oc edit deployment strimzi-cluster-operator
oc edit deployment strimzi-cluster-operator
Copy to Clipboard Copied! Deployment
を直接編集せずに YAML ファイルを更新する場合は、変更を適用します。oc create -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
oc create -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
Copy to Clipboard Copied!
9.5.6. Cluster Operator 設定を使用した FIPS モードの無効化
Streams for Apache Kafka は、FIPS 対応の OpenShift クラスターで実行されると、自動的に FIPS モードに切り替わります。FIPS モードを無効にするには、Cluster Operator のデプロイメント設定で FIPS_MODE
環境変数を disabled
に設定します。FIPS モードを無効にすると、Streams for Apache Kafka はすべてのコンポーネントの OpenJDK で FIPS を自動的に無効にします。FIPS モードが無効な場合、Streams for Apache Kafka は FIPS に準拠しません。Streams for Apache Kafka の Operator とすべてのオペランドが、FIPS が有効でない OpenShift クラスターで実行されている場合と同じように実行されます。
手順
Cluster Operator で FIPS モードを無効にするには、
Deployment
設定 (install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
) を更新し、FIPS_MODE
環境変数を追加します。Cluster Operator の FIPS 設定例
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "FIPS_MODE" value: "disabled" # ...
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "FIPS_MODE" value: "disabled"
1 # ...
Copy to Clipboard Copied! - 1
- FIPS モードを無効にします。
または、
Deployment
を直接編集します。oc edit deployment strimzi-cluster-operator
oc edit deployment strimzi-cluster-operator
Copy to Clipboard Copied! Deployment
を直接編集せずに YAML ファイルを更新する場合は、変更を適用します。oc apply -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
oc apply -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
Copy to Clipboard Copied!
9.6. Kafka Connect の設定
KafkaConnect
カスタムリソースの spec
プロパティーを更新して、Kafka Connect デプロイメントを設定します。
Kafka Connect を使用して、Kafka クラスターへの外部データ接続を設定します。KafkaConnect
リソースのプロパティーを使用して、Kafka Connect デプロイメントを設定します。
Kafka Connect クラスターの設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
KafkaConnector の設定
KafkaConnect
リソースを使用すると、Kafka Connect のコネクターインスタンスを OpenShift ネイティブに作成および管理できます。
Kafka Connect 設定では、strimzi.io/use-connector-resources
アノテーションを追加して、Kafka Connect クラスターの KafkaConnectors を有効にします。また、build
設定を追加して、データ接続に必要なコネクタープラグインを備えたコンテナーイメージを Streams for Apache Kafka が自動的にビルドするようにすることもできます。Kafka Connect コネクターの外部設定は、externalConfiguration
プロパティーで指定します。
コネクターを管理するには、KafkaConnector
カスタムリソースまたは Kafka Connect REST API を使用できます。KafkaConnector
リソースは、リンク先の Kafka Connect クラスターと同じ namespace にデプロイする必要があります。これらの方法を使用してコネクターを作成、再設定、または削除する方法の詳細については、コネクターの追加 を参照してください。
コネクター設定は、HTTP リクエストの一部として Kafka Connect に渡され、Kafka 自体に保存されます。ConfigMap およびシークレットは、設定やデータの保存に使用される標準的な OpenShift リソースです。ConfigMap およびシークレットを使用してコネクターの特定の要素を設定できます。その後、HTTP REST コマンドで設定値を参照できます。これにより、必要な場合は設定が分離され、よりセキュアになります。この方法は、ユーザー名、パスワード、証明書などの機密性の高いデータに適用されます。
大量のメッセージ処理
設定を調整して、大量のメッセージを処理できます。詳細は、大量のメッセージの処理 を参照してください。
KafkaConnect
カスタムリソース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: replicas: 3 authentication: type: tls certificateAndKey: certificate: source.crt key: source.key secretName: my-user-source bootstrapServers: my-cluster-kafka-bootstrap:9092 tls: trustedCertificates: - secretName: my-cluster-cluster-cert certificate: ca.crt - secretName: my-cluster-cluster-cert certificate: ca2.crt config: group.id: my-connect-cluster offset.storage.topic: my-connect-cluster-offsets config.storage.topic: my-connect-cluster-configs status.storage.topic: my-connect-cluster-status key.converter: org.apache.kafka.connect.json.JsonConverter value.converter: org.apache.kafka.connect.json.JsonConverter key.converter.schemas.enable: true value.converter.schemas.enable: true config.storage.replication.factor: 3 offset.storage.replication.factor: 3 status.storage.replication.factor: 3 build: output: type: docker image: my-registry.io/my-org/my-connect-cluster:latest pushSecret: my-registry-credentials plugins: - name: connector-1 artifacts: - type: tgz url: <url_to_download_connector_1_artifact> sha512sum: <SHA-512_checksum_of_connector_1_artifact> - name: connector-2 artifacts: - type: jar url: <url_to_download_connector_2_artifact> sha512sum: <SHA-512_checksum_of_connector_2_artifact> externalConfiguration: env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-creds key: awsAccessKey - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey resources: requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: type: inline loggers: log4j.rootLogger: INFO readinessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 metricsConfig: type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: my-config-map key: my-key jvmOptions: "-Xmx": "1g" "-Xms": "1g" image: my-org/my-image:latest rack: topologyKey: topology.kubernetes.io/zone template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect-cluster
annotations:
strimzi.io/use-connector-resources: "true"
spec:
replicas: 3
authentication:
type: tls
certificateAndKey:
certificate: source.crt
key: source.key
secretName: my-user-source
bootstrapServers: my-cluster-kafka-bootstrap:9092
tls:
trustedCertificates:
- secretName: my-cluster-cluster-cert
certificate: ca.crt
- secretName: my-cluster-cluster-cert
certificate: ca2.crt
config:
group.id: my-connect-cluster
offset.storage.topic: my-connect-cluster-offsets
config.storage.topic: my-connect-cluster-configs
status.storage.topic: my-connect-cluster-status
key.converter: org.apache.kafka.connect.json.JsonConverter
value.converter: org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable: true
value.converter.schemas.enable: true
config.storage.replication.factor: 3
offset.storage.replication.factor: 3
status.storage.replication.factor: 3
build:
output:
type: docker
image: my-registry.io/my-org/my-connect-cluster:latest
pushSecret: my-registry-credentials
plugins:
- name: connector-1
artifacts:
- type: tgz
url: <url_to_download_connector_1_artifact>
sha512sum: <SHA-512_checksum_of_connector_1_artifact>
- name: connector-2
artifacts:
- type: jar
url: <url_to_download_connector_2_artifact>
sha512sum: <SHA-512_checksum_of_connector_2_artifact>
externalConfiguration:
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-creds
key: awsAccessKey
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-creds
key: awsSecretAccessKey
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
log4j.rootLogger: INFO
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
image: my-org/my-image:latest
rack:
topologyKey: topology.kubernetes.io/zone
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
connectContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
- 1
KafkaConnect
を使用します。- 2
- Kafka Connect クラスターの KafkaConnectors を有効にします。
- 3
- タスクを実行するワーカーのレプリカノード数。
- 4
- mTLS、トークンベースの OAuth、SASL ベース SCRAM-SHA-256/SCRAM-SHA-512、または PLAIN として指定された Kafka Connect クラスターの認証。デフォルトでは、Kafka Connect はプレーンテキスト接続を使用して Kafka ブローカーに接続します。
- 5
- Kafka クラスターに接続するためのブートストラップサーバー。
- 6
- クラスターの TLS 証明書が X.509 形式で保存されるキー名のある TLS による暗号化。複数の証明書が同じシークレットに保存されている場合は、複数回リストできます。
- 7
- ワーカーの Kafka Connect 設定 (コネクターではない)。Streams for Apache Kafka によって直接管理されないプロパティーに限り、標準の Apache Kafka 設定を指定できます。
- 8
- コネクタープラグインで自動的にコンテナーイメージをビルドするためのビルド設定プロパティー。
- 9
- (必須) 新しいイメージがプッシュされるコンテナーレジストリーの設定。
- 10
- (必須) 新しいコンテナーイメージに追加するコネクタープラグインとそれらのアーティファクトのリスト。各プラグインは、1 つ以上の
artifact
を使用して設定する必要があります。 - 11
- ここで示す環境変数や、ボリュームを使用したコネクターの外部設定。設定プロバイダープラグインを使用して、外部ソースから設定値を読み込むこともできます。
- 12
- 現在
cpu
およびmemory
である、サポートされるリソースの予約を要求し、消費可能な最大リソースを指定を制限します。 - 13
- 指定された Kafka ロガーおよびログレベルが ConfigMap を介して直接的に (
inline
) または間接的に (external
) に追加されます。カスタム Log4j 設定は、ConfigMap のlog4j.properties
キーまたはlog4j2.properties
キーの下に配置する必要があります。Kafka Connectlog4j.rootLogger
ロガーでは、ログレベルを INFO、ERROR、WARN、TRACE、DEBUG、FATAL または OFF に設定できます。 - 14
- コンテナーを再起動するタイミング (liveness) およびコンテナーがトラフィックを許可できるタイミング (readiness) を把握するためのヘルスチェック。
- 15
- Prometheus メトリクス。この例では、Prometheus JMX エクスポーターの設定が含まれる ConfigMap を参照して有効になります。
metricsConfig.valueFrom.configMapKeyRef.key
配下に空のファイルが含まれる ConfigMap の参照を使用して、追加設定なしでメトリックを有効にできます。 - 16
- Kafka Connect を実行している仮想マシン (VM) のパフォーマンスを最適化するための JVM 設定オプション。
- 17
- 高度なオプション: コンテナーイメージの設定。特別な状況でのみ推奨されます。
- 18
- 特別なオプション: 展開のための Rack awareness 設定。これは、リージョン間ではなく、同じロケーション内でのデプロイメントを目的とした特殊なオプションです。このオプションは、コネクターがリーダーレプリカではなく、最も近いレプリカから消費する場合に使用できます。場合によっては、最も近いレプリカから消費することで、ネットワークの使用率を改善したり、コストを削減したりできます。
topologyKey
は、ラック ID を含むノードラベルと一致する必要があります。この設定で使用される例では、標準のtopology.kubernetes.io/zone
ラベルを使用するゾーンを指定します。最も近いレプリカから消費するには、Kafka ブローカー設定でRackAwareReplicaSelector
を有効にします。 - 19
- テンプレートのカスタマイズ。ここでは、Pod は非アフィニティーでスケジュールされるため、Pod は同じホスト名のノードではスケジュールされません。
- 20
- 分散トレース用に環境変数が設定されます。
- 21
- 分散トレーシングは、OpenTelemetry を使用して有効になります。
9.6.1. 複数のインスタンス用の Kafka Connect の設定
デフォルトでは、Streams for Apache Kafka は、Kafka Connect によって使用される内部トピックのグループ ID と名前を設定します。Kafka Connect の複数のインスタンスを実行する場合は、次の config
プロパティーを使用してこれらのデフォルト設定を変更する必要があります。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: config: group.id: my-connect-cluster offset.storage.topic: my-connect-cluster-offsets config.storage.topic: my-connect-cluster-configs status.storage.topic: my-connect-cluster-status # ... # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect
spec:
config:
group.id: my-connect-cluster
offset.storage.topic: my-connect-cluster-offsets
config.storage.topic: my-connect-cluster-configs
status.storage.topic: my-connect-cluster-status
# ...
# ...
group.id
が同じすべてのインスタンスで、3 つのトピックの値を同じにする必要があります。
これらのデフォルト設定を変更しない限り、同じ Kafka クラスターに接続する各インスタンスは同じ値でデプロイされます。実際には、これはすべてのインスタンスがクラスターを形成し、同じ内部トピックを使用することを意味します。
複数のインスタンスが同じ内部トピックを使用しようとすると、予期しないエラーが発生するため、インスタンスごとにこれらのプロパティーの値を変更する必要があります。
9.6.2. Kafka Connect のユーザー認可の設定
Kafka で認可を使用する場合、Kafka Connect ユーザーはクラスターグループおよび Kafka Connect の内部トピックへの読み取り/書き込みアクセス権が必要です。この手順では、simple
認可および ACL を使用してアクセス権限を付与する方法を説明します。
Kafka Connect クラスターグループ ID と内部トピックのプロパティーは、デフォルトで Streams for Apache Kafka によって設定されます。あるいは、KafkaConnect
リソースの spec
で明示的に定義することもできます。複数の Kafka Connect インスタンスを実行する 場合はグループ ID とトピックの値が異なる必要があるため、これは複数のインスタンスに対して Kafka Connect を設定する場合に便利です。
簡易認可は、Kafka AclAuthorizer
および StandardAuthorizer
プラグインで管理される ACL ルールを使用し、適切なアクセスレベルを確保します。KafkaUser
リソースに簡易認証を使用するように設定する方法については、AclRule
スキーマリファレンスを参照してください。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
KafkaUser
リソースのauthorization
プロパティーを編集し、アクセス権限をユーザーに付与します。アクセス権は、
literal
名の値を使用して、Kafka Connect トピックとクラスターグループに対して設定されます。次の表に、トピックとクラスターグループ ID に設定されたデフォルトの名前を示します。表9.2 アクセス権設定の名前 プロパティー 名前 offset.storage.topic
connect-cluster-offsets
status.storage.topic
connect-cluster-status
config.storage.topic
connect-cluster-configs
group
connect-cluster
この設定例では、デフォルト名を使用してアクセス権を指定します。Kafka Connect インスタンスに別の名前を使用している場合は、ACL 設定でそれらの名前を使用します。
簡易認可の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: # ... authorization: type: simple acls: # access to offset.storage.topic - resource: type: topic name: connect-cluster-offsets patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to status.storage.topic - resource: type: topic name: connect-cluster-status patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to config.storage.topic - resource: type: topic name: connect-cluster-configs patternType: literal operations: - Create - Describe - Read - Write host: "*" # cluster group - resource: type: group name: connect-cluster patternType: literal operations: - Read host: "*"
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: # ... authorization: type: simple acls: # access to offset.storage.topic - resource: type: topic name: connect-cluster-offsets patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to status.storage.topic - resource: type: topic name: connect-cluster-status patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to config.storage.topic - resource: type: topic name: connect-cluster-configs patternType: literal operations: - Create - Describe - Read - Write host: "*" # cluster group - resource: type: group name: connect-cluster patternType: literal operations: - Read host: "*"
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f KAFKA-USER-CONFIG-FILE
oc apply -f KAFKA-USER-CONFIG-FILE
Copy to Clipboard Copied!
9.6.3. Kafka Connect コネクターの手動停止または一時停止
KafkaConnector
リソースを使用してコネクターを設定している場合は、state
設定を使用してコネクターを停止または一時停止します。コネクターとタスクがインスタンス化されたままになる一時停止状態とは対照的に、コネクターを停止すると設定のみが保持され、アクティブなプロセスは保持されません。コネクター実行の停止は、単に一時停止するよりも長時間停止する場合に適しています。一時停止されたコネクターはすぐに再開されますが、停止されたコネクターにはメモリーとリソースが解放されるという利点があります。
state
設定は、KafkaConnectorSpec
スキーマの (非推奨) pause
設定を置き換えるもので、コネクターでの一時停止を許可します。これまでに pause
設定を使用してコネクターを一時停止した場合には、競合の回避目的にのみ state
設定の使用に移行することを推奨します。
前提条件
- Cluster Operator が稼働中である。
手順
一時停止または停止するコネクターを制御する
KafkaConnector
カスタムリソースの名前を見つけます。oc get KafkaConnector
oc get KafkaConnector
Copy to Clipboard Copied! KafkaConnector
リソースを編集して、コネクターを停止または一時停止します。Kafka Connect コネクターを停止する設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: org.apache.kafka.connect.file.FileStreamSourceConnector tasksMax: 2 config: file: "/opt/kafka/LICENSE" topic: my-topic state: stopped # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: org.apache.kafka.connect.file.FileStreamSourceConnector tasksMax: 2 config: file: "/opt/kafka/LICENSE" topic: my-topic state: stopped # ...
Copy to Clipboard Copied! state
設定をstopped
またはpaused
に変更します。このプロパティーが設定されていない場合のコネクターのデフォルトの状態はrunning
です。変更を
KafkaConnector
設定に適用します。state
をrunning
に変更するか、設定を削除して、コネクターを再開できます。
あるいは、Kafka Connect API を公開し、stop
エンドポイントと 一時pause
エンドポイントを使用してコネクターの実行を停止することもできます。たとえば、PUT /connectors/<connector_name>/stop
などです。その後、resume
エンドポイントを使用して再起動できます。
9.6.4. Kafka Connect コネクターの手動での再起動
KafkaConnector
リソースを使用してコネクターを管理している場合は、strimzi.io/restart
アノテーションを使用してコネクターの再起動を手動でトリガーします。
前提条件
- Cluster Operator が稼働中である。
手順
再起動する Kafka コネクターを制御する
KafkaConnector
カスタムリソースの名前を見つけます。oc get KafkaConnector
oc get KafkaConnector
Copy to Clipboard Copied! OpenShift で
KafkaConnector
リソースにアノテーションを付けて、コネクターを再起動します。oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart="true"
oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart="true"
Copy to Clipboard Copied! restart
アノテーションはtrue
に設定されています。次の調整が発生するまで待ちます (デフォルトでは 2 分ごとです)。
アノテーションが調整プロセスで検出されれば、Kafka コネクターは再起動されます。Kafka Connect が再起動リクエストを受け入れると、アノテーションは
KafkaConnector
カスタムリソースから削除されます。
9.6.5. Kafka Connect コネクタータスクの手動での再起動
KafkaConnector
リソースを使用してコネクターを管理している場合は、strimzi.io/restart-task
アノテーションを使用して、コネクタータスクの再起動を手動でトリガーします。
前提条件
- Cluster Operator が稼働中である。
手順
再起動する Kafka コネクタータスクを制御する
KafkaConnector
カスタムリソースの名前を見つけます。oc get KafkaConnector
oc get KafkaConnector
Copy to Clipboard Copied! KafkaConnector
カスタムリソースから再起動するタスクの ID を検索します。oc describe KafkaConnector <kafka_connector_name>
oc describe KafkaConnector <kafka_connector_name>
Copy to Clipboard Copied! タスク ID は 0 から始まる負の値ではない整数です。
OpenShift で
KafkaConnector
リソースにアノテーションを付けて、ID を使用してコネクタータスクを再開します。oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart-task="0"
oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart-task="0"
Copy to Clipboard Copied! この例では、タスク
0
が再起動されます。次の調整が発生するまで待ちます (デフォルトでは 2 分ごとです)。
アノテーションが調整プロセスで検出されれば、Kafka コネクタータスクは再起動されます。Kafka Connect が再起動リクエストを受け入れると、アノテーションは
KafkaConnector
カスタムリソースから削除されます。
9.7. Kafka MirrorMaker 2 の設定
KafkaMirrorMaker2
カスタムリソースの spec
プロパティーを更新して、MirrorMaker 2 デプロイメントを設定します。MirrorMaker 2 は、データ消費にソースクラスター設定を使用し、データ出力にターゲットクラスター設定を使用します。
MirrorMaker 2 は、クラスター間のデータ転送を管理する コネクター である Kafka Connect フレームワークに基づいています。
MirrorMaker 2 を設定して、ソースクラスターとターゲットクラスターの接続の詳細を含む Kafka Connect デプロイメントを定義し、一連の MirrorMaker 2 コネクターを実行して接続を確立します。
MirrorMaker 2 は、ソースクラスターとターゲットクラスター間のトピック設定の同期をサポートします。MirrorMaker 2 設定でソーストピックを指定します。MirrorMaker 2 はソーストピックを監視します。MirrorMaker 2 は、ソーストピックへの変更を検出し、リモートトピックに伝達します。変更には、欠けているトピックおよびパーティションの自動作成が含まれる場合があります。
ほとんどの場合、ローカルトピックに書き込み、リモートトピックから読み取ります。リモートトピックでは書き込み操作ができないわけではありませんが、使用しないようにしてください。
設定では以下を指定する必要があります。
- 各 Kafka クラスター
- 認証を含む各クラスターの接続情報
レプリケーションのフローおよび方向
- クラスターからクラスターへ
- トピックからトピックへ
Kafka MirrorMaker 2 クラスター設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
MirrorMaker 2 のリソース設定は、現在非推奨になっている以前のバージョンの MirrorMaker とは異なります。現在、レガシーサポートはないため、リソースは手動で新しい形式に変換する必要があります。
デフォルト設定
MirrorMaker 2 は、レプリケーション係数などのプロパティーのデフォルト設定値を提供します。デフォルトに変更がない最小設定の例は以下のようになります。
MirrorMaker 2 の最小設定
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.7.0 connectCluster: "my-cluster-target" clusters: - alias: "my-cluster-source" bootstrapServers: my-cluster-source-kafka-bootstrap:9092 - alias: "my-cluster-target" bootstrapServers: my-cluster-target-kafka-bootstrap:9092 mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: {}
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
version: 3.7.0
connectCluster: "my-cluster-target"
clusters:
- alias: "my-cluster-source"
bootstrapServers: my-cluster-source-kafka-bootstrap:9092
- alias: "my-cluster-target"
bootstrapServers: my-cluster-target-kafka-bootstrap:9092
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector: {}
mTLS または SASL 認証を使用して、ソースおよびターゲットクラスターのアクセス制御を設定できます。この手順では、ソースおよびターゲットクラスターに対して mTLS による暗号化および認証を使用する設定を説明します。
KafkaMirrorMaker2
リソースのソースクラスターからレプリケートするトピックとコンシューマーグループを指定できます。これを行うには、topicsPattern
および groupsPattern
プロパティーを使用します。名前のリストを指定したり、正規表現を使用したりできます。デフォルトでは、topicsPattern
および groupsPattern
プロパティーを設定しない場合、すべてのトピックとコンシューマーグループがレプリケートされます。.*
を正規表現として使用して、すべてのトピックとコンシューマーグループを複製することもできます。ただし、クラスターに不要な負荷が余分にかかるのを避けるため、必要なトピックとコンシューマーグループのみを指定するようにしてください。
大量のメッセージ処理
設定を調整して、大量のメッセージを処理できます。詳細は、大量のメッセージの処理 を参照してください。
KafkaMirrorMaker2
カスタムリソース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.7.0 replicas: 3 connectCluster: "my-cluster-target" clusters: - alias: "my-cluster-source" authentication: certificateAndKey: certificate: source.crt key: source.key secretName: my-user-source type: tls bootstrapServers: my-cluster-source-kafka-bootstrap:9092 tls: trustedCertificates: - certificate: ca.crt secretName: my-cluster-source-cluster-ca-cert - alias: "my-cluster-target" authentication: certificateAndKey: certificate: target.crt key: target.key secretName: my-user-target type: tls bootstrapServers: my-cluster-target-kafka-bootstrap:9092 config: config.storage.replication.factor: 1 offset.storage.replication.factor: 1 status.storage.replication.factor: 1 tls: trustedCertificates: - certificate: ca.crt secretName: my-cluster-target-cluster-ca-cert mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 10 autoRestart: enabled: true config replication.factor: 1 offset-syncs.topic.replication.factor: 1 sync.topic.acls.enabled: "false" refresh.topics.interval.seconds: 60 replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy" heartbeatConnector: autoRestart: enabled: true config: heartbeats.topic.replication.factor: 1 replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy" checkpointConnector: autoRestart: enabled: true config: checkpoints.topic.replication.factor: 1 refresh.groups.interval.seconds: 600 sync.group.offsets.enabled: true sync.group.offsets.interval.seconds: 60 emit.checkpoints.interval.seconds: 60 replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy" topicsPattern: "topic1|topic2|topic3" groupsPattern: "group1|group2|group3" resources: requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: type: inline loggers: connect.root.logger.level: INFO readinessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 jvmOptions: "-Xmx": "1g" "-Xms": "1g" image: my-org/my-image:latest rack: topologyKey: topology.kubernetes.io/zone template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry externalConfiguration: env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-creds key: awsAccessKey - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
version: 3.7.0
replicas: 3
connectCluster: "my-cluster-target"
clusters:
- alias: "my-cluster-source"
authentication:
certificateAndKey:
certificate: source.crt
key: source.key
secretName: my-user-source
type: tls
bootstrapServers: my-cluster-source-kafka-bootstrap:9092
tls:
trustedCertificates:
- certificate: ca.crt
secretName: my-cluster-source-cluster-ca-cert
- alias: "my-cluster-target"
authentication:
certificateAndKey:
certificate: target.crt
key: target.key
secretName: my-user-target
type: tls
bootstrapServers: my-cluster-target-kafka-bootstrap:9092
config:
config.storage.replication.factor: 1
offset.storage.replication.factor: 1
status.storage.replication.factor: 1
tls:
trustedCertificates:
- certificate: ca.crt
secretName: my-cluster-target-cluster-ca-cert
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector:
tasksMax: 10
autoRestart:
enabled: true
config
replication.factor: 1
offset-syncs.topic.replication.factor: 1
sync.topic.acls.enabled: "false"
refresh.topics.interval.seconds: 60
replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
heartbeatConnector:
autoRestart:
enabled: true
config:
heartbeats.topic.replication.factor: 1
replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
checkpointConnector:
autoRestart:
enabled: true
config:
checkpoints.topic.replication.factor: 1
refresh.groups.interval.seconds: 600
sync.group.offsets.enabled: true
sync.group.offsets.interval.seconds: 60
emit.checkpoints.interval.seconds: 60
replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy"
topicsPattern: "topic1|topic2|topic3"
groupsPattern: "group1|group2|group3"
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
connect.root.logger.level: INFO
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
image: my-org/my-image:latest
rack:
topologyKey: topology.kubernetes.io/zone
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
connectContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
externalConfiguration:
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: aws-creds
key: awsAccessKey
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: aws-creds
key: awsSecretAccessKey
- 1
- 常に同じになる Kafka Connect と Mirror Maker 2 のバージョン。
- 2
- タスクを実行するワーカーのレプリカノード数。
- 3
- Kafka Connect の Kafka クラスターエイリアス。ターゲット Kafka クラスターを指定する必要があります。Kafka クラスターは、その内部トピックのために Kafka Connect によって使用されます。
- 4
- 同期される Kafka クラスターの指定。
- 5
- ソースの Kafka クラスターのクラスターエイリアス。
- 6
- ソースクラスターの認証。mTLS、トークンベースの OAuth、SASL ベース SCRAM-SHA-256/SCRAM-SHA-512、または PLAIN として指定します。
- 7
- ソース Kafka クラスターに接続するためのブートストラップサーバー。
- 8
- ソース Kafka クラスターの TLS 証明書が X.509 形式で保存されるキー名のある TLS による暗号化。複数の証明書が同じシークレットに保存されている場合は、複数回リストできます。
- 9
- ターゲット Kafka クラスターのクラスターエイリアス。
- 10
- ターゲット Kafka クラスターの認証は、ソース Kafka クラスターと同様に設定されます。
- 11
- ターゲット Kafka クラスターに接続するためのブートストラップサーバー。
- 12
- Kafka Connect の設定。Streams for Apache Kafka によって直接管理されないプロパティーに限り、標準の Apache Kafka 設定を指定できます。
- 13
- ターゲット Kafka クラスターの TLS による暗号化は、ソース Kafka クラスターと同様に設定されます。
- 14
- MirrorMaker 2 コネクター。
- 15
- MirrorMaker 2 コネクターによって使用されるソースクラスターのクラスターエイリアス。
- 16
- MirrorMaker 2 コネクターによって使用されるターゲットクラスターのクラスターエイリアス。
- 17
- リモートトピックを作成する
MirrorSourceConnector
の設定。デフォルトの設定オプションはconfig
によって上書きされます。 - 18
- コネクターによる作成が可能なタスクの最大数。タスクは、データのレプリケーションを処理し、並行して実行されます。インフラストラクチャーが処理のオーバーヘッドをサポートする場合、この値を大きくするとスループットが向上されます。Kafka Connect は、クラスターのメンバー間でタスクを分散します。ワーカーよりも多くのタスクがある場合は、ワーカーには複数のタスクが割り当てられます。シンクコネクターでは、消費される各トピックパーティションに 1 つタスクがあるようになることを目指します。ソースコネクターでは、並行して実行できるタスクの数は外部システムによって異なる場合もあります。並列処理を実現できない場合、コネクターは最大数より少ないタスクを作成します。
- 19
- 失敗したコネクターとタスクの自動再起動を有効にします。デフォルトでは、再起動の回数は無制限ですが、
maxRestarts
プロパティーを使用して自動再起動の最大回数を設定できます。 - 20
- ターゲットクラスターで作成されるミラーリングされたトピックのレプリケーション係数。
- 21
- ソースおよびターゲットクラスターのオフセットをマップする
MirrorSourceConnector
offset-syncs
内部トピックのレプリケーション係数。 - 22
- ACL ルールの同期が有効になっていると、同期されたトピックに ACL が適用されます。デフォルトは
true
です。この機能は User Operator と互換性がありません。User Operator を使用している場合は、このプロパティーをfalse
に設定します。 - 23
- 新規トピックのチェック頻度を変更する任意設定。デフォルトでは 10 分毎にチェックされます。
- 24
- リモートトピック名の自動変更をオーバーライドするポリシーを追加します。その名前の前にソースクラスターの名前を追加する代わりに、トピックが元の名前を保持します。このオプションの設定は、active/passive バックアップおよびデータ移行に役立ちます。このプロパティーはすべてのコネクターに指定する必要があります。双方向 (アクティブ/アクティブ) レプリケーションの場合、
DefaultReplicationPolicy
クラスを使用してリモートトピックの名前を自動的に変更し、すべてのコネクターにreplication.policy.separator
プロパティーを指定してカスタムセパレーターを追加します。 - 25
- 接続チェックを実行する
MirrorHeartbeatConnector
の設定。デフォルトの設定オプションはconfig
によって上書きされます。 - 26
- ターゲットクラスターで作成されたハートビートトピックのレプリケーション係数。
- 27
- オフセットを追跡する
MirrorCheckpointConnector
の設定。デフォルトの設定オプションはconfig
によって上書きされます。 - 28
- ターゲットクラスターで作成されたチェックポイントトピックのレプリケーション係数。
- 29
- 新規コンシューマーグループのチェック頻度を変更する任意設定。デフォルトでは 10 分毎にチェックされます。
- 30
- コンシューマーグループのオフセットを同期する任意設定。これは、active/passive 設定でのリカバリーに便利です。同期はデフォルトでは有効になっていません。
- 31
- コンシューマーグループオフセットの同期が有効な場合は、同期の頻度を調整できます。
- 32
- オフセット追跡のチェック頻度を調整します。オフセット同期の頻度を変更する場合は、これらのチェックの頻度も調整することを推奨します。
- 33
- コンマ区切りリストまたは正規表現パターンとして定義されたソースクラスターからのトピックレプリケーション。ソースコネクターは指定のトピックをレプリケーションします。チェックポイントコネクターは、指定されたトピックのオフセットを追跡します。ここでは、3 つのトピックを名前でリクエストします。
- 34
- コンマ区切りリストまたは正規表現パターンとして定義されたソースクラスターからのコンシューマーグループのレプリケーション。チェックポイントコネクターは、指定されたコンシューマーグループをレプリケーションします。ここで、3 つのコンシューマーグループを名前で要求します。
- 35
- 現在
cpu
およびmemory
である、サポートされるリソースの予約を要求し、消費可能な最大リソースを指定を制限します。 - 36
- 指定された Kafka ロガーおよびログレベルが ConfigMap を介して直接的に (
inline
) または間接的に (external
) に追加されます。カスタム Log4j 設定は、ConfigMap のlog4j.properties
キーまたはlog4j2.properties
キーの下に配置する必要があります。Kafka Connectlog4j.rootLogger
ロガーでは、ログレベルを INFO、ERROR、WARN、TRACE、DEBUG、FATAL または OFF に設定できます。 - 37
- コンテナーを再起動するタイミング (liveness) およびコンテナーがトラフィックを許可できるタイミング (readiness) を把握するためのヘルスチェック。
- 38
- Kafka MirrorMaker を実行している仮想マシン (VM) のパフォーマンスを最適化するための JVM 設定オプション。
- 39
- 高度なオプション: コンテナーイメージの設定。特別な状況でのみ推奨されます。
- 40
- 特別なオプション: 展開のための Rack awareness 設定。これは、リージョン間ではなく、同じロケーション内でのデプロイメントを目的とした特殊なオプションです。このオプションは、コネクターがリーダーレプリカではなく、最も近いレプリカから消費する場合に使用できます。場合によっては、最も近いレプリカから消費することで、ネットワークの使用率を改善したり、コストを削減したりできます。
topologyKey
は、ラック ID を含むノードラベルと一致する必要があります。この設定で使用される例では、標準のtopology.kubernetes.io/zone
ラベルを使用するゾーンを指定します。最も近いレプリカから消費するには、Kafka ブローカー設定でRackAwareReplicaSelector
を有効にします。 - 41
- テンプレートのカスタマイズ。ここでは、Pod は非アフィニティーでスケジュールされるため、Pod は同じホスト名のノードではスケジュールされません。
- 42
- 分散トレース用に環境変数が設定されます。
- 43
- 分散トレーシングは、OpenTelemetry を使用して有効になります。
- 44
- 環境変数として Kafka MirrorMaker にマウントされた OpenShift Secret の外部設定。設定プロバイダープラグインを使用して、外部ソースから設定値を読み込むこともできます。
9.7.1. アクティブ/アクティブまたはアクティブ/パッシブモードの設定
MirrorMaker 2 は、active/passive または active/active クラスター設定で使用できます。
- アクティブ/アクティブのクラスター設定
- アクティブ/アクティブ設定には、双方向でデータをレプリケーションするアクティブなクラスターが 2 つあります。アプリケーションはいずれかのクラスターを使用できます。各クラスターは同じデータを提供できます。これにより、地理的に異なる場所で同じデータを利用できるようにします。コンシューマーグループは両方のクラスターでアクティブであるため、レプリケーションされたトピックのコンシューマーオフセットはソースクラスターに同期されません。
- active/passive クラスター設定
- active/passive 設定には、passive クラスターにデータをレプリケーションする active クラスターがあります。passive クラスターはスタンバイのままになります。システムに障害が発生した場合に、データ復旧に passive クラスターを使用できます。
プロデューサーとコンシューマーがアクティブなクラスターのみに接続することを前提とします。MirrorMaker 2 クラスターはターゲットごとに必要です。
9.7.1.1. 双方向レプリケーション (active/active)
MirrorMaker 2 アーキテクチャーは、アクティブ/アクティブ クラスター設定での双方向レプリケーションをサポートします。
各クラスターは、source および remote トピックの概念を使用して、別のクラスターのデータをレプリケーションします。同じトピックが各クラスターに保存されるため、リモートトピックの名前は MirrorMaker 2 によってソースクラスターを表すように自動的に変更されます。元のクラスターの名前の先頭には、トピックの名前が追加されます。
図9.1 トピック名の変更

ソースクラスターにフラグを付けると、トピックはそのクラスターにレプリケーションされません。
remote トピックを介したレプリケーションの概念は、データの集約が必要なアーキテクチャーの設定に役立ちます。コンシューマーは、同じクラスター内でソースおよびリモートトピックにサブスクライブできます。これに個別の集約クラスターは必要ありません。
9.7.1.2. 一方向レプリケーション (active/passive)
MirrorMaker 2 アーキテクチャーは、active/passive クラスター設定での一方向レプリケーションをサポートします。
active/passive のクラスター設定を使用してバックアップを作成したり、データを別のクラスターに移行したりできます。この場合、リモートトピックの名前の自動変更は推奨しません。
IdentityReplicationPolicy
をソースコネクター設定に追加することで、名前の自動変更をオーバーライドできます。この設定が適用されると、トピックには元の名前が保持されます。
9.7.2. 複数のインスタンス用の MirrorMaker 2 の設定
デフォルトでは、Streams for Apache Kafka は、MirrorMaker 2 が実行される Kafka Connect フレームワークによって使用される内部トピックのグループ ID と名前を設定します。MirrorMaker 2 の複数のインスタンスを実行し、同じ connectCluster
値を共有する場合は、次の config
プロパティーを使用してこれらのデフォルト設定を変更する必要があります。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: connectCluster: "my-cluster-target" clusters: - alias: "my-cluster-target" config: group.id: my-connect-cluster offset.storage.topic: my-connect-cluster-offsets config.storage.topic: my-connect-cluster-configs status.storage.topic: my-connect-cluster-status # ... # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
connectCluster: "my-cluster-target"
clusters:
- alias: "my-cluster-target"
config:
group.id: my-connect-cluster
offset.storage.topic: my-connect-cluster-offsets
config.storage.topic: my-connect-cluster-configs
status.storage.topic: my-connect-cluster-status
# ...
# ...
group.id
が同じすべてのインスタンスで、3 つのトピックの値を同じにする必要があります。
connectCluster
設定は、Kafka Connect が内部トピックに使用するターゲットの Kafka クラスターのエイリアスを指定します。その結果、connectCluster
、グループ ID、および内部トピックの名前付け設定への変更は、ターゲットの Kafka クラスターに固有のものになります。2 つの MirrorMaker 2 インスタンスが同じソース Kafka クラスターを使用している場合、または MirrorMaker 2 インスタンスごとに connectCluster
設定とターゲットクラスターが異なるアクティブ/アクティブモードを使用している場合は、変更を加える必要はありません。
ただし、複数の MirrorMaker 2 インスタンスが同じ connectCluster
を共有する場合、同じターゲット Kafka クラスターに接続する各インスタンスは同じ値でデプロイされます。実際には、これはすべてのインスタンスがクラスターを形成し、同じ内部トピックを使用することを意味します。
複数のインスタンスが同じ内部トピックを使用しようとすると、予期しないエラーが発生するため、インスタンスごとにこれらのプロパティーの値を変更する必要があります。
9.7.3. MirrorMaker 2 コネクターの設定
Kafka クラスター間のデータの同期を調整する内部コネクターには、MirrorMaker 2 コネクター設定を使用します。
MirrorMaker 2 は次のコネクターで構成されます。
MirrorSourceConnector
-
ソースコネクターは、トピックをソースクラスターからターゲットクラスターにレプリケーションします。また、ACL をレプリケーションし、
MirrorCheckpointConnector
を実行する必要があります。 MirrorCheckpointConnector
- チェックポイントコネクターは定期的にオフセットを追跡します。有効にすると、ソースクラスターとターゲットクラスター間のコンシューマーグループオフセットも同期されます。
MirrorHeartbeatConnector
- ハートビートコネクターは、ソースクラスターとターゲットクラスター間の接続を定期的にチェックします。
以下の表は、コネクタープロパティーと、これらを使用するために設定するコネクターについて説明しています。
プロパティー | sourceConnector | checkpointConnector | heartbeatConnector |
---|---|---|---|
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | |
| ✓ | ✓ | |
| ✓ | ✓ | |
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ |
9.7.3.1. コンシューマーグループオフセットの場所の変更トピック
MirrorMaker 2 は、内部トピックを使用してコンシューマーグループのオフセットを追跡します。
offset-syncs
トピック-
offset-syncs
トピックは、レプリケーションされたトピックパーティションのソースおよびターゲットオフセットをレコードメタデータからマッピングします。 checkpoints
トピック-
checkpoints
トピックは、各コンシューマーグループでレプリケーションされたトピックパーティションのソースおよびターゲットクラスターで、最後にコミットされたオフセットをマッピングします。
これらは MirrorMaker 2 によって内部的に使用されるため、これらのトピックと直接対話することはありません。
MirrorCheckpointConnector
は、オフセット追跡用の チェックポイント を発行します。checkpoints
トピックのオフセットは、設定によって事前に決定された間隔で追跡されます。両方のトピックは、フェイルオーバー時に正しいオフセットの位置からレプリケーションの完全復元を可能にします。
offset-syncs
トピックの場所は、デフォルトで source
クラスターです。offset-syncs.topic.location
コネクター設定を使用して、これを target
クラスターに変更することができます。トピックが含まれるクラスターへの読み取り/書き込みアクセスが必要です。ターゲットクラスターを offset-syncs
トピックの場所として使用すると、ソースクラスターへの読み取りアクセス権しかない場合でも、MirrorMaker 2 を使用できるようになります。
9.7.3.2. コンシューマーグループオフセットの同期
__consumer_offsets
トピックには、各コンシューマーグループのコミットされたオフセットに関する情報が保存されます。オフセットの同期は、ソースクラスターのコンシューマーグループのコンシューマーオフセットをターゲットクラスターのコンシューマーオフセットに定期的に転送します。
オフセットの同期は、特に active/passive 設定で便利です。アクティブなクラスターがダウンした場合、コンシューマーアプリケーションを passive (スタンバイ) クラスターに切り替え、最後に転送されたオフセットの位置からピックアップできます。
トピックオフセットの同期を使用するには、sync.group.offsets.enabled
を checkpoint コネクター設定に追加し、プロパティーを true
に設定して、同期を有効にします。同期はデフォルトで無効になっています。
ソースコネクターで IdentityReplicationPolicy
を使用する場合は、チェックポイントコネクター設定でも設定する必要があります。これにより、ミラーリングされたコンシューマーオフセットが正しいトピックに適用されます。
コンシューマーオフセットは、ターゲットクラスターでアクティブではないコンシューマーグループに対してのみ同期されます。コンシューマーグループがターゲットクラスターにある場合、Synchronization を実行できず、UNKNOWN_MEMBER_ID
エラーが返されます。
同期を有効にすると、ソースクラスターからオフセットの同期が定期的に行われます。この頻度は、sync.group.offsets.interval.seconds
および emit.checkpoints.interval.seconds
をチェックポイントコネクター設定に追加することで変更できます。これらのプロパティーは、コンシューマーグループのオフセットが同期される頻度 (秒単位) と、オフセットを追跡するためにチェックポイントが生成される頻度を指定します。両方のプロパティーのデフォルトは 60 秒です。refresh.groups.interval.seconds
プロパティーを使用して、新規コンシューマーグループのチェック頻度を変更することもできます。デフォルトでは 10 分ごとに実行されます。
同期は時間ベースであるため、コンシューマーによって passive クラスターへ切り替えられると、一部のメッセージが重複する可能性があります。
Java で作成されたアプリケーションがある場合は、RemoteClusterUtils.java
ユーティリティーを使用して、アプリケーションを通じてオフセットを同期できます。ユーティリティーは、checkpoints
トピックからコンシューマーグループのリモートオフセットを取得します。
9.7.3.3. ハートビートコネクターを使用するタイミングの決定
ハートビートコネクターはハートビートを出力して、ソース Kafka クラスターとターゲット Kafka クラスター間の接続を確認します。内部 heartbeat
トピックはソースクラスターからレプリケートされます。つまり、ハートビートコネクターがソースクラスターに接続されている必要があります。heartbeat
トピックはターゲットクラスターに配置されているため、次のことが可能になります。
- データのミラーリング元のすべてのソースクラスターを特定します。
- ミラーリングプロセスの稼働状況と遅延を確認する
これは、プロセスが何らかの理由でスタックしたり停止したりしていないことを確認するのに役立ちます。ハートビートコネクターは、Kafka クラスター間のミラーリングプロセスを監視するための貴重なツールですが、必ずしも使用する必要があるわけではありません。たとえば、デプロイメントのネットワーク遅延が低い場合、またはトピックの数が少ない場合は、ログメッセージやその他の監視ツールを使用してミラーリングプロセスを監視することが推奨されます。ハートビートコネクターを使用しない場合は、MirrorMaker 2 設定からハートビートコネクターを省略してください。
9.7.3.4. MirrorMaker 2 コネクターの設定の調整
MirrorMaker 2 コネクターが正しく動作することを確認するには、コネクター全体で特定の設定を調整してください。具体的には、次のプロパティーが該当するすべてのコネクターで同じ値であることを確認してください。
-
replication.policy.class
-
replication.policy.separator
-
offset-syncs.topic.location
-
topic.filter.class
たとえば、replication.policy.class
の値は、ソース、チェックポイント、およびハートビートコネクターで同じである必要があります。設定が一致していないか欠落していると、データレプリケーションやオフセット同期で問題が発生するため、関連するすべてのコネクターを同じ設定で設定しておくことが重要です。
9.7.4. MirrorMaker 2 コネクターのプロデューサとコンシューマーの設定
MirrorMaker 2 コネクターは、内部プロデューサーとコンシューマーを使用します。必要に応じて、これらのプロデューサーおよびコンシューマーを設定して、デフォルト設定を上書きできます。
たとえば、トピックをターゲットの Kafka クラスターに送信するソースプロデューサーの batch.size
を増やして、大量のデータをより適切に対応できます。
プロデューサおよびコンシューマーの設定オプションは MirrorMaker 2 の実装に依存しており、変更される可能性があります。
次の表では、各コネクターのプロデューサーとコンシューマー、および設定を追加できる場所について説明します。
タイプ | 説明 | 設定 |
---|---|---|
プロデューサー | トピックメッセージをターゲット Kafka クラスターに送信します。大量のデータを処理する場合は、このプロデューサーの設定を調整することを検討してください。 |
|
プロデューサー |
レプリケートされたトピックパーティションのソースオフセットとターゲットオフセットをマップする、 |
|
コンシューマー | ソース Kafka クラスターからトピックメッセージを取得します。 |
|
タイプ | 説明 | 設定 |
---|---|---|
プロデューサー | コンシューマーオフセットチェックポイントを発行します。 |
|
コンシューマー |
|
|
offset-syncs.topic.location
を target
に設定して、ターゲット Kafka クラスターを offset-syncs
トピックの場所として使用できます。
タイプ | 説明 | 設定 |
---|---|---|
プロデューサー | ハートビートを生成します。 |
|
次の例は、プロデューサーとコンシューマーを設定する方法を示しています。
コネクターのプロデューサーとコンシューマーの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.7.0 # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 5 config: producer.override.batch.size: 327680 producer.override.linger.ms: 100 producer.request.timeout.ms: 30000 consumer.fetch.max.bytes: 52428800 # ... checkpointConnector: config: producer.override.request.timeout.ms: 30000 consumer.max.poll.interval.ms: 300000 # ... heartbeatConnector: config: producer.override.request.timeout.ms: 30000 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
version: 3.7.0
# ...
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector:
tasksMax: 5
config:
producer.override.batch.size: 327680
producer.override.linger.ms: 100
producer.request.timeout.ms: 30000
consumer.fetch.max.bytes: 52428800
# ...
checkpointConnector:
config:
producer.override.request.timeout.ms: 30000
consumer.max.poll.interval.ms: 300000
# ...
heartbeatConnector:
config:
producer.override.request.timeout.ms: 30000
# ...
9.7.5. データ複製タスクの最大数の指定
コネクターは、Kafka にデータを出し入れするタスクを作成します。各コネクターは 1 つ以上のタスクで構成されます。タスクは、タスクを実行するワーカー Pod のグループ全体に分散されます。タスクの数を増やすと、多数のパーティションをレプリケーションするとき、または多数のコンシューマーグループのオフセットを同期するときのパフォーマンスの問題に役立ちます。
タスクは並行して実行されます。ワーカーには 1 つ以上のタスクが割り当てられます。1 つのタスクが 1 つのワーカー Pod によって処理されるため、タスクよりも多くのワーカー Pod は必要ありません。ワーカーよりも多くのタスクがある場合、ワーカーは複数のタスクを処理します。
tasksMax
プロパティーを使用して、MirrorMaker 設定でコネクタータスクの最大数を指定できます。タスクの最大数を指定しない場合、デフォルト設定のタスク数は 1 つです。
ハートビートコネクターは常に単一のタスクを使用します。
ソースおよびチェックポイントコネクターに対して開始されるタスクの数は、可能なタスクの最大数と tasksMax
の値の間の低い値です。ソースコネクターの場合、可能なタスクの最大数は、ソースクラスターからレプリケーションされるパーティションごとに 1 つです。チェックポイントコネクターの場合、可能なタスクの最大数は、ソースクラスターからレプリケーションされるコンシューマーグループごとに 1 つです。タスクの最大数を設定するときは、プロセスをサポートするパーティションの数とハードウェアリソースを考慮してください。
インフラストラクチャーが処理のオーバーヘッドをサポートしている場合、タスクの数を増やすと、スループットと待機時間が向上する可能性があります。たとえば、タスクを追加すると、多数のパーティションまたはコンシューマーグループがある場合に、ソースクラスターのポーリングにかかる時間が短縮されます。
ソースコネクターのタスク数を増やすと、多数のパーティションがある場合に役立ちます。
ソースコネクターのタスク数を増やす
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 10 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
# ...
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
sourceConnector:
tasksMax: 10
# ...
多数のコンシューマーグループがある場合は、チェックポイントコネクターのタスク数を増やすと便利です。
チェックポイントコネクターのタスク数の増加
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" checkpointConnector: tasksMax: 10 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: my-mirror-maker2
spec:
# ...
mirrors:
- sourceCluster: "my-cluster-source"
targetCluster: "my-cluster-target"
checkpointConnector:
tasksMax: 10
# ...
デフォルトでは、MirrorMaker 2 は 10 分ごとに新しいコンシューマーグループをチェックします。refresh.groups.interval.seconds
設定を調整して、頻度を変更できます。低く調整するときは注意してください。より頻繁なチェックは、パフォーマンスに悪影響を及ぼす可能性があります。
9.7.5.1. コネクタータスクの動作の確認
Prometheus と Grafana を使用してデプロイメントを監視している場合は、MirrorMaker 2 のパフォーマンスをチェックできます。Streams for Apache Kafka に付属する MirrorMaker 2 Grafana ダッシュボードの例では、タスクとレイテンシーに関連する次のメトリクスが表示されます。
- タスクの数
- レプリケーションのレイテンシー
- オフセット同期のレイテンシー
9.7.6. リモートトピックの ACL ルールの同期
MirrorMaker 2 を Streams for Apache Kafka と併用すると、リモートトピックの ACL ルールを同期できます。ただし、この機能は User Operator を使用していない場合にのみ使用できます。
User Operator を使用せずに type: simple
認可を使用している場合、ブローカーへのアクセスを管理する ACL ルールはリモートトピックにも適用されます。これは、ソーストピックへの読み取りアクセス権を持つユーザーが、リモートの同等のトピックを読み取ることもできることを意味します。
OAuth 2.0 での認可は、このようなリモートトピックへのアクセスをサポートしません。
9.7.7. Kafka MirrorMaker 2 デプロイメントの保護
この手順では、MirrorMaker 2 デプロイメントを保護するために必要な設定の概要を説明します。
ソース Kafka クラスターとターゲット Kafka クラスターには別々の設定が必要です。また、MirrorMaker がソースおよびターゲットの Kafka クラスターに接続するために必要な認証情報を提供するために、個別のユーザー設定が必要です。
Kafka クラスターの場合、OpenShift クラスター内のセキュア接続用の内部リスナーと、OpenShift クラスター外の接続用の外部リスナーを指定します。
認証および認可メカニズムを設定できます。ソースおよびターゲットの Kafka クラスターに実装されたセキュリティーオプションは、MirrorMaker 2 に実装されたセキュリティーオプションと互換性がある必要があります。
クラスターとユーザー認証情報を作成したら、セキュアな接続のために MirrorMaker 設定でそれらを指定します。
この手順では、Cluster Operator によって生成された証明書が使用されますが、独自の証明書をインストール してそれらを置き換えることができます。外部 CA (認証局) によって管理される Kafka リスナー証明書を使用 するようにリスナーを設定することもできます。
作業を開始する前の注意事項
この手順を開始する前に、Streams for Apache Kafka に付属する サンプル設定ファイル を確認してください。これらには、mTLS または SCRAM-SHA-512 認証を使用して MirrorMaker 2 のデプロイメントを保護するための例が含まれています。例では、OpenShift クラスター内で接続するための内部リスナーを指定しています。
この例では、ソースおよびターゲットの Kafka クラスターでのユーザー操作を許可する ACL を含む、完全な認可の設定も提供します。
ソースおよびターゲット Kafka クラスターへのユーザーアクセスを設定する場合、ACL は内部 MirrorMaker 2 コネクターへのアクセス権と、ターゲットクラスター内の基盤となる Kafka Connect フレームワークによって使用されるクラスターグループおよび内部トピックへの読み取り/書き込みアクセス権を割り当てる必要があります。複数のインスタンスに対して MirrorMaker 2 を設定する など、クラスターグループまたは内部トピックの名前を変更した場合は、ACL 設定でその名前を使用します。
簡易認可は、Kafka AclAuthorizer
および StandardAuthorizer
プラグインで管理される ACL ルールを使用し、適切なアクセスレベルを確保します。KafkaUser
リソースに簡易認証を使用するように設定する方法については、AclRule
スキーマリファレンスを参照してください。
前提条件
- Streams for Apache Kafka が実行中である。
- ソースクラスターとターゲットクラスターの namespace が分離されている。
この手順では、ソースとターゲットの Kafka クラスターが別の namespace にインストールされていることを前提としています。Topic Operator を使用する場合は、こちらを行う必要があります。Topoic Operator は、指定された namespace 内の単一クラスターのみをモニタリングします。
クラスターを namespace に分割することにより、クラスターシークレットをコピーして、namespace の外部からアクセスできるようにする必要があります。MirrorMaker 設定でシークレットを参照する必要があります。
手順
2 つの
Kafka
リソースを設定します。1 つはソース Kafka クラスターを保護するためのもので、もう 1 つはターゲット Kafka クラスターを保護するためのものです。認証用のリスナー設定を追加し、認可を有効にすることができます。
この例の場合、内部リスナーは mTLS 暗号化と認証を使用して Kafka クラスター用に設定されています。Kafka の
simple
認可が有効になっています。TLS 暗号化と mTLS 認証を使用したソース Kafka クラスター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-source-cluster spec: kafka: version: 3.7.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.7" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-source-cluster spec: kafka: version: 3.7.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.7" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}
Copy to Clipboard Copied! TLS 暗号化と mTLS 認証を使用したターゲット Kafka クラスター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-target-cluster spec: kafka: version: 3.7.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.7" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-target-cluster spec: kafka: version: 3.7.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.7" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}
Copy to Clipboard Copied! 別の namespace で
Kafka
リソースを作成または更新します。oc apply -f <kafka_configuration_file> -n <namespace>
oc apply -f <kafka_configuration_file> -n <namespace>
Copy to Clipboard Copied! Cluster Operator はリスナーを作成し、クラスターおよびクライアント認証局 (CA) 証明書を設定して Kafka クラスター内で認証を有効にします。
証明書は、シークレット
<cluster_name>-cluster-ca-cert
に作成されます。2 つの
KafkaUser
リソースを設定します。1 つはソース Kafka クラスターのユーザー用で、もう 1 つはターゲット Kafka クラスターのユーザー用です。-
対応するソースおよびターゲットの Kafka クラスターと同じ認証および認可タイプを設定します。たとえば、ソース Kafka クラスターの
Kafka
設定でtls
認証とsimple
認可タイプを使用した場合は、KafkaUser
設定でも同じものを使用します。 - MirrorMaker 2 に必要な ACL を設定して、ソースおよびターゲットの Kafka クラスターでの操作を許可します。
mTLS 認証のソースユーザー設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-source-user labels: strimzi.io/cluster: my-source-cluster spec: authentication: type: tls authorization: type: simple acls: # MirrorSourceConnector - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - Create - DescribeConfigs - Read - Write - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - DescribeConfigs - Read # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: # Needed for every group for which offsets are synced type: group name: "*" operations: - Describe - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - Read
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-source-user labels: strimzi.io/cluster: my-source-cluster spec: authentication: type: tls authorization: type: simple acls: # MirrorSourceConnector - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - Create - DescribeConfigs - Read - Write - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - DescribeConfigs - Read # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: # Needed for every group for which offsets are synced type: group name: "*" operations: - Describe - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - Read
Copy to Clipboard Copied! mTLS 認証のターゲットユーザー設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-target-user labels: strimzi.io/cluster: my-target-cluster spec: authentication: type: tls authorization: type: simple acls: # cluster group - resource: type: group name: mirrormaker2-cluster operations: - Read # access to config.storage.topic - resource: type: topic name: mirrormaker2-cluster-configs operations: - Create - Describe - DescribeConfigs - Read - Write # access to status.storage.topic - resource: type: topic name: mirrormaker2-cluster-status operations: - Create - Describe - DescribeConfigs - Read - Write # access to offset.storage.topic - resource: type: topic name: mirrormaker2-cluster-offsets operations: - Create - Describe - DescribeConfigs - Read - Write # MirrorSourceConnector - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - Create - Alter - AlterConfigs - Write # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: type: topic name: my-source-cluster.checkpoints.internal operations: - Create - Describe - Read - Write - resource: # Needed for every group for which the offset is synced type: group name: "*" operations: - Read - Describe # MirrorHeartbeatConnector - resource: type: topic name: heartbeats operations: - Create - Describe - Write
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-target-user labels: strimzi.io/cluster: my-target-cluster spec: authentication: type: tls authorization: type: simple acls: # cluster group - resource: type: group name: mirrormaker2-cluster operations: - Read # access to config.storage.topic - resource: type: topic name: mirrormaker2-cluster-configs operations: - Create - Describe - DescribeConfigs - Read - Write # access to status.storage.topic - resource: type: topic name: mirrormaker2-cluster-status operations: - Create - Describe - DescribeConfigs - Read - Write # access to offset.storage.topic - resource: type: topic name: mirrormaker2-cluster-offsets operations: - Create - Describe - DescribeConfigs - Read - Write # MirrorSourceConnector - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - Create - Alter - AlterConfigs - Write # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: type: topic name: my-source-cluster.checkpoints.internal operations: - Create - Describe - Read - Write - resource: # Needed for every group for which the offset is synced type: group name: "*" operations: - Read - Describe # MirrorHeartbeatConnector - resource: type: topic name: heartbeats operations: - Create - Describe - Write
Copy to Clipboard Copied! 注記type
をtls-external
に設定することにより、User Operator の外部で発行された証明書を使用できます。詳細は、KafkaUserSpec
スキーマリファレンス を参照してください。-
対応するソースおよびターゲットの Kafka クラスターと同じ認証および認可タイプを設定します。たとえば、ソース Kafka クラスターの
ソースおよびターゲットの Kafka クラスター用に作成した各 namespace で、
KafkaUser
リソースを作成または更新します。oc apply -f <kafka_user_configuration_file> -n <namespace>
oc apply -f <kafka_user_configuration_file> -n <namespace>
Copy to Clipboard Copied! User Operator はクライアント (MirrorMaker) に対応するユーザーを作成すると共に、選択した認証タイプに基づいて、クライアント認証に使用されるセキュリティークレデンシャルを作成します。
User Operator は、
KafkaUser
リソースと同じ名前の新しいシークレットを作成します。シークレットには、mTLS 認証用の秘密鍵と公開鍵が含まれています。公開鍵は、クライアント CA によって署名されたユーザー証明書に含まれます。ソースおよびターゲットの Kafka クラスターに接続するための認証の詳細を使用して
KafkaMirrorMaker2
リソースを設定します。TLS 暗号化と mTLS 認証を使用した MirrorMaker 2 設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker-2 spec: version: 3.7.0 replicas: 1 connectCluster: "my-target-cluster" clusters: - alias: "my-source-cluster" bootstrapServers: my-source-cluster-kafka-bootstrap:9093 tls: trustedCertificates: - secretName: my-source-cluster-cluster-ca-cert certificate: ca.crt authentication: type: tls certificateAndKey: secretName: my-source-user certificate: user.crt key: user.key - alias: "my-target-cluster" bootstrapServers: my-target-cluster-kafka-bootstrap:9093 tls: trustedCertificates: - secretName: my-target-cluster-cluster-ca-cert certificate: ca.crt authentication: type: tls certificateAndKey: secretName: my-target-user certificate: user.crt key: user.key config: # -1 means it will use the default replication factor configured in the broker config.storage.replication.factor: -1 offset.storage.replication.factor: -1 status.storage.replication.factor: -1 mirrors: - sourceCluster: "my-source-cluster" targetCluster: "my-target-cluster" sourceConnector: config: replication.factor: 1 offset-syncs.topic.replication.factor: 1 sync.topic.acls.enabled: "false" heartbeatConnector: config: heartbeats.topic.replication.factor: 1 checkpointConnector: config: checkpoints.topic.replication.factor: 1 sync.group.offsets.enabled: "true" topicsPattern: "topic1|topic2|topic3" groupsPattern: "group1|group2|group3"
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker-2 spec: version: 3.7.0 replicas: 1 connectCluster: "my-target-cluster" clusters: - alias: "my-source-cluster" bootstrapServers: my-source-cluster-kafka-bootstrap:9093 tls:
1 trustedCertificates: - secretName: my-source-cluster-cluster-ca-cert certificate: ca.crt authentication:
2 type: tls certificateAndKey: secretName: my-source-user certificate: user.crt key: user.key - alias: "my-target-cluster" bootstrapServers: my-target-cluster-kafka-bootstrap:9093 tls:
3 trustedCertificates: - secretName: my-target-cluster-cluster-ca-cert certificate: ca.crt authentication:
4 type: tls certificateAndKey: secretName: my-target-user certificate: user.crt key: user.key config: # -1 means it will use the default replication factor configured in the broker config.storage.replication.factor: -1 offset.storage.replication.factor: -1 status.storage.replication.factor: -1 mirrors: - sourceCluster: "my-source-cluster" targetCluster: "my-target-cluster" sourceConnector: config: replication.factor: 1 offset-syncs.topic.replication.factor: 1 sync.topic.acls.enabled: "false" heartbeatConnector: config: heartbeats.topic.replication.factor: 1 checkpointConnector: config: checkpoints.topic.replication.factor: 1 sync.group.offsets.enabled: "true" topicsPattern: "topic1|topic2|topic3" groupsPattern: "group1|group2|group3"
Copy to Clipboard Copied! ターゲット Kafka クラスターと同じ namespace で
KafkaMirrorMaker2
リソースを作成または更新します。oc apply -f <mirrormaker2_configuration_file> -n <namespace_of_target_cluster>
oc apply -f <mirrormaker2_configuration_file> -n <namespace_of_target_cluster>
Copy to Clipboard Copied!
9.7.8. MirrorMaker 2 コネクターの手動停止または一時停止
KafkaMirrorMaker2
リソースを使用して内部 MirrorMaker コネクターを設定している場合は、state
設定を使用してコネクターを停止または一時停止します。コネクターとタスクがインスタンス化されたままになる一時停止状態とは対照的に、コネクターを停止すると設定のみが保持され、アクティブなプロセスは保持されません。コネクター実行の停止は、単に一時停止するよりも長時間停止する場合に適しています。一時停止されたコネクターはすぐに再開されますが、停止されたコネクターにはメモリーとリソースが解放されるという利点があります。
state
設定は、KafkaMirrorMaker2ConnectorSpec
スキーマの (非推奨) pause
設定を置き換えるもので、コネクターでの一時停止を許可します。これまでに pause
設定を使用してコネクターを一時停止した場合には、競合の回避目的にのみ state
設定の使用に移行することを推奨します。
前提条件
- Cluster Operator が稼働中である。
手順
再起動する MirrorMaker 2 コネクターを制御する
KafkaMirrorMaker2
カスタムリソースの名前を見つけます。oc get KafkaMirrorMaker2
oc get KafkaMirrorMaker2
Copy to Clipboard Copied! KafkaMirrorMaker2
リソースを編集して、コネクターを停止または一時停止します。MirrorMaker 2 コネクターを停止するための設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.7.0 replicas: 3 connectCluster: "my-cluster-target" clusters: # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 10 autoRestart: enabled: true state: stopped # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.7.0 replicas: 3 connectCluster: "my-cluster-target" clusters: # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 10 autoRestart: enabled: true state: stopped # ...
Copy to Clipboard Copied! state
設定をstopped
またはpaused
に変更します。このプロパティーが設定されていない場合のコネクターのデフォルトの状態はrunning
です。変更を
KafkaMirrorMaker2
設定に適用します。state
をrunning
に変更するか、設定を削除して、コネクターを再開できます。
あるいは、Kafka Connect API を公開し、stop
エンドポイントと 一時pause
エンドポイントを使用してコネクターの実行を停止することもできます。たとえば、PUT /connectors/<connector_name>/stop
などです。その後、resume
エンドポイントを使用して再起動できます。
9.7.9. MirrorMaker 2 コネクターの手動での再起動
strimzi.io/restart-connector
アノテーションを使用して、MirrorMaker 2 コネクターの再起動を手動でトリガーします。
前提条件
- Cluster Operator が稼働中である。
手順
再起動する Kafka MirrorMaker 2 コネクターを制御する
KafkaMirrorMaker2
カスタムリソースの名前を見つけます。oc get KafkaMirrorMaker2
oc get KafkaMirrorMaker2
Copy to Clipboard Copied! KafkaMirrorMaker2
カスタムリソースから再起動する Kafka MirrorMaker 2 コネクターの名前を見つけます。oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>
oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>
Copy to Clipboard Copied! コネクターの名前を使用して、OpenShift の
KafkaMirrorMaker2
リソースにアノテーションを付けてコネクターを再起動します。oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector=<mirrormaker_connector_name>"
oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector=<mirrormaker_connector_name>"
Copy to Clipboard Copied! この例では、
my-mirror-maker-2
クラスター内のmy-connector
コネクターが再起動されます。oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector=my-connector"
oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector=my-connector"
Copy to Clipboard Copied! 次の調整が発生するまで待ちます (デフォルトでは 2 分ごとです)。
アノテーションが調整プロセスによって検出されているかぎり、MirrorMaker 2 コネクターは再起動されます。MirrorMaker 2 がリクエストを受け入れると、アノテーションは
KafkaMirrorMaker2
カスタムリソースから削除されます。
9.7.10. MirrorMaker 2 コネクタータスクの手動での再起動
strimzi.io/restart-connector-task
アノテーションを使用して、MirrorMaker 2 コネクターの再起動を手動でトリガーします。
前提条件
- Cluster Operator が稼働中である。
手順
再起動する MirrorMaker 2 コネクタータスクを制御する
KafkaMirrorMaker2
カスタムリソースの名前を見つけます。oc get KafkaMirrorMaker2
oc get KafkaMirrorMaker2
Copy to Clipboard Copied! KafkaMirrorMaker2
カスタムリソースから、コネクターの名前と再起動するタスクの ID を検索します。oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>
oc describe KafkaMirrorMaker2 <mirrormaker_cluster_name>
Copy to Clipboard Copied! タスク ID は 0 から始まる負の値ではない整数です。
名前と ID を使用して、OpenShift の
KafkaMirrorMaker2
リソースにアノテーションを付けてコネクタータスクを再開します。oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector-task=<mirrormaker_connector_name>:<task_id>"
oc annotate KafkaMirrorMaker2 <mirrormaker_cluster_name> "strimzi.io/restart-connector-task=<mirrormaker_connector_name>:<task_id>"
Copy to Clipboard Copied! この例では、
my-mirror-maker-2
クラスター内のmy-connector
コネクターのタスク0
が再起動されます。oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector-task=my-connector:0"
oc annotate KafkaMirrorMaker2 my-mirror-maker-2 "strimzi.io/restart-connector-task=my-connector:0"
Copy to Clipboard Copied! 次の調整が発生するまで待ちます (デフォルトでは 2 分ごとです)。
アノテーションが調整プロセスによって検出されているかぎり、MirrorMaker 2 コネクタータスクが再起動されます。MirrorMaker 2 がリクエストを受け入れると、アノテーションは
KafkaMirrorMaker2
カスタムリソースから削除されます。
9.8. Kafka MirrorMaker の設定 (非推奨)
KafkaMirrorMaker
カスタムリソースの spec
プロパティーを更新して、Kafka MirrorMaker デプロイメントを設定します。
TLS または SASL 認証を使用して、プロデューサーおよびコンシューマーのアクセス制御を設定できます。この手順では、コンシューマーおよびプロデューサー側で mTLS による暗号化および認証を使用する設定を説明します。
Kafka MirrorMaker クラスター設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
Kafka MirrorMaker 1 (ドキュメントでは単に MirrorMaker と呼ばれる) は Apache Kafka 3.0.0 で非推奨となり、Apache Kafka 4.0.0 で削除されます。そのため、Kafka MirrorMaker 1 のデプロイに使用される KafkaMirrorMaker
カスタムリソースも、Streams for Apache Kafka で非推奨となりました。KafkaMirrorMaker
リソースは、Apache Kafka 4.0.0 の導入時に Streams for Apache Kafka から削除されます。代わりに、IdentityReplicationPolicy
で KafkaMirrorMaker2
カスタムリソースを使用します。
KafkaMirrorMaker
カスタムリソース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker metadata: name: my-mirror-maker spec: replicas: 3 consumer: bootstrapServers: my-source-cluster-kafka-bootstrap:9092 groupId: "my-group" numStreams: 2 offsetCommitInterval: 120000 tls: trustedCertificates: - secretName: my-source-cluster-ca-cert certificate: ca.crt authentication: type: tls certificateAndKey: secretName: my-source-secret certificate: public.crt key: private.key config: max.poll.records: 100 receive.buffer.bytes: 32768 producer: bootstrapServers: my-target-cluster-kafka-bootstrap:9092 abortOnSendFailure: false tls: trustedCertificates: - secretName: my-target-cluster-ca-cert certificate: ca.crt authentication: type: tls certificateAndKey: secretName: my-target-secret certificate: public.crt key: private.key config: compression.type: gzip batch.size: 8192 include: "my-topic|other-topic" resources: requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: type: inline loggers: mirrormaker.root.logger: INFO readinessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 metricsConfig: type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: my-config-map key: my-key jvmOptions: "-Xmx": "1g" "-Xms": "1g" image: my-org/my-image:latest template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" mirrorMakerContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker
metadata:
name: my-mirror-maker
spec:
replicas: 3
consumer:
bootstrapServers: my-source-cluster-kafka-bootstrap:9092
groupId: "my-group"
numStreams: 2
offsetCommitInterval: 120000
tls:
trustedCertificates:
- secretName: my-source-cluster-ca-cert
certificate: ca.crt
authentication:
type: tls
certificateAndKey:
secretName: my-source-secret
certificate: public.crt
key: private.key
config:
max.poll.records: 100
receive.buffer.bytes: 32768
producer:
bootstrapServers: my-target-cluster-kafka-bootstrap:9092
abortOnSendFailure: false
tls:
trustedCertificates:
- secretName: my-target-cluster-ca-cert
certificate: ca.crt
authentication:
type: tls
certificateAndKey:
secretName: my-target-secret
certificate: public.crt
key: private.key
config:
compression.type: gzip
batch.size: 8192
include: "my-topic|other-topic"
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
mirrormaker.root.logger: INFO
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
image: my-org/my-image:latest
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
mirrorMakerContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
- 1
- レプリカノードの数。
- 2
- コンシューマーおよびプロデューサーのブートストラップサーバー。
- 3
- コンシューマーのグループ ID。
- 4
- コンシューマーストリームの数。
- 5
- オフセットの自動コミット間隔 (ミリ秒単位)。
- 6
- コンシューマーまたはプロデューサーの TLS 証明書が X.509 形式で保存されるキー名のある TLS による暗号化。複数の証明書が同じシークレットに保存されている場合は、複数回リストできます。
- 7
- mTLS、トークンベースの OAuth、SASL ベース SCRAM-SHA-256/SCRAM-SHA-512、または PLAIN として指定されたコンシューマーまたはプロデューサーの認証。
- 8
- コンシューマーおよびプロデューサーの Kafka 設定オプション。
- 9
abortOnSendFailure
プロパティーがtrue
に設定されている場合、メッセージの送信に失敗した後、Kafka MirrorMaker は終了し、コンテナーは再起動します。- 10
- ソースからターゲット Kafka クラスターにミラーリングされた含まれるトピックの一覧。
- 11
- 現在
cpu
およびmemory
である、サポートされるリソースの予約を要求し、消費可能な最大リソースを指定を制限します。 - 12
- ConfigMap より直接的 (
inline
) または間接的 (external
) に追加されたロガーおよびログレベルを指定します。カスタム Log4j 設定は、ConfigMap のlog4j.properties
キーまたはlog4j2.properties
キーの下に配置する必要があります。MirrorMaker にはmirrormaker.root.logger
と呼ばれる単一のロガーがあります。ログレベルは INFO、ERROR、WARN、TRACE、DEBUG、FATAL、または OFF に設定できます。 - 13
- コンテナーを再起動するタイミング (liveness) およびコンテナーがトラフィックを許可できるタイミング (readiness) を把握するためのヘルスチェック。
- 14
- Prometheus メトリクス。この例では、Prometheus JMX エクスポーターの設定が含まれる ConfigMap を参照して有効になります。
metricsConfig.valueFrom.configMapKeyRef.key
配下に空のファイルが含まれる ConfigMap の参照を使用して、追加設定なしでメトリックを有効にできます。 - 15
- Kafka MirrorMaker を実行している仮想マシン (VM) のパフォーマンスを最適化するための JVM 設定オプション。
- 16
- 高度なオプション: コンテナーイメージの設定。特別な状況でのみ推奨されます。
- 17
- テンプレートのカスタマイズ。ここでは、Pod は非アフィニティーでスケジュールされるため、Pod は同じホスト名のノードではスケジュールされません。
- 18
- 分散トレース用に環境変数が設定されます。
- 19
- 分散トレーシングは、OpenTelemetry を使用して有効になります。警告
abortOnSendFailure
プロパティーがfalse
に設定されると、プロデューサーはトピックの次のメッセージを送信しようとします。失敗したメッセージは再送されないため、元のメッセージが失われる可能性があります。
9.9. Kafka Bridge の設定
KafkaBridge
カスタムリソースの spec
プロパティーを更新して、Kafka Bridge デプロイメントを設定します。
クライアントのコンシューマーリクエストが異なる Kafka Bridge インスタンスによって処理された場合に発生する問題を防ぐには、アドレスベースのルーティングを利用して、要求が適切な Kafka Bridge インスタンスにルーティングされるようにする必要があります。また、独立した各 Kafka Bridge インスタンスにレプリカが必要です。Kafka Bridge インスタンスには、別のインスタンスと共有されない独自の状態があります。
Kafka Bridge クラスターの設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
KafkaBridge
カスタムリソース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: replicas: 3 bootstrapServers: <cluster_name>-cluster-kafka-bootstrap:9092 tls: trustedCertificates: - secretName: my-cluster-cluster-cert certificate: ca.crt - secretName: my-cluster-cluster-cert certificate: ca2.crt authentication: type: tls certificateAndKey: secretName: my-secret certificate: public.crt key: private.key http: port: 8080 cors: allowedOrigins: "https://strimzi.io" allowedMethods: "GET,POST,PUT,DELETE,OPTIONS,PATCH" consumer: config: auto.offset.reset: earliest producer: config: delivery.timeout.ms: 300000 resources: requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: type: inline loggers: logger.bridge.level: INFO # enabling DEBUG just for send operation logger.send.name: "http.openapi.operation.send" logger.send.level: DEBUG jvmOptions: "-Xmx": "1g" "-Xms": "1g" readinessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 image: my-org/my-image:latest template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" bridgeContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaBridge
metadata:
name: my-bridge
spec:
replicas: 3
bootstrapServers: <cluster_name>-cluster-kafka-bootstrap:9092
tls:
trustedCertificates:
- secretName: my-cluster-cluster-cert
certificate: ca.crt
- secretName: my-cluster-cluster-cert
certificate: ca2.crt
authentication:
type: tls
certificateAndKey:
secretName: my-secret
certificate: public.crt
key: private.key
http:
port: 8080
cors:
allowedOrigins: "https://strimzi.io"
allowedMethods: "GET,POST,PUT,DELETE,OPTIONS,PATCH"
consumer:
config:
auto.offset.reset: earliest
producer:
config:
delivery.timeout.ms: 300000
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gi
logging:
type: inline
loggers:
logger.bridge.level: INFO
# enabling DEBUG just for send operation
logger.send.name: "http.openapi.operation.send"
logger.send.level: DEBUG
jvmOptions:
"-Xmx": "1g"
"-Xms": "1g"
readinessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
livenessProbe:
initialDelaySeconds: 15
timeoutSeconds: 5
image: my-org/my-image:latest
template:
pod:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: application
operator: In
values:
- postgresql
- mongodb
topologyKey: "kubernetes.io/hostname"
bridgeContainer:
env:
- name: OTEL_SERVICE_NAME
value: my-otel-service
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otlp-host:4317"
tracing:
type: opentelemetry
- 1
- レプリカノードの数。
- 2
- ターゲット Kafka クラスターに接続するためのブートストラップサーバー。Kafka クラスターの名前は <cluster_name> を使用します。
- 3
- ソース Kafka クラスターの TLS 証明書が X.509 形式で保存されるキー名のある TLS による暗号化。複数の証明書が同じシークレットに保存されている場合は、複数回リストできます。
- 4
- mTLS、トークンベースの OAuth、SASL ベース SCRAM-SHA-256/SCRAM-SHA-512、または PLAIN として指定された Kafka Bridge クラスターの認証。デフォルトでは、Kafka Bridge は認証なしで Kafka ブローカーに接続します。
- 5
- Kafka ブローカーへの HTTP アクセス。
- 6
- 選択されたリソースおよびアクセスメソッドを指定する CORS アクセス。要求に別の HTTP ヘッダーを追加して、Kafka クラスターへのアクセスが許可されるオリジンが記述されます。
- 7
- コンシューマー設定オプション。
- 8
- プロデューサー設定オプション。
- 9
- 現在
cpu
およびmemory
である、サポートされるリソースの予約を要求し、消費可能な最大リソースを指定を制限します。 - 10
- 指定された Kafka Bridge ロガーおよびログレベルが ConfigMap を介して直接的に (
inline
) または間接的に (external
) に追加されます。カスタム Log4j 設定は、ConfigMap のlog4j.properties
キーまたはlog4j2.properties
キーの下に配置する必要があります。Kafka Bridge ロガーでは、ログレベルを INFO、ERROR、WARN、TRACE、DEBUG、FATAL または OFF に設定できます。 - 11
- Kafka Bridge を実行している仮想マシン (VM) のパフォーマンスを最適化するための JVM 設定オプション。
- 12
- コンテナーを再起動するタイミング (liveness) およびコンテナーがトラフィックを許可できるタイミング (readiness) を把握するためのヘルスチェック。
- 13
- オプション: コンテナーイメージの設定。これは、特別な状況でのみ推奨されます。
- 14
- テンプレートのカスタマイズ。ここでは、Pod は非アフィニティーでスケジュールされるため、Pod は同じホスト名のノードではスケジュールされません。
- 15
- 分散トレース用に環境変数が設定されます。
- 16
- 分散トレーシングは、OpenTelemetry を使用して有効になります。
9.10. Kafka および ZooKeeper ストレージの設定
Streams for Apache Kafka では、Kafka と ZooKeeper のデータストレージオプションを柔軟に設定できます。
サポート対象のストレージタイプは次のとおりです。
- 一時データストレージ (開発用のみで推奨されます)
- 永続ストレージ
- JBOD (Kafka のみ。ZooKeeper では使用できません)
- 階層化ストレージ (早期アクセス)
ストレージを設定するには、コンポーネントのカスタムリソースで storage
プロパティーを指定します。ストレージタイプは、storage.type
プロパティーを使用して設定されます。ノードプールを使用する場合、Kafka クラスターで使用される各ノードプールに固有のストレージ設定を指定できます。Kafka
リソースで使用できる同じストレージプロパティーは、KafkaNodePool
プールリソースでも使用できます。
階層化ストレージは、異なる特性を持つストレージタイプを並行して使用することで、データ管理の柔軟性を高めます。たとえば、階層化ストレージには次のようなものが含まれます。
- パフォーマンスとコストがより高いブロックストレージ
- パフォーマンスとコストがより少ないオブジェクトストレージ
階層化ストレージは、Kafka の早期アクセス機能です。階層化ストレージを設定するには、tieredStorage
プロパティーを指定します。階層化ストレージは、Kafka
カスタムリソースを使用するクラスターレベルでのみ設定されます。
ストレージ関連のスキーマリファレンスには、ストレージ設定プロパティーに関する詳細情報が記載されています。
Kafka クラスターをデプロイした後に、ストレージタイプを変更することはできません。
9.10.1. データストレージに関する留意事項
Streams for Apache Kafka を適切に機能させるには、効率的なデータストレージインフラストラクチャーが不可欠です。ブロックストレージを使用することを強く推奨します。Streams for Apache Kafka は、ブロックストレージでの使用についてのみテストされています。NFS などのファイルストレージはテストされておらず、動作するという保証はありません。
ブロックストレージには、以下のいずれかのオプションを選択します。
- Amazon Elastic Block Store (EBS) などのクラウドベースのブロックストレージソリューション。
- ローカル永続ボリューム を使用した永続ストレージ
- ファイバーチャネル や iSCSI などのプロトコルがアクセスする SAN (ストレージエリアネットワーク) ボリューム
Streams for Apache Kafka には OpenShift の raw ブロックボリュームは必要ありません。
9.10.1.1. ファイルシステム
Kafka は、メッセージの保存にファイルシステムを使用します。Streams for Apache Kafka は、Kafka で一般的に使用される XFS および ext4 ファイルシステムと互換性があります。ファイルシステムを選択して設定するときは、デプロイメントの基盤となるアーキテクチャーと要件を考慮してください。
詳細については、Kafka ドキュメントの Filesystem Selection を参照してください。
9.10.1.2. ディスク使用量
Apache Kafka と ZooKeeper には別々のディスクを使用します。
ソリッドステートドライブ (SSD) は必須ではありませんが、複数のトピックに対してデータが非同期的に送受信される大規模なクラスターで Kafka のパフォーマンスを向上させることができます。SSD は、高速で低レイテンシーのデータアクセスが必要な ZooKeeper で特に有効です。
Kafka と ZooKeeper の両方にデータレプリケーションが組み込まれているため、レプリケーションされたストレージのプロビジョニングは必要ありません。
9.10.2. 一時ストレージ
一時データストレージは一時的なものです。ノード上のすべての Pod は、ローカルの一時ストレージスペースを共有します。データは、それを使用する Pod が実行されている限り保持されます。Pod が削除されると、データは失われます。ただし、Pod は高可用性環境でデータを回復できます。
その一時的な性質のため、一時ストレージは開発とテストにのみ推奨されます。
一時ストレージは emptyDir
ボリュームを使用してデータを保存します。Pod がノードに割り当てられると、emptyDir
ボリュームが作成されます。sizeLimit
プロパティーを使用して、emptyDir
のストレージの合計量を設定できます。
一時ストレージは、単一ノードの ZooKeeper クラスターやレプリケーション係数が 1 の Kafka トピックでの使用には適していません。
一時ストレージを使用するには、Kafka
または ZooKeeper
リソースのストレージタイプ設定を ephemeral
に設定します。ノードプールを使用している場合は、個々のノードプールのストレージ設定で ephemeral
を指定することもできます。
一時ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: storage: type: ephemeral # ... zookeeper: storage: type: ephemeral # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
storage:
type: ephemeral
# ...
zookeeper:
storage:
type: ephemeral
# ...
9.10.2.1. Kafka ログディレクトリーのマウントパス
一時ボリュームは、以下のパスにマウントされるログディレクトリーとして Kafka ブローカーによって使用されます。
/var/lib/kafka/data/kafka-logIDX
/var/lib/kafka/data/kafka-logIDX
IDX
は、Kafka ブローカー Pod インデックスです。たとえば、/var/lib/kafka/data/kafka-log0
のようになります。
9.10.3. 永続ストレージ
永続的なデータストレージは、システムが中断した場合でもデータを保持します。永続的なデータストレージを使用する Pod の場合、データは Pod の障害や再起動後も保持されます。永続的な性質のため、実稼働環境には永続ストレージを推奨します。
Streams for Apache Kafka で永続ストレージを使用するには、Kafka
または ZooKeeper
リソースのストレージ設定に persistent-claim
を指定します。ノードプールを使用している場合は、個々のノードプールのストレージ設定で persistent-claim
を指定することもできます。
Pod が Persistent Volume Claim (PVC) を使用して Persistent Volume (PV) 上でストレージ要求を行うようにリソースを設定します。PV は、オンデマンドで作成され、それを使用する Pod から独立したストレージボリュームを表します。PVC は、Pod の作成時に必要なストレージの量を要求します。PV の基盤となるストレージインフラストラクチャーを理解する必要はありません。PV がストレージ基準に一致する場合、PVC は PV にバインドされます。
ストレージタイプを指定するには、次の 2 つのオプションがあります。
storage.type: persistent-claim
-
ストレージタイプとして
persistent-claim
を選択した場合、単一の永続ストレージボリュームが定義されます。 storage.type: jbod
-
ストレージタイプとして
jbod
を選択すると、一意の ID を使用して永続ストレージボリュームの配列を柔軟に定義できます。
実稼働環境では、次のように設定することを推奨します。
-
Kafka またはノードプールの場合は、1 つ以上の永続ボリュームを使用して
storage.type
をjbod
に設定します。 -
ZooKeeper の場合、単一の永続ボリュームに対して
storage.type を
persistent-claim
として設定します。
永続ストレージには、次の設定オプションもあります。
id
(任意)-
ストレージ ID 番号。このオプションは、JBOD ストレージ宣言で定義されるストレージボリュームには必須です。デフォルトは
0
です。 size
(必須)- 永続ボリューム要求のサイズ (例: 1000Gi)。
class
(任意)- PVC は、StorageClass を指定することにより、さまざまなタイプの永続ストレージを要求できます。ストレージクラスはストレージプロファイルを定義し、そのプロファイルに基づいて PV を動的にプロビジョニングします。ストレージクラスが指定されていない場合、OpenShift クラスターで default としてマークされたストレージクラスが使用されます。永続ストレージオプションには、SAN ストレージタイプまたは ローカル永続ボリューム が含まれる場合があります。
selector
(任意)- 特定の PV を指定する設定。選択したボリュームのラベルを表す key:value ペアを提供します。
deleteClaim
(任意)-
クラスターのアンインストール時に PVC を削除するかどうかを指定するブール値。デフォルトは
false
です。
既存 Streams for Apache Kafka クラスター内の永続ボリュームのサイズ拡大は、永続ボリュームのサイズ変更をサポートする OpenShift バージョンでのみサポートされます。サイズを変更する永続ボリュームには、ボリューム拡張をサポートするストレージクラスを使用する必要があります。ボリューム拡張をサポートしないその他のバージョンの OpenShift およびストレージクラスでは、クラスターをデプロイする前に必要なストレージサイズを決定する必要があります。既存の永続ボリュームのサイズを縮小することはできません。
Kafka と ZooKeeper の永続ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: storage: type: persistent-claim size: 1000Gi # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
- id: 1
type: persistent-claim
size: 100Gi
deleteClaim: false
- id: 2
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
zookeeper:
storage:
type: persistent-claim
size: 1000Gi
# ...
特定のストレージクラスを使用した永続ストレージ設定の例
# ... storage: type: persistent-claim size: 500Gi class: my-storage-class # ...
# ...
storage:
type: persistent-claim
size: 500Gi
class: my-storage-class
# ...
selector
を使用して、SSD などの特定の機能を提供するラベル付き永続ボリュームを指定します。
セレクターを使用した永続ストレージ設定の例
# ... storage: type: persistent-claim size: 1Gi selector: hdd-type: ssd deleteClaim: true # ...
# ...
storage:
type: persistent-claim
size: 1Gi
selector:
hdd-type: ssd
deleteClaim: true
# ...
9.10.3.1. ストレージクラスのオーバーライド
デフォルトのストレージクラスを使用する代わりに、1 つ以上の Kafka または ZooKeeper ノードに異なるストレージクラスを指定できます。これは、ストレージクラスが、異なるアベイラビリティーゾーンやデータセンターに制限されている場合などに便利です。この場合、overrides
フィールドを使用できます。
以下の例では、デフォルトのストレージクラスの名前は my-storage-class
になります。
クラスオーバーライドを使用したストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: # ... kafka: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false class: my-storage-class overrides: - broker: 0 class: my-storage-class-zone-1a - broker: 1 class: my-storage-class-zone-1b - broker: 2 class: my-storage-class-zone-1c # ... # ... zookeeper: replicas: 3 storage: deleteClaim: true size: 100Gi type: persistent-claim class: my-storage-class overrides: - broker: 0 class: my-storage-class-zone-1a - broker: 1 class: my-storage-class-zone-1b - broker: 2 class: my-storage-class-zone-1c # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
labels:
app: my-cluster
name: my-cluster
namespace: myproject
spec:
# ...
kafka:
replicas: 3
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
class: my-storage-class
overrides:
- broker: 0
class: my-storage-class-zone-1a
- broker: 1
class: my-storage-class-zone-1b
- broker: 2
class: my-storage-class-zone-1c
# ...
# ...
zookeeper:
replicas: 3
storage:
deleteClaim: true
size: 100Gi
type: persistent-claim
class: my-storage-class
overrides:
- broker: 0
class: my-storage-class-zone-1a
- broker: 1
class: my-storage-class-zone-1b
- broker: 2
class: my-storage-class-zone-1c
# ...
overrides
プロパティーが設定され、ボリュームによって以下のストレージクラスが使用されます。
-
ZooKeeper ノード 0 の永続ボリュームでは
my-storage-class-zone-1a
が使用されます。 -
ZooKeeper ノード 1 の永続ボリュームでは
my-storage-class-zone-1b
が使用されます。 -
ZooKeeper ノード 2 の永続ボリュームでは
my-storage-class-zone-1c
が使用されます。 -
Kafka ブローカー 0 の永続ボリュームでは
my-storage-class-zone-1a
が使用されます。 -
Kafka ブローカー 1 の永続ボリュームでは
my-storage-class-zone-1b
が使用されます。 -
Kafka ブローカー 2 の永続ボリュームでは
my-storage-class-zone-1c
が使用されます。
overrides
プロパティーは現在、ストレージ class
をオーバーライドするためにのみ使用されます。他のストレージ設定プロパティーのオーバーライドは現在サポートされていません。
9.10.3.2. 永続ストレージ用の PVC リソース
永続ストレージを使用すると、次の名前で PVC が作成されます。
data-cluster-name-kafka-idx
-
Kafka ブローカー Pod
idx
のデータを格納するために使用されるボリュームの PVC。 data-cluster-name-zookeeper-idx
-
ZooKeeper ノード Pod
idx
のデータを格納するために使用されるボリュームの PVC。
9.10.3.3. Kafka ログディレクトリーのマウントパス
永続ボリュームは、以下のパスにマウントされるログディレクトリーとして Kafka ブローカーによって使用されます。
/var/lib/kafka/data/kafka-logIDX
/var/lib/kafka/data/kafka-logIDX
IDX
は、Kafka ブローカー Pod インデックスです。たとえば、/var/lib/kafka/data/kafka-log0
のようになります。
9.10.4. 永続ボリュームのサイズ変更
クラスターで使用される永続ボリュームは、ストレージインフラストラクチャーがサポートしている限り、データ損失のリスクなしにサイズ変更できます。Streams for Apache Kafka は、ストレージのサイズを変更する設定の更新に従って、ストレージインフラストラクチャーに変更を指示します。ストレージ拡張は、persistent-claim ボリュームを使用する Streams for Apache Kafka クラスターでサポートされています。
ストレージの削減は、ブローカーごとに複数のディスクを使用する場合にのみ可能です。ディスク上のすべてのパーティションを同じブローカー内の他のボリューム (ブローカー内) または同じクラスター内の他のブローカー (クラスター内) に移動した後、ディスクを削除できます。
永続ボリュームのサイズは OpenShift で現在サポートされていないため、減らすことはできません。
前提条件
- ボリュームのサイズ変更をサポートする OpenShift クラスター。
- Cluster Operator が稼働中である。
- ボリューム拡張をサポートするストレージクラスを使用して作成された永続ボリュームを使用する Kafka クラスター。
手順
クラスターの
Kafka
リソースを編集します。size
プロパティーを変更して、Kafka クラスター、ZooKeeper クラスター、またはその両方に割り当てられた永続ボリュームのサイズを増やします。-
Kafka クラスターの場合は、
spec.kafka.storage
の下にあるsize
プロパティーを更新します。 -
ZooKeeper クラスターの場合は、
spec.zookeeper.storage
の下にあるsize
プロパティーを更新します。
ボリュームサイズを
2000Gi
に増やす Kafka 設定apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: persistent-claim size: 2000Gi class: my-storage-class # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: persistent-claim size: 2000Gi class: my-storage-class # ... zookeeper: # ...
Copy to Clipboard Copied! -
Kafka クラスターの場合は、
リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! OpenShift では、Cluster Operator からの要求に応じて、選択された永続ボリュームの容量が増やされます。サイズ変更が完了すると、サイズ変更された永続ボリュームを使用するすべての Pod が Cluster Operator によって再起動されます。これは自動的に行われます。
クラスター上の関連する Pod のストレージ容量が増加したことを確認します。
oc get pv
oc get pv
Copy to Clipboard Copied! ストレージが増加した Kafka ブローカー Pod
NAME CAPACITY CLAIM pvc-0ca459ce-... 2000Gi my-project/data-my-cluster-kafka-2 pvc-6e1810be-... 2000Gi my-project/data-my-cluster-kafka-0 pvc-82dc78c9-... 2000Gi my-project/data-my-cluster-kafka-1
NAME CAPACITY CLAIM pvc-0ca459ce-... 2000Gi my-project/data-my-cluster-kafka-2 pvc-6e1810be-... 2000Gi my-project/data-my-cluster-kafka-0 pvc-82dc78c9-... 2000Gi my-project/data-my-cluster-kafka-1
Copy to Clipboard Copied! 出力には、ブローカー Pod に関連付けられた各 PVC の名前が表示されます。
9.10.5. JBOD ストレージ
JBOD ストレージを使用すると、複数のディスクまたはボリュームを使用するように Kafka クラスターを設定できます。このアプローチにより、Kafka ブローカーのデータストレージ容量が増え、パフォーマンスが向上する可能性があります。JBOD 設定は 1 つ以上のボリュームによって定義され、各ボリュームは 一時 または 永続 ボリュームのいずれかになります。JBOD ボリューム宣言のルールおよび制約は、一時および永続ストレージのルールおよび制約と同じです。たとえば、プロビジョニング後に永続ストレージのボリュームのサイズを縮小できません。また、タイプが ephemeral
の場合は、sizeLimit
の値を変更することはできません。
JBOD ストレージは Kafka でのみ サポートされ、ZooKeeper ではサポートされません。
JBOD ストレージを使用するには、Kafka
リソースのストレージタイプ設定を jbod
に設定します。ノードプールを使用している場合は、個々のノードプールのストレージ設定で jbod
を指定することもできます。
volumes
プロパティーを使用すると、JBOD ストレージアレイまたは設定を設定するディスクを記述できます。
JBOD ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
- id: 1
type: persistent-claim
size: 100Gi
deleteClaim: false
# ...
JBOD ボリュームが作成されると、ID を変更することはできません。JBOD 設定からボリュームを追加または削除できます。
9.10.5.1. JBOD ストレージの PVC リソース
永続ストレージを使用して JBOD ボリュームを宣言すると、次の名前の PVC が作成されます。
data-id-cluster-name-kafka-idx
-
Kafka ブローカー Pod
idx
のデータを格納するために使用されるボリュームの PVC。id
は、Kafka ブローカー Pod のデータを格納するために使用されるボリュームの ID になります。
9.10.5.2. Kafka ログディレクトリーのマウントパス
JBOD ボリュームは、以下のパスにマウントされるログディレクトリーとして Kafka ブローカーによって使用されます。
/var/lib/kafka/data-id/kafka-logidx
/var/lib/kafka/data-id/kafka-logidx
id
は、Kafka ブローカー Pod idx
のデータを保存するために使用されるボリュームの ID に置き換えます。たとえば、/var/lib/kafka/data-0/kafka-log0
のようになります。
9.10.6. JBOD ストレージへのボリュームの追加
この手順では、JBOD ストレージを使用するように設定されている Kafka クラスターにボリュームを追加する方法を説明します。この手順は、他のストレージタイプを使用するように設定されている Kafka クラスターには適用できません。
以前使用され、削除された id
の下に新規ボリュームを追加する場合、以前使用された PersistentVolumeClaims
が必ず削除されているよう確認する必要があります。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
- JBOD ストレージのある Kafka クラスター。
手順
Kafka
リソースのspec.kafka.storage.volumes
プロパティーを編集します。新しいボリュームをvolumes
アレイに追加します。たとえば、id が2
の新しいボリュームを追加します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! 新しいトピックを作成するか、既存のパーティションを新しいディスクに再度割り当てます。
ヒントCruise Control は、パーティションを再割り当てするための効果的なツールです。ブローカー内のディスク分散を実行するには、
KafkaRebalance.spec
でrebalanceDisk
をtrue
に設定します。
9.10.7. JBOD ストレージからのボリュームの削除
この手順では、JBOD ストレージを使用するように設定されている Kafka クラスターからボリュームを削除する方法を説明します。この手順は、他のストレージタイプを使用するように設定されている Kafka クラスターには適用できません。JBOD ストレージには、常に 1 つのボリュームが含まれている必要があります。
データの損失を避けるには、ボリュームを削除する前にすべてのパーティションを移動する必要があります。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
- 複数のボリュームがある JBOD ストレージのある Kafka クラスター
手順
削除するディスクからすべてのパーティションを再度割り当てます。削除するディスクに割り当てられたままになっているパーティションのデータは削除される可能性があります。
ヒントkafka-reassign-partitions.sh
ツールを使用してパーティションを再割り当てできます。Kafka
リソースのspec.kafka.storage.volumes
プロパティーを編集します。volumes
アレイから 1 つまたは複数のボリュームを削除します。たとえば、ID が1
と2
のボリュームを削除します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
9.10.8. 階層化ストレージ (早期アクセス)
階層化ストレージは、ログセグメントを別のストレージシステムに移動することで、Kafka データを管理するための柔軟なアプローチを導入します。たとえば、頻繁にアクセスされるデータに対してブローカー上のブロックストレージの使用を組み合わせ、データのアクセス性と耐久性を損なうことなく、古いデータやアクセス頻度の低いデータをブロックストレージから Amazon S3 などのよりコスト効率が高くスケーラブルなリモートストレージソリューションにオフロードできます。
階層化ストレージは Kafka の早期アクセス機能であり、Streams for Apache Kafka でも利用できます。現在の制限 により、実稼働環境では推奨されません。
階層化ストレージでは、Kafka とリモートストレージシステム間の通信を処理するために Kafka の RemoteStorageManager
インターフェイスの実装が必要です。これは、Kafka
リソースの設定によって有効になります。Streams for Apache Kafka は、カスタムの階層化ストレージが有効な場合、Remote Log Metadata Management (RLMM) に Kafka の TopicBasedRemoteLogMetadataManager
を使用します。RLMM は、リモートストレージに関連するメタデータを管理します。
カスタムの階層化ストレージを使用するには、次の手順を実行します。
- カスタムコンテナーイメージをビルドして、Streams for Apache Kafka イメージに Kafka 用の階層化ストレージプラグインを含めます。プラグインは、Streams for Apache Kafka によって管理される Kafka クラスターが階層化ストレージソリューションと対話するために必要な機能を提供する必要があります。
-
Kafka
リソースのtieredStorage
プロパティーを使用して、階層化ストレージ用に Kafka を設定します。カスタムRemoteStorageManager
実装のクラス名とパス、および追加の設定を指定します。 - 必要に応じて、RLMM 固有の階層化ストレージ設定を指定します。
Kafka のカスタム階層化ストレージ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: tieredStorage: type: custom remoteStorageManager: className: com.example.kafka.tiered.storage.s3.S3RemoteStorageManager classPath: /opt/kafka/plugins/tiered-storage-s3/* config: storage.bucket.name: my-bucket # ... config: rlmm.config.remote.log.metadata.topic.replication.factor: 1 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
tieredStorage:
type: custom
remoteStorageManager:
className: com.example.kafka.tiered.storage.s3.S3RemoteStorageManager
classPath: /opt/kafka/plugins/tiered-storage-s3/*
config:
storage.bucket.name: my-bucket
# ...
config:
rlmm.config.remote.log.metadata.topic.replication.factor: 1
# ...
- 1
type
はcustom
に設定する必要があります。- 2
- クラス名とパスを含むカスタム
RemoteStorageManager
実装の設定。 - 3
- カスタム
RemoteStorageManager
実装に渡す設定。Streams for Apache Kafka によってrsm.config.
という接頭辞が自動的に付けられます。 - 4
- RLMM に渡す階層型ストレージ設定。
rlmm.config.
の接頭辞が必要です。階層化ストレージ設定の詳細は、Apache Kafka のドキュメント を参照してください。
9.11. CPU およびメモリーのリソース制限および要求の設定
デフォルトでは、Streams for Apache Kafka Cluster Operator は、デプロイされたオペランドの CPU およびメモリーのリソース要求および制限を指定しません。Kafka の安定性を維持し、最適なパフォーマンスを達成するには、リソースの適切な割り当てを確保することが重要です。理想的なリソース割り当ては、特定の要件とユースケースによって異なります。
適切な要求と制限を設定 して、各コンテナーの CPU およびメモリーリソースを設定することを推奨します。
9.12. Pod スケジューリングの設定
同じ OpenShift ノード上でスケジュールされたアプリケーション間のリソース競合によるパフォーマンスの低下を回避するために、Kafka Pod を重要なワークロードとは別にスケジュールできます。これは、特定のノードを選択するか、ノードのセットを Kafka 専用にすることで実現できます。
9.12.1. アフィニティー、容認 (Toleration)、およびトポロジー分散制約の指定
アフィニティー、容認 (Toleration)、およびトポロジー分散制約を使用して、kafka リソースの Pod をノードにスケジュールします。アフィニティー、容認 (Toleration)、およびトポロジー分散制約は、以下のリソースの affinity
、tolerations
、および topologySpreadConstraint
プロパティーを使用して設定されます。
-
Kafka.spec.kafka.template.pod
-
Kafka.spec.zookeeper.template.pod
-
Kafka.spec.entityOperator.template.pod
-
KafkaConnect.spec.template.pod
-
KafkaBridge.spec.template.pod
-
KafkaMirrorMaker.spec.template.pod
-
KafkaMirrorMaker2.spec.template.pod
affinity
、tolerations
、および topologySpreadConstraint
プロパティーの形式は、OpenShift の仕様に準拠します。アフィニティー設定には、さまざまなタイプのアフィニティーを含めることができます。
- Pod のアフィニティーおよび非アフィニティー
- ノードのアフィニティー
9.12.1.1. Pod の非アフィニティーを使用して重要なアプリケーションがノードを共有しないようにする
Pod の非アフィニティーを使用して、重要なアプリケーションが同じディスクにスケジュールされないようにします。Kafka クラスターの実行時に、Pod の非アフィニティーを使用して、Kafka ブローカーがデータベースなどの他のワークロードとノードを共有しないようにすることが推奨されます。
9.12.1.2. ノードのアフィニティーを使用したワークロードの特定ノードへのスケジュール
OpenShift クラスターは通常、さまざまなタイプのワーカーノードで構成されます。ワークロードが非常に大きい環境の CPU に対して最適化されたものもあれば、メモリー、ストレージ (高速のローカル SSD)、または ネットワークに対して最適化されたものもあります。異なるノードを使用すると、コストとパフォーマンスの両面で最適化しやすくなります。最適なパフォーマンスを実現するには、Streams for Apache Kafka コンポーネントが適切なノードを使用するようにスケジュール設定することが重要です。
OpenShift はノードのアフィニティーを使用してワークロードを特定のノードにスケジュールします。ノードのアフィニティーにより、Pod がスケジュールされるノードにスケジューリングの制約を作成できます。制約はラベルセレクターとして指定されます。beta.kubernetes.io/instance-type
などの組み込みノードラベルまたはカスタムラベルのいずれかを使用してラベルを指定すると、適切なノードを選択できます。
9.12.1.3. 専用ノードへのノードのアフィニティーと容認 (Toleration) の使用
テイントを使用して専用ノードを作成し、ノードのアフィニティーおよび容認 (Toleration) を設定して専用ノードに Kafka Pod をスケジュールします。
クラスター管理者は、選択した OpenShift ノードをテイントとしてマーク付けできます。テイントのあるノードは、通常のスケジューリングから除外され、通常の Pod はそれらのノードでの実行はスケジュールされません。ノードに設定されたテイントを許容できるサービスのみをスケジュールできます。このようなノードで実行されるその他のサービスは、ログコレクターやソフトウェア定義のネットワークなどのシステムサービスのみです。
専用のノードで Kafka とそのコンポーネントを実行する利点は多くあります。障害の原因になったり、Kafka に必要なリソースを消費するその他のアプリケーションが同じノードで実行されません。これにより、パフォーマンスと安定性が向上します。
9.12.2. それぞれの Kafka ブローカーを別のワーカーノードでスケジュールするための Pod の非アフィニティーの設定
多くの Kafka ブローカーまたは ZooKeeper ノードは、同じ OpenShift ワーカーノードで実行できます。ワーカーノードが失敗すると、それらはすべて同時に利用できなくなります。信頼性を向上させるために、podAntiAffinity
設定を使用して、各 Kafka ブローカーまたは ZooKeeper ノードを異なる OpenShift ワーカーノードにスケジュールすることができます。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
クラスターデプロイメントを指定するリソースの
affinity
プロパティーを編集します。ワーカーノードが Kafka ブローカーまたは ZooKeeper ノードで共有されないようにするには、strimzi.io/name
ラベルを使用します。topologyKey
をkubernetes.io/hostname
に設定して、選択した Pod が同じホスト名のノードでスケジュールされないように指定します。これにより、同じワーカーノードを単一の Kafka ブローカーと単一の ZooKeeper ノードで共有できます。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-kafka topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-zookeeper topologyKey: "kubernetes.io/hostname" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-kafka topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-zookeeper topologyKey: "kubernetes.io/hostname" # ...
Copy to Clipboard Copied! CLUSTER-NAME
は、Kafka カスタムリソースの名前です。Kafka ブローカーと ZooKeeper ノードが同じワーカーノードを共有しないようにする場合は、
strimzi.io/cluster
ラベルを使用します。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ...
Copy to Clipboard Copied! CLUSTER-NAME
は、Kafka カスタムリソースの名前です。リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
9.12.3. Kafka コンポーネントでの Pod の非アフィニティーの設定
Pod の非アフィニティー設定は、Kafka ブローカーの安定性とパフォーマンスに役立ちます。podAntiAffinity
を使用すると、OpenShift は他のワークロードと同じノードで Kafka ブローカーをスケジュールしません。通常、Kafka が他のネットワークと同じワーカーノードで実行されないようにし、データベース、ストレージ、その他のメッセージングプラットフォームなどのストレージを大量に消費するアプリケーションで実行されないようにします。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
クラスターデプロイメントを指定するリソースの
affinity
プロパティーを編集します。ラベルを使用して、同じノードでスケジュールすべきでない Pod を指定します。topologyKey
をkubernetes.io/hostname
に設定し、選択した Pod が同じホスト名のノードでスケジュールされてはならないことを指定する必要があります。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply
を使用して、これを行うことができます。oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
9.12.4. Kafka コンポーネントでのノードのアフィニティーの設定
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
Streams for Apache Kafka コンポーネントをスケジュールする必要があるノードにラベルを付けます。
oc label
を使用してこれを行うことができます。oc label node NAME-OF-NODE node-type=fast-network
oc label node NAME-OF-NODE node-type=fast-network
Copy to Clipboard Copied! または、既存のラベルによっては再利用が可能です。
クラスターデプロイメントを指定するリソースの
affinity
プロパティーを編集します。以下に例を示します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - fast-network # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - fast-network # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply
を使用して、これを行うことができます。oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
9.12.5. 専用ノードの設定と Pod のスケジューリング
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
- 専用ノードとして使用するノードを選択します。
- これらのノードにスケジュールされているワークロードがないことを確認します。
選択したノードにテイントを設定します。
oc adm taint
を使用してこれを行うことができます。oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule
oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule
Copy to Clipboard Copied! さらに、選択したノードにラベルも追加します。
oc label
を使用してこれを行うことができます。oc label node NAME-OF-NODE dedicated=Kafka
oc label node NAME-OF-NODE dedicated=Kafka
Copy to Clipboard Copied! クラスターデプロイメントを指定するリソースの
affinity
およびtolerations
プロパティーを編集します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: tolerations: - key: "dedicated" operator: "Equal" value: "Kafka" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - Kafka # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: tolerations: - key: "dedicated" operator: "Equal" value: "Kafka" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - Kafka # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply
を使用して、これを行うことができます。oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
9.13. ロギングレベルの設定
ロギングレベルは、Kafka コンポーネントと Streams for Apache Kafka Operator のカスタムリソースで設定します。ロギングレベルは、カスタムリソースの spec.logging
プロパティーに直接指定できます。あるいは、configMapKeyRef
プロパティーを使用してカスタムリソースで参照される ConfigMap でロギングプロパティーを定義することもできます。
ConfigMap を使用する利点は、ロギングプロパティーが 1 カ所で維持され、複数のリソースにアクセスできることです。複数のリソースに ConfigMap を再利用することもできます。ConfigMap を使用して Streams for Apache Kafka Operator のロガーを指定する場合は、ロギング仕様を追加してフィルターを追加することもできます。
ロギング仕様でロギング type
を指定します。
-
ロギングレベルを直接指定する場合は
inline
-
ConfigMap を参照する場合は
external
inline
ロギングの設定例
... ...
# ...
logging:
type: inline
loggers:
kafka.root.logger.level: INFO
# ...
external
設定の例
... ...
# ...
logging:
type: external
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-config-map-key
# ...
ConfigMap の name
と key
の値は必須です。name
や key
が設定されていない場合は、デフォルトのロギングが使用されます。
9.13.1. Kafka コンポーネントおよび Operator のロギングオプション
特定の Kafka コンポーネントまたは Operator のログ設定の詳細は、次のセクションを参照してください。
Kafka コンポーネントのロギング
Operator のロギング
9.13.2. ロギングの ConfigMap の作成
ConfigMap を使用してロギングプロパティーを定義するには、ConfigMap を作成してから、リソースの spec
にあるロギング定義の一部としてそれを参照します。
ConfigMap には適切なロギング設定が含まれる必要があります。
-
Kafka コンポーネント、ZooKeeper、および Kafka Bridge の
log4j.properties
。 -
Topic Operator および User Operator の
log4j2.properties
設定はこれらのプロパティーの配下に配置する必要があります。
この手順では、ConfigMap は Kafka リソースのルートロガーを定義します。
手順
ConfigMap を作成します。
ConfigMap を YAML ファイルとして作成するか、プロパティーファイルから Config Map を作成します。
Kafka のルートロガー定義が含まれる ConfigMap の例:
kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j.properties: kafka.root.logger.level="INFO"
kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j.properties: kafka.root.logger.level="INFO"
Copy to Clipboard Copied! プロパティーファイルを使用している場合は、コマンドラインでファイルを指定します。
oc create configmap logging-configmap --from-file=log4j.properties
oc create configmap logging-configmap --from-file=log4j.properties
Copy to Clipboard Copied! プロパティーファイルではロギング設定が定義されます。
Define the logger ...
# Define the logger kafka.root.logger.level="INFO" # ...
Copy to Clipboard Copied! リソースの
spec
にexternal ロギングを定義し、logging.valueFrom.configMapKeyRef.name
に ConfigMap の名前を、logging.valueFrom.configMapKeyRef.key
にこの ConfigMap のキーを設定します。... ...
# ... logging: type: external valueFrom: configMapKeyRef: name: logging-configmap key: log4j.properties # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
9.13.3. Cluster Operator のロギングの設定
Cluster Operator のロギングは、strimzi-cluster-operator
という名前の ConfigMap
を使用して設定されます。ロギング設定が含まれる ConfigMap
は、Cluster Operator のインストール時に作成されます。この ConfigMap
は、install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
ファイルに記述されます。この ConfigMap
のデータフィールド data.log4j2.properties
を変更することで、Cluster Operator のロギングを設定します。
ロギング設定を更新するには、050-ConfigMap-strimzi-cluster-operator.yaml
ファイルを編集し、以下のコマンドを実行します。
oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
または、ConfigMap
を直接編集することもできます。
oc edit configmap strimzi-cluster-operator
oc edit configmap strimzi-cluster-operator
この ConfigMap を使用すると、ルートロガーレベル、ログ出力形式、さまざまなコンポーネントのログレベルなど、ログのさまざまな側面を制御できます。monitorInterval
設定は、ログ設定をリロードする頻度を決定します。Kafka AdminClient
、ZooKeeper ZKTrustManager
、Netty、および OkHttp クライアントのログレベルを制御することもできます。Netty は、Streams for Apache Kafka でネットワーク通信に使用されるフレームワークです。OkHttp は、HTTP リクエストを行うために使用されるライブラリーです。
Cluster Operator のデプロイ時に ConfigMap
が見つからない場合、デフォルトのロギング値が使用されます。
Cluster Operator のデプロイ後に ConfigMap
が誤って削除される場合、最後に読み込まれたロギング設定が使用されます。新規のロギング設定を読み込むために新規 ConfigMap
を作成します。
ConfigMap
から monitorInterval
オプションを削除しないでください。
9.13.4. Streams for Apache Kafka Operator にログフィルターを追加する
ConfigMap を使用して Streams for Apache Kafka Operator の (log4j2) ロギングレベルを設定する場合、ロギングフィルターを定義して、ログに返される内容も制限できます。
ロギングフィルターは、ロギングメッセージが多数ある場合に役に立ちます。ロガーのログレベルを DEBUG(rootLogger.level="DEBUG"
) に設定すると仮定します。ロギングフィルターは、このレベルでロガーに対して返されるログ数を減らし、特定のリソースに集中できるようにします。フィルターが設定されると、フィルターに一致するログメッセージのみがログに記録されます。
フィルターはマーカーを使用して、ログに含まれる内容を指定します。マーカーの種類、namespace、および名前を指定します。たとえば、Kafka クラスターで障害が発生した場合、種類を Kafka
に指定してログを分離し、障害が発生しているクラスターの namespace および名前を使用します。
以下の例は、my-kafka-cluster
という名前の Kafka クラスターのマーカーフィルターを示しています。
基本的なロギングフィルターの設定
rootLogger.level="INFO" appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)
rootLogger.level="INFO"
appender.console.filter.filter1.type=MarkerFilter
appender.console.filter.filter1.onMatch=ACCEPT
appender.console.filter.filter1.onMismatch=DENY
appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)
フィルターは 1 つまたは複数作成できます。ここでは、ログは 2 つの Kafka クラスターに対してフィルターされます。
複数のロギングフィルターの設定
appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster-1) appender.console.filter.filter2.type=MarkerFilter appender.console.filter.filter2.onMatch=ACCEPT appender.console.filter.filter2.onMismatch=DENY appender.console.filter.filter2.marker=Kafka(my-namespace/my-kafka-cluster-2)
appender.console.filter.filter1.type=MarkerFilter
appender.console.filter.filter1.onMatch=ACCEPT
appender.console.filter.filter1.onMismatch=DENY
appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster-1)
appender.console.filter.filter2.type=MarkerFilter
appender.console.filter.filter2.onMatch=ACCEPT
appender.console.filter.filter2.onMismatch=DENY
appender.console.filter.filter2.marker=Kafka(my-namespace/my-kafka-cluster-2)
フィルターの Cluster Operator への追加
フィルターを Cluster Operator に追加するには、そのロギング ConfigMap YAML ファイルを更新します (install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
)。
手順
050-ConfigMap-strimzi-cluster-operator.yaml
ファイルを更新して、フィルタープロパティーを ConfigMap に追加します。この例では、フィルタープロパティーは
my-kafka-cluster
Kafka クラスターのログのみを返します。kind: ConfigMap apiVersion: v1 metadata: name: strimzi-cluster-operator data: log4j2.properties: #... appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)
kind: ConfigMap apiVersion: v1 metadata: name: strimzi-cluster-operator data: log4j2.properties: #... appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)
Copy to Clipboard Copied! または、
ConfigMap
を直接編集することもできます。oc edit configmap strimzi-cluster-operator
oc edit configmap strimzi-cluster-operator
Copy to Clipboard Copied! ConfigMap
を直接編集せずに YAML ファイルを更新する場合は、ConfigMap をデプロイして変更を適用します。oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
Copy to Clipboard Copied!
Topic Operator または User Operator へのフィルターの追加
フィルターを Topic Operator または User Operator に追加するには、ロギング ConfigMap を作成または編集します。
この手順では、ロギング ConfigMap は、Topic Operator のフィルターで作成されます。User Operator に同じアプローチが使用されます。
手順
ConfigMap を作成します。
ConfigMap を YAML ファイルとして作成するか、プロパティーファイルから Config Map を作成します。
この例では、フィルタープロパティーは
my-topic
トピックに対してのみログを返します。kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j2.properties: rootLogger.level="INFO" appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic)
kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j2.properties: rootLogger.level="INFO" appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic)
Copy to Clipboard Copied! プロパティーファイルを使用している場合は、コマンドラインでファイルを指定します。
oc create configmap logging-configmap --from-file=log4j2.properties
oc create configmap logging-configmap --from-file=log4j2.properties
Copy to Clipboard Copied! プロパティーファイルではロギング設定が定義されます。
Define the logger Set the filters ...
# Define the logger rootLogger.level="INFO" # Set the filters appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic) # ...
Copy to Clipboard Copied! リソースの
spec
にexternal ロギングを定義し、logging.valueFrom.configMapKeyRef.name
に ConfigMap の名前を、logging.valueFrom.configMapKeyRef.key
にこの ConfigMap のキーを設定します。Topic Operator については、
Kafka
リソースのtopicOperator
設定でロギングを指定します。spec: # ... entityOperator: topicOperator: logging: type: external valueFrom: configMapKeyRef: name: logging-configmap key: log4j2.properties
spec: # ... entityOperator: topicOperator: logging: type: external valueFrom: configMapKeyRef: name: logging-configmap key: log4j2.properties
Copy to Clipboard Copied! - Cluster Operator をデプロイして変更を適用します。
create -f install/cluster-operator -n my-cluster-operator-namespace
create -f install/cluster-operator -n my-cluster-operator-namespace
9.14. ConfigMap を使用した設定の追加
ConfigMap
リソースを使用して、Streams for Apache Kafka デプロイメントに特定の設定を追加します。ConfigMap はキーと値のペアを使用して機密ではないデータを保存します。ConfigMap に追加された設定データは 1 か所に保持され、コンポーネント間で再利用できます。
ConfigMap は、次のタイプの設定データのみを保存できます。
- ロギング設定
- メトリックの設定
- Kafka Connect コネクターの外部設定
設定の他の領域に ConfigMap を使用することはできません。
コンポーネントを設定する場合、configMapKeyRef
プロパティーを使用して ConfigMap への参照を追加できます。
たとえば、configMapKeyRef
を使用してロギングの設定を提供する ConfigMap を参照できます。ConfigMap を使用して Log4j 設定ファイルを渡すことができます。参照を logging
設定に追加します。
ロギングの ConfigMap の例
... ...
# ...
logging:
type: external
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-config-map-key
# ...
メトリクス設定に ConfigMap を使用するには、同じ方法でコンポーネントの metricsConfig
設定への参照を追加します。
ExternalConfiguration
プロパティーは、Pod にマウントされた ConfigMap (またはシークレット) からのデータを環境変数またはボリュームとして使用できるようにします。Kafka Connect によって使用されるコネクターの外部設定データを使用できます。データは外部データソースに関連する可能性があり、コネクターがそのデータソースと通信するために必要な値を指定します。
たとえば、configMapKeyRef
プロパティーを使用して、ConfigMap から設定データを環境変数として渡すことができます。
環境変数の値を提供する ConfigMap の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... externalConfiguration: env: - name: MY_ENVIRONMENT_VARIABLE valueFrom: configMapKeyRef: name: my-config-map key: my-key
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect
spec:
# ...
externalConfiguration:
env:
- name: MY_ENVIRONMENT_VARIABLE
valueFrom:
configMapKeyRef:
name: my-config-map
key: my-key
外部で管理される ConfigMap を使用している場合は、設定プロバイダーを使用して ConfigMap にデータを読み込みます。
9.14.1. カスタム ConfigMap の命名
Streams for Apache Kafka は、OpenShift にデプロイされると、独自の ConfigMap とその他のリソースを作成 します。ConfigMap には、コンポーネントの実行に必要なデータが含まれます。Streams for Apache Kafka によって作成された ConfigMap は編集しないでください。
作成するカスタム ConfigMap にはこれらのデフォルト ConfigMap と同じ名前がないことを確認します。名前が同じ場合は上書きされます。たとえば、ConfigMap が Kafka クラスターの ConfigMap と同じ名前である場合、Kafka クラスターの更新がある場合に上書きされます。
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 # ...
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
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 config.providers.configmaps.class: io.strimzi.kafka.KubernetesConfigMapConfigProvider config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider # ...
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 # ...
Copy to Clipboard Copied! -
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
oc apply -f <kafka_connect_configuration_file>
Copy to Clipboard Copied! 外部の 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"] # ...
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: connector-configuration-role rules: - apiGroups: [""] resources: ["configmaps"] resourceNames: ["my-connector-configuration"] verbs: ["get"] # ...
Copy to Clipboard Copied! このルールは、
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 # ...
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 # ...
Copy to Clipboard Copied! ロールバインディングにより、
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} # ... # ...
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} # ... # ...
Copy to Clipboard Copied! プレースホルダー構造は、
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=
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 config.providers.env.class: org.apache.kafka.common.config.provider.EnvVarConfigProvider # ... externalConfiguration: env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-creds key: awsAccessKey - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey # ...
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 # ...
Copy to Clipboard Copied! 注記SecretKeyRef
プロパティーは、シークレット内のキーを参照します。シークレットの代わりに config map を使用している場合は、configMapKeyRef
プロパティーを使用します。-
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
oc apply -f <kafka_connect_configuration_file>
Copy to Clipboard Copied! コネクター設定の環境変数を参照してください。
環境変数を参照するコネクター設定の例
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} # ... # ...
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} # ... # ...
Copy to Clipboard Copied! プレースホルダー構造は
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: |- dbUsername: my-username dbPassword: my-password
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
connector.properties: |-
dbUsername: my-username
dbPassword: my-password
手順
KafkaConnect
リソースを設定します。-
FileConfigProvider
を有効にする -
externalConfiguration
プロパティーを使用してファイルを指定します。
外部プロパティーファイルを使用するための Kafka Connect 設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: config.providers: file config.providers.file.class: org.apache.kafka.common.config.provider.FileConfigProvider #... externalConfiguration: volumes: - name: connector-config secret: secretName: mysecret
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 Copy to Clipboard Copied! -
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
oc apply -f <kafka_connect_configuration_file>
Copy to Clipboard Copied! コネクター設定内のファイルプロパティーをプレースホルダーとして参照します。
ファイルを参照するコネクター設定の例
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" #...
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" #...
Copy to Clipboard Copied! プレースホルダー構造は、
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
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 config.providers.directory.class: org.apache.kafka.common.config.provider.DirectoryConfigProvider #... externalConfiguration: volumes: - name: cluster-ca secret: secretName: my-cluster-cluster-ca-cert - name: my-user secret: secretName: my-user
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 Copy to Clipboard Copied! -
リソースを作成または更新してプロバイダーを有効にします。
oc apply -f <kafka_connect_configuration_file>
oc apply -f <kafka_connect_configuration_file>
Copy to Clipboard Copied! コネクター設定内のファイルプロパティーをプレースホルダーとして参照します。
ファイルを参照するコネクター設定の例
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}" #...
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}" #...
Copy to Clipboard Copied! プレースホルダー構造は
directory:<path>:<file_name>
です。DirectoryConfigProvider
は、マウントされたシークレットから認証情報を読み取り、抽出します。
9.16. OpenShift リソースのカスタマイズ
Streams for Apache Kafka のデプロイメントは、Deployment
、Pod
、Service
リソースなどの OpenShift リソースを作成します。これらのリソースは、Streams for Apache Kafka Operator によって管理されます。特定の OpenShift リソースの管理を担当する operator のみがそのリソースを変更できます。operator によって管理される OpenShift リソースを手動で変更しようとすると、operator はその変更を元に戻します。
operator が管理する OpenShift リソースの変更は、以下のような特定のタスクを実行する場合に役立ちます。
-
Pod
が Istio またはその他のサービスによって処理される方法を制御するカスタムラベルまたはアノテーションの追加 -
Loadbalancer
-type サービスがクラスターによって作成される方法の管理
OpenShift リソースに変更を加えるには、さまざまな Streams for Apache Kafka カスタムリソースの spec
セクション内の template
プロパティーを使用できます。
変更を適用できるカスタムリソースのリストは次のとおりです。
-
Kafka.spec.kafka
-
Kafka.spec.zookeeper
-
Kafka.spec.entityOperator
-
Kafka.spec.kafkaExporter
-
Kafka.spec.cruiseControl
-
KafkaNodePool.spec
-
KafkaConnect.spec
-
KafkaMirrorMaker.spec
-
KafkaMirrorMaker2.spec
-
KafkaBridge.spec
-
KafkaUser.spec
これらのプロパティーの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
カスタマイズ可能なフィールドの詳細は、「Streams for Apache Kafka カスタムリソース API リファレンス」を参照してください。
以下の例では、template
プロパティーを使用して Kafka ブローカーの Pod のラベルを変更します。
テンプレートのカスタマイズ例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster labels: app: my-cluster spec: kafka: # ... template: pod: metadata: labels: mylabel: myvalue # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
labels:
app: my-cluster
spec:
kafka:
# ...
template:
pod:
metadata:
labels:
mylabel: myvalue
# ...
9.16.1. イメージプルポリシーのカスタマイズ
Streams for Apache Kafka では、Cluster Operator によってデプロイされた全 Pod のコンテナーのイメージプルポリシーをカスタマイズできます。イメージプルポリシーは、Cluster Operator デプロイメントの環境変数 STRIMZI_IMAGE_PULL_POLICY
を使用して設定されます。STRIMZI_IMAGE_PULL_POLICY
環境変数に設定できる値は 3 つあります。
Always
- Pod が起動または再起動されるたびにコンテナーイメージがレジストリーからプルされます。
IfNotPresent
- 以前プルされたことのないコンテナーイメージのみがレジストリーからプルされます。
Never
- コンテナーイメージはレジストリーからプルされることはありません。
現在、イメージプルポリシーは、すべての Kafka、Kafka Connect、および Kafka MirrorMaker クラスターに対して一度にのみカスタマイズできます。ポリシーを変更すると、すべての Kafka、Kafka Connect、および Kafka MirrorMaker クラスターのローリング更新が実行されます。
9.16.2. 終了時の猶予期間の適用
終了時の猶予期間を適用し、Kafka クラスターが正常にシャットダウンされるように十分な時間を確保します。
terminationGracePeriodSeconds
プロパティーを使用して時間を指定します。プロパティーを Kafka
カスタムリソースの template.pod
設定に追加します。
追加する時間は Kafka クラスターのサイズによって異なります。終了猶予期間の OpenShift のデフォルト値は 30 秒です。クラスターが正常にシャットダウンしていないことが判明した場合には、終了までの猶予期間を増やすことができます。
終了時の猶予期間は、Pod が再起動されるたびに適用されます。この期間は、OpenShift が Pod で実行されているプロセスに term (中断) シグナルを送信すると開始します。この期間は、終了する Pod のプロセスを、停止する前に別の Pod に転送するのに必要な時間を反映する必要があります。期間の終了後、kill シグナルにより、Pod で実行中のプロセスはすべて停止します。
以下の例では、終了猶予期間 120 秒を Kafka
カスタムリソースに追加します。他の Kafka コンポーネントのカスタムリソースで設定を指定することもできます。
終了猶予期間の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... template: pod: terminationGracePeriodSeconds: 120 # ... # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
template:
pod:
terminationGracePeriodSeconds: 120
# ...
# ...
第10章 Topic Operator を使用した Kafka トピックの管理
KafkaTopic
リソースは、パーティションやレプリケーション係数の設定などのトピックを設定します。KafkaTopic
を使用してトピックを作成、変更、または削除すると、Topic Operator はこれらの変更が Kafka クラスターに確実に反映されるようにします。
KafkaTopic
リソースの詳細は、KafkaTopic
スキーマリファレンス を参照してください。
10.1. トピック管理モード
KafkaTopic
リソースは、Kafka クラスター内の単一トピックを管理します。Topic Operator は、KafkaTopic
リソースと Kafka トピックを管理するための 2 つのモードを提供します。
- 一方向モード (デフォルト)
- 一方向モードでは、クラスター管理に ZooKeeper は必要ありません。KRaft モードでの Streams for Apache Kafka の使用と互換性があります。
- 双方向モード
- 双方向モードでは、クラスター管理に ZooKeeper が必要です。KRaft モードでの Streams for Apache Kafka の使用と互換性がありません。
Topic Operator を単方向モードで実行できるようにする機能ゲートが一般提供に進むにつれて、双方向モードは段階的に廃止されます。この移行は、特に KRaft モードでの Kafka のサポートにおいて、ユーザーエクスペリエンスを向上させることを目的としています。
10.1.1. 一方向のトピック管理
双方向モードでは、Topic Operator は次のように動作します。
-
KafkaTopic
が作成、削除、または変更されると、Topic Operator は Kafka トピックに対して対応するアクションを実行します。
対応する KafkaTopic
リソースが存在せずに、トピックが Kafka クラスター内で直接作成、削除、または変更された場合、Topic Operator はそのトピックを管理しません。Topic Operator は KafkaTopic
リソースに関連付けられた Kafka トピックのみを管理し、Kafka クラスター内で独立して管理されるトピックに干渉しません。Kafka トピックに KafkaTopic
が存在する場合は、リソースの外部で行われた設定変更はすべて元に戻されます。
Topic Operator は、複数の KafkaTopic
リソースが同じ .spec.topicName
を使用して Kafka トピックを管理しようとしているケースを検出できます。最も古いリソースのみが調整され、他のリソースはリソースの競合エラーで失敗します。
10.1.2. 双方向のトピック管理
双方向モードでは、Topic Operator は次のように動作します。
-
KafkaTopic
が作成、削除、または変更されると、Topic Operator は Kafka トピックに対して対応するアクションを実行します。 -
同様に、Kafka クラスター内でトピックが作成、削除、または変更されると、Topic Operator は
KafkaTopic
リソースに対して対応する操作を実行します。
KafkaTopic
リソースまたは Kafka で直接トピックを管理する方法を 1 つ保持してみてください。特定のトピックで、両方の方法を頻繁に切り替えないでください。
10.2. トピックの命名規則
KafkaTopic
リソースには、トピックの名前と、そのトピックが属する Kafka クラスターの名前を識別するラベルが含まれます。
トピック処理用の Kafka クラスターの特定
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: topic-name-1 labels: strimzi.io/cluster: my-cluster spec: topicName: topic-name-1
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: topic-name-1
labels:
strimzi.io/cluster: my-cluster
spec:
topicName: topic-name-1
ラベルは、Kafka
リソースのクラスター名を指定します。Topic Operator は、管理する KafkaTopic
リソースを決定するメカニズムとしてラベルを使用します。ラベルが Kafka クラスターと一致しない場合、Topic Operator は KafkaTopic
を認識できず、トピックは作成されません。
Kafka と OpenShift には独自の命名検証ルールがあり、Kafka トピック名は OpenShift では有効なリソース名ではない可能性があります。可能であれば、両方に有効な命名規則に従うようにしてください。
次のガイドラインを考慮してください。
- トピックの性質を反映したトピック名を使用
- 名前は簡潔にして 63 文字以内に
- すべて小文字とハイフンを使用
- 特殊文字、スペース、シンボルは避ける
KafkaTopic
リソースを使用すると、metadata.name
フィールドを使用して Kafka トピック名を指定できます。ただし、目的の Kafka トピック名が有効な OpenShift リソース名ではない場合は、spec.topicName
プロパティーを使用して実際の名前を指定できます。spec.topicName
フィールドはオプションであり、これが存在しない場合、Kafka トピック名はデフォルトでトピックの metadata.name
になります。トピックを作成すると、後でトピック名を変更することはできません。
有効な Kafka トピック名を指定する例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 spec: topicName: My.Topic.1 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic-1
spec:
topicName: My.Topic.1
# ...
複数の KafkaTopic
リソースが同じ Kafka トピックを参照している場合、最初に作成されたリソースがトピックを管理しているリソースとみなされます。新しいリソースのステータスが更新されて競合が示され、その Ready
ステータスが False
に変更されます。
Kafka Streams などの Kafka クライアントアプリケーションが無効な OpenShift リソース名を持つトピックを自動的に作成する場合、Topic Operator は双方向モードで使用すると有効な metadata.name
を生成します。無効な文字を置換し、名前にハッシュを追加します。ただし、この動作は一方向モードには適用されません。
無効なトピック名を置き換える例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic---c55e57fe2546a33f9e603caf57165db4072e827e # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic---c55e57fe2546a33f9e603caf57165db4072e827e
# ...
クラスター内の識別子と名前の要件の詳細は、OpenShift ドキュメントの オブジェクト名と ID を参照してください。
10.3. トピック変更の処理
Topic Operator がトピックへの変更をどのように処理するかは、トピック管理のモード によって異なります。
-
一方向トピック管理の場合、設定の変更は
KafkaTopic
リソースから Kafka トピックへの一方向のみに行われます。KafkaTopic
リソースの外部で管理される Kafka トピックへの変更はすべて元に戻されます。 -
双方向のトピック管理の場合、設定の変更は Kafka トピックと
KafkaTopic
リソースの間で両方向に同期されます。互換性のない変更では Kafka 設定が優先され、それに応じてKafkaTopic
リソースが調整されます。
10.3.1. 双方向トピック管理のためのトピックストア
双方向のトピック管理の場合、Topic Operator は、唯一の信頼できる情報源がない場合でもトピックへの変更を処理できます。KafkaTopic
リソースと Kafka トピックは別々に変更される可能性があります。特に Topic Operator が動作していない場合は、変更をリアルタイムで観察することが常に可能であるとは限りません。これに対処するために、Topic Operator は、各トピックに関するトピック設定情報を保存するトピックストアを維持します。Kafka クラスターと OpenShift の状態をトピックストアと比較して、同期に必要な変更を判断します。この評価は、起動中および Topic Operator がアクティブである間、定期的に行われます。
たとえば、Topic Operator が非アクティブで、my-topic という名前の新しい KafkaTopic
が作成された場合、再起動時に Topic Operator はトピックストアに my-topic が存在しないことを認識します。KafkaTopic
が最後の操作の後に作成されたことを認識します。その結果、Topic Operator は対応する Kafka トピックを生成し、メタデータをトピックストアに保存します。
トピックストアを使用すると、Topic Operator は、変更に互換性がある限り、Kafka トピックと KafkaTopic
リソースの両方でトピック設定が変更される状況を管理できます。Kafka トピック設定が更新されるか、KafkaTopic
カスタムリソースに変更が加えられると、変更に互換性がある限り、Kafka クラスターとの調整後にトピックストアが更新されます。
トピックストアは、Kafka トピックを使用して状態を永続化する Kafka Streams のキーバリューメカニズムを基にしています。トピックメタデータはインメモリーでキャッシュされ、Topic Operator 内にてローカルでアクセスされます。ローカルのインメモリーキャッシュに適用される操作からの更新は、ディスク上のバックアップトピックストアに永続化されます。トピックストアは、Kafka トピックまたは OpenShift KafkaTopic
カスタムリソースからの更新と継続的に同期されます。操作は、このような方法で設定されたトピックストアで迅速に処理されますが、インメモリーキャッシュがクラッシュした場合は、永続ストレージから自動的にデータが再入力されます。
内部トピックは、トピックストアでのトピックメタデータの処理をサポートします。
__strimzi_store_topic
- トピックメタデータを保存するための入力トピック
__strimzi-topic-operator-kstreams-topic-store-changelog
- 圧縮されたトピックストア値のログの維持
これらのトピックは、Topic Operator の実行に不可欠であるため、削除しないでください。
10.3.2. ZooKeeper からトピックストアへのトピックメタデータの移行
Streams for Apache Kafka の以前のリリースでは、トピックのメタデータが ZooKeeper に保存されていました。トピックストアによってその必要がなくなるため、メタデータは Kafka クラスターに取り込まれ、Topic Operator の制御下に置かれます。
Streams for Apache Kafka 2.7 にアップグレードすると、Topic Operator によるトピックストア制御への以降がシームレスに行われます。メタデータは ZooKeeper から検出および移行され、古いストアは削除されます。
10.3.3. ZooKeeper を使用してトピックのメタデータを保存する Streams for Apache Kafka バージョンにダウングレードする
トピックメタデータの保存に ZooKeeper を使用する 1.7 より前のバージョンの Streams for Apache Kafka に戻す場合も、Cluster Operator を前のバージョンにダウングレードしてから、Kafka ブローカーおよびクライアントアプリケーションを標準として前の Kafka バージョンにダウングレードします。
ただし、Kafka クラスターのブートストラップアドレスを指定して、kafka-topics
コマンドを使用してトピックストア用に作成されたトピックを削除する必要もあります。以下に例を示します。
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
このコマンドは、Kafka クラスターへのアクセスに使用されるリスナーおよび認証のタイプに対応している必要があります。
Topic Operator は、Kafka のトピックの状態から ZooKeeper トピックメタデータを再構築します。
10.3.4. トピックの自動作成
アプリケーションは、Kafka クラスター内のトピックの自動作成をトリガーできます。デフォルトでは、Kafka ブローカー設定 auto.create.topics.enable
は true
に設定されており、アプリケーションが存在しないトピックから生成または消費しようとしたときに、ブローカーがトピックを自動的に作成できるようになります。アプリケーションは、Kafka AdminClient
を使用してトピックを自動的に作成する場合もあります。アプリケーションが KafkaTopic
リソースとともにデプロイされる場合、Topic Operator が KafkaTopic
に反応する前に、クラスター内でトピックの自動作成が行われる可能性があります。
双方向のトピック管理の場合、Topic Operator はトピックと KafkaTopic
リソース間の変更を同期します。
一方向トピック管理を使用している場合、これは、アプリケーションのデプロイメント用に作成されたトピックが、最初はデフォルトのトピック設定で作成されることを意味する可能性があります。Topic Operator がアプリケーションデプロイメントに含まれる KafkaTopic
リソース仕様に基づいてトピックを再設定しようとすると、必要な設定変更が許可されていないため、操作が失敗する可能性があります。たとえば、変更がトピックパーティションの数を減らすことを意味する場合です。このため、一方向トピック管理を使用する場合は、Kafka クラスター設定で auto.create.topics.enable
を無効にすることを推奨します。
10.4. Kafka トピックの設定
KafkaTopic
リソースのプロパティーを使用して、Kafka トピックを設定します。KafkaTopic
内のトピック設定に加えられた変更は、Kafka に伝播されます。
oc apply
を使用すると、トピックを作成または編集できます。oc delete
を使用すると、既存のトピックを削除できます。
以下に例を示します。
-
oc apply -f <topic_config_file>
-
oc delete KafkaTopic <topic_name>
トピックを削除できるようにするには、Kafka リソースの spec.kafka.config
で delete.topic.enable
を true
(デフォルト) に設定する必要があります。
この手順では、10 個のパーティションと 2 つのレプリカがあるトピックを作成する方法を説明します。
手順は、トピック管理の一方向モードと双方向モードで同じです。
作業を開始する前に
KafkaTopic リソースでは、次の変更は許可されません。
-
spec.topicName
で定義されたトピックの名前を変更します。spec.topicName
とstatus.topicName
の不一致が検出されます。 -
spec.partitions
を使用してパーティションの数を減らす (Kafka ではサポートされていません)。 -
spec.replicas
で指定されたレプリカの数を変更します。
キーを持つトピックの spec.partitions
を増やすと、レコードのパーティション分割が変更され、特にトピックでセマンティックパーティション分割が使用されている場合に問題が発生する可能性があります。
前提条件
- mTLS 認証と TLS 暗号化を使用する Kafka ブローカーリスナーで設定された実行中の Kafka クラスター。
- 実行中の Topic Operator (通常は、Entity Operator とともにデプロイされます)。
-
トピックを削除する場合は、
Kafka
リソースのspec.kafka.config
がdelete.topic.enable=true
(デフォルト) である必要があります。
手順
KafkaTopic
リソースを設定します。Kafka トピックの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2
Copy to Clipboard Copied! ヒントトピックを変更する場合、
oc get kafkatopic my-topic-1 -o yaml
を使用してリソースの現在のバージョンを取得できます。OpenShift で
KafkaTopic
リソースを作成します。oc apply -f <topic_config_file>
oc apply -f <topic_config_file>
Copy to Clipboard Copied! トピックの準備完了ステータスが
True
に変わるまで待ちます。oc get kafkatopics -o wide -w -n <namespace>
oc get kafkatopics -o wide -w -n <namespace>
Copy to Clipboard Copied! Kafka トピックのステータス
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY my-topic-1 my-cluster 10 3 True my-topic-2 my-cluster 10 3 my-topic-3 my-cluster 10 3 True
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY my-topic-1 my-cluster 10 3 True my-topic-2 my-cluster 10 3 my-topic-3 my-cluster 10 3 True
Copy to Clipboard Copied! READY
出力がTrue
を示す場合、トピックの作成は成功です。READY
列が空白のままの場合は、リソース YAML または Topic Operator ログからステータスの詳細を取得してください。ステータスメッセージには、現在のステータスの理由の詳細が示されます。
oc get kafkatopics my-topic-2 -o yaml
oc get kafkatopics my-topic-2 -o yaml
Copy to Clipboard Copied! NotReady
ステータスのトピックの詳細...
# ... status: conditions: - lastTransitionTime: "2022-06-13T10:14:43.351550Z" message: Number of partitions cannot be decreased reason: PartitionDecreaseException status: "True" type: NotReady
Copy to Clipboard Copied! この例では、トピックの準備ができていない理由は、
KafkaTopic
設定で元のパーティション数が減ったためです。Kafka はこれをサポートしていません。トピック設定をリセットした後、ステータスはトピックの準備ができていることを示します。
oc get kafkatopics my-topic-2 -o wide -w -n <namespace>
oc get kafkatopics my-topic-2 -o wide -w -n <namespace>
Copy to Clipboard Copied! トピックのステータス更新
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY my-topic-2 my-cluster 10 3 True
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY my-topic-2 my-cluster 10 3 True
Copy to Clipboard Copied! 詳細のフェッチではメッセージが表示されない
oc get kafkatopics my-topic-2 -o yaml
oc get kafkatopics my-topic-2 -o yaml
Copy to Clipboard Copied! READY
ステータスのトピックの詳細...
# ... status: conditions: - lastTransitionTime: '2022-06-13T10:15:03.761084Z' status: 'True' type: Ready
Copy to Clipboard Copied!
10.5. レプリケーションとパーティション数のトピックの設定
Topic Operator によって管理されるトピックには、トピックレプリケーション係数を 3 に設定し、最低でも 2 つの In-Sync レプリカを設定することが推奨されます。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 3 config: min.insync.replicas: 2 #...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 10
replicas: 3
config:
min.insync.replicas: 2
#...
In-Sync レプリカは、プロデューサーアプリケーションの acks
設定と組み合わせて使用されます。acks
設定は、メッセージが正常に受信されたことを確認するまでに、メッセージを複製しなければならないフォロワーパーティションの数を決定します。双方向 Topic Operator は、その内部トピックに対して acks=all
を指定して実行されます。これにより、メッセージはすべての In-Sync レプリカによって確認応答される必要があります。
ブローカーを追加または削除して Kafka クラスターをスケーリングする場合、レプリケーション係数設定は変更されず、レプリカは自動的に再割り当てされません。しかし、kafka-reassign-partitions.sh
ツールを使用してレプリケーション係数を変更し、手動でレプリカをブローカーに再割り当てすることができます。
また、Streams for Apache Kafka の Cruise Control の統合ではトピックのレプリケーション係数を変更することはできませんが、Kafka のリバランスのために生成される最適化プロポーザルには、パーティションレプリカを転送し、パーティションリーダーを変更するコマンドが含まれています。
10.6. Kafka トピックに影響を与えずに KafkaTopic リソースを管理する
この手順では、現在 KafkaTopic
リソースを通じて管理されている Kafka トピックを非管理トピックに変換する方法について説明します。この機能はさまざまなシナリオで役立ちます。たとえば、KafkaTopic
リソースの metadata.name
を更新したい場合があります。これを行うには、元の KafkaTopic
リソースを削除し、新しいリソースを再作成する必要があります。
KafkaTopic
リソースに strimzi.io/managed=false
のアノテーションを付けることにより、Topic Operator がその特定のトピックを管理すべきでないことを示します。これにより、リソースの設定やその他の管理タスクを変更しながら、Kafka トピックを保持できるようになります。
一方向トピック管理を使用している場合は、このタスクを実行できます。
手順
OpenShift で
KafkaTopic
リソースにアノテーションを付け、strimzi.io/managed
をfalse
に設定します。oc annotate kafkatopic my-topic-1 strimzi.io/managed="false"
oc annotate kafkatopic my-topic-1 strimzi.io/managed="false"
Copy to Clipboard Copied! KafkaTopic
リソース内のトピックのmetadata.name
を指定します。この例ではmy-topic-1
です。KafkaTopic
リソースのステータスをチェックして、リクエストが成功したことを確認します。oc get kafkatopics my-topic-1 -o yaml
oc get kafkatopics my-topic-1 -o yaml
Copy to Clipboard Copied! Ready
ステータスのトピックの例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 124 name: my-topic-1 finalizer: strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 124 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 124 name: my-topic-1 finalizer: strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 124
1 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z
Copy to Clipboard Copied! - 1
- リソースの調整が成功すると、トピックは管理されなくなります。
metadata.generation
(デプロイの現在のバージョン) の値は、status.observedGeneration
(リソースの最新の調整) と一致する必要があります。これで、管理していた Kafka トピックに影響を与えることなく、
KafkaTopic
リソースを変更できるようになりました。たとえば、
metadata.name
を変更するには、次のように実行します。元の
KafkTopic
リソースを削除します。oc delete kafkatopic <kafka_topic_name>
oc delete kafkatopic <kafka_topic_name>
Copy to Clipboard Copied! -
別の
metadata.name
を使用してKafkTopic
リソースを再作成しますが、元のリソースで管理されていたのと同じトピックを参照するにはspec.topicName
を使用します。
-
元の
KafkaTopic
リソースを削除していないが、Kafka トピックの管理を再度再開したい場合は、strimzi.io/managed
アノテーションをtrue
に設定するか、アノテーションを削除します。
10.7. 既存の Kafka トピックのトピック管理を有効にする
この手順では、現在 KafkaTopic
リソースを通じて管理されていないトピックのトピック管理を有効にする方法について説明します。これを行うには、一致する KafkaTopic
リソースを作成します。
一方向トピック管理を使用している場合は、このタスクを実行できます。
手順
Kafka トピックと同じ
metadata.name
を使用してKafkaTopic
リソースを作成します。または、Kafka のトピック名が有効な OpenShift リソース名ではない場合は、
spec.topicName
を使用します。Kafka トピックの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2
Copy to Clipboard Copied! この例では、Kafka トピックの名前は
my-topic-1
です。Topic Operator は、トピックが別の
KafkaTopic
リソースによって管理されているかどうかを確認します。そうである場合、古いリソースが優先され、新しいリソースのステータスでリソース競合エラーが返されます。KafkaTopic
リソースを適用します。oc apply -f <topic_configuration_file>
oc apply -f <topic_configuration_file>
Copy to Clipboard Copied! operator が Kafka のトピックを更新するまで待ちます。
operator は、同じ名前を持つ
KafkaTopic
のspec
で Kafka トピックを更新します。KafkaTopic
リソースのステータスをチェックして、リクエストが成功したことを確認します。oc get kafkatopics my-topic-1 -o yaml
oc get kafkatopics my-topic-1 -o yaml
Copy to Clipboard Copied! Ready
ステータスのトピックの例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 1 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 1
1 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z
Copy to Clipboard Copied! - 1
- リソースの調整が成功すると、トピックが管理されるようになりました。
metadata.generation
(デプロイの現在のバージョン) の値は、status.observedGeneration
(リソースの最新の調整) と一致する必要があります。
10.8. 管理トピックの削除
一方向トピック管理は、OpenShift ファイナライザーの有無にかかわらず、KafkaTopic
リソースを通じて管理されるトピックの削除をサポートします。これは、STRIMZI_USE_FINALIZERS
Topic Operator 環境変数によって決定されます。デフォルトでは、これは true
に設定されます。ただし、Topic Operator でファイナライザーを追加する必要がない場合は、Topic Operator env
設定で false
に設定できます。
ファイナライザーは、KafkaTopic
リソースを順番に削除および制御します。Topic Operator のファイナライザーが KafkaTopic
リソースのメタデータに追加されます。
トピックの削除を制御するファイナライザー
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 finalizers: - strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
generation: 1
name: my-topic-1
finalizers:
- strimzi.io/topic-operator
labels:
strimzi.io/cluster: my-cluster
この例では、トピック my-topic-1
にファイナライザーが追加されます。ファイナライザーは、ファイナライズプロセスが完了するまでトピックが完全に削除されないようにします。次に、oc delete kafkatopic my-topic-1
を使用してトピックを削除すると、タイムスタンプがメタデータに追加されます。
削除時のファイナライザーのタイムスタンプ
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 finalizers: - strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster deletionTimestamp: 20230301T000000.000
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
generation: 1
name: my-topic-1
finalizers:
- strimzi.io/topic-operator
labels:
strimzi.io/cluster: my-cluster
deletionTimestamp: 20230301T000000.000
リソースは引き続き存在します。削除に失敗した場合は、リソースのステータスにその旨が表示されます。
ファイナライゼーションタスクが正常に実行されると、ファイナライザーがメタデータから削除され、リソースが完全に削除されます。
ファイナライザーは、関連リソースが削除されないように防ぐ役割を果たします。一方向 Topic Operator が実行されていない場合、ファイナライザーを metadata.finalizers
から削除できません。また、KafkaTopic
リソースまたは namespace を直接削除しようとすると、失敗するかタイムアウトになり、namespace が停止停止状態のままになります。この問題が発生した場合は、トピックのファイナライザーを削除する ことで、ファイナライズプロセスをバイパスできます。
10.9. Topic Operator モード間の切り替え
Streams for Apache Kafka をアップグレードまたはダウングレードするとき、または同じバージョンの Streams for Apache Kafka を使用するときに、そのバージョンでモードがサポートされている限り、トピック管理モードを切り替えることができます。
双方向トピック管理モードから一方向トピック管理モードへの切り替え
UnidirectionalTopicOperator
フィーチャーゲートを有効にします。Cluster Operator は、Topic Operator とともに Entity Operator を一方向トピック管理モードでデプロイします。
双方向トピック管理モードで実行される Topic Operator をサポートする内部トピックは不要になったので、
KafkaTopic
リソースを削除して管理できます。oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-store-topic) \ && oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-topic-operator)
oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-store-topic) \ && oc delete $(oc get kt -n <namespace_name> -o name | grep strimzi-topic-operator)
Copy to Clipboard Copied! このコマンドは、名前が
strimzi-store-topic
およびstrimzi-topic-operator
で始まる内部トピックを削除します。コンシューマーオフセットとトランザクション状態を保存するための内部トピックは、Kafka で保持する必要があります。したがって、
KafkaTopic
リソースを削除する前に、まず Topic Operator による管理を中止する必要があります。トピックの管理を停止します。
oc annotate $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) strimzi.io/managed="false" \ && oc annotate $(oc get kt -n <namespace_name> -o name | grep transaction-state) strimzi.io/managed="false"
oc annotate $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) strimzi.io/managed="false" \ && oc annotate $(oc get kt -n <namespace_name> -o name | grep transaction-state) strimzi.io/managed="false"
Copy to Clipboard Copied! KafkaTopic
リソースにstrimzi.io/managed="false"
のアノテーションを指定して、Topic Operator がそれらのトピックを管理しないことを指定します。この場合、内部トピックを管理するためのアノテーションを、consumer-offsets
とtransaction-state
で始まる名前のリソースに追加します。管理が中断された場合は、
KafkaTopic
リソースを削除します (Kafka 内のトピックは削除されません)。oc delete $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) \ && oc delete $(oc get kt -n <namespace_name> -o name | grep transaction-state)
oc delete $(oc get kt -n <namespace_name> -o name | grep consumer-offsets) \ && oc delete $(oc get kt -n <namespace_name> -o name | grep transaction-state)
Copy to Clipboard Copied!
一方向から双方向トピック管理モードへの切り替え
UnidirectionalTopicOperator
フィーチャーゲートを無効にします。Cluster Operator では、Topic Operator とともに Entity Operator を双方向のトピック管理モードでデプロイします。
双方向トピック管理モードで実行される Topic Operator に必要な内部トピックが作成されます。
トピックの削除を制御するためにファイナライザーが使用されているかどうかを確認します。
KafkaTopic
リソースがファイナライザーを使用している場合は、切り替え後に必ず次のいずれかを実行してください。- トピックからすべてのファイナライザーを削除します。
Topic Operator の
env
設定でSTRIMZI_USE_FINALIZERS
環境変数をfalse
に設定して、ファイナライザーを無効にします。Streams for Apache Kafka が管理するクラスター内で実行されている Topic Operator、またはスタンドアロンデプロイメントとして実行されている Topic Operator に、同じ設定を使用してください。
Streams for Apache Kafka が管理するクラスターでトピックファイナライザーを無効にする
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... entityOperator: topicOperator: {} userOperator: {} template: topicOperatorContainer: env: - name: STRIMZI_USE_FINALIZERS value: "false" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... entityOperator: topicOperator: {} userOperator: {} template: topicOperatorContainer: env: - name: STRIMZI_USE_FINALIZERS value: "false" # ...
Copy to Clipboard Copied! スタンドアロンデプロイメントでのトピックファイナライザーの無効化
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator spec: template: spec: containers: - name: STRIMZI_USE_FINALIZERS value: "false" # ...
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator spec: template: spec: containers: - name: STRIMZI_USE_FINALIZERS value: "false" # ...
Copy to Clipboard Copied! Topic Operator は双方向モードでファイナライザーを使用しません。一方向モードから切り替えを行った後にファイナライザーが保持されている場合は、
KafkaTopic
と関連リソースを削除できません。
Topic Operator モード間の切り替え後に、トピックを作成して、Operator が正常に実行されていることを確認します。詳細は、「Kafka トピックの設定」 を参照してください。
10.10. トピックでのファイナライザーの削除
一方向 Topic Operator が実行されておらず、管理トピックを削除するときにファイナライゼーションプロセスをバイパスする場合は、ファイナライザーを削除する必要があります。これは、リソースを直接編集するか、コマンドを使用して手動で実行できます。
すべてのトピックでファイナライザーを削除するには、以下のコマンドを使用します。
トピックでのファイナライザーの削除
oc get kt -o=json | jq '.items[].metadata.finalizers = null' | oc apply -f -
oc get kt -o=json | jq '.items[].metadata.finalizers = null' | oc apply -f -
このコマンドは、jq
コマンドライン JSON パーサーツール を使用して、ファイナライザーを null
に設定することで KafkaTopic
(kt
) リソースを変更します。特定のトピックにコマンドを使用することもできます。
特定のトピックでファイナライザーの削除
oc get kt <topic_name> -o=json | jq '.metadata.finalizers = null' | oc apply -f -
oc get kt <topic_name> -o=json | jq '.metadata.finalizers = null' | oc apply -f -
コマンドを実行すると、トピックを削除できます。あるいは、トピックがすでに削除されているものの、未処理のファイナライザーによりブロックされていた場合は、削除が完了するはずです。
Topic Operator が実行されていない場合、ファイナライゼーションプロセスに関連するクリーンアップ操作は実行されないため、ファイナライザーを削除するときは注意してください。たとえば、KafkaTopic
リソースからファイナライザーを削除し、その後リソースを削除した場合、関連する Kafka トピックは削除されません。
10.11. トピックの削除を無効にする場合の考慮事項
Kafka の delete.topic.enable
設定が false
に設定されていると、トピックは削除できません。これは特定のシナリオで必要になる場合がありますが、Topic Operator を一方向モードで使用する場合には考慮事項が必要になります。
トピックは削除できないため、トピックの削除を制御するために KafkaTopic
リソースのメタデータに追加されたファイナライザーは、Topic Operator によって削除されることはありません (ただし、手動で削除する ことはできます)。同様に、トピックに関連付けられたカスタムリソース定義 (CRD) または namespace は削除できません。
delete.topic.enable=false
を設定する前に、これらの影響を評価して、特定の要件と一致していることを確認してください。
ファイナライザーの使用を回避するには、STRIMZI_USE_FINALIZERS
Topic Operator 環境変数を false
に設定します。
10.12. トピック操作のリクエストバッチのチューニング
一方向モードでは、Topic Operator は、トピックリソースに対する操作に Kafka Admin API のリクエストバッチ機能を使用します。次の Operator 設定プロパティーを使用して、バッチ処理メカニズムを微調整できます。
-
STRIMZI_MAX_QUEUE_SIZE
: トピックイベントキューの最大サイズを設定します。デフォルト値は 1024 です。 -
STRIMZI_MAX_BATCH_SIZE
: 単一のバッチで許可されるトピックイベントの最大数を設定します。デフォルト値は 100 です。 -
MAX_BATCH_LINGER_MS
: 処理前にバッチがアイテムを蓄積するまで待機する最大時間を指定します。デフォルトは 100 (ミリ秒) です。
リクエストバッチキューの最大サイズを超えると、Topic Operator はシャットダウンされ、再起動されます。頻繁な再起動を防ぐには、一般的な負荷に合わせて STRIMZI_MAX_QUEUE_SIZE
プロパティーを調整することを検討してください。
第11章 User Operator を使用した Kafka ユーザーの管理
KafkaUser
リソースを使用してユーザーを作成、編集、または削除する場合、User Operator によって変更が確実に Kafka クラスターで反映されます。
KafkaUser
リソースの詳細は、KafkaUser
スキーマリファレンス を参照してください。
11.1. Kafka ユーザーの設定
KafkaUser
リソースのプロパティーを使用して、Kafka ユーザーを設定します。
oc apply
を使用すると、ユーザーを作成または編集できます。oc delete
を使用すると、既存のユーザーを削除できます。
以下に例を示します。
-
oc apply -f <user_config_file>
-
oc delete KafkaUser <user_name>
ユーザーは Kafka クライアントを表します。Kafka ユーザーを設定するとき、クライアントが Kafka にアクセスするのに必要なユーザーの認証および認可メカニズムを有効にします。使用するメカニズムは、同等の Kafka
設定と一致する必要があります。Kafka
および KafkaUser
リソースを使用して Kafka ブローカーへのアクセスを保護する方法の詳細については、Kafka ブローカーへの アクセスの保護 を参照してください。
前提条件
- mTLS 認証と TLS 暗号化を使用する Kafka ブローカーリスナーで設定された実行中の Kafka クラスター。
- 実行中の User Operator (通常は Entity Operator とともにデプロイされます)。
手順
KafkaUser
リソースを設定します。この例では、mTLS 認証と、ACL を使用した単純な認可を指定します。
Kafka ユーザー設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user-1 labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: # Example consumer Acls for topic my-topic using consumer group my-group - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read host: "*" - resource: type: group name: my-group patternType: literal operations: - Read host: "*" # Example Producer Acls for topic my-topic - resource: type: topic name: my-topic patternType: literal operations: - Create - Describe - Write host: "*"
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user-1 labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: # Example consumer Acls for topic my-topic using consumer group my-group - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read host: "*" - resource: type: group name: my-group patternType: literal operations: - Read host: "*" # Example Producer Acls for topic my-topic - resource: type: topic name: my-topic patternType: literal operations: - Create - Describe - Write host: "*"
Copy to Clipboard Copied! OpenShift で
KafkaUser
リソースを作成します。oc apply -f <user_config_file>
oc apply -f <user_config_file>
Copy to Clipboard Copied! ユーザーの Ready ステータスが
True
に変わるまで待ちます。oc get kafkausers -o wide -w -n <namespace>
oc get kafkausers -o wide -w -n <namespace>
Copy to Clipboard Copied! Kafka ユーザーの状態
NAME CLUSTER AUTHENTICATION AUTHORIZATION READY my-user-1 my-cluster tls simple True my-user-2 my-cluster tls simple my-user-3 my-cluster tls simple True
NAME CLUSTER AUTHENTICATION AUTHORIZATION READY my-user-1 my-cluster tls simple True my-user-2 my-cluster tls simple my-user-3 my-cluster tls simple True
Copy to Clipboard Copied! READY
出力がTrue
を示す場合、ユーザーの作成は成功です。READY
列が空白のままの場合は、リソース YAML またはユーザー Operator ログからステータスの詳細を取得します。メッセージは、現在のステータスの理由に関する詳細を提供します。
oc get kafkausers my-user-2 -o yaml
oc get kafkausers my-user-2 -o yaml
Copy to Clipboard Copied! NotReady
ステータスのユーザーの詳細...
# ... status: conditions: - lastTransitionTime: "2022-06-10T10:07:37.238065Z" message: Simple authorization ACL rules are configured but not supported in the Kafka cluster configuration. reason: InvalidResourceException status: "True" type: NotReady
Copy to Clipboard Copied! この例では、ユーザーの準備ができていない理由は、
Kafka
設定で簡易認可が有効になっていないためです。簡易認可用の Kafka 設定
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... authorization: type: simple
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... authorization: type: simple
Copy to Clipboard Copied! Kafka 設定を更新した後、ステータスはユーザーの準備ができていることを示します。
oc get kafkausers my-user-2 -o wide -w -n <namespace>
oc get kafkausers my-user-2 -o wide -w -n <namespace>
Copy to Clipboard Copied! ユーザーのステータス更新
NAME CLUSTER AUTHENTICATION AUTHORIZATION READY my-user-2 my-cluster tls simple True
NAME CLUSTER AUTHENTICATION AUTHORIZATION READY my-user-2 my-cluster tls simple True
Copy to Clipboard Copied! 詳細を取得してもメッセージは表示されません。
oc get kafkausers my-user-2 -o yaml
oc get kafkausers my-user-2 -o yaml
Copy to Clipboard Copied! READY
ステータスのユーザーの詳細...
# ... status: conditions: - lastTransitionTime: "2022-06-10T10:33:40.166846Z" status: "True" type: Ready
Copy to Clipboard Copied!
第12章 Red Hat build of Apicurio Registry を使用したスキーマの検証
Streams for Apache Kafka では、Red Hat build of Apicurio Registry を使用できます。
Apicurio Registry は、API およびイベント駆動型アーキテクチャー全体で標準的なイベントスキーマおよび API 設計を共有するためのデータストアです。Apicurio Registry を使用して、クライアントアプリケーションからデータの構造を切り離し、REST インターフェイスを使用して実行時にデータ型と API の記述を共有および管理できます。
Apicurio Registry では、メッセージをシリアライズおよびデシリアライズするために使用されるスキーマが保存されます。その後、クライアントアプリケーションからスキーマを参照して、送受信されるメッセージとこれらのスキーマの互換性を維持するようにします。Apicurio Registry によって、Kafka プロデューサーおよびコンシューマーアプリケーションの Kafka クライアントシリアライザーおよびデシリアライザーが提供されます。Kafka プロデューサーアプリケーションは、シリアライザーを使用して、特定のイベントスキーマに準拠するメッセージをエンコードします。Kafka コンシューマーアプリケーションはデシリアライザーを使用して、特定のスキーマ ID に基づいてメッセージが適切なスキーマを使用してシリアライズされたことを検証します。
アプリケーションがレジストリーからスキーマを使用できるようにすることができます。これにより、スキーマが一貫して使用されるようにし、実行時にデータエラーが発生しないようにします。
第13章 変更データキャプチャーのための Red Hat build of Debezium との統合
Red Hat build of Debezium は、分散型の変更データキャプチャープラットフォームです。データベースの行レベルの変更をキャプチャーして、変更イベントレコードを作成し、Kafka トピックにレコードをストリーミングします。Debezium は Apache Kafka 上に構築されています。Red Hat build of Debezium は、Streams for Apache Kafka にデプロイして統合できます。Streams for Apache Kafka のデプロイ後、Kafka Connect で Debezium をコネクター設定としてデプロイします。Debezium は、変更イベントレコードを OpenShift 上の Streams for Apache Kafka に渡します。アプリケーションはこれらの 変更イベントストリーム を読み取りでき、変更イベントが発生した順にアクセスできます。
Debezium には、以下を含む複数の用途があります。
- データレプリケーション
- キャッシュの更新およびインデックスの検索
- モノリシックアプリケーションの簡素化
- データ統合
- ストリーミングクエリーの有効化
データベースの変更をキャプチャーするには、Debezium データベースコネクターで Kafka Connect をデプロイします。KafkaConnector
リソースを設定し、コネクターインスタンスを定義します。
Streams for Apache Kafka を使用した Red Hat build of Debezium のデプロイの詳細は、製品ドキュメント を参照してください。ドキュメントには、Debezium スタートガイド が含まれています。このガイドでは、データベース更新の変更イベントレコードの表示に必要なサービスおよびコネクターの設定方法を説明しています。
第14章 Kafka クラスターへのクライアントアクセスの設定
Streams for Apache Kafka をデプロイ したら、Kafka クラスターへのクライアントアクセスを設定できます。デプロイメントを検証するために、サンプルのプロデューサークライアントとコンシューマークライアントをデプロイできます。それ以外の場合は、OpenShift クラスター内またはクラスター外でクライアントアクセスを提供するリスナーを作成します。
14.1. サンプルクライアントのデプロイ
サンプルのプロデューサークライアントとコンシューマークライアントをデプロイして、メッセージを送受信します。これらのクライアントを使用して、Streams for Apache Kafka のデプロイメントを検証できます。
前提条件
- クライアントが Kafka クラスターを使用できる。
手順
Kafka プロデューサーをデプロイします。
oc run kafka-producer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic
oc run kafka-producer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic
Copy to Clipboard Copied! - プロデューサーが稼働しているコンソールにメッセージを入力します。
- Enter を押してメッセージを送信します。
Kafka コンシューマーをデプロイします。
oc run kafka-consumer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic --from-beginning
oc run kafka-consumer -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic --from-beginning
Copy to Clipboard Copied! - コンシューマーコンソールに受信メッセージが表示されることを確認します。
14.2. Kafka ブローカーに接続するためのリスナー設定
Kafka ブローカーへのクライアント接続にはリスナーを使用します。Streams for Apache Kafka には、Kafka
リソースを通じてリスナーを設定するためのプロパティーを備えた汎用的な GenericKafkaListener
スキーマが用意されています。GenericKafkaListener
は、リスナー設定に柔軟なアプローチを提供します。プロパティーを指定して、OpenShift クラスター内で接続する 内部 リスナーを設定したり、OpenShift クラスター外部で接続する 外部 リスナーを設定したりできます。
リスナー設定で Kafka を公開するための接続 type
を指定します。要件ならびにお使いの環境およびインフラストラクチャーに応じて、選択するタイプは異なります。次のリスナータイプがサポートされています。
- 内部リスナー
-
同じ OpenShift クラスター内で接続する
internal
-
ブローカーごとの
ClusterIP
サービスを使用して Kafka を公開するcluster-ip
-
同じ OpenShift クラスター内で接続する
- 外部リスナー
-
OpenShift ノードのポートを使用する
nodeport
-
ロードバランサーサービスを使用する
loadbalancer
-
Kubernetes
Ingress
および Kubernetes 用 Ingress NGINX コントローラー を使用するingress
(Kubernetes のみ) -
OpenShift
Route
とデフォルトの HAProxy ルーターを使用するroute
(OpenShift のみ)
-
OpenShift ノードのポートを使用する
OpenShift では ingress
を使用せず、代わりに route
タイプを使用してください。Ingress NGINX コントローラーは、Kubernetes でのみ使用することを目的としています。route
タイプは OpenShift でのみサポートされます。
internal
タイプのリスナー設定は、ヘッドレスサービスと、ブローカー Pod に指定された DNS 名を使用します。OpenShift ネットワークを外部ネットワークに参加させたい場合があります。その場合、OpenShift サービスの DNS ドメイン (通常は .cluster.local
) が使用されないように、内部
タイプのリスナーを (useServiceDnsDomain
プロパティーを使用して) 設定できます。ブローカーごとの ClusterIP
サービスに基づいて Kafka クラスターを公開する cluster-ip
タイプのリスナーを設定することもできます。これは、ヘッドレスサービスを介してルーティングできない場合や、カスタムアクセスメカニズムを組み込みたい場合に便利なオプションです。たとえば、特定の Ingress コントローラーまたは OpenShift Gateway API 用に独自のタイプの外部リスナーを構築するときに、このリスナーを使用できます。
外部リスナーは、さまざまな認証メカニズムを必要とするネットワークから Kafka クラスターへのアクセスを処理します。ロードバランサーやルートなどの指定された接続メカニズムを使用して、OpenShift 環境外部のクライアントアクセスに対して外部リスナーを設定できます。たとえば、ロードバランサーは、ベアメタルなどの特定のインフラストラクチャーには適さない場合があります。ベアメタルでは、ノードポートがより適したオプションを提供します。
各リスナーは、Kafka
リソース内の配列として定義されます。
リスナーの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... listeners: - name: plain port: 9092 type: internal tls: false configuration: useServiceDnsDomain: true - name: tls port: 9093 type: internal tls: true authentication: type: tls - name: external1 port: 9094 type: route tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-certificate.crt key: my-key.key # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
listeners:
- name: plain
port: 9092
type: internal
tls: false
configuration:
useServiceDnsDomain: true
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external1
port: 9094
type: route
tls: true
configuration:
brokerCertChainAndKey:
secretName: my-secret
certificate: my-certificate.crt
key: my-key.key
# ...
名前とポートが一意であれば、必要なリスナーをいくつでも設定できます。認証を使用してセキュアな接続を行うようにリスナーを設定することもできます。
各接続タイプの長所と短所については、Strimzi での Apache Kafka へのアクセスを参照してください。
外部リスナーの使用時に Kafka クラスターをスケーリングする場合、すべての Kafka ブローカーのローリング更新がトリガーされる可能性があります。これは設定によって異なります。
14.3. リスナーの命名規則
リスナー設定から得られるリスナーブートストラップ名とブローカーごとのサービス名は、次の命名規則に従って構成されます。
リスナータイプ | ブートストラップサービス名 | ブローカーごとのサービス名 |
---|---|---|
| <cluster_name>-kafka-bootstrap | 該当なし |
| <cluster_name>-kafka-<listener-name>-bootstrap | <cluster_name>-kafka-<listener-name>-<idx> |
たとえば、my-cluster-kafka-bootstrap
, my-cluster-kafka-external1-bootstrap
や my-cluster-kafka-external1-0
などです。名前は、リスナー設定を介して作成されるサービス、ルート、ロードバランサー、および ingress に割り当てられます。
特定の下位互換性のある名前とポート番号を使用して、廃止された KafkaListeners
スキーマで最初に設定されたリスナーを移行できます。結果として得られる外部リスナーの命名規則は若干異なります。リスナー名とポート設定値の次の特定の組み合わせには下位互換性があります。
リスナー名 | ポート | ブートストラップサービス名 | ブローカーごとのサービス名 |
---|---|---|---|
|
| <cluster_name>-kafka-bootstrap | 該当なし |
|
| <cluster-name>-kafka-bootstrap | 該当なし |
|
| <cluster_name>-kafka-bootstrap | <cluster_name>-kafka-bootstrap-<idx> |
14.4. リスナーを使用した Kafka クラスターへのクライアントアクセス設定
Kafka クラスターのアドレスを使用して、同じ OpenShift クラスター内のクライアントへのアクセスを提供できます。または、別の OpenShift namespace または完全に OpenShift の外部にあるクライアントへの外部アクセスを提供できます。この手順では、OpenShift の外部または別の OpenShift クラスターから、Kafka クラスターへのクライアントアクセスを設定する方法を示します。
Kafka リスナーは、Kafka クラスターへのアクセスを提供します。クライアントアクセスは、次の設定を使用して保護されます。
-
mTLS 暗号化および認証、ならびに Kafka
simple
認可を有効にして、Kafka クラスターに外部リスナーが設定されます。 -
simple
認可用に mTLS 認証および アクセス制御リスト (ACL) を定義して、クライアントにKafkaUser
が作成されます。
相互 tls
、scram-sha-512
、または oauth
認証を使用するようにリスナーを設定できます。mTLS は常に暗号化を使用しますが、SCRAM-SHA-512 および OAuth 2.0 認証を使用する場合は暗号化も推奨されます。
Kafka ブローカーに simple
、oauth
、opa
、または custom
認可を設定できます。認可を有効にすると、認可は有効なすべてのリスナーに適用されます。
KafkaUser
認証および認可メカニズムを設定する場合は、必ず同等の Kafka 設定と一致させてください。
-
KafkaUser.spec.authentication
はKafka.spec.kafka.listeners[*].authentication
と一致します。 -
KafkaUser.spec.authorization
はKafka.spec.kafka.authorization
と一致します。
KafkaUser
に使用する認証をサポートするリスナーが少なくとも 1 つ必要です。
Kafka ユーザーと Kafka ブローカー間の認証は、それぞれの認証設定によって異なります。たとえば、mTLS が Kafka 設定で有効になっていない場合は、mTLS でユーザーを認証できません。
Streams for Apache Kafka の Operator が、設定プロセスを自動化し、認証に必要な証明書を作成します。
- Cluster Operator はリスナーを作成し、クラスターとクライアント認証局 (CA) 証明書を設定して、Kafka クラスターでの認証を有効にします。
- User Operator はクライアントに対応するユーザーを作成すると共に、選択した認証タイプに基づいて、クライアント認証に使用されるセキュリティークレデンシャルを作成します。
証明書をクライアント設定に追加します。
この手順では、Cluster Operator によって生成された CA 証明書が使用されますが、独自の証明書をインストール して証明書を置き換えることもできます。外部 CA (認証局) によって管理される Kafka リスナー証明書を使用 するようにリスナーを設定することもできます。
証明書は、PEM (.crt) および PKCS #12 (.p12) 形式で利用できます。この手順では、PEM 証明書を使用します。X.509 形式の証明書を使用するクライアントで PEM 証明書を使用します。
同じ OpenShift クラスターおよび namespace の内部クライアントの場合、Pod 仕様でクラスター CA 証明書をマウントできます。詳細については、クラスター CA を信頼するように内部クライアントを設定する を参照してください。
前提条件
- OpenShift クラスターの外部で実行されているクライアントによる接続に、Kafka クラスターを使用できる。
- Cluster Operator および User Operator がクラスターで実行されている。
手順
Kafka リスナーを使用して Kafka クラスターを設定します。
- リスナーを通じて Kafka ブローカーにアクセスするために必要な認証を定義します。
Kafka ブローカーで認可を有効にします。
リスナーの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external1 port: 9094 type: <listener_type> tls: true authentication: type: tls configuration: #... authorization: type: simple superUsers: - super-user-name # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... listeners:
1 - name: external1
2 port: 9094
3 type: <listener_type>
4 tls: true
5 authentication: type: tls
6 configuration:
7 #... authorization:
8 type: simple superUsers: - super-user-name
9 # ...
Copy to Clipboard Copied! - 1
- 外部リスナーを有効にする設定オプションは、汎用 Kafka リスナースキーマリファレンス に記載されています。
- 2
- リスナーを識別するための名前。Kafka クラスター内で一意である必要があります。
- 3
- Kafka 内でリスナーによって使用されるポート番号。ポート番号は指定の Kafka クラスター内で一意である必要があります。許可されるポート番号は 9092 以上ですが、すでに Prometheus および JMX によって使用されているポート 9404 および 9999 以外になります。リスナーのタイプによっては、ポート番号は Kafka クライアントに接続するポート番号と同じではない場合があります。
- 4
- 外部リスナーのタイプは、
route
(OpenShift のみ)、loadbalancer
、nodeport
またはingress
(Kubernetes のみ) として指定されます。内部リスナーはinternal
またはcluster-ip
として指定されます。 - 5
- 必須。リスナーでの TLS 暗号化。
route
およびingress
タイプのリスナーの場合は、true
に設定する必要があります。mTLS 認証の場合は、authentication
プロパティーも使用します。 - 6
- リスナーでのクライアント認証メカニズム。mTLS を使用したサーバーおよびクライアント認証の場合、
tls: true
およびauthentication.type: tls
を指定します。 - 7
- (オプション) リスナータイプの要件に応じて、追加の リスナー設定 を指定できます。
- 8
AclAuthorizer
およびStandardAuthorizer
Kafka プラグインを使用するsimple
として指定された認可。- 9
- (任意設定) スーパーユーザーは、ACL で定義されたアクセス制限に関係なく、すべてのブローカーにアクセスできます。
警告OpenShift ルートアドレスは、Kafka クラスター名、リスナー名、プロジェクト名、およびルーターのドメインで構成されます。たとえば、
my-cluster-kafka-external1-bootstrap-my-project.domain.com
(<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>) のようになります。各 DNS ラベル (ピリオド.の間) は 63 文字を超えてはならず、アドレスの合計の長さは 255 文字を超えてはなりません。
Kafka
リソースを作成または更新します。oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! Kafka クラスターは、mTLS 認証を使用する Kafka ブローカーリスナーと共に設定されます。
Kafka ブローカー Pod ごとにサービスが作成されます。
サービスが作成され、Kafka クラスターに接続するための ブートストラップアドレス として機能します。
サービスは、
nodeport
リスナーを使用した Kafka クラスターへの外部接続用 外部ブートストラップアドレス としても作成されます。kafka ブローカーのアイデンティティーを検証するクラスター CA 証明書もシークレット
<cluster_name>-cluster-ca-cert
に作成されます。注記外部リスナーの使用時に Kafka クラスターをスケーリングする場合、すべての Kafka ブローカーのローリング更新がトリガーされる可能性があります。これは設定によって異なります。
Kafka
リソースのステータスから、Kafka クラスターにアクセスする際に使用するブートストラップアドレスを取得します。oc get kafka <kafka_cluster_name> -o=jsonpath='{.status.listeners[?(@.name=="<listener_name>")].bootstrapServers}{"\n"}'
oc get kafka <kafka_cluster_name> -o=jsonpath='{.status.listeners[?(@.name=="<listener_name>")].bootstrapServers}{"\n"}'
Copy to Clipboard Copied! 以下に例を示します。
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}'
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}'
Copy to Clipboard Copied! Kafka クライアントのブートストラップアドレスを使用して、Kafka クラスターに接続します。
Kafka クラスターにアクセスする必要があるクライアントに対応するユーザーを作成または変更します。
-
Kafka
リスナーと同じ認証タイプを指定します。 simple
認可の認可 ACL を指定します。ユーザー設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read - resource: type: group name: my-group patternType: literal operations: - Read
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster
1 spec: authentication: type: tls
2 authorization: type: simple acls:
3 - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read - resource: type: group name: my-group patternType: literal operations: - Read
Copy to Clipboard Copied!
-
KafkaUser
リソースを作成または変更します。oc apply -f USER-CONFIG-FILE
oc apply -f USER-CONFIG-FILE
Copy to Clipboard Copied! KafkaUser
リソースと同じ名前のシークレットと共に、ユーザーが作成されます。シークレットには、mTLS 認証用の公開鍵と秘密鍵が含まれています。シークレットの例
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
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
Copy to Clipboard Copied! Kafka クラスターの
<cluster_name>-cluster-ca-cert
シークレットからクラスター CA 証明書を抽出します。oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
Copy to Clipboard Copied! <user_name>
シークレットからユーザー CA 証明書を抽出します。oc get secret <user_name> -o jsonpath='{.data.user\.crt}' | base64 -d > user.crt
oc get secret <user_name> -o jsonpath='{.data.user\.crt}' | base64 -d > user.crt
Copy to Clipboard Copied! <user_name>
シークレットからユーザーの秘密鍵を抽出します。oc get secret <user_name> -o jsonpath='{.data.user\.key}' | base64 -d > user.key
oc get secret <user_name> -o jsonpath='{.data.user\.key}' | base64 -d > user.key
Copy to Clipboard Copied! Kafka クラスターに接続するためのブートストラップアドレスのホスト名とポートを使用してクライアントを設定します。
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "<hostname>:<port>");
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "<hostname>:<port>");
Copy to Clipboard Copied! Kafka クラスターの ID を検証するために、トラストストア認証情報を使用してクライアントを設定します。
パブリッククラスター CA 証明書を指定します。
トラストストア設定の例
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_TRUSTSTORE_CERTIFICATES_CONFIG, "<ca.crt_file_content>");
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_TRUSTSTORE_CERTIFICATES_CONFIG, "<ca.crt_file_content>");
Copy to Clipboard Copied! SSL は、mTLS 認証用に指定されたセキュリティープロトコルです。TLS を介した SCRAM-SHA-512 認証には
SASL_SSL
を指定します。PEM はトラストストアのファイル形式です。Kafka クラスターに接続する際にユーザーを検証するために、キーストア認証情報を使用してクライアントを設定します。
公開証明書と秘密鍵を指定します。
キーストア設定の例
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "<user.crt_file_content>"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "<user.key_file_content>");
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "<user.crt_file_content>"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "<user.key_file_content>");
Copy to Clipboard Copied! キーストア証明書と秘密鍵を設定に直接追加します。1 行形式で追加します。
BEGIN CERTIFICATE
とEND CERTIFICATE
区切り文字の間は、改行文字 (\n
) で始まります。元の証明書の各行も\n
で終了します。キーストア設定の例
props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "-----BEGIN CERTIFICATE----- \n<user_certificate_content_line_1>\n<user_certificate_content_line_n>\n-----END CERTIFICATE---"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "----BEGIN PRIVATE KEY-----\n<user_key_content_line_1>\n<user_key_content_line_n>\n-----END PRIVATE KEY-----");
props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "-----BEGIN CERTIFICATE----- \n<user_certificate_content_line_1>\n<user_certificate_content_line_n>\n-----END CERTIFICATE---"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "----BEGIN PRIVATE KEY-----\n<user_key_content_line_1>\n<user_key_content_line_n>\n-----END PRIVATE KEY-----");
Copy to Clipboard Copied!
14.5. ノードポートを使用した Kafka へのアクセス
ノードポートを使用して、OpenShift クラスター外の外部クライアントから Streams for Apache Kafka クラスターにアクセスします。
ブローカーに接続するには、Kafka ブートストラップアドレスのホスト名とポート番号、および TLS 暗号化に使用される証明書を指定します。
この手順では、基本的な nodeport
リスナーの設定を示します。リスナープロパティーを使用して、TLS 暗号化 (tls
) を有効にし、クライアント認証メカニズム (authentication
) を指定できます。configuration
プロパティーを使用して追加の設定を追加します。たとえば、nodeport
リスナーで次の設定プロパティーを使用できます。
preferredNodePortAddressType
- ノードアドレスとしてチェックされる最初のアドレスタイプを指定します。
externalTrafficPolicy
- サービスによって外部トラフィックがローカルノードのエンドポイントまたはクラスター全体のエンドポイントにルーティングされるかどうかを指定します。
nodePort
- ブートストラップおよびブローカーサービスに割り当てられたノードポート番号をオーバーライドします。
リスナー設定の詳細は、GenericKafkaListener
スキーマリファレンス を参照してください。
前提条件
- 稼働中の Cluster Operator
この手順では、Kafka クラスター名は my-cluster
です。リスナーの名前は external4
です。
手順
外部リスナーを
nodeport
タイプに設定してKafka
リソースを設定します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external4 port: 9094 type: nodeport tls: true authentication: type: tls # ... # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external4 port: 9094 type: nodeport tls: true authentication: type: tls # ... # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! kafka ブローカーの ID を確認するためのクラスター CA 証明書は、シークレットの
my-cluster-cluster-ca-cert
に作成されます。NodePort
タイプのサービスは、外部ブートストラップサービスと同様に、Kafka ブローカーごとに作成されます。ブートストラップおよびブローカー用に作成されたノードポートサービス
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external4-0 NodePort 172.30.55.13 9094:31789/TCP my-cluster-kafka-external4-1 NodePort 172.30.250.248 9094:30028/TCP my-cluster-kafka-external4-2 NodePort 172.30.115.81 9094:32650/TCP my-cluster-kafka-external4-bootstrap NodePort 172.30.30.23 9094:32650/TCP
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external4-0 NodePort 172.30.55.13 9094:31789/TCP my-cluster-kafka-external4-1 NodePort 172.30.250.248 9094:30028/TCP my-cluster-kafka-external4-2 NodePort 172.30.115.81 9094:32650/TCP my-cluster-kafka-external4-bootstrap NodePort 172.30.30.23 9094:32650/TCP
Copy to Clipboard Copied! クライアント接続に使用されるブートストラップアドレスは、
Kafka
リソースのstatus
に伝播されます。ブートストラップアドレスのステータスの例
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready kafkaVersion: 3.7.0 listeners: # ... - addresses: - host: ip-10-0-224-199.us-west-2.compute.internal port: 32650 bootstrapServers: 'ip-10-0-224-199.us-west-2.compute.internal:32650' certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external4 observedGeneration: 2 operatorLastSuccessfulVersion: 2.7 # ...
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready kafkaVersion: 3.7.0 listeners: # ... - addresses: - host: ip-10-0-224-199.us-west-2.compute.internal port: 32650 bootstrapServers: 'ip-10-0-224-199.us-west-2.compute.internal:32650' certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external4 observedGeneration: 2 operatorLastSuccessfulVersion: 2.7 # ...
Copy to Clipboard Copied! Kafka
リソースのステータスから、Kafka クラスターにアクセスする際に使用するブートストラップアドレスを取得します。oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external4")].bootstrapServers}{"\n"}' ip-10-0-224-199.us-west-2.compute.internal:32650
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external4")].bootstrapServers}{"\n"}' ip-10-0-224-199.us-west-2.compute.internal:32650
Copy to Clipboard Copied! クラスター CA 証明書を抽出します。
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
Copy to Clipboard Copied! ブローカーに接続するようにクライアントを設定します。
-
Kafka クラスターに接続するためのブートストラップアドレスとして、Kafka クライアントのブートストラップホストとポートを指定します。たとえば、
ip-10-0-224-199.us-west-2.compute.internal:32650
です。 抽出した証明書を Kafka クライアントのトラストストアに追加して、TLS 接続を設定します。
クライアント認証メカニズムを有効にした場合は、クライアントでもそれを設定する必要があります。
-
Kafka クラスターに接続するためのブートストラップアドレスとして、Kafka クライアントのブートストラップホストとポートを指定します。たとえば、
独自のリスナー証明書を使用している場合は、CA 証明書をクライアントのトラストストア設定に追加する必要があるかどうかを確認してください。パブリック (外部) CA の場合、通常は追加する必要はありません。
14.6. ロードバランサーを使用した Kafka へのアクセス
ロードバランサーを使用して、OpenShift クラスター外の外部クライアントから Streams for Apache Kafka クラスターにアクセスします。
ブローカーに接続するには、Kafka ブートストラップアドレスのホスト名とポート番号、および TLS 暗号化に使用される証明書を指定します。
この手順では、基本的な loadbalancer
リスナーの設定を示します。リスナープロパティーを使用して、TLS 暗号化 (tls
) を有効にし、クライアント認証メカニズム (authentication
) を指定できます。configuration
プロパティーを使用して追加の設定を追加します。たとえば、loadbalancer
リスナーで次の設定プロパティーを使用できます。
loadBalancerSourceRanges
- トラフィックを CIDR (クラスレスドメイン間ルーティング) 範囲の指定されたリストに制限します。
externalTrafficPolicy
- サービスによって外部トラフィックがローカルノードのエンドポイントまたはクラスター全体のエンドポイントにルーティングされるかどうかを指定します。
loadBalancerIP
- ロードバランサーの作成時に特定の IP アドレスを要求します。
リスナー設定の詳細は、GenericKafkaListener
スキーマリファレンス を参照してください。
前提条件
- 稼働中の Cluster Operator
この手順では、Kafka クラスター名は my-cluster
です。リスナーの名前は external3
です。
手順
外部リスナーを
loadbalancer
タイプに設定してKafka
リソースを設定します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: tls # ... # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: tls # ... # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! Kafka ブローカーの ID を検証するためのクラスター CA 証明書も、シークレット
my-cluster-cluster-ca-cert
に作成されます。loadbalancer
タイプのサービスとロードバランサーは、外部ブートストラップサービスと同様に、Kafka ブローカーごとに作成されます。ロードバランサーサービス、ブートストラップおよびブローカー用に作成されたロードバランサー
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external3-0 LoadBalancer 172.30.204.234 9094:30011/TCP my-cluster-kafka-external3-1 LoadBalancer 172.30.164.89 9094:32544/TCP my-cluster-kafka-external3-2 LoadBalancer 172.30.73.151 9094:32504/TCP my-cluster-kafka-external3-bootstrap LoadBalancer 172.30.30.228 9094:30371/TCP NAME EXTERNAL-IP (loadbalancer) my-cluster-kafka-external3-0 a8a519e464b924000b6c0f0a05e19f0d-1132975133.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-1 ab6adc22b556343afb0db5ea05d07347-611832211.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-2 a9173e8ccb1914778aeb17eca98713c0-777597560.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-bootstrap a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com
NAME TYPE CLUSTER-IP PORT(S) my-cluster-kafka-external3-0 LoadBalancer 172.30.204.234 9094:30011/TCP my-cluster-kafka-external3-1 LoadBalancer 172.30.164.89 9094:32544/TCP my-cluster-kafka-external3-2 LoadBalancer 172.30.73.151 9094:32504/TCP my-cluster-kafka-external3-bootstrap LoadBalancer 172.30.30.228 9094:30371/TCP NAME EXTERNAL-IP (loadbalancer) my-cluster-kafka-external3-0 a8a519e464b924000b6c0f0a05e19f0d-1132975133.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-1 ab6adc22b556343afb0db5ea05d07347-611832211.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-2 a9173e8ccb1914778aeb17eca98713c0-777597560.us-west-2.elb.amazonaws.com my-cluster-kafka-external3-bootstrap a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com
Copy to Clipboard Copied! クライアント接続に使用されるブートストラップアドレスは、
Kafka
リソースのstatus
に伝播されます。ブートストラップアドレスのステータスの例
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready kafkaVersion: 3.7.0 listeners: # ... - addresses: - host: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com port: 9094 bootstrapServers: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094 certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external3 observedGeneration: 2 operatorLastSuccessfulVersion: 2.7 # ...
status: clusterId: Y_RJQDGKRXmNF7fEcWldJQ conditions: - lastTransitionTime: '2023-01-31T14:59:37.113630Z' status: 'True' type: Ready kafkaVersion: 3.7.0 listeners: # ... - addresses: - host: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com port: 9094 bootstrapServers: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094 certificates: - | -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- name: external3 observedGeneration: 2 operatorLastSuccessfulVersion: 2.7 # ...
Copy to Clipboard Copied! クライアント接続に使用される DNS アドレスは、各ロードバランサーサービスの
status
に伝達されます。ブートストラップロードバランサーのステータスの例
status: loadBalancer: ingress: - hostname: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com # ...
status: loadBalancer: ingress: - hostname: >- a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com # ...
Copy to Clipboard Copied! Kafka
リソースのステータスから、Kafka クラスターにアクセスする際に使用するブートストラップアドレスを取得します。oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external3")].bootstrapServers}{"\n"}' a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external3")].bootstrapServers}{"\n"}' a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094
Copy to Clipboard Copied! クラスター CA 証明書を抽出します。
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
Copy to Clipboard Copied! ブローカーに接続するようにクライアントを設定します。
-
Kafka クラスターに接続するためのブートストラップアドレスとして、Kafka クライアントのブートストラップホストとポートを指定します。たとえば、
a8d4a6fb363bf447fb6e475fc3040176-36312313.us-west-2.elb.amazonaws.com:9094
です。 抽出した証明書を Kafka クライアントのトラストストアに追加して、TLS 接続を設定します。
クライアント認証メカニズムを有効にした場合は、クライアントでもそれを設定する必要があります。
-
Kafka クラスターに接続するためのブートストラップアドレスとして、Kafka クライアントのブートストラップホストとポートを指定します。たとえば、
独自のリスナー証明書を使用している場合は、CA 証明書をクライアントのトラストストア設定に追加する必要があるかどうかを確認してください。パブリック (外部) CA の場合、通常は追加する必要はありません。
14.7. OpenShift ルートを使用した Kafka へのアクセス
OpenShift ルートを使用して、OpenShift クラスター外のクライアントから Streams for Apache Kafka クラスターにアクセスします。
ルートを使用できるようにするには、Kafka
カスタムリソースに route
タイプリスナーの設定を追加します。適用すると、設定により、外部ブートストラップとクラスター内の各ブローカーに専用のルートとサービスが作成されます。クライアントはブートストラップルートに接続し、ブートストラップサービスを経由してクライアントをルーティングし、ブローカーに接続します。その後、ブローカーごとの接続が DNS 名を使用して確立されます。DNS 名は、ブローカー固有のルートとサービスを介してクライアントからブローカーにトラフィックをルーティングします。
ブローカーに接続するには、ルートブートストラップアドレスのホスト名と、TLS 暗号化に使用される証明書を指定します。ルートを使用したアクセスでは、ポートは常に 443 になります。
OpenShift ルートアドレスは、Kafka クラスター名、リスナー名、プロジェクト名、およびルーターのドメインで構成されます。たとえば、my-cluster-kafka-external1-bootstrap-my-project.domain.com
(<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>) のようになります。各 DNS ラベル (ピリオド.の間) は 63 文字を超えてはならず、アドレスの合計の長さは 255 文字を超えてはなりません。
この手順では、基本的なリスナー設定を示します。TLS 暗号化 (tls
) を有効にする必要があります。クライアント認証メカニズム (authentication
) を指定することもできます。configuration
プロパティーを使用して追加の設定を追加します。たとえば、route
リスナーで host
設定プロパティーを使用して、ブートストラップサービスおよびブローカーごとのサービスで使用されるホスト名を指定できます。
リスナー設定の詳細は、GenericKafkaListener
スキーマリファレンス を参照してください。
TLS パススルー
Streams for Apache Kafka によって作成されたルートでは、TLS パススルーが有効になります。Kafka は TCP 経由でバイナリープロトコルを使用しますが、ルートは HTTP プロトコルで動作するように設計されています。TCP トラフィックをルート経由でルーティングできるようにするために、Streams for Apache Kafka は Server Name Indication (SNI) を使用した TLS パススルーを使用します。
SNI は、Kafka ブローカーへの接続を識別して渡すのに役立ちます。パススルーモードでは、TLS 暗号化が常に使用されます。接続はブローカーに渡されるため、リスナーは、ingress 証明書ではなく、内部クラスター CA によって署名された TLS 証明書を使用します。独自のリスナー証明書を使用するようにリスナーを設定するには、brokerCertChainAndKey
プロパティーを使用します。
前提条件
- 稼働中の Cluster Operator
この手順では、Kafka クラスター名は my-cluster
です。リスナーの名前は external1
です。
手順
外部リスナーを
route
タイプに設定したKafka
リソースを設定します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external1 port: 9094 type: route tls: true authentication: type: tls # ... # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external1 port: 9094 type: route tls: true
1 authentication: type: tls # ... # ... zookeeper: # ...
Copy to Clipboard Copied! - 1
route
タイプリスナーの場合、TLS 暗号化を有効にする必要があります (true
)。
リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! kafka ブローカーの ID を確認するためのクラスター CA 証明書は、シークレットの
my-cluster-cluster-ca-cert
に作成されます。ClusterIP
タイプサービスは、各 Kafka ブローカーと、外部のブートストラップサービスに対して作成されます。デフォルトの OpenShift HAProxy ルーターを使用してサービスを公開するための DNS アドレス (ホスト/ポート) を使用して、サービスごとに
route
も作成されます。ルートは、TLS パススルーで事前設定されています。
ブートストラップとブローカー用に作成されたルート
NAME HOST/PORT SERVICES PORT TERMINATION my-cluster-kafka-external1-0 my-cluster-kafka-external1-0-my-project.router.com my-cluster-kafka-external1-0 9094 passthrough my-cluster-kafka-external1-1 my-cluster-kafka-external1-1-my-project.router.com my-cluster-kafka-external1-1 9094 passthrough my-cluster-kafka-external1-2 my-cluster-kafka-external1-2-my-project.router.com my-cluster-kafka-external1-2 9094 passthrough my-cluster-kafka-external1-bootstrap my-cluster-kafka-external1-bootstrap-my-project.router.com my-cluster-kafka-external1-bootstrap 9094 passthrough
NAME HOST/PORT SERVICES PORT TERMINATION my-cluster-kafka-external1-0 my-cluster-kafka-external1-0-my-project.router.com my-cluster-kafka-external1-0 9094 passthrough my-cluster-kafka-external1-1 my-cluster-kafka-external1-1-my-project.router.com my-cluster-kafka-external1-1 9094 passthrough my-cluster-kafka-external1-2 my-cluster-kafka-external1-2-my-project.router.com my-cluster-kafka-external1-2 9094 passthrough my-cluster-kafka-external1-bootstrap my-cluster-kafka-external1-bootstrap-my-project.router.com my-cluster-kafka-external1-bootstrap 9094 passthrough
Copy to Clipboard Copied! クライアント接続に使用される DNS アドレスは、各ルートの
status
に伝播されます。ブートストラップルートのステータスの例
status: ingress: - host: >- my-cluster-kafka-external1-bootstrap-my-project.router.com # ...
status: ingress: - host: >- my-cluster-kafka-external1-bootstrap-my-project.router.com # ...
Copy to Clipboard Copied! ターゲットブローカーを使用して、OpenSSL
s_client
を使用するポート 443 でクライアントサーバーの TLS 接続を確認します。openssl s_client -connect my-cluster-kafka-external1-0-my-project.router.com:443 -servername my-cluster-kafka-external1-0-my-project.router.com -showcerts
openssl s_client -connect my-cluster-kafka-external1-0-my-project.router.com:443 -servername my-cluster-kafka-external1-0-my-project.router.com -showcerts
Copy to Clipboard Copied! サーバー名は、接続をブローカーに渡すための Server Name Indication (SNI) です。
接続が成功すると、ブローカーの証明書が返されます。
ブローカーの証明書
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0
Copy to Clipboard Copied! Kafka
リソースのステータスからブートストラップサービスのアドレスを取得します。oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external1")].bootstrapServers}{"\n"}' my-cluster-kafka-external1-bootstrap-my-project.router.com:443
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external1")].bootstrapServers}{"\n"}' my-cluster-kafka-external1-bootstrap-my-project.router.com:443
Copy to Clipboard Copied! アドレスは、Kafka クラスター名、リスナー名、プロジェクト名、およびルーターのドメイン (この例では
router.com
) で構成されます。クラスター CA 証明書を抽出します。
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
Copy to Clipboard Copied! ブローカーに接続するようにクライアントを設定します。
- Kafka クラスターに接続するためのブートストラップアドレスとして、Kafka クライアントでブートストラップサービスのアドレスとポート 443 を指定します。
抽出した証明書を Kafka クライアントのトラストストアに追加して、TLS 接続を設定します。
クライアント認証メカニズムを有効にした場合は、クライアントでもそれを設定する必要があります。
独自のリスナー証明書を使用している場合は、CA 証明書をクライアントのトラストストア設定に追加する必要があるかどうかを確認してください。パブリック (外部) CA の場合、通常は追加する必要はありません。
14.8. サービスの接続の詳細を返す
サービスディスカバリーは、Streams for Apache Kafka と同じ OpenShift クラスターで稼働しているクライアントアプリケーションの Kafka クラスターとの対話を容易にします。
サービスディスカバリー ラベルおよびアノテーションは、Kafka クラスターにアクセスするために使用されるサービスに対して生成されます。
- 内部 Kafka ブートストラップサービス
- Kafka Bridge サービス
ラベルは、サービスを検出可能にするのに役立ちます。アノテーションは、クライアントアプリケーションが接続を確立するための接続の詳細を提供します。
サービスディスカバリーラベル strimzi.io/discovery
は、Service
リソースに対して true
に設定されています。サービスディスカバリーアノテーションには同じキーがあり、各サービスの接続詳細を JSON 形式で提供します。
内部 Kafka ブートストラップサービスの例
apiVersion: v1 kind: Service metadata: annotations: strimzi.io/discovery: |- [ { "port" : 9092, "tls" : false, "protocol" : "kafka", "auth" : "scram-sha-512" }, { "port" : 9093, "tls" : true, "protocol" : "kafka", "auth" : "tls" } ] labels: strimzi.io/cluster: my-cluster strimzi.io/discovery: "true" strimzi.io/kind: Kafka strimzi.io/name: my-cluster-kafka-bootstrap name: my-cluster-kafka-bootstrap spec: #...
apiVersion: v1
kind: Service
metadata:
annotations:
strimzi.io/discovery: |-
[ {
"port" : 9092,
"tls" : false,
"protocol" : "kafka",
"auth" : "scram-sha-512"
}, {
"port" : 9093,
"tls" : true,
"protocol" : "kafka",
"auth" : "tls"
} ]
labels:
strimzi.io/cluster: my-cluster
strimzi.io/discovery: "true"
strimzi.io/kind: Kafka
strimzi.io/name: my-cluster-kafka-bootstrap
name: my-cluster-kafka-bootstrap
spec:
#...
Kafka Bridge サービスの例
apiVersion: v1 kind: Service metadata: annotations: strimzi.io/discovery: |- [ { "port" : 8080, "tls" : false, "auth" : "none", "protocol" : "http" } ] labels: strimzi.io/cluster: my-bridge strimzi.io/discovery: "true" strimzi.io/kind: KafkaBridge strimzi.io/name: my-bridge-bridge-service
apiVersion: v1
kind: Service
metadata:
annotations:
strimzi.io/discovery: |-
[ {
"port" : 8080,
"tls" : false,
"auth" : "none",
"protocol" : "http"
} ]
labels:
strimzi.io/cluster: my-bridge
strimzi.io/discovery: "true"
strimzi.io/kind: KafkaBridge
strimzi.io/name: my-bridge-bridge-service
コマンドラインまたは対応する API 呼び出しでサービスを取得するときにディスカバリーラベルを指定して、サービスを検出します。
ディスカバリーラベルを使用してサービスを返す
oc get service -l strimzi.io/discovery=true
oc get service -l strimzi.io/discovery=true
サービスディスカバリーラベルの取得時に接続の詳細が返されます。
第15章 Kafka へのアクセスのセキュア化
クライアントが Kafka ブローカーに対して持つアクセスを管理することで、Kafka クラスターを保護します。Kafka ブローカーとクライアント間のセキュアな接続には、次のものが含まれます。
- データ交換の暗号化
- アイデンティティー証明に使用する認証
- ユーザーが実行するアクションを許可または拒否する認可
Streams for Apache Kafka では、接続を保護するためにリスナーとユーザーアカウントを設定する必要があります。
- リスナーの設定
Kafka
リソースを使用して、Kafka ブローカーへのクライアント接続用のリスナーを設定します。リスナーは、mTLS、SCRAM-SHA-512、OAuth 2.0、またはカスタム認証方法の使用など、クライアントの認証方法を定義します。セキュリティーを強化するには、TLS 暗号化を設定して Kafka ブローカーとクライアント間の通信を保護します。Kafka ブローカー設定でサポートされている TLS バージョンと暗号スイートを指定することで、TLS ベースの通信をさらにセキュリティー保護できます。保護層を追加するには、
Kafka
リソースを使用して、シンプル、OAuth 2.0、OPA、カスタム認証などの Kafka クラスターの認証方法を指定します。- ユーザーアカウント
Streams for Apache Kafka の
KafkaUser
リソースを使用してユーザーアカウントと認証情報を設定します。ユーザーはクライアントを表し、Kafka クラスターで認証および認可する方法を決定します。ユーザー設定で指定された認証および認可メカニズムは、Kafka 設定と一致する必要があります。さらに、アクセス制御リスト (ACL) を定義して、特定のトピックおよびアクションへのユーザーアクセスを制御し、よりきめ細かい承認を実現します。セキュリティーをさらに強化するには、ユーザークォータを指定して、バイトレートまたは CPU 使用率に基づいて Kafka ブローカーへのクライアントアクセスを制限します。使用する TLS バージョンと暗号スイートを制限する場合は、クライアントにプロデューサー設定またはコンシューマー設定を追加することもできます。クライアントの設定では、ブローカーで有効になっているプロトコルと暗号スイートのみを使用する必要があります。
OAuth 2.0 を使用してクライアントアクセスを管理している場合、ユーザー認証と認可認証情報は認可サーバーを通じて管理されます。
Streams for Apache Kafka の Operator が、設定プロセスを自動化し、認証に必要な証明書を作成します。Cluster Operator は、クラスター内のデータ暗号化と認証に対して TLS 証明書を自動設定します。
15.1. Kafka のセキュリティーオプション
Kafka
リソースを使用して、Kafka の認証および認可に使用されるメカニズムを設定します。
15.1.1. リスナー認証
リスナーの作成時に、Kafka ブローカーのクライアント認証を設定します。Kafka
リソースの Kafka.spec.kafka.listeners.authentication
プロパティーを使用して、リスナー認証タイプを指定します。
OpenShift クラスター内のクライアントの場合は、plain
(暗号化なし) または tls
internal リスナーを作成できます。internal
リスナータイプは、ヘッドレスサービスと、ブローカー Pod に指定された DNS 名を使用します。ヘッドレスサービスの代わりに、内部リスナーの cluster-ip
タイプを作成して、ブローカーごとの ClusterIP
サービスを使用して Kafka を公開することもできます。OpenShift クラスターの外部にあるクライアントの場合は、外部 リスナーを作成し、接続メカニズム (nodeport
、loadbalancer
、ingress
(Kubernetes のみ)、または route
(OpenShift のみ)) を指定します。
外部クライアントを接続するための設定オプションの詳細については、14章Kafka クラスターへのクライアントアクセスの設定 を参照してください。
サポートされる認証オプションは次のとおりです。
- mTLS 認証 (TLS が有効な暗号化を使用するリスナーのみ)
- SCRAM-SHA-512 認証
- OAuth 2.0 のトークンベースの認証
- カスタム認証
- TLS バージョンおよび暗号スイート
選択する認証オプションは、Kafka ブローカーへのクライアントアクセスを認証する方法によって異なります。
カスタム認証を使用する前に、標準の認証オプションを試してみてください。カスタム認証では、kafka でサポートされているあらゆるタイプの認証が可能です。柔軟性を高めることができますが、複雑さも増します。
図15.1 Kafka リスナーの認証オプション

リスナーの authentication
プロパティーは、そのリスナーに固有の認証メカニズムを指定するために使用されます。
authentication
プロパティーが指定されていない場合、リスナーはそのリスナー経由で接続するクライアントを認証しません。認証がないと、リスナーではすべての接続が許可されます。
認証は、User Operator を使用して KafkaUsers
を管理する場合に設定する必要があります。
以下の例で指定されるものは次のとおりです。
-
SCRAM-SHA-512 認証に設定された
plain
リスナー -
mTLS
認証を使用する TLS リスナー -
mTLS 認証を使用する
external
リスナー
各リスナーは、Kafka クラスター内で一意の名前およびポートで設定されます。
ブローカーへのクライアントアクセス用にリスナーを設定する場合、いくつかの例外を除き、ポート 9092 以降 (9093、9094 など) を使用できます。ブローカー間通信 (9090 および 9091)、Prometheus メトリック (9404)、および JMX (Java Management Extensions) モニタリング (9999) 用に予約されているポートを使用するようにリスナーを設定できません。
リスナー認証の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: plain port: 9092 type: internal tls: true authentication: type: scram-sha-512 - name: tls port: 9093 type: internal tls: true authentication: type: tls - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: tls # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
listeners:
- name: plain
port: 9092
type: internal
tls: true
authentication:
type: scram-sha-512
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: tls
- name: external3
port: 9094
type: loadbalancer
tls: true
authentication:
type: tls
# ...
15.1.1.1. mTLS 認証
mTLS 認証は、Kafka ブローカーと ZooKeeper Pod 間の通信で常に使用されます。
Streams for Apache Kafka では、TLS (Transport Layer Security) を使用して、相互認証の有無を問わず、Kafka ブローカーとクライアントとの間で暗号化された通信を行うように Kafka を設定できます。相互 (双方向) 認証の場合、サーバーとクライアントの両方が証明書を提示します。mTLS 認証を設定すると、ブローカーはクライアントを認証し (クライアント認証)、クライアントはブローカーを認証します (サーバー認証)。
Kafka
リソースの mTLS リスナー設定には、次のものが必要です。
-
TLS 暗号化とサーバー認証を指定する場合は
tls: true
-
クライアント認証を指定する場合は
authentication.type: tls
Cluster Operator によって Kafka クラスターが作成されると、<cluster_name>-cluster-ca-cert
という名前の新しいシークレットが作成されます。シークレットには CA 証明書が含まれています。CA 証明書は PEM および PKCS #12 形式 です。Kafka クラスターを検証するには、CA 証明書をクライアント設定のトラストストアに追加します。クライアントを確認するには、クライアント設定のキーストアにユーザー証明書とキーを追加します。mTLS 用のクライアントの設定の詳細については、「ユーザー認証」 を参照してください。
TLS 認証は一般的には一方向で、一方が他方のアイデンティティーを認証します。たとえば、Web ブラウザーと Web サーバーの間で HTTPS が使用される場合、ブラウザーは Web サーバーのアイデンティティーの証明を取得します。
15.1.1.2. SCRAM-SHA-512 認証
SCRAM (Salted Challenge Response Authentication Mechanism) は、パスワードを使用して相互認証を確立できる認証プロトコルです。Streams for Apache Kafka では、SASL (Simple Authentication and Security Layer) SCRAM-SHA-512 を使用するように Kafka を設定して、暗号化されていないクライアント接続と暗号化されたクライアント接続の両方で認証を提供できます。
SCRAM-SHA-512 認証が TLS 接続で使用される場合、TLS プロトコルは暗号化を提供しますが、認証には使用されません。
SCRAM の以下のプロパティーは、暗号化されていない接続でも SCRAM-SHA-512 を安全に使用できるようにします。
- 通信チャネル上では、パスワードはクリアテキストで送信されません。代わりに、クライアントとサーバーはお互いにチャレンジを生成し、認証するユーザーのパスワードを認識していることを証明します。
- サーバーとクライアントは、認証を交換するたびに新しいチャレンジを生成します。よって、この交換はリレー攻撃に対する回復性を備えています。
KafkaUser.spec.authentication.type
を scram-sha-512
に設定すると、User Operator が大文字と小文字の ASCII 文字と数字で構成されるランダムな 12 文字のパスワードを生成します。
15.1.1.3. ネットワークポリシー
Streams for Apache Kafka では、デフォルトで、Kafka ブローカーで有効になっているすべてのリスナーに対して NetworkPolicy
リソースが自動的に作成されます。この NetworkPolicy
により、アプリケーションはすべての namespace のリスナーに接続できます。リスナー設定の一部としてネットワークポリシーを使用します。
ネットワークレベルでのリスナーへのアクセスを指定のアプリケーションまたは namespace のみに制限するには、networkPolicyPeers
プロパティーを使用します。各リスナーは異なる networkPolicyPeers
設定 を指定できます。ネットワークポリシーピアの詳細は、NetworkPolicyPeer API reference を参照してください。
カスタムネットワークポリシーを使用する場合は、Cluster Operator 設定で STRIMZI_NETWORK_POLICY_GENERATION
環境変数を false
に設定できます。詳細は、「Cluster Operator の設定」 を参照してください。
Streams for Apache Kafka でネットワークポリシーを使用するには、OpenShift の設定で Ingress NetworkPolicies
がサポートされている必要があります。
15.1.1.4. リスナー証明書の提供
TLS 暗号化が有効になっている TLS リスナーまたは外部リスナーの、Kafka リスナー証明書 と呼ばれる独自のサーバー証明書を提供できます。詳細は、「TLS 暗号化用の独自の Kafka リスナー証明書を提供する」 を参照してください。
15.1.2. Kafka の承認
Kafka
リソースの Kafka.spec.kafka.authorization
プロパティーを使用して、Kafka ブローカーの承認を設定します。authorization
プロパティーがないと、承認が有効になりず、クライアントには制限がありません。認可を有効にすると、認可は有効なすべてのリスナーに適用されます。承認方法は type
フィールドで定義されます。
サポートされる承認オプションは次のとおりです。
- 簡易承認
- OAuth 2.0 での認可 (OAuth 2.0 トークンベースの認証を使用している場合)
- Open Policy Agent (OPA) での承認
- カスタム承認
図15.2 Kafka クラスター承認オプション

15.1.2.1. スーパーユーザー
スーパーユーザーは、アクセスの制限に関係なく Kafka クラスターのすべてのリソースにアクセスでき、すべての承認メカニズムでサポートされます。
Kafka クラスターのスーパーユーザーを指定するには、superUsers
プロパティーにユーザープリンシパルのリストを追加します。ユーザーが mTLS 認証を使用する場合、ユーザー名は CN=
で始まる TLS 証明書サブジェクトの共通名です。User Operator を使用せず、mTLS に独自の証明書を使用している場合、ユーザー名は完全な証明書サブジェクトです。完全な証明書サブジェクトには次のフィールドを含めることができます。CN=user,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=my_country_code
存在しないフィールドは省略します。
スーパーユーザーを使用した設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... authorization: type: simple superUsers: - CN=client_1 - user_2 - CN=client_3 - CN=client_4,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=US - CN=client_5,OU=my_ou,O=my_org,C=GB - CN=client_6,O=my_org # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
authorization:
type: simple
superUsers:
- CN=client_1
- user_2
- CN=client_3
- CN=client_4,OU=my_ou,O=my_org,L=my_location,ST=my_state,C=US
- CN=client_5,OU=my_ou,O=my_org,C=GB
- CN=client_6,O=my_org
# ...
15.2. Kafka クライアントのセキュリティーオプション
KafkaUser
リソースを使用して、Kafka クライアントの認証メカニズム、認可メカニズム、およびアクセス権限を設定します。セキュリティーの設定では、クライアントはユーザーとして表されます。
Kafka ブローカーへのユーザーアクセスを認証および承認できます。認証によってアクセスが許可され、認可によって許容されるアクションへのアクセスが制限されます。
Kafka ブローカーへのアクセスが制限されない スーパーユーザー を作成することもできます。
認証および認可メカニズムは、Kafka ブローカーへのアクセスに使用されるリスナーの仕様 と一致する必要があります。
Kafka ブローカーにセキュアにアクセスするための KafkaUser
リソースの設定の詳細については、「リスナーを使用した Kafka クラスターへのクライアントアクセス設定」 を参照してください。
15.2.1. ユーザー処理用の Kafka クラスターの特定
KafkaUser
リソースには、このリソースが属する Kafka クラスターに適した名前 (Kafka
リソースの名前から派生) を定義するラベルが含まれています。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
このラベルは、KafkaUser
リソースを特定し、新しいユーザーを作成するために、User Operator によって使用されます。また、以降のユーザーの処理でも使用されます。
ラベルが Kafka クラスターと一致しない場合、User Operator は KafkaUser
を識別できず、ユーザーは作成されません。
KafkaUser
リソースの状態が空のままの場合は、ラベルを確認します。
15.2.2. ユーザー認証
KafkaUser
カスタムリソースを使用して、Kafka クラスターへのアクセスを必要とするユーザー (クライアント) の認証情報を設定します。KafkaUser.spec
の authentication
プロパティーを使用して認証情報を設定します。type
を指定することで、生成される認証情報を制御します。
サポートされる認証タイプ
-
mTLS 認証用の
tls
-
外部証明書を使用した mTLS 認証用の
tls-external
-
scram-sha-512
(SCRAM-SHA-512 認証用)
tls
または scram-sha-512
が指定された場合、User Operator がユーザーを作成する際に、認証用のクレデンシャルを作成します。tls-external
が指定されている場合、ユーザーは引き続き mTLS を使用しますが、認証情報は作成されません。独自の証明書を指定する場合は、このオプションを使用します。認証タイプが指定されていない場合、User Operator はユーザーまたはそのクレデンシャルを作成しません。
tls-external
を使用して、User Operator の外部で発行された証明書を使用して mTLS で認証できます。User Operator は TLS 証明書またはシークレットを生成しません。tls
メカニズムを使用する場合と同様に、User Operator を使用して ACL ルールおよびクォータを管理できます。これは、ACL ルールおよびクォータを指定する際に CN=USER-NAME
形式を使用することを意味します。USER-NAME は、TLS 証明書で指定したコモンネームです。
15.2.2.1. mTLS 認証
mTLS 認証を使用するには、KafkaUser
リソースの type
フィールドを tls
に設定します。
mTLS 認証が有効になっているユーザーの例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls
# ...
認証タイプは、Kafka クラスターへのアクセスに使用される Kafka
リスナーの同等の設定と一致する必要があります。
ユーザーが User Operator によって作成されると、KafkaUser
リソースと同じ名前で新しいシークレットが作成されます。シークレットには、mTLS の秘密鍵と公開鍵が含まれています。公開鍵はユーザー証明書に含まれており、作成時にクライアント CA (認証局) によって署名されます。すべての鍵は X.509 形式です。
Cluster Operator によって生成されたクライアント CA を使用している場合、Cluster Operator によってクライアント CA が更新されると、User Operator によって生成されたユーザー証明書も更新されます。
ユーザーシークレットは、キーと証明書を PEM および PKCS #12 形式で提供します。
ユーザー認証情報を含むシークレットの例
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
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
クライアントを設定するときは、次を指定します。
- Kafka クラスターの ID を検証するためのパブリッククラスター CA 証明書の トラストストア プロパティー
- クライアントを検証するためのユーザー認証クレデンシャルの キーストア プロパティー
設定は、ファイル形式 (PEM または PKCS #12) によって異なります。この例では、PKCS #12 ストアと、ストア内の認証情報にアクセスするために必要なパスワードを使用しています。
PKCS #12 形式の mTLS を使用したクライアント設定の例
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093 security.protocol=SSL ssl.truststore.location=/tmp/ca.p12 ssl.truststore.password=<truststore_password> ssl.keystore.location=/tmp/user.p12 ssl.keystore.password=<keystore_password>
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093
security.protocol=SSL
ssl.truststore.location=/tmp/ca.p12
ssl.truststore.password=<truststore_password>
ssl.keystore.location=/tmp/user.p12
ssl.keystore.password=<keystore_password>
- 1
- Kafka クラスターに接続するためのブートストラップサーバーアドレス。
- 2
- 暗号化に TLS を使用する場合のセキュリティープロトコルオプション。
- 3
- トラストストアの場所には、Kafka クラスターの公開鍵証明書 (
ca.p12
) が含まれます。クラスター CA 証明書とパスワードは、Kafka クラスターの作成時に<cluster_name>-cluster-ca-cert
シークレットで Cluster Operator によって生成されます。 - 4
- トラストストアにアクセスするためのパスワード (
ca.password
)。 - 5
- キーストアの場所には、Kafka ユーザーの公開鍵証明書 (
user.p12
) が含まれます。 - 6
- キーストアにアクセスするためのパスワード (
user.password
)。
15.2.2.2. User Operator の外部で発行された証明書を使用した mTLS 認証
User Operator の外部で発行された証明書を使用して mTLS 認証を使用するには、KafkaUser
リソースの type
フィールドを tls-external
に設定します。シークレットおよび認証情報はユーザー用には作成されません。
User Operator 以外で発行された証明書を使用する mTLS 認証を使用するユーザーの例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls-external # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: tls-external
# ...
15.2.2.3. SCRAM-SHA-512 認証
SCRAM-SHA-512 認証メカニズムを使用するには、KafkaUser
リソースの type
フィールドを scram-sha-512
に設定します。
SCRAM-SHA-512 認証が有効になっているユーザーの例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: scram-sha-512 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
# ...
ユーザーが User Operator によって作成されると、KafkaUser
リソースと同じ名前で新しいシークレットが作成されます。シークレットの password
キーには、生成されたパスワードが含まれ、base64 でエンコードされます。パスワードを使用するにはデコードする必要があります。
ユーザー認証情報を含むシークレットの例
apiVersion: v1 kind: Secret metadata: name: my-user labels: strimzi.io/kind: KafkaUser strimzi.io/cluster: my-cluster type: Opaque data: password: Z2VuZXJhdGVkcGFzc3dvcmQ= sasl.jaas.config: b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkuc2NyYW0uU2NyYW1Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT0ibXktdXNlciIgcGFzc3dvcmQ9ImdlbmVyYXRlZHBhc3N3b3JkIjsK
apiVersion: v1
kind: Secret
metadata:
name: my-user
labels:
strimzi.io/kind: KafkaUser
strimzi.io/cluster: my-cluster
type: Opaque
data:
password: Z2VuZXJhdGVkcGFzc3dvcmQ=
sasl.jaas.config: b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkuc2NyYW0uU2NyYW1Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT0ibXktdXNlciIgcGFzc3dvcmQ9ImdlbmVyYXRlZHBhc3N3b3JkIjsK
生成されたパスワードをデコードします。
echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
15.2.2.3.1. カスタムパスワード設定
ユーザーが作成されると、Streams for Apache Kafka によってランダムなパスワードが生成されます。Streams for Apache Kafka によって生成されたパスワードの代わりに、独自のパスワードを使用できます。これを行うには、パスワードでシークレットを作成し、KafkaUser
リソースでこれを参照します。
SCRAM-SHA-512 認証に設定されたパスワードを持つユーザーの例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: scram-sha-512 password: valueFrom: secretKeyRef: name: my-secret key: my-password # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
authentication:
type: scram-sha-512
password:
valueFrom:
secretKeyRef:
name: my-secret
key: my-password
# ...
15.2.3. ユーザーの承認
KafkaUser
カスタムリソースを使用して、Kafka クラスターへのアクセスを必要とするユーザー (クライアント) の承認規則を設定します。KafkaUser.spec
の authorization
プロパティーを使用してルールを設定します。type
を指定することで、使用するルールを制御します。
簡易承認を使用するには、KafkaUser.spec.authorization
で type
プロパティーを simple
に設定します。簡易承認は、Kafka Admin API を使用して Kafka クラスター内で ACL ルールを管理します。User Operator の ACL 管理が有効であるかどうかは、Kafka クラスターの承認設定によって異なります。
- 簡易承認では、ACL 管理が常に有効になります。
- OPA 承認の場合、ACL 管理は常に無効になります。承認ルールは OPA サーバーで設定されます。
- Red Hat Single Sign-On の承認では、Red Hat Single Sign-On で ACL ルールを直接管理できます。設定のフォールバックオプションとして、承認を簡単なオーソライザーに委譲することもできます。簡単なオーソライザーへの委譲が有効になっている場合、User Operator は ACL ルールの管理も有効にします。
-
カスタム承認プラグインを使用したカスタム承認では、
Kafka
カスタムリソースの.spec.kafka.authorization
設定のsupportsAdminApi
プロパティーを使用して、サポートを有効または無効にする必要があります。
承認はクラスター全体です。認可タイプは、Kafka
カスタムリソースの同等の設定と一致する必要があります。
ACL 管理が有効になっていない場合、Streams for Apache Kafka は、ACL ルールが含まれているリソースを拒否します。
User Operator のスタンドアロンデプロイメントを使用している場合、ACL 管理はデフォルトで有効にされます。STRIMZI_ACLS_ADMIN_API_SUPPORTED
環境変数を使用してこれを無効にすることができます。
承認が指定されていない場合は、User Operator によるユーザーのアクセス権限のプロビジョニングは行われません。このような KafkaUser
がリソースにアクセスできるかどうかは、使用されているオーソライザーによって異なります。たとえば、simple
認可の場合、これは Kafka クラスターの allow.everyone.if.no.acl.found
設定によって決定されます。
15.2.3.1. ACL ルール
simple
認可では、ACL ルールを使用して Kafka ブローカーへのアクセスを管理します。
ACL ルールによって、acls
プロパティーで指定したユーザーにアクセス権限が付与されます。
AclRule
オブジェクトの詳細は、AclRule
スキーマリファレンス を参照してください。
15.2.3.2. Kafka ブローカーへのスーパーユーザーアクセス
ユーザーを Kafka ブローカー設定のスーパーユーザーのリストに追加すると、KafkaUser
の ACL で定義された承認制約に関係なく、そのユーザーにはクラスターへのアクセスが無制限に許可されます。
ブローカーへのスーパーユーザーアクセスの設定に関する詳細は Kafka の承認 を参照してください。
15.2.3.3. ユーザークォータ
KafkaUser
リソースの spec
を設定してクォータを強制し、ユーザーが Kafka ブローカーへの設定されたアクセスレベルを超えないようにします。サイズベースのネットワーク使用量と時間ベースの CPU 使用率のしきい値を設定できます。また、パーティション mutation (変更) クォータを追加して、ユーザー要求に対して受け入れられるパーティション変更のリクエストのレートを制御することもできます。
ユーザークォータをともなう KafkaUser
の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: # ... quotas: producerByteRate: 1048576 consumerByteRate: 2097152 requestPercentage: 55 controllerMutationRate: 10
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
name: my-user
labels:
strimzi.io/cluster: my-cluster
spec:
# ...
quotas:
producerByteRate: 1048576
consumerByteRate: 2097152
requestPercentage: 55
controllerMutationRate: 10
これらのプロパティーの詳細は、KafkaUserQuotas
スキーマリファレンス を参照してください。
15.3. Kafka ブローカーへのアクセスのセキュア化
Kafka ブローカーへのセキュアなアクセスを確立するには、以下を設定し、適用します。
以下を行う
Kafka
リソース。- 指定された認証タイプでリスナーを作成します。
- Kafka クラスター全体の承認を設定します。
-
Kafka ブローカーにリスナー経由でセキュアにアクセスするための
KafkaUser
リソース。
Kafka
リソースを設定して以下を設定します。
- リスナー認証
- Kafka リスナーへのアクセスを制限するネットワークポリシー
- Kafka の承認
- ブローカーへのアクセスが制限されないスーパーユーザー
認証は、リスナーごとに独立して設定されます。承認は、常に Kafka クラスター全体に対して設定されます。
Cluster Operator はリスナーを作成し、クラスターおよびクライアント認証局 (CA) 証明書を設定して Kafka クラスター内で認証を有効にします。
独自の証明書をインストール することで、Cluster Operator によって生成された証明書を置き換えることができます。
TLS 暗号化が有効になっているリスナーに対して独自のサーバー証明書と秘密鍵を提供することもできます。これらのユーザー提供による証明書は、Kafka リスナー証明書 と呼ばれます。Kafka リスナー証明書を提供すると、組織のプライベート CA やパブリック CA などの既存のセキュリティーインフラストラクチャーを利用できます。Kafka クライアントは、リスナー証明書の署名に使用された CA を信頼する必要があります。Kafka リスナー証明書の更新が必要な場合は、手作業で更新する必要があります。PKCS #12 形式 (.p12) および PEM 形式 (.crt) の証明書を利用できます。
KafkaUser
を使用して、特定のクライアントが Kafka にアクセスするために使用する認証および認可メカニズムを有効にします。
KafkaUser
リソースを設定して以下を設定します。
- 有効なリスナー認証と一致する認証
- 有効な Kafka 承認と一致する承認
- クライアントによるリソースの使用を制御するクォータ
User Operator はクライアントに対応するユーザーを作成すると共に、選択した認証タイプに基づいて、クライアント認証に使用されるセキュリティークレデンシャルを作成します。
アクセス設定プロパティーの詳細は、次のスキーマリファレンスを参照してください。
15.3.1. Kafka ブローカーのセキュア化
この手順では、Streams for Apache Kafka を実行するときに Kafka ブローカーを保護するために必要な手順を示します。
Kafka ブローカーに実装されたセキュリティーは、アクセスを必要とするクライアントに実装されたセキュリティーとの互換性を維持する必要があります。
-
Kafka.spec.kafka.listeners[*].authentication
matchesKafkaUser.spec.authentication
-
Kafka.spec.kafka.authorization
はKafkaUser.spec.authorization
と一致します。
この手順では、mTLS 認証を使用した簡易承認とリスナーの設定を説明します。リスナー設定の詳細は、GenericKafkaListener
スキーマリファレンス を参照してください。
代わりに、リスナー認証 には SCRAM-SHA または OAuth 2.0、Kafka 認可 には OAuth 2.0 または OPA を使用することができます。
手順
Kafka
リソースを設定します。-
承認には
authorization
プロパティーを設定します。 listeners
プロパティーを設定し、認証でリスナーを作成します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... authorization: type: simple superUsers: - CN=client_1 - user_2 - CN=client_3 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... authorization:
1 type: simple superUsers:
2 - CN=client_1 - user_2 - CN=client_3 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls
3 # ... zookeeper: # ...
Copy to Clipboard Copied! - 1
- 2
- Kafka へのアクセスを制限されないユーザープリンシパルのリスト。CN は、mTLS による認証が使用される場合のクライアント証明書のコモンネームです。
- 3
- リスナーの認証メカニズムは各リスナーに対して設定でき、mTLS、SCRAM-SHA-512、またはトークンベース OAuth 2.0 として指定 できます。
外部リスナーを設定している場合、設定は選択した接続のメカニズムによって異なります。
-
承認には
Kafka
リソースを作成または更新します。oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! Kafka クラスターは、mTLS 認証を使用する Kafka ブローカーリスナーと共に設定されます。
Kafka ブローカー Pod ごとにサービスが作成されます。
サービスが作成され、Kafka クラスターに接続するための ブートストラップアドレス として機能します。
kafka ブローカーのアイデンティティーを検証するクラスター CA 証明書もシークレット
<cluster_name>-cluster-ca-cert
に作成されます。
15.3.2. Kafka へのユーザーアクセスのセキュア化
KafkaUser
を作成または変更して、Kafka クラスターへのセキュアなアクセスを必要とするクライアントを表します。
KafkaUser
認証および認可メカニズムを設定する場合、必ず同等の Kafka
設定と一致するようにしてください。
-
KafkaUser.spec.authentication
はKafka.spec.kafka.listeners[*].authentication
と一致します。 -
KafkaUser.spec.authorization
はKafka.spec.kafka.authorization
と一致します。
この手順は、mTLS 認証を使用してユーザーを作成する方法を示しています。SCRAM-SHA 認証でユーザーを作成することも可能です。
必要な認証は、Kafka ブローカーリスナーに設定された認証のタイプ によって異なります。
Kafka ユーザーと Kafka ブローカー間の認証は、それぞれの認証設定によって異なります。たとえば、mTLS が Kafka 設定で有効になっていない場合は、mTLS でユーザーを認証できません。
前提条件
- mTLS 認証と TLS 暗号化を使用する Kafka ブローカーリスナーで設定された 実行中の Kafka クラスター。
- 実行中の User Operator (通常は Entity Operator とともにデプロイされます)。
KafkaUser
の認証タイプは、Kafka
ブローカーに設定された認証と一致する必要があります。
手順
KafkaUser
リソースを設定します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read - resource: type: group name: my-group patternType: literal operations: - Read
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication:
1 type: tls authorization: type: simple
2 acls: - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read - resource: type: group name: my-group patternType: literal operations: - Read
Copy to Clipboard Copied! KafkaUser
リソースを作成または更新します。oc apply -f <user_config_file>
oc apply -f <user_config_file>
Copy to Clipboard Copied! KafkaUser
リソースと同じ名前の Secret と共に、ユーザーが作成されます。Secret には、mTLS 認証用の秘密鍵と公開鍵が含まれています。
Kafka ブローカーへのセキュアな接続のためのプロパティーを使用して Kafka クライアントを設定する方法については、「リスナーを使用した Kafka クラスターへのクライアントアクセス設定」 を参照してください。
15.3.3. ネットワークポリシーを使用した Kafka リスナーへのアクセス制限
networkPolicyPeers
プロパティーを使用すると、リスナーへのアクセスを指定のアプリケーションのみに制限できます。
前提条件
- Ingress NetworkPolicies をサポートする OpenShift クラスター。
- Cluster Operator が稼働中である。
手順
-
Kafka
リソースを開きます。 networkPolicyPeers
プロパティーで、Kafka クラスターへのアクセスが許可されるアプリケーション Pod または namespace を定義します。以下は、ラベル
app
がkafka-client
に設定されているアプリケーションからの接続のみを許可するようtls
リスナーを設定する例になります。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls networkPolicyPeers: - podSelector: matchLabels: app: kafka-client # ... zookeeper: # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls networkPolicyPeers: - podSelector: matchLabels: app: kafka-client # ... zookeeper: # ...
Copy to Clipboard Copied! リソースを作成または更新します。
次のように
oc apply
を使用します。oc apply -f your-file
oc apply -f your-file
Copy to Clipboard Copied!
15.3.4. TLS 暗号化用の独自の Kafka リスナー証明書を提供する
リスナーは、Kafka ブローカーへのクライアントアクセスを提供します。TLS を使用したクライアントアクセスに必要な設定を含め、Kafka
リソースでリスナーを設定します。
デフォルトでは、リスナーは Streams for Apache Kafka によって生成された内部 CA (認証局) 証明書によって署名された証明書を使用します。CA 証明書は、Kafka クラスターを作成するときに Cluster Operator によって生成されます。クライアントを TLS 用に設定するときは、CA 証明書をそのトラストストア設定に追加して、Kafka クラスターを検証します。独自の CA 証明書をインストールして使用する こともできます。または、brokerCertChainAndKey
プロパティーを使用してリスナーを設定し、カスタムサーバー証明書を使用することもできます。
brokerCertChainAndKey
プロパティーを使用すると、リスナーレベルで独自のカスタム証明書を使用して Kafka ブローカーにアクセスできます。独自のプライベートキーとサーバー証明書を使用してシークレットを作成し、リスナーの brokerCertChainAndKey
設定でキーと証明書を指定します。パブリック (外部) CA またはプライベート CA によって署名された証明書を使用できます。パブリック CA によって署名されている場合、通常、それをクライアントのトラストストア設定に追加する必要はありません。カスタム証明書は Streams for Apache Kafka によって管理されないため、手動で更新する必要があります。
リスナー証明書は、TLS 暗号化とサーバー認証のみに使用されます。これらは TLS クライアント認証には使用されません。TLS クライアント認証にも独自の証明書を使用する場合は、独自のクライアント CA をインストールして使用する 必要があります。
前提条件
- Cluster Operator が稼働中である。
各リスナーには次のものが必要です。
外部 CA によって署名された互換性のあるサーバー証明書。(X.509 証明書を PEM 形式で提供します。)
複数のリスナーに対して 1 つのリスナー証明書を使用できます。
- サブジェクト代替名 (SAN) は、各リスナーの証明書で指定されます。詳細は、「Kafka リスナーのサーバー証明書の SAN」 を参照してください。
自己署名証明書を使用していない場合は、証明書に CA チェーン全体を含む証明書を提供できます。
リスナーに対して TLS 暗号化 (tls: true
) が設定されている場合は、brokerCertChainAndKey
プロパティーのみを使用できます。
Streams for Apache Kafka では、TLS の暗号化された秘密鍵の使用はサポートされていません。これが機能するには、シークレットに保存されている秘密鍵が暗号化されていない必要があります。
手順
秘密鍵およびサーバー証明書が含まれる
Secret
を作成します。oc create secret generic my-secret --from-file=my-listener-key.key --from-file=my-listener-certificate.crt
oc create secret generic my-secret --from-file=my-listener-key.key --from-file=my-listener-certificate.crt
Copy to Clipboard Copied! クラスターの
Kafka
リソースを編集します。Secret
、証明書ファイル、および秘密鍵ファイルを使用するように、リスナーをconfiguration.brokerCertChainAndKey
プロパティーで設定します。TLS 暗号化が有効な
loadbalancer
外部リスナーの設定例# ... listeners: - name: plain port: 9092 type: internal tls: false - name: external3 port: 9094 type: loadbalancer tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...
# ... listeners: - name: plain port: 9092 type: internal tls: false - name: external3 port: 9094 type: loadbalancer tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...
Copy to Clipboard Copied! TLS リスナーの設定例
# ... listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...
# ... listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-listener-certificate.crt key: my-listener-key.key # ...
Copy to Clipboard Copied! 新しい設定を適用してリソースを作成または更新します。
oc apply -f kafka.yaml
oc apply -f kafka.yaml
Copy to Clipboard Copied! Cluster Operator は、Kafka クラスターのローリング更新を開始し、これによりリスナーの設定が更新されます。
注記リスナーによってすでに使用されている
Secret
の Kafka リスナー証明書を更新した場合でも、ローリング更新が開始されます。
15.3.5. Kafka リスナーのサーバー証明書の SAN
独自の Kafka リスナー証明書 で TLS ホスト名検証を使用するには、リスナーごとに正しいサブジェクト代替名 (SAN) を使用する必要があります。証明書 SAN では、次のホスト名を指定する必要があります。
- クラスターのすべての Kafka ブローカー
- Kafka クラスターブートストラップサービス
ワイルドカード証明書は、CA でサポートされれば使用できます。
15.3.5.1. 内部リスナー用の SAN の例
次の例は、内部リスナーの証明書で SAN のホスト名を指定するのに役立ちます。
<cluster-name>
を Kafka クラスターの名前に置き換え、<namespace>
をクラスターが実行されている OpenShift namespace に置き換えます。
type: internal
リスナーのワイルドカードの例
//Kafka brokers *.<cluster-name>-kafka-brokers *.<cluster-name>-kafka-brokers.<namespace>.svc // Bootstrap service <cluster-name>-kafka-bootstrap <cluster-name>-kafka-bootstrap.<namespace>.svc
//Kafka brokers
*.<cluster-name>-kafka-brokers
*.<cluster-name>-kafka-brokers.<namespace>.svc
// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc
type: internal
リスナーのワイルドカード以外の例
// Kafka brokers <cluster-name>-kafka-0.<cluster-name>-kafka-brokers <cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc <cluster-name>-kafka-1.<cluster-name>-kafka-brokers <cluster-name>-kafka-1.<cluster-name>-kafka-brokers.<namespace>.svc # ... // Bootstrap service <cluster-name>-kafka-bootstrap <cluster-name>-kafka-bootstrap.<namespace>.svc
// Kafka brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers
<cluster-name>-kafka-1.<cluster-name>-kafka-brokers.<namespace>.svc
# ...
// Bootstrap service
<cluster-name>-kafka-bootstrap
<cluster-name>-kafka-bootstrap.<namespace>.svc
type: cluster-ip
リスナーのワイルドカード以外の例
// Kafka brokers <cluster-name>-kafka-<listener-name>-0 <cluster-name>-kafka-<listener-name>-0.<namespace>.svc <cluster-name>-kafka-<listener-name>-1 <cluster-name>-kafka-<listener-name>-1.<namespace>.svc # ... // Bootstrap service <cluster-name>-kafka-<listener-name>-bootstrap <cluster-name>-kafka-<listener-name>-bootstrap.<namespace>.svc
// Kafka brokers
<cluster-name>-kafka-<listener-name>-0
<cluster-name>-kafka-<listener-name>-0.<namespace>.svc
<cluster-name>-kafka-<listener-name>-1
<cluster-name>-kafka-<listener-name>-1.<namespace>.svc
# ...
// Bootstrap service
<cluster-name>-kafka-<listener-name>-bootstrap
<cluster-name>-kafka-<listener-name>-bootstrap.<namespace>.svc
15.3.5.2. 外部リスナー用の SAN の例
TLS 暗号化が有効になっている外部リスナーの場合、証明書に指定する必要があるホスト名は、外部リスナーの type
によって異なります。
外部リスナータイプ | SAN で指定する内容 |
---|---|
|
すべての Kafka ブローカー 一致するワイルドカード名を使用できます。 |
|
すべての Kafka ブローカー 一致するワイルドカード名を使用できます。 |
|
すべての Kafka ブローカー 一致するワイルドカード名を使用できます。 |
| Kafka ブローカー Pod がスケジュールされるすべての OpenShift ワーカーノードのアドレス。 一致するワイルドカード名を使用できます。 |
15.4. OAuth 2.0 トークンベース認証の使用
Streams for Apache Kafka は、OAUTHBEARER および PLAIN メカニズムを使用した OAuth 2.0 認証 の使用をサポートしています。
OAuth 2.0 は、アプリケーション間で標準的なトークンベースの認証および認可を有効にし、中央の認可サーバーを使用してリソースに制限されたアクセス権限を付与するトークンを発行します。
OAuth 2.0 認証を設定した後に OAuth 2.0 認可 を設定できます。
Kafka ブローカーおよびクライアントの両方が OAuth 2.0 を使用するように設定する必要があります。OAuth 2.0 認証は、simple
または OPA ベースの Kafka authorization と併用することもできます。
OAuth 2.0 のトークンベースの認証を使用すると、アプリケーションクライアントはアカウントのクレデンシャルを公開せずにアプリケーションサーバー (リソースサーバー と呼ばれる) のリソースにアクセスできます。
アプリケーションクライアントは、アクセストークンを認証の手段として渡します。アプリケーションサーバーはこれを使用して、付与するアクセス権限のレベルを決定することもできます。認可サーバーは、アクセスの付与とアクセスに関する問い合わせを処理します。
Streams for Apache Kafka のコンテキストでは、以下が行われます。
- Kafka ブローカーは OAuth 2.0 リソースサーバーとして動作します。
- Kafka クライアントは OAuth 2.0 アプリケーションクライアントとして動作します。
Kafka クライアントは Kafka ブローカーに対して認証を行います。ブローカーおよびクライアントは、必要に応じて OAuth 2.0 認可サーバーと通信し、アクセストークンを取得または検証します。
Streams for Apache Kafka のデプロイメントでは、OAuth 2.0 統合により以下が提供されます。
- Kafka ブローカーのサーバー側 OAuth 2.0 サポート
- Kafka MirrorMaker、Kafka Connect、および Kafka Bridge のクライアント側 OAuth 2.0 サポート。
15.4.1. OAuth 2.0 認証メカニズム
Streams for Apache Kafka は、OAuth 2.0 認証用の OAUTHBEARER および PLAIN メカニズムをサポートしています。どちらのメカニズムも、Kafka クライアントが Kafka ブローカーで認証されたセッションを確立できるようにします。クライアント、認可サーバー、および Kafka ブローカー間の認証フローは、メカニズムごとに異なります。
可能な限り、OAUTHBEARER を使用するようにクライアントを設定することが推奨されます。OAUTHBEARER では、クライアントクレデンシャルは Kafka ブローカーと 共有されることがない ため、PLAIN よりも高レベルのセキュリティーが提供されます。OAUTHBEARER をサポートしない Kafka クライアントの場合のみ、PLAIN の使用を検討してください。
クライアントの接続に OAuth 2.0 認証を使用するように Kafka ブローカーリスナーを設定します。必要な場合は、同じ oauth
リスナーで OAUTHBEARER および PLAIN メカニズムを使用できます。各メカニズムをサポートするプロパティーは、oauth
リスナー設定で明示的に指定する必要があります。
OAUTHBEARER の概要
OAUTHBEARER は、Kafka ブローカーの oauth
リスナー設定で自動的に有効になります。enableOauthBearer
プロパティーを true
に設定できますが、これは必須ではありません。
# ... authentication: type: oauth # ... enableOauthBearer: true
# ...
authentication:
type: oauth
# ...
enableOauthBearer: true
また、多くの Kafka クライアントツールでは、プロトコルレベルで OAUTHBEARER の基本サポートを提供するライブラリーを使用します。Streams for Apache Kafka では、アプリケーションの開発を支援するために、アップストリームの Kafka Client Java ライブラリー用の OAuth コールバックハンドラー が提供されます (ただし、他のライブラリーは対象外)。そのため、独自のコールバックハンドラーを作成する必要はありません。アプリケーションクライアントはコールバックハンドラーを使用してアクセストークンを提供できます。Go などの他言語で書かれたクライアントは、カスタムコードを使用して認可サーバーに接続し、アクセストークンを取得する必要があります。
OAUTHBEARER を使用する場合、クライアントはクレデンシャルを交換するために Kafka ブローカーでセッションを開始します。ここで、クレデンシャルはコールバックハンドラーによって提供されるベアラートークンの形式を取ります。コールバックを使用して、以下の 3 つの方法のいずれかでトークンの提供を設定できます。
- クライアント ID および Secret (OAuth 2.0 クライアントクレデンシャルメカニズム を使用)
- 設定時に手動で取得された有効期限の長いアクセストークン
- 設定時に手動で取得された有効期限の長い更新トークン
OAUTHBEARER 認証は、プロトコルレベルで OAUTHBEARER メカニズムをサポートする Kafka クライアントでのみ使用できます。
PLAIN の概要
PLAIN を使用するには、Kafka ブローカーの oauth
リスナー設定で有効にする必要があります。
以下の例では、デフォルトで有効になっている OAUTHBEARER に加え、PLAIN も有効になっています。PLAIN のみを使用する場合は、enableOauthBearer
を false
に設定して OAUTHBEARER を無効にすることができます。
# ... authentication: type: oauth # ... enablePlain: true tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token
# ...
authentication:
type: oauth
# ...
enablePlain: true
tokenEndpointUri: https://OAUTH-SERVER-ADDRESS/auth/realms/external/protocol/openid-connect/token
PLAIN は、すべての Kafka クライアントツールによって使用される簡単な認証メカニズムです。PLAIN を OAuth 2.0 認証で使用できるようにするために、Streams for Apache Kafka では、OAuth 2.0 over PLAIN サーバー側コールバックが提供されます。
PLAIN の Streams for Apache Kafka 実装では、クライアントクレデンシャルは ZooKeeper に保存されません。代わりに、OAUTHBEARER 認証が使用される場合と同様に、クライアントのクレデンシャルは準拠した認可サーバーの背後で一元的に処理されます。
OAuth 2.0 over PLAIN コールバックを併用する場合、以下のいずれかの方法を使用して Kafka クライアントは Kafka ブローカーで認証されます。
- クライアント ID およびシークレット (OAuth 2.0 クライアントクレデンシャルメカニズムを使用)
- 設定時に手動で取得された有効期限の長いアクセストークン
どちらの方法でも、クライアントは Kafka ブローカーにクレデンシャルを渡すために、PLAIN username
および password
プロパティーを提供する必要があります。クライアントはこれらのプロパティーを使用してクライアント ID およびシークレット、または、ユーザー名およびアクセストークンを渡します。
クライアント ID およびシークレットは、アクセストークンの取得に使用されます。
アクセストークンは、password
プロパティーの値として渡されます。$accessToken:
接頭辞の有無に関わらずアクセストークンを渡します。
-
リスナー設定でトークンエンドポイント (
tokenEndpointUri
) を設定する場合は、接頭辞が必要です。 -
リスナー設定でトークンエンドポイント (
tokenEndpointUri
) を設定しない場合は、接頭辞は必要ありません。Kafka ブローカーは、パスワードを raw アクセストークンとして解釈します。
アクセストークンとして password
が設定されている場合、username
は Kafka ブローカーがアクセストークンから取得するプリンシパル名と同じものを設定する必要があります。userNameClaim
、fallbackUserNameClaim
、fallbackUsernamePrefix
、および userInfoEndpointUri
プロパティーを使用すると、リスナーにユーザー名抽出オプションを指定できます。ユーザー名の抽出プロセスも、認可サーバーによって異なります。特に、クライアント ID をアカウント名にマッピングする方法により異なります。
OAuth over PLAIN は、password grant
メカニズムをサポートしていません。上記のように、SASL PLAIN メカニズムを介して、client credentials
(clientId + シークレット) またはアクセストークンをプロキシーすることしかできません。
15.4.2. OAuth 2.0 Kafka ブローカーの設定
OAuth 2.0 の Kafka ブローカー設定には、以下が関係します。
- 認可サーバーでの OAuth 2.0 クライアントの作成
- Kafka カスタムリソースでの OAuth 2.0 認証の設定
認可サーバーに関連する Kafka ブローカーおよび Kafka クライアントはどちらも OAuth 2.0 クライアントと見なされます。
15.4.2.1. 認可サーバーの OAuth 2.0 クライアント設定
セッションの開始中に受信されたトークンを検証するように Kafka ブローカーを設定するには、認可サーバーで OAuth 2.0 の クライアント 定義を作成し、以下のクライアントクレデンシャルが有効な状態で 機密情報 として設定することが推奨されます。
-
kafka
のクライアント ID (例) - 認証メカニズムとしてのクライアント ID およびシークレット
認可サーバーのパブリックでないイントロスペクションエンドポイントを使用する場合のみ、クライアント ID およびシークレットを使用する必要があります。高速のローカル JWT トークンの検証と同様に、パブリック認可サーバーのエンドポイントを使用する場合は通常、クレデンシャルは必要ありません。
15.4.2.2. Kafka クラスターでの OAuth 2.0 認証設定
Kafka クラスターで OAuth 2.0 認証を使用するには、たとえば、認証方法が oauth
の Kafka クラスターカスタムリソースの tls
リスナー設定を指定します。
OAuth 2.0 の認証方法タイプの割り当て
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... listeners: - name: tls port: 9093 type: internal tls: true authentication: type: oauth #...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
# ...
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
#...
リスナーで OAuth 2.0 認証を設定できます。OAuth 2.0 認証と TLS 暗号化 (tls: true
) を併用することを推奨します。暗号化を行わないと、ネットワークの盗聴やトークンの盗難による不正アクセスに対して接続が脆弱になります。
external
リスナーを type: oauth
で設定し、セキュアなトランスポート層がクライアントと通信するようにします。
OAuth 2.0 の外部リスナーとの使用
# ... listeners: - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth #...
# ...
listeners:
- name: external3
port: 9094
type: loadbalancer
tls: true
authentication:
type: oauth
#...
tls
プロパティーはデフォルトで false に設定されているため、有効にする必要があります。
認証のタイプを OAuth 2.0 として定義した場合、検証のタイプに基づいて、 高速のローカル JWT 検証 または イントロスペクションエンドポイントを使用したトークンの検証 のいずれかとして、設定を追加します。
説明や例を用いてリスナー向けに OAuth 2.0 を設定する手順は、Kafka ブローカーの OAuth 2.0 サポートの設定 を参照してください。
15.4.2.3. 高速なローカル JWT トークン検証の設定
高速なローカル JWT トークンの検証では、JWT トークンの署名がローカルでチェックされます。
ローカルチェックでは、トークンに対して以下が確認されます。
-
アクセストークンに
Bearer
の (typ) 要求値が含まれ、トークンがタイプに準拠することを確認します。 - 有効 (期限切れでない) かどうかを確認します。
-
トークンに
validIssuerURI
と一致する発行元があることを確認します。
リスナーの設定時に validIssuerURI
属性を指定することで、認可サーバーから発行されていないトークンは拒否されます。
高速のローカル JWT トークン検証の実行中に、認可サーバーの通信は必要はありません。OAuth 2.0 の認可サーバーによって公開されるエンドポイントの jwksEndpointUri
属性を指定して、高速のローカル JWT トークン検証をアクティベートします。エンドポイントには、署名済み JWT トークンの検証に使用される公開鍵が含まれます。これらは、Kafka クライアントによってクレデンシャルとして送信されます。
認可サーバーとの通信はすべて TLS による暗号化を使用して実行する必要があります。
Streams for Apache Kafka のプロジェクト namespace で証明書トラストストアを OpenShift シークレットとして設定し、tlsTrustedCertificates
属性を使用して、トラストストアファイルを含む OpenShift シークレットを参照することができます。
JWT トークンからユーザー名を適切に取得するため、userNameClaim
の設定を検討してください。必要に応じて、"['user.info'].['user.id']"
のような JsonPath 式を使用して、トークン内のネストされた JSON 属性からユーザー名を取得できます。
Kafka ACL 認可を使用する場合は、認証中にユーザー名でユーザーを特定する必要があります。JWT トークンの sub
要求は、通常は一意な ID でユーザー名ではありません。
高速なローカル JWT トークン検証の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: #... listeners: - name: tls port: 9093 type: internal tls: true authentication: type: oauth validIssuerUri: <https://<auth_server_address>/auth/realms/tls> jwksEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/certs> userNameClaim: preferred_username maxSecondsWithoutReauthentication: 3600 tlsTrustedCertificates: - secretName: oauth-server-cert certificate: ca.crt #...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
#...
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
validIssuerUri: <https://<auth_server_address>/auth/realms/tls>
jwksEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/certs>
userNameClaim: preferred_username
maxSecondsWithoutReauthentication: 3600
tlsTrustedCertificates:
- secretName: oauth-server-cert
certificate: ca.crt
#...
15.4.2.4. OAuth 2.0 イントロスペクションエンドポイントの設定
OAuth 2.0 のイントロスペクションエンドポイントを使用したトークンの検証では、受信したアクセストークンは不透明として対処されます。Kafka ブローカーは、アクセストークンをイントロスペクションエンドポイントに送信します。このエンドポイントは、検証に必要なトークン情報を応答として返します。ここで重要なのは、特定のアクセストークンが有効である場合は最新情報を返すことで、トークンの有効期限に関する情報も返します。
OAuth 2.0 のイントロスペクションベースの検証を設定するには、高速のローカル JWT トークン検証に指定された jwksEndpointUri
属性ではなく、introspectionEndpointUri
属性を指定します。通常、イントロスペクションエンドポイントは保護されているため、認可サーバーに応じて clientId
および clientSecret
を指定する必要があります。
イントロスペクションエンドポイントの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: listeners: - name: tls port: 9093 type: internal tls: true authentication: type: oauth clientId: kafka-broker clientSecret: secretName: my-cluster-oauth key: clientSecret validIssuerUri: <https://<auth_server_-_address>/auth/realms/tls> introspectionEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/token/introspect> userNameClaim: preferred_username maxSecondsWithoutReauthentication: 3600 tlsTrustedCertificates: - secretName: oauth-server-cert certificate: ca.crt
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
listeners:
- name: tls
port: 9093
type: internal
tls: true
authentication:
type: oauth
clientId: kafka-broker
clientSecret:
secretName: my-cluster-oauth
key: clientSecret
validIssuerUri: <https://<auth_server_-_address>/auth/realms/tls>
introspectionEndpointUri: <https://<auth_server_address>/auth/realms/tls/protocol/openid-connect/token/introspect>
userNameClaim: preferred_username
maxSecondsWithoutReauthentication: 3600
tlsTrustedCertificates:
- secretName: oauth-server-cert
certificate: ca.crt
15.4.3. Kafka ブローカーの再認証の設定
Kafka クライアントと Kafka ブローカー間の OAuth 2.0 セッションに Kafka session re-authentication を使用するように、oauth
リスナーを設定できます。このメカニズムは、定義された期間後に、クライアントとブローカー間の認証されたセッションを期限切れにします。セッションの有効期限が切れると、クライアントは既存の接続を破棄せずに再使用して、新しいセッションを即座に開始します。
セッションの再認証はデフォルトで無効になっています。これを有効にするには、oauth
リスナー設定で maxSecondsWithoutReauthentication
の時間値を設定します。OAUTHBEARER および PLAIN 認証では、同じプロパティーを使用してセッションの再認証が設定されます。設定例については、「Kafka ブローカーの OAuth 2.0 サポートの設定」 を参照してください。
セッションの再認証は、クライアントによって使用される Kafka クライアントライブラリーによってサポートされる必要があります。
セッションの再認証は、高速ローカル JWT または イントロスペクションエンドポイント のトークン検証と共に使用できます。
クライアントの再認証
ブローカーの認証されたセッションが期限切れになると、クライアントは接続を切断せずに新しい有効なアクセストークンをブローカーに送信し、既存のセッションを再認証する必要があります。
トークンの検証に成功すると、既存の接続を使用して新しいクライアントセッションが開始されます。クライアントが再認証に失敗した場合、さらにメッセージを送受信しようとすると、ブローカーは接続を閉じます。ブローカーで再認証メカニズムが有効になっていると、Kafka クライアントライブラリー 2.2 以降を使用する Java クライアントが自動的に再認証されます。
セッションの再認証は、リフレッシュトークンが使用されている場合にも適用されます。セッションが期限切れになると、クライアントは更新トークンを使用してアクセストークンを更新します。その後、クライアントは新しいアクセストークンを使用して既存のセッションに再認証されます。
OAUTHBEARER および PLAIN のセッションの有効期限
セッションの再認証が設定されている場合、OAUTHBEARER と PLAIN 認証ではセッションの有効期限は異なります。
クライアント ID とシークレットによる方法を使用する OAUTHBEARER および PLAIN の場合:
-
ブローカーの認証されたセッションは、設定された
maxSecondsWithoutReauthentication
で期限切れになります。 - アクセストークンが設定期間前に期限切れになると、セッションは設定期間前に期限切れになります。
有効期間の長いアクセストークンによる方法を使用する PLAIN の場合:
-
ブローカーの認証されたセッションは、設定された
maxSecondsWithoutReauthentication
で期限切れになります。 - アクセストークンが設定期間前に期限切れになると、再認証に失敗します。セッションの再認証は試行されますが、PLAIN にはトークンを更新するメカニズムがありません。
maxSecondsWithoutReauthentication
が 設定されていない 場合、OAUTHBEARER および PLAIN クライアントは、再認証しなくてもブローカーへの接続を無限に保持できます。認証されたセッションは、アクセストークンの期限が切れても終了しません。ただし、keycloak
認可を使用したり、カスタム authorizer をインストールして、認可を設定する場合に考慮できます。
15.4.4. OAuth 2.0 Kafka クライアントの設定
Kafka クライアントは以下のいずれかで設定されます。
- 認可サーバーから有効なアクセストークンを取得するために必要なクレデンシャル (クライアント ID およびシークレット)。
- 認可サーバーから提供されたツールを使用して取得された、有効期限の長い有効なアクセストークンまたは更新トークン。
アクセストークンは、Kafka ブローカーに送信される唯一の情報です。アクセストークンを取得するために認可サーバーでの認証に使用されるクレデンシャルは、ブローカーに送信されません。
クライアントによるアクセストークンの取得後、認可サーバーと通信する必要はありません。
クライアント ID とシークレットを使用した認証が最も簡単です。有効期間の長いアクセストークンまたは更新トークンを使用すると、認可サーバーツールに追加の依存関係があるため、より複雑になります。
有効期間が長いアクセストークンを使用している場合は、認可サーバーでクライアントを設定し、トークンの最大有効期間を長くする必要があります。
Kafka クライアントが直接アクセストークンで設定されていない場合、クライアントは認可サーバーと通信して Kafka セッションの開始中にアクセストークンのクレデンシャルを交換します。Kafka クライアントは以下のいずれかを交換します。
- クライアント ID およびシークレット
- クライアント ID、更新トークン、および (任意の) シークレット
- ユーザー名とパスワード、およびクライアント ID と (オプションで) シークレット
15.4.5. OAuth 2.0 クライアント認証フロー
OAuth 2.0 認証フローは、基礎となる Kafka クライアントおよび Kafka ブローカー設定によって異なります。フローは、使用する認可サーバーによってもサポートされる必要があります。
Kafka ブローカーリスナー設定は、クライアントがアクセストークンを使用して認証する方法を決定します。クライアントはクライアント ID およびシークレットを渡してアクセストークンをリクエストできます。
リスナーが PLAIN 認証を使用するように設定されている場合、クライアントはクライアント ID およびシークレット、または、ユーザー名およびアクセストークンで認証できます。これらの値は PLAIN メカニズムの username
および password
プロパティーとして渡されます。
リスナー設定は、以下のトークン検証オプションをサポートします。
- 認可サーバーと通信しない、JWT の署名確認およびローカルトークンのイントロスペクションをベースとした高速なローカルトークン検証を使用できます。認可サーバーは、トークンで署名を検証するために使用される公開証明書のある JWKS エンドポイントを提供します。
- 認可サーバーが提供するトークンイントロスペクションエンドポイントへの呼び出しを使用することができます。新しい Kafka ブローカー接続が確立されるたびに、ブローカーはクライアントから受け取ったアクセストークンを認可サーバーに渡します。Kafka ブローカーは応答を確認して、トークンが有効かどうかを確認します。
認可サーバーは不透明なアクセストークンの使用のみを許可する可能性があり、この場合はローカルトークンの検証は不可能です。
Kafka クライアントクレデンシャルは、以下のタイプの認証に対して設定することもできます。
- 以前に生成された有効期間の長いアクセストークンを使用した直接ローカルアクセス
- 新しいアクセストークンを発行するには、認可サーバーに連絡します (クライアント ID とシークレット、または更新トークン、またはユーザー名とパスワードを使用)。
15.4.5.1. SASL OAUTHBEARER メカニズムを使用したクライアント認証フローの例
SASL OAUTHBEARER メカニズムを使用して、Kafka 認証に以下の通信フローを使用できます。
クライアントがクライアント ID とシークレットを使用し、ブローカーが検証を認可サーバーに委任する場合
- Kafka クライアントは、クライアント ID とシークレット、および必要に応じてリフレッシュトークンを使用して、認可サーバーからアクセストークンを要求します。または、クライアントはユーザー名とパスワードを使用して認証することもできます。
- 認可サーバーは新しいアクセストークンを生成します。
- Kafka クライアントは、SASL OAUTHBEARER メカニズムを使用してアクセストークンを渡すことで Kafka ブローカーで認証されます。
- Kafka ブローカーは、独自のクライアント ID およびシークレットを使用し、認可サーバーでトークンイントロスペクションエンドポイントを呼び出すことで、アクセストークンを検証します。
- トークンが有効な場合、Kafka クライアントセッションが確立されます。
クライアントがクライアント ID およびシークレットを使用し、ブローカーが高速のローカルトークン検証を実行する場合
- Kafka クライアントは、クライアント ID とシークレット、および必要に応じてリフレッシュトークンを使用して、トークンエンドポイントから認可サーバーに対して認証を行います。または、クライアントはユーザー名とパスワードを使用して認証することもできます。
- 認可サーバーは新しいアクセストークンを生成します。
- Kafka クライアントは、SASL OAUTHBEARER メカニズムを使用してアクセストークンを渡すことで Kafka ブローカーで認証されます。
- Kafka ブローカーは、JWT トークン署名チェックおよびローカルトークンイントロスペクションを使用して、ローカルでアクセストークンを検証します。
クライアントが有効期限の長いアクセストークンを使用し、ブローカーが検証を認可サーバーに委任する場合
- Kafka クライアントは、SASL OAUTHBEARER メカニズムを使用して、有効期限の長いアクセストークンを渡すために Kafka ブローカーで認証します。
- Kafka ブローカーは、独自のクライアント ID およびシークレットを使用して、認可サーバーでトークンイントロスペクションエンドポイントを呼び出し、アクセストークンを検証します。
- トークンが有効な場合、Kafka クライアントセッションが確立されます。
クライアントが有効期限の長いアクセストークンを使用し、ブローカーが高速のローカル検証を実行する場合
- Kafka クライアントは、SASL OAUTHBEARER メカニズムを使用して、有効期限の長いアクセストークンを渡すために Kafka ブローカーで認証します。
- Kafka ブローカーは、JWT トークン署名チェックおよびローカルトークンイントロスペクションを使用して、ローカルでアクセストークンを検証します。
トークンが取り消された場合に認可サーバーとのチェックが行われないため、高速のローカル JWT トークン署名の検証は有効期限の短いトークンにのみ適しています。トークンの有効期限はトークンに書き込まれますが、失効はいつでも発生する可能性があるため、認可サーバーと通信せずに対応することはできません。発行されたトークンはすべて期限切れになるまで有効とみなされます。
15.4.5.2. SASL PLAIN メカニズムを使用したクライアント認証フローの例
OAuth PLAIN メカニズムを使用して、Kafka 認証に以下の通信フローを使用できます。
クライアントがクライアント ID およびシークレットを使用し、ブローカーがクライアントのアクセストークンを取得する場合
-
Kafka クライアントは、
clientId
をユーザー名として、secret
をパスワードとして渡します。 -
Kafka ブローカーは、トークンエンドポイントを使用して
clientId
およびsecret
を認可サーバーに渡します。 - 認可サーバーは、新しいアクセストークンまたはエラー (クライアントクレデンシャルが有効でない場合) を返します。
Kafka ブローカーは、以下のいずれかの方法でトークンを検証します。
- トークンイントロスペクションエンドポイントが指定されている場合、Kafka ブローカーは認可サーバーでエンドポイントを呼び出すことで、アクセストークンを検証します。トークンの検証に成功した場合には、セッションが確立されます。
- ローカルトークンのイントロスペクションが使用される場合、要求は認可サーバーに対して行われません。Kafka ブローカーは、JWT トークン署名チェックを使用して、アクセストークンをローカルで検証します。
クライアントが、クライアント ID およびシークレットなしで有効期限の長いアクセストークンを使用する場合
- Kafka クライアントはユーザー名とパスワードを渡します。パスワードは、クライアントを実行する前に手動で取得および設定されたアクセストークンの値を提供します。
Kafka ブローカーリスナーが認証のトークンエンドポイントで設定されているかどうかに応じて、
$accessToken:
文字列の接頭辞の有無にかかわらず、パスワードは渡されます。-
トークンエンドポイントが設定されている場合、パスワードの前に
$accessToken:
を付け、password パラメーターにクライアントシークレットではなくアクセストークンが含まれていることをブローカーに知らせる必要があります。Kafka ブローカーは、ユーザー名をアカウントのユーザー名として解釈します。 -
トークンエンドポイントが Kafka ブローカーリスナーで設定されていない場合 (
no-client-credentials mode
を強制)、パスワードは接頭辞なしでアクセストークンを提供する必要があります。Kafka ブローカーは、ユーザー名をアカウントのユーザー名として解釈します。このモードでは、クライアントはクライアント ID およびシークレットを使用せず、password
パラメーターは常に raw アクセストークンとして解釈されます。
-
トークンエンドポイントが設定されている場合、パスワードの前に
Kafka ブローカーは、以下のいずれかの方法でトークンを検証します。
- トークンイントロスペクションエンドポイントが指定されている場合、Kafka ブローカーは認可サーバーでエンドポイントを呼び出すことで、アクセストークンを検証します。トークンの検証に成功した場合には、セッションが確立されます。
- ローカルトークンイントロスペクションが使用されている場合には、認可サーバーへの要求はありません。Kafka ブローカーは、JWT トークン署名チェックを使用して、アクセストークンをローカルで検証します。
15.4.6. OAuth 2.0 認証の設定
OAuth 2.0 は、Kafka クライアントと Streams for Apache Kafka コンポーネントとの対話に使用されます。
Streams for Apache Kafka に OAuth 2.0 を使用するには、以下を行う必要があります。
15.4.6.1. OAuth 2.0 認可サーバーの設定
この手順では、Streams for Apache Kafka との統合用に認可サーバーを設定するために必要な一般的な手順について説明します。
これらの手順は製品固有のものではありません。
手順は、選択した認可サーバーによって異なります。OAuth 2.0 アクセスの設定方法については、認可サーバーの製品ドキュメントを参照してください。
認可サーバーがすでにデプロイされている場合は、デプロイ手順をスキップして、現在のデプロイを使用できます。
手順
- 認可サーバーをクラスターにデプロイします。
認可サーバーの CLI または管理コンソールにアクセスして、Streams for Apache Kafka 用に OAuth 2.0 を設定します。
Streams for Apache Kafka で動作するように認可サーバーを準備します。
-
kafka-broker
クライアントを設定します。 - アプリケーションの Kafka クライアントコンポーネントごとにクライアントを設定します。
次のステップ
認可サーバーのデプロイおよび設定後に、Kafka ブローカーが OAuth 2.0 を使用するように設定 します。
15.4.6.2. Kafka ブローカーの OAuth 2.0 サポートの設定
この手順では、ブローカーリスナーが認可サーバーを使用して OAuth 2.0 認証を使用するように、Kafka ブローカーを設定する方法について説明します。
tls: true
を使用したリスナーを介して、暗号化されたインターフェイスで OAuth 2.0 を使用することを推奨します。プレーンリスナーは推奨されません。
認可サーバーが信頼できる CA によって署名された証明書を使用し、OAuth 2.0 サーバーのホスト名と一致する場合、TLS 接続はデフォルト設定を使用して動作します。それ以外の場合は、適切な証明書でトラストストアを設定するか、証明書のホスト名の検証を無効にする必要があります。
Kafka ブローカーの設定する場合、新たに接続された Kafka クライアントの OAuth 2.0 認証中にアクセストークンを検証するために使用されるメカニズムには、以下の 2 つのオプションがあります。
作業を開始する前の注意事項
Kafka ブローカーリスナーの OAuth 2.0 認証の設定に関する詳細は、以下を参照してください。
前提条件
- Streams for Apache Kafka と Kafka が実行中である。
- OAuth 2.0 の認可サーバーがデプロイされている。
手順
エディターで、
Kafka
リソースの Kafka ブローカー設定 (Kafka.spec.kafka
) を更新します。oc edit kafka my-cluster
oc edit kafka my-cluster
Copy to Clipboard Copied! Kafka ブローカーの
listeners
設定を行います。各タイプのリスナーは独立しているため、同じ設定にする必要はありません。
以下は、外部リスナーに設定された設定オプションの例になります。
例 1: 高速なローカル JWT トークン検証の設定
#... - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth validIssuerUri: https://<auth_server_address>/auth/realms/external jwksEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/certs userNameClaim: preferred_username maxSecondsWithoutReauthentication: 3600 tlsTrustedCertificates: - secretName: oauth-server-cert certificate: ca.crt disableTlsHostnameVerification: true jwksExpirySeconds: 360 jwksRefreshSeconds: 300 jwksMinRefreshPauseSeconds: 1
#... - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth
1 validIssuerUri: https://<auth_server_address>/auth/realms/external
2 jwksEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/certs
3 userNameClaim: preferred_username
4 maxSecondsWithoutReauthentication: 3600
5 tlsTrustedCertificates:
6 - secretName: oauth-server-cert certificate: ca.crt disableTlsHostnameVerification: true
7 jwksExpirySeconds: 360
8 jwksRefreshSeconds: 300
9 jwksMinRefreshPauseSeconds: 1
10 Copy to Clipboard Copied! - 1
oauth
に設定されたリスナータイプ。- 2
- 認証に使用されるトークン発行者の URI。
- 3
- ローカルの JWT 検証に使用される JWKS 証明書エンドポイントの URI。
- 4
- ユーザーを識別するために使用される実際のユーザー名を含むトークンクレーム (またはキー)。その値は、認可サーバーによって異なります。必要に応じて、
"['user.info'].['user.id']"
のような JsonPath 式を使用して、トークン内のネストされた JSON 属性からユーザー名を取得できます。 - 5
- (任意設定): セッションの有効期限がアクセストークンと同じ期間になるよう強制する Kafka の再認証メカニズムを有効にします。指定された値がアクセストークンの有効期限が切れるまでの残り時間よりも短い場合、クライアントは実際にトークンの有効期限が切れる前に再認証する必要があります。デフォルトでは、アクセストークンの期限が切れてもセッションは期限切れにならず、クライアントは再認証を試行しません。
- 6
- (任意設定): 認可サーバーへの TLS 接続用の信用できる証明書。
- 7
- (任意設定): TLS ホスト名の検証を無効にします。デフォルトは
false
です。 - 8
- JWKS 証明書が期限切れになる前に有効であるとみなされる期間。デフォルトは
360
秒です。デフォルトよりも長い時間を指定する場合は、無効になった証明書へのアクセスが許可されるリスクを考慮してください。 - 9
- JWKS 証明書を更新する間隔。この間隔は、有効期間よりも 60 秒以上短くする必要があります。デフォルトは
300
秒です。 - 10
- JWKS 公開鍵の更新が連続して試行される間隔の最小一時停止時間 (秒単位)。不明な署名キーが検出されると、JWKS キーの更新は、最後に更新を試みてから少なくとも指定された期間は一時停止し、通常の定期スケジュール以外でスケジュールされます。キーの更新は指数バックオフ (指数バックオフ) のルールに従い、
jwksRefreshSeconds
に到達するまで、一時停止を増やして失敗した更新を再試行します。デフォルト値は 1 です。
例 2: イントロスペクションエンドポイントを使用したトークンの検証の設定
- name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth validIssuerUri: https://<auth_server_address>/auth/realms/external introspectionEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token/introspect clientId: kafka-broker clientSecret: secretName: my-cluster-oauth key: clientSecret userNameClaim: preferred_username maxSecondsWithoutReauthentication: 3600
- name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth validIssuerUri: https://<auth_server_address>/auth/realms/external introspectionEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token/introspect
1 clientId: kafka-broker
2 clientSecret:
3 secretName: my-cluster-oauth key: clientSecret userNameClaim: preferred_username
4 maxSecondsWithoutReauthentication: 3600
5 Copy to Clipboard Copied! - 1
- トークンイントロスペクションエンドポイントの URI。
- 2
- クライアントを識別するためのクライアント ID。
- 3
- 認証にはクライアントシークレットとクライアント ID が使用されます。
- 4
- ユーザーを識別するために使用される実際のユーザー名を含むトークンクレーム (またはキー)。その値は、認可サーバーによって異なります。必要に応じて、
"['user.info'].['user.id']"
のような JsonPath 式を使用して、トークン内のネストされた JSON 属性からユーザー名を取得できます。 - 5
- (任意設定): セッションの有効期限がアクセストークンと同じ期間になるよう強制する Kafka の再認証メカニズムを有効にします。指定された値がアクセストークンの有効期限が切れるまでの残り時間よりも短い場合、クライアントは実際にトークンの有効期限が切れる前に再認証する必要があります。デフォルトでは、アクセストークンの期限が切れてもセッションは期限切れにならず、クライアントは再認証を試行しません。
OAuth 2.0 認証の適用方法や、認可サーバーのタイプによっては、追加 (任意) の設定を使用できます。
# ... authentication: type: oauth # ... checkIssuer: false checkAudience: true fallbackUserNameClaim: client_id fallbackUserNamePrefix: client-account- validTokenType: bearer userInfoEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/userinfo enableOauthBearer: false enablePlain: true tokenEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token customClaimCheck: "@.custom == 'custom-value'" clientAudience: audience clientScope: scope connectTimeoutSeconds: 60 readTimeoutSeconds: 60 httpRetries: 2 httpRetryPauseMs: 300 groupsClaim: "$.groups" groupsClaimDelimiter: "," includeAcceptHeader: false
# ... authentication: type: oauth # ... checkIssuer: false
1 checkAudience: true
2 fallbackUserNameClaim: client_id
3 fallbackUserNamePrefix: client-account-
4 validTokenType: bearer
5 userInfoEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/userinfo
6 enableOauthBearer: false
7 enablePlain: true
8 tokenEndpointUri: https://<auth_server_address>/auth/realms/external/protocol/openid-connect/token
9 customClaimCheck: "@.custom == 'custom-value'"
10 clientAudience: audience
11 clientScope: scope
12 connectTimeoutSeconds: 60
13 readTimeoutSeconds: 60
14 httpRetries: 2
15 httpRetryPauseMs: 300
16 groupsClaim: "$.groups"
17 groupsClaimDelimiter: ","
18 includeAcceptHeader: false
19 Copy to Clipboard Copied! - 1
- 認可サーバーが
iss
クレームを提供しない場合は、発行者チェックを行うことができません。このような場合、checkIssuer
をfalse
に設定し、validIssuerUri
を指定しないようにします。デフォルトはtrue
です。 - 2
- オーソリゼーションサーバーが
aud
(オーディエンス) クレームを提供していて、オーディエンスチェックを実施したい場合は、checkAudience
をtrue
に設定します。オーディエンスチェックによって、トークンの目的の受信者が特定されます。これにより、Kafka ブローカーはaud
要求にclientId
を持たないトークンを拒否します。デフォルトはfalse
です。 - 3
- 認可サーバーは、通常ユーザーとクライアントの両方を識別する単一の属性を提供しない場合があります。クライアントが独自の名前で認証される場合、サーバーによって クライアント ID が提供されることがあります。更新トークンまたはアクセストークンを取得するために、ユーザー名およびパスワードを使用してユーザーが認証される場合、サーバーによってクライアント ID の他に username が提供されることがあります。プライマリーユーザー ID 属性が使用できない場合は、このフォールバックオプションで、使用するユーザー名クレーム (属性) を指定します。必要に応じて、
"['client.info'].['client.id']"
のような JsonPath 式を使用してフォールバックユーザー名を取得し、トークン内のネストされた JSON 属性からユーザー名を取得できます。 - 4
fallbackUserNameClaim
が適用される場合、ユーザー名クレームの値とフォールバックユーザー名クレームの値が競合しないようにする必要もあることがあります。producer
というクライアントが存在し、producer
という通常ユーザーも存在する場合について考えてみましょう。この 2 つを区別するには、このプロパティーを使用してクライアントのユーザー ID に接頭辞を追加します。- 5
- (
introspectionEndpointUri
を使用する場合のみ該当): 使用している認可サーバーによっては、イントロスペクションエンドポイントによってトークンタイプ属性が返されるかどうかは分からず、異なる値が含まれることがあります。イントロスペクションエンドポイントからの応答に含まれなければならない有効なトークンタイプ値を指定できます。 - 6
- (
introspectionEndpointUri
を使用する場合のみ該当): イントロスペクションエンドポイントの応答に識別可能な情報が含まれないように、認可サーバーが設定または実装されることがあります。ユーザー ID を取得するには、userinfo
エンドポイントの URI をフォールバックとして設定します。userNameClaim
、fallbackUserNameClaim
、およびfallbackUserNamePrefix
の設定がuserinfo
エンドポイントの応答に適用されます。 - 7
- これを
false
に設定してリスナーで OAUTHBEARER メカニズムを無効にします。PLAIN または OAUTHBEARER のいずれかを有効にする必要があります。デフォルトはtrue
です。 - 8
- リスナーで PLAIN 認証を有効にするには、
true
に設定します。これは、すべてのプラットフォームのすべてのクライアントでサポートされています。 - 9
- PLAIN メカニズムの追加設定。これが指定されている場合、クライアントは
$accessToken:
接頭辞を使用してアクセストークンをpassword
として渡すことで、PLAIN 経由で認証できます。実稼働環境の場合は、常にhttps://
urls を使用してください。 - 10
- これを JsonPath フィルタークエリーに設定すると、検証中に追加のカスタムルールを JWT アクセストークンに適用できます。アクセストークンに必要なデータが含まれていないと拒否されます。
introspectionEndpointUri
を使用する場合、カスタムチェックはイントロスペクションエンドポイントの応答 JSON に適用されます。 - 11
- トークンエンドポイントに渡される
audience
パラメーター。オーディエンス は、inter-broker 認証用にアクセストークンを取得する場合に使用されます。また、clientId
とsecret
を使用した PLAIN クライアント認証の上にある OAuth 2.0 のクライアント名にも使われています。これは、認可サーバーに応じて、トークンの取得機能とトークンの内容のみに影響します。リスナーによるトークン検証ルールには影響しません。 - 12
scope
パラメーターがトークンエンドポイントに渡されます。スコープ は、inter-broker 認証用にアクセストークンを取得する場合に使用されます。また、clientId
とsecret
を使用した PLAIN クライアント認証の上にある OAuth 2.0 のクライアント名にも使われています。これは、認可サーバーに応じて、トークンの取得機能とトークンの内容のみに影響します。リスナーによるトークン検証ルールには影響しません。- 13
- 認可サーバーへの接続時のタイムアウト (秒単位)。デフォルト値は 60 です。
- 14
- 認可サーバーへの接続時の読み取りタイムアウト (秒単位)。デフォルト値は 60 です。
- 15
- 認可サーバーへの失敗した HTTP リクエストを再試行する最大回数。デフォルト値は
0
で、再試行は実行されないことを意味します。このオプションを効果的に使用するには、connectTimeoutSeconds
オプションとreadTimeoutSeconds
オプションのタイムアウト時間を短縮することを検討してください。ただし、再試行により現在のワーカースレッドが他のリクエストで利用できなくなる可能性があり、リクエストが多すぎると停止する場合、Kafka ブローカーが応答しなくなる可能性があることに注意してください。 - 16
- 認可サーバーへの失敗した HTTP リクエストの再試行を行うまでの待機時間。デフォルトでは、この時間はゼロに設定されており、一時停止は適用されません。これは、リクエストの失敗の原因となる問題の多くは、リクエストごとのネットワークの不具合やプロキシーの問題であり、すぐに解決できるためです。ただし、認可サーバーに負荷がかかっている場合、または高トラフィックが発生している場合は、このオプションを 100 ミリ秒以上の値に設定して、サーバーの負荷を軽減し、再試行が成功する可能性を高めることができます。
- 17
- JWT トークンまたはイントロスペクションエンドポイント応答からグループ情報を抽出するために使用される JsonPath クエリー。このオプションはデフォルトでは設定されていません。このオプションを設定すると、カスタム承認者はユーザーグループに基づいて承認の決定を行うことができます。
- 18
- グループ情報が単一の区切り文字列として返される場合に、グループ情報を解析するために使用される区切り文字。デフォルト値は ',' (コンマ) です。
- 19
- 一部の認可サーバーでは、クライアントが
Accept: application/json
ヘッダーを送信する際に問題が発生します。includeAcceptHeader: false
を設定する場合、ヘッダーは送信されません。デフォルトはtrue
です。
- エディターを保存して終了し、ローリング更新の完了を待ちます。
更新をログで確認するか、Pod 状態の遷移を監視して確認します。
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
Copy to Clipboard Copied! ローリング更新によって、ブローカーが OAuth 2.0 認証を使用するように設定されます。
15.4.6.3. OAuth 2.0 を使用するための Kafka Java クライアントの設定
Kafka ブローカーとの対話に OAuth 2.0 を使用するように Kafka プロデューサー API とコンシューマー API を設定します。コールバックプラグインをクライアントの pom.xml
ファイルに追加してから、OAuth 2.0 用にクライアントを設定します。
クライアント設定で次を指定します。
SASL (Simple Authentication and Security Layer) セキュリティープロトコル:
-
TLS 暗号化接続を介した認証用の
SASL_SSL
暗号化されていない接続を介した認証用の
SASL_PLAINTEXT
プロダクションには
SASL_SSL
を使用し、ローカル開発にはSASL_PLAINTEXT
のみを使用してください。SASL_SSL
を使用する場合は、追加のssl.truststore
設定が必要です。OAuth 2.0 認可サーバーへのセキュアな接続 (https://
) には、トラストストア設定が必要です。OAuth 2.0 認可サーバーを確認するには、認可サーバーの CA 証明書をクライアント設定のトラストストアに追加します。トラストストアは、PEM または PKCS #12 形式で設定できます。
-
TLS 暗号化接続を介した認証用の
Kafka SASL メカニズム:
-
ベアラートークンを使用したクレデンシャル交換用の
OAUTHBEARER
-
クライアントクレデンシャル (clientId + secret) またはアクセストークンを渡す
PLAIN
-
ベアラートークンを使用したクレデンシャル交換用の
SASL メカニズムを実装する JAAS (Java Authentication and Authorization Service) モジュール:
-
org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule
は OAUTHBEARER メカニズムを実装します。 -
org.apache.kafka.common.security.plain.PlainLoginModule
は plain メカニズムを実装します。
OAuthbearer メカニズムを使用できるようにするには、
io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
のカスタムクラスをコールバックハンドラーとして追加する必要もあります。JaasClientOauthLoginCallbackHandler
は、クライアントのログイン中にアクセストークンの認可サーバーへの OAuth コールバックを処理します。これにより、トークンの自動更新が可能になり、ユーザーの介入なしで継続的な認証が保証されます。さらに、OAuth 2.0 パスワード付与方式を使用してクライアントのログイン認証情報を処理します。-
以下の認証方法をサポートする SASL 認証プロパティー:
- OAuth 2.0 クライアントクレデンシャル
- OAuth 2.0 パスワードグラント (非推奨)
- アクセストークン
- リフレッシュトークン
SASL 認証プロパティーを JAAS 設定として追加します (
sasl.jaas.config
およびsasl.login.callback.handler.class
)。認証プロパティーを設定する方法は、OAuth 2.0 認可サーバーへのアクセスに使用している認証方法によって異なります。この手順では、プロパティーはプロパティーファイルで指定されてから、クライアント設定にロードされます。
認証プロパティーを環境変数または Java システムプロパティーとして指定することもできます。Java システムプロパティーの場合は、setProperty
を使用して設定し、-D
オプションを使用してコマンドラインで渡すことができます。
前提条件
- Streams for Apache Kafka と Kafka が実行中である。
- OAuth 2.0 認可サーバーがデプロイされ、Kafka ブローカーへの OAuth のアクセスが設定されている。
- Kafka ブローカーが OAuth 2.0 に対して設定されている。
手順
OAuth 2.0 サポートのあるクライアントライブラリーを Kafka クライアントの
pom.xml
ファイルに追加します。<dependency> <groupId>io.strimzi</groupId> <artifactId>kafka-oauth-client</artifactId> <version>0.15.0.redhat-00007</version> </dependency>
<dependency> <groupId>io.strimzi</groupId> <artifactId>kafka-oauth-client</artifactId> <version>0.15.0.redhat-00007</version> </dependency>
Copy to Clipboard Copied! プロパティーファイルで以下の設定を指定して、クライアントプロパティーを設定します。
- セキュリティープロトコル
- SASL メカニズム
使用されているメソッドに応じた JAAS モジュールと認証プロパティー
たとえば、以下を
client.properties
ファイルに追加できます。クライアントクレデンシャルメカニズムのプロパティー
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \ oauth.client.secret="<client_secret>" \ oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.scope="<scope>" \ oauth.audience="<audience>" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
security.protocol=SASL_SSL
1 sasl.mechanism=OAUTHBEARER
2 ssl.truststore.location=/tmp/truststore.p12
3 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \
4 oauth.client.id="<client_id>" \
5 oauth.client.secret="<client_secret>" \
6 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \
7 oauth.ssl.truststore.password="$STOREPASS" \
8 oauth.ssl.truststore.type="PKCS12" \
9 oauth.scope="<scope>" \
10 oauth.audience="<audience>" ;
11 sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
Copy to Clipboard Copied! - 1
- TLS 暗号化接続用の
SASL_SSL
セキュリティープロトコル。ローカル開発のみでは、暗号化されていない接続でSASL_PLAINTEXT
を使用します。 - 2
OAUTHBEARER
またはPLAIN
として指定された SASL メカニズム。- 3
- Kafka クラスターへのセキュアなアクセスのためのトラストストア設定。
- 4
- 認可サーバーのトークンエンドポイントの URI です。
- 5
- クライアント ID。認可サーバーで クライアント を作成するときに使用される名前です。
- 6
- 認可サーバーで クライアント を作成するときに作成されるクライアントシークレット。
- 7
- この場所には、認可サーバーの公開鍵証明書 (
truststore.p12
) が含まれています。 - 8
- トラストストアにアクセスするためのパスワード。
- 9
- トラストストアのタイプ。
- 10
- (オプション): トークンエンドポイントからトークンを要求するための
scope
。認可サーバーでは、クライアントによるスコープの指定が必要になることがあります。 - 11
- (オプション) トークンエンドポイントからトークンを要求するための
audience
。認可サーバーでは、クライアントによるオーディエンスの指定が必要になることがあります。
パスワード付与メカニズムのプロパティー
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \ oauth.client.secret="<client_secret>" \ oauth.password.grant.username="<username>" \ oauth.password.grant.password="<password>" \ oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.scope="<scope>" \ oauth.audience="<audience>" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \
1 oauth.client.secret="<client_secret>" \
2 oauth.password.grant.username="<username>" \
3 oauth.password.grant.password="<password>" \
4 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.scope="<scope>" \ oauth.audience="<audience>" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
Copy to Clipboard Copied! - 1
- クライアント ID。認可サーバーで クライアント を作成するときに使用される名前です。
- 2
- (オプション) 認可サーバーで クライアント を作成するときに作成されるクライアントシークレット。
- 3
- パスワードグラント認証のユーザー名。OAuth パスワードグラント設定 (ユーザー名とパスワード) では、OAuth 2.0 パスワードグラント方式が使用されます。パスワードグラントを使用するには、権限が制限されたクライアントのユーザーアカウントを認可サーバー上に作成します。アカウントは、サービスアカウントのように機能する必要があります。認証にユーザーアカウントが必要な環境で使用しますが、先にリフレッシュトークンの使用を検討してください。
- 4
- パスワード付与認証のパスワード。注記
SASL PLAIN は、OAuth 2.0 パスワード付与メソッドを使用したユーザー名とパスワードの受け渡し (パスワード付与) をサポートしていません。
アクセストークンのプロパティー
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.access.token="<access_token>" \ oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.access.token="<access_token>" \
1 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
Copy to Clipboard Copied! - 1
- Kafka クライアントの有効期間が長いアクセストークン。
トークンのプロパティーを更新する
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \ oauth.client.secret="<client_secret>" \ oauth.refresh.token="<refresh_token>" \ oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
security.protocol=SASL_SSL sasl.mechanism=OAUTHBEARER ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.token.endpoint.uri="<token_endpoint_url>" \ oauth.client.id="<client_id>" \
1 oauth.client.secret="<client_secret>" \
2 oauth.refresh.token="<refresh_token>" \
3 oauth.ssl.truststore.location="/tmp/oauth-truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
Copy to Clipboard Copied!
OAUTH 2.0 認証のクライアントプロパティーを Java クライアントコードに入力します。
クライアントプロパティーの入力を示す例
Properties props = new Properties(); try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) { props.load(reader); }
Properties props = new Properties(); try (FileReader reader = new FileReader("client.properties", StandardCharsets.UTF_8)) { props.load(reader); }
Copy to Clipboard Copied! - Kafka クライアントが Kafka ブローカーにアクセスできることを確認します。
15.4.6.4. Kafka コンポーネントの OAuth 2.0 の設定
この手順では、認可サーバーを使用して OAuth 2.0 認証を使用するように Kafka コンポーネントを設定する方法を説明します。
以下の認証を設定できます。
- Kafka Connect
- Kafka MirrorMaker
- Kafka Bridge
この手順では、Kafka コンポーネントと認可サーバーは同じサーバーで稼働しています。
作業を開始する前の注意事項
Kafka コンポーネントの OAuth 2.0 認証の設定に関する詳細は、KafkaClientAuthenticationOAuth
スキーマリファレンス を参照してください。スキーマリファレンスには、設定オプションの例が記載されています。
前提条件
- Streams for Apache Kafka と Kafka が実行中である。
- OAuth 2.0 認可サーバーがデプロイされ、Kafka ブローカーへの OAuth のアクセスが設定されている。
- Kafka ブローカーが OAuth 2.0 に対して設定されている。
手順
クライアントシークレットを作成し、これを環境変数としてコンポーネントにマウントします。
以下は、Kafka Bridge の
Secret
を作成する例になります。apiVersion: kafka.strimzi.io/v1beta2 kind: Secret metadata: name: my-bridge-oauth type: Opaque data: clientSecret: MGQ1OTRmMzYtZTllZS00MDY2LWI5OGEtMTM5MzM2NjdlZjQw
apiVersion: kafka.strimzi.io/v1beta2 kind: Secret metadata: name: my-bridge-oauth type: Opaque data: clientSecret: MGQ1OTRmMzYtZTllZS00MDY2LWI5OGEtMTM5MzM2NjdlZjQw
1 Copy to Clipboard Copied! - 1
clientSecret
キーは base64 形式である必要があります。
Kafka コンポーネントのリソースを作成または編集し、OAuth 2.0 認証が認証プロパティーに設定されるようにします。
OAuth 2.0 認証の場合、次のオプションを使用できます。
- クライアント ID およびシークレット
- クライアント ID およびリフレッシュトークン
- アクセストークン
- ユーザー名およびパスワード
- TLS
以下は、クライアント ID、シークレット、および TLS を使用して OAuth 2.0 が Kafka Bridge クライアントに割り当てられる例になります。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: # ... authentication: type: oauth tokenEndpointUri: https://<auth-server-address>/auth/realms/master/protocol/openid-connect/token clientId: kafka-bridge clientSecret: secretName: my-bridge-oauth key: clientSecret tlsTrustedCertificates: - secretName: oauth-server-cert certificate: tls.crt
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: # ... authentication: type: oauth
1 tokenEndpointUri: https://<auth-server-address>/auth/realms/master/protocol/openid-connect/token
2 clientId: kafka-bridge clientSecret: secretName: my-bridge-oauth key: clientSecret tlsTrustedCertificates:
3 - secretName: oauth-server-cert certificate: tls.crt
Copy to Clipboard Copied! OAuth 2.0 認証の適用方法や、認可サーバーのタイプによって、使用できる追加の設定オプションがあります。
# ... spec: # ... authentication: # ... disableTlsHostnameVerification: true checkAccessTokenType: false accessTokenIsJwt: false scope: any audience: kafka connectTimeoutSeconds: 60 readTimeoutSeconds: 60 httpRetries: 2 httpRetryPauseMs: 300 includeAcceptHeader: false
# ... spec: # ... authentication: # ... disableTlsHostnameVerification: true
1 checkAccessTokenType: false
2 accessTokenIsJwt: false
3 scope: any
4 audience: kafka
5 connectTimeoutSeconds: 60
6 readTimeoutSeconds: 60
7 httpRetries: 2
8 httpRetryPauseMs: 300
9 includeAcceptHeader: false
10 Copy to Clipboard Copied! - 1
- (任意設定): TLS ホスト名の検証を無効にします。デフォルトは
false
です。 - 2
- 認可サーバーによって、JWT トークン内部で
typ
(タイプ) 要求が返されない場合は、checkAccessTokenType: false
を適用するとトークンタイプがチェックされず次に進むことができます。デフォルトはtrue
です。 - 3
- 不透明なトークンを使用している場合、アクセストークンが JWT トークンとして処理されないように
accessTokenIsJwt: false
を適用することができます。 - 4
- (オプション): トークンエンドポイントからトークンを要求するための
scope
。認可サーバーでは、クライアントによるスコープの指定が必要になることがあります。この場合ではany
になります。 - 5
- (オプション) トークンエンドポイントからトークンを要求するための
audience
。認可サーバーでは、クライアントによるオーディエンスの指定が必要になることがあります。今回の場合はkafka
です。 - 6
- (オプション) 認可サーバーへの接続時のタイムアウト (秒単位)。デフォルト値は 60 です。
- 7
- (オプション): 認可サーバーへの接続時の読み取りタイムアウト (秒単位)。デフォルト値は 60 です。
- 8
- (オプション) 認可サーバーへの失敗した HTTP リクエストを再試行する最大回数。デフォルト値は
0
で、再試行は実行されないことを意味します。このオプションを効果的に使用するには、connectTimeoutSeconds
オプションとreadTimeoutSeconds
オプションのタイムアウト時間を短縮することを検討してください。ただし、再試行により現在のワーカースレッドが他のリクエストで利用できなくなる可能性があり、リクエストが多すぎると停止する場合、Kafka ブローカーが応答しなくなる可能性があることに注意してください。 - 9
- (オプション) 失敗した認可サーバーへの HTTP リクエストの再試行を行うまでの待機時間。デフォルトでは、この時間はゼロに設定されており、一時停止は適用されません。これは、リクエストの失敗の原因となる問題の多くは、リクエストごとのネットワークの不具合やプロキシーの問題であり、すぐに解決できるためです。ただし、認可サーバーに負荷がかかっている場合、または高トラフィックが発生している場合は、このオプションを 100 ミリ秒以上の値に設定して、サーバーの負荷を軽減し、再試行が成功する可能性を高めることができます。
- 10
- (オプション) 一部の認可サーバーでは、クライアントが
Accept: application/json
ヘッダーを送信する際に問題が発生します。includeAcceptHeader: false
を設定する場合、ヘッダーは送信されません。デフォルトはtrue
です。
Kafka リソースのデプロイメントに変更を適用します。
oc apply -f your-file
oc apply -f your-file
Copy to Clipboard Copied! 更新をログで確認するか、Pod 状態の遷移を監視して確認します。
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
oc logs -f ${POD_NAME} -c ${CONTAINER_NAME} oc get pod -w
Copy to Clipboard Copied! ローリング更新では、OAuth 2.0 認証を使用して Kafka ブローカーと対話するコンポーネントが設定されます。
15.5. OAuth 2.0 トークンベース承認の使用
Streams for Apache Kafka は、Red Hat Single Sign-On の Authorization Services による OAuth 2.0 トークンベースの認可をサポートしています。これにより、セキュリティーポリシーと権限を一元的に管理できます。
Red Hat Single Sign-On で定義されたセキュリティーポリシーおよびパーミッションは、Kafka ブローカーのリソースへのアクセスを付与するために使用されます。ユーザーとクライアントは、Kafka ブローカーで特定のアクションを実行するためのアクセスを許可するポリシーに対して照合されます。
Kafka では、デフォルトですべてのユーザーにブローカーへのフルアクセスが許可されており、アクセスコントロールリスト (ACL) に基づいて認可を設定するための AclAuthorizer
プラグインと StandardAuthorizer
プラグインも提供されています。これらのプラグインによって管理される ACL ルールは、username に基づいてリソースへのアクセスを許可または拒否するために使用され、このようなルールは Kafka クラスター自体の中に保存されます。ただし、Red Hat Single Sign-On を使用した OAuth 2.0 トークンベースの認可では、より柔軟にアクセス制御を Kafka ブローカーに実装できます。さらに、Kafka ブローカーで OAuth 2.0 の認可および ACL が使用されるように設定することができます。
15.5.1. OAuth 2.0 の認可メカニズム
Streams for Apache Kafka の OAuth 2.0 認可では、Red Hat Single Sign-On サーバーの Authorization Services REST エンドポイントを使用して、特定のユーザーに定義済みのセキュリティーポリシーを適用し、各リソースに付与された当該ユーザーの権限のリストを提供することで、Red Hat Single Sign-On によるトークンベースの認証を拡張します。ポリシーは、ロールとグループを使用してユーザーと権限を照合します。OAuth 2.0 の認可では、Red Hat Single Sign-On の Authorization Services から受信した、ユーザーに付与された権限のリストを基にして、権限がローカルで強制されます。
15.5.1.1. Kafka ブローカーのカスタム authorizer
Streams for Apache Kafka では、Red Hat Single Sign-On の オーソライザー (KeycloakAuthorizer
) が提供されます。Red Hat Single Sign-On によって提供される Authorization Services で Red Hat Single Sign-On REST エンドポイントを使用できるようにするには、Kafka ブローカーでカスタム authorizer を設定します。
authorizer は必要に応じて付与された権限のリストを認可サーバーから取得し、ローカルで Kafka ブローカーに認可を強制するため、クライアントの要求ごとに迅速な認可決定が行われます。
15.5.2. OAuth 2.0 認可サポートの設定
この手順では、Red Hat Single Sign-On の Authorization Services を使用して、OAuth 2.0 認可を使用するように Kafka ブローカーを設定する方法を説明します。
作業を開始する前に
特定のユーザーに必要なアクセス、または制限するアクセスについて検討してください。Red Hat Single Sign-On では、Red Hat Single Sign-On の グループ、ロール、クライアント、および ユーザー の組み合わせを使用して、アクセスを設定できます。
通常、グループは組織の部門または地理的な場所を基にしてユーザーを照合するために使用されます。また、ロールは職務を基にしてユーザーを照合するために使用されます。
Red Hat Single Sign-On を使用すると、ユーザーおよびグループを LDAP で保存できますが、クライアントおよびロールは LDAP で保存できません。ユーザーデータへのアクセスとストレージを考慮して、認可ポリシーの設定方法を選択する必要がある場合があります。
スーパーユーザー は、Kafka ブローカーに実装された認可にかかわらず、常に制限なく Kafka ブローカーにアクセスできます。
前提条件
- Streams for Apache Kafka が、トークンベースの認証 に Red Hat Single Sign-On と OAuth 2.0 を使用するように設定されている。認可を設定するときに、同じ Red Hat Single Sign-On サーバーエンドポイントを使用する必要があります。
-
OAuth 2.0 認証は、再認証を有効にするために
maxSecondsWithoutReauthentication
オプションで設定する必要があります。
手順
- Red Hat Single Sign-On の Admin Console にアクセスするか、Red Hat Single Sign-On の Admin CLI を使用して、OAuth 2.0 認証の設定時に作成した Kafka ブローカークライアントの Authorization Services を有効にします。
- 認可サービスを使用して、クライアントのリソース、認可スコープ、ポリシー、およびパーミッションを定義します。
- ロールとグループをユーザーとクライアントに割り当てて、パーミッションをユーザーとクライアントにバインドします。
エディターで
Kafka
リソースの Kafka ブローカー設定 (Kafka.spec.kafka
) を更新して、Kafka ブローカーで Red Hat Single Sign-On による認可が使用されるように設定します。oc edit kafka my-cluster
oc edit kafka my-cluster
Copy to Clipboard Copied! Kafka ブローカーの
kafka
設定を指定して、keycloak
による認可を使用し、認可サーバーと Red Hat Single Sign-On の Authorization Services にアクセスできるようにします。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... authorization: type: keycloak tokenEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/token> clientId: kafka delegateToKafkaAcls: false disableTlsHostnameVerification: false superUsers: - CN=fred - sam - CN=edward tlsTrustedCertificates: - secretName: oauth-server-cert certificate: ca.crt grantsRefreshPeriodSeconds: 60 grantsRefreshPoolSize: 5 grantsMaxIdleSeconds: 300 grantsGcPeriodSeconds: 300 grantsAlwaysLatest: false connectTimeoutSeconds: 60 readTimeoutSeconds: 60 httpRetries: 2 enableMetrics: false includeAcceptHeader: false #...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... authorization: type: keycloak
1 tokenEndpointUri: <https://<auth-server-address>/auth/realms/external/protocol/openid-connect/token>
2 clientId: kafka
3 delegateToKafkaAcls: false
4 disableTlsHostnameVerification: false
5 superUsers:
6 - CN=fred - sam - CN=edward tlsTrustedCertificates:
7 - secretName: oauth-server-cert certificate: ca.crt grantsRefreshPeriodSeconds: 60
8 grantsRefreshPoolSize: 5
9 grantsMaxIdleSeconds: 300
10 grantsGcPeriodSeconds: 300
11 grantsAlwaysLatest: false
12 connectTimeoutSeconds: 60
13 readTimeoutSeconds: 60
14 httpRetries: 2
15 enableMetrics: false
16 includeAcceptHeader: false
17 #...
Copy to Clipboard Copied! - 1
- タイプ
keycloak
によって Red Hat Single Sign-On の認可が有効になります。 - 2
- Red Hat Single Sign-On トークンエンドポイントの URI。実稼働環境の場合は、常に
https://
urls を使用してください。トークンベースのoauth
認証を設定する場合、jwksEndpointUri
をローカル JWT 検証の URI として指定します。tokenEndpointUri
URI のホスト名は同じである必要があります。 - 3
- 認可サービスが有効になっている Red Hat Single Sign-On の OAuth 2.0 クライアント定義のクライアント ID。通常、
kafka
が ID として使用されます。 - 4
- (オプション) Red Hat Single Sign-On Authorization Services ポリシーでアクセスが拒否された場合、Kafka
AclAuthorizer
およびStandardAuthorizer
に権限を委譲します。デフォルトはfalse
です。 - 5
- (任意設定): TLS ホスト名の検証を無効にします。デフォルトは
false
です。 - 6
- (オプション) 指定されたスーパーユーザー。
- 7
- (任意設定): 認可サーバーへの TLS 接続用の信用できる証明書。
- 8
- (任意設定): 連続する付与 (Grants) 更新実行の間隔。これは、アクティブなセッションが Red Hat Single Sign-On でユーザーのパーミッション変更を検出する最大時間です。デフォルト値は 60 です。
- 9
- (任意設定): アクティブなセッションの付与 (Grants) の更新 (並行して) に使用するスレッドの数。デフォルト値は 5 です。
- 10
- (オプション) キャッシュ内のアイドル許可を削除できるようになるまでの時間 (秒単位)。デフォルト値は 300 です。
- 11
- (オプション) キャッシュから古い許可を削除するジョブの連続実行間の時間 (秒単位)。デフォルト値は 300 です。
- 12
- (オプション) 新しいセッションに対して最新の許可を取得するかどうかを制御します。有効にすると、許可が Red Hat Single Sign-On から取得され、ユーザーのためにキャッシュされます。デフォルト値は
false
です。 - 13
- (オプション): Red Hat Single Sign-On トークンエンドポイントへの接続時のタイムアウト (秒単位)。デフォルト値は 60 です。
- 14
- (オプション): Red Hat Single Sign-On トークンエンドポイントへの接続時の読み取りタイムアウト (秒単位)。デフォルト値は 60 です。
- 15
- (オプション) 認可サーバーへの失敗した HTTP リクエストを (一時停止せずに) 再試行する最大回数。デフォルト値は
0
で、再試行は実行されないことを意味します。このオプションを効果的に使用するには、connectTimeoutSeconds
オプションとreadTimeoutSeconds
オプションのタイムアウト時間を短縮することを検討してください。ただし、再試行により現在のワーカースレッドが他のリクエストで利用できなくなる可能性があり、リクエストが多すぎると停止する場合、Kafka ブローカーが応答しなくなる可能性があることに注意してください。 - 16
- (オプション) OAuth メトリックを有効または無効にします。デフォルト値は
false
です。 - 17
- (オプション) 一部の認可サーバーでは、クライアントが
Accept: application/json
ヘッダーを送信する際に問題が発生します。includeAcceptHeader: false
を設定する場合、ヘッダーは送信されません。デフォルトはtrue
です。
- エディターを保存して終了し、ローリング更新の完了を待ちます。
更新をログで確認するか、Pod 状態の遷移を監視して確認します。
oc logs -f ${POD_NAME} -c kafka oc get pod -w
oc logs -f ${POD_NAME} -c kafka oc get pod -w
Copy to Clipboard Copied! ローリング更新によって、ブローカーが OAuth 2.0 認可を使用するように設定されます。
- クライアントまたは特定のロールを持つユーザーとして Kafka ブローカーにアクセスして、設定したパーミッションを検証し、必要なアクセス権限があり、付与されるべきでないアクセス権限がないことを確認します。
15.5.3. Red Hat Single Sign-On の Authorization Services でのポリシーおよびパーミッションの管理
本セクションでは、Red Hat Single Sign-On Authorization Services および Kafka によって使用される認可モデルについて説明し、各モデルの重要な概念を定義します。
Kafka にアクセスするためのパーミッションを付与するには、Red Hat Single Sign-On で OAuth クライアント仕様を作成して、Red Hat Single Sign-On Authorization Services オブジェクトを Kafka リソースにマップできます。Kafka パーミッションは、Red Hat Single Sign-On Authorization Services ルールを使用して、ユーザーアカウントまたはサービスアカウントに付与されます。
トピックの作成やリスト表示など、一般的な Kafka 操作に必要なさまざまなユーザーパーミッションの 例 を紹介します。
15.5.3.1. Kafka および Red Hat Single Sign-On 認可モデルの概要
Kafka および Red Hat Single Sign-On Authorization Services は、異なる認可モデルを使用します。
Kafka 認可モデル
Kafka の認可モデルはリソース型を使用します。Kafka クライアントがブローカーでアクションを実行すると、ブローカーは設定済みの KeycloakAuthorizer
を使用して、アクションおよびリソースタイプを基にしてクライアントのパーミッションをチェックします。
Kafka は 5 つのリソースタイプを使用してアクセスを制御します ( Topic
、Group
、Cluster
、TransactionalId
、および DelegationToken
)。各リソースタイプには、利用可能なパーミッションセットがあります。
トピック
-
作成
-
Write
-
読み取り
-
Delete
-
Describe
-
DescribeConfigs
-
Alter
-
AlterConfigs
グループ
-
読み取り
-
Describe
-
Delete
クラスター
-
作成
-
Describe
-
Alter
-
DescribeConfigs
-
AlterConfigs
-
IdempotentWrite
-
ClusterAction
TransactionalId
-
Describe
-
Write
DelegationToken
-
Describe
Red Hat Single Sign-On の Authorization Services モデル
Red Hat Single Sign-On の Authorization Services には、パーミッションを定義および付与するための 4 つの概念があります。これらは リソース、認可スコープ、ポリシー、および パーミッション です。
- リソース
- リソースは、リソースを許可されたアクションと一致するために使用されるリソース定義のセットです。リソースは、個別のトピックであったり、名前が同じ接頭辞で始まるすべてのトピックであったりします。リソース定義は、利用可能なスコープのセットに関連付けられます。これは、リソースで利用可能なすべてのアクションのセットを表します。多くの場合、これらのアクションのサブセットのみが実際に許可されます。
- 承認スコープ
- 承認スコープは、特定のリソース定義で利用可能なすべてのアクションのセットです。新規リソースを定義するとき、すべてのスコープのセットからスコープを追加します。
- ポリシー
ポリシーは、アカウントのリストと照合するための基準を使用する承認ルールです。ポリシーは以下と一致できます。
- クライアント ID またはロールに基づくサービスアカウント
- ユーザー名、グループ、またはロールに基づくユーザーアカウント
- パーミッション
- パーミッションは、特定のリソース定義の承認スコープのサブセットをユーザーのセットに付与します。
15.5.3.2. Red Hat Single Sign-On Authorization Services の Kafka 承認モデルへのマッピング
Kafka 承認モデルは、Kafka へのアクセスを制御する Red Hat Single Sign-On ロールおよびリソースを定義するベースとして使用されます。
ユーザーアカウントまたはサービスアカウントに Kafka パーミッションを付与するには、まず Kafka ブローカーの Red Hat Single Sign-On に OAuth クライアント仕様を作成します。次に、クライアントに Red Hat Single Sign-On の Authorization Services ルールを指定します。通常、ブローカーを表す OAuth クライアントのクライアント ID は kafka
です。Streams for Apache Kafka に付属する サンプル設定ファイル では、OAuth クライアント ID として Kafka
を使用します。
複数の Kafka クラスターがある場合は、それらすべてに単一の OAuth クライアント (kafka)
を使用できます。これにより、承認ルールを定義および管理するための単一の統合されたスペースが提供されます。ただし、異なる OAuth クライアント ID(例 my-cluster-kafka
または cluster-dev-kafka
) を使用し、各クライアント設定内の各クラスターの承認ルールを定義することもできます。
Kafka クライアント
定義では、Red Hat Single Sign-On 管理コンソールで Authorization Enabled オプションが有効になっている必要があります。
すべてのパーミッションは、kafka
クライアントのスコープ内に存在します。異なる OAuth クライアント ID で異なる Kafka クラスターを設定した場合、同じ Red Hat Single Sign-On レルムの一部であっても、それぞれに個別のパーミッションセットが必要です。
Kafka クライアントが OAUTHBEARER 認証を使用する場合、Red Hat Single Sign-On オーソライザー (KeycloakAuthorizer
) は現在のセッションのアクセストークンを使用して、Red Hat Single Sign-On サーバーからグラントのリストを取得します。許可を取得するために、オーソライザーは Red Hat Single Sign-On の Authorization Services ポリシーおよびパーミッションを評価します。
Kafka パーミッションの承認スコープ
通常、Red Hat Single Sign-On 初期設定では、承認スコープをアップロードして、各 Kafka リソースタイプで実行できるすべての可能なアクションのリストを作成します。この手順は、パーミッションを定義する前に 1 度のみ実行されます。承認スコープをアップロードする代わりに、手動で追加できます。
承認スコープには、リソースタイプに関係なく、可能なすべての Kafka パーミッションが含まれる必要があります。
-
作成
-
Write
-
読み取り
-
Delete
-
Describe
-
Alter
-
DescribeConfig
-
AlterConfig
-
ClusterAction
-
IdempotentWrite
パーミッションが必要ない場合 (例: IdempotentWrite
)、承認スコープのリストから省略できます。ただし、そのパーミッションは Kafka リソースをターゲットにすることはできません。
パーミッションチェックのリソースパターン
リソースパターンは、パーミッションチェックの実行時にターゲットリソースに対するパターンの照合に使用されます。一般的なパターン形式は RESOURCE-TYPE:PATTERN-NAME
です。
リソースタイプは Kafka 承認モデルをミラーリングします。このパターンでは、次の 2 つの一致オプションが可能です。
-
完全一致 (パターンが
*
で終了しない場合) -
接頭辞一致 (パターンが
*
で終了する)
リソースのパターン例
Topic:my-topic Topic:orders-* Group:orders-* Cluster:*
Topic:my-topic
Topic:orders-*
Group:orders-*
Cluster:*
さらに、一般的なパターンフォーマットは、kafka-cluster:CLUSTER-NAME
の前にコンマを付けることができ、CLUSTER-NAMEは Kafka カスタムリソースの metadata.name
を参照します。
クラスター接頭辞が付けられたリソースのパターン例
kafka-cluster:my-cluster,Topic:* kafka-cluster:*,Group:b_*
kafka-cluster:my-cluster,Topic:*
kafka-cluster:*,Group:b_*
kafka-cluster
の接頭辞がない場合は、kafka-cluster:*
とみなします。
リソースを定義するときに、リソースに関連する可能な承認スコープのリストを関連付けることができます。ターゲットリソースタイプに妥当なアクションを設定します。
任意の承認スコープを任意のリソースに追加できますが、リソースタイプでサポートされるスコープのみがアクセス制御の対象として考慮されます。
アクセスパーミッションを適用するポリシー
ポリシーは、1 つ以上のユーザーアカウントまたはサービスアカウントにパーミッションをターゲットにするために使用されます。以下がターゲットの対象になります。
- 特定のユーザーまたはサービスアカウント
- レルムロールまたはクライアントロール
- ユーザーグループ
- クライアント IP アドレスに一致する JavaScript ルール
ポリシーには一意の名前が割り当てられ、複数のリソースに対して複数の対象パーミッションを指定するために再使用できます。
アクセスを付与するためのパーミッション
詳細なパーミッションを使用して、ユーザーへのアクセスを付与するポリシー、リソース、および承認スコープをまとめます。
各パーミッションの名前によって、どのユーザーにどのパーミッションが付与されるかが明確に定義される必要があります。例えば、Dev Team B は x で始まるトピックから読むことができます
。
15.5.3.3. Kafka 操作に必要なパーミッションの例
以下の例は、Kafka で一般的な操作を実行するために必要なユーザーパーミッションを示しています。
トピックを作成します
トピックを作成するには、特定のトピック、または Cluster:kafka-cluster
に対して Create
パーミッションが必要です。
bin/kafka-topics.sh --create --topic my-topic \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-topics.sh --create --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
トピックのリスト表示
指定のトピックでユーザーに Describe
パーミッションがある場合には、トピックがリスト表示されます。
bin/kafka-topics.sh --list \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-topics.sh --list \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
トピックの詳細の表示
トピックの詳細を表示するには、トピックに対して Describe
および DescribeConfigs
の権限が必要です。
bin/kafka-topics.sh --describe --topic my-topic \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-topics.sh --describe --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
トピックへのメッセージの生成
トピックへのメッセージを作成するには、トピックに対する Describe
と Write
の権限が必要です。
トピックが作成されておらず、トピックの自動生成が有効になっている場合は、トピックを作成するパーミッションが必要になります。
bin/kafka-console-producer.sh --topic my-topic \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties
bin/kafka-console-producer.sh --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties
トピックからのメッセージの消費
トピックからのメッセージを消費するためには、トピックに Describe
と Read
のパーミッションが必要です。通常、トピックからの消費は、コンシューマーグループにコンシューマーオフセットを格納することに依存しており、これにはコンシューマーグループに対する追加の Describe
および Read
権限が必要です。
マッチングには 2 つの resources
が必要です。以下に例を示します。
Topic:my-topic Group:my-group-*
Topic:my-topic
Group:my-group-*
bin/kafka-console-consumer.sh --topic my-topic --group my-group-1 --from-beginning \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --consumer.config /tmp/config.properties
bin/kafka-console-consumer.sh --topic my-topic --group my-group-1 --from-beginning \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --consumer.config /tmp/config.properties
べき等プロデューサーを使用したトピックへのメッセージの生成
Cluster:kafka-cluster
リソースには、トピックをプロデュースするためのアクセス許可だけでなく、IdempotentWrite
アクセス許可が追加で必要です。
マッチングには 2 つの resources
が必要です。以下に例を示します。
Topic:my-topic Cluster:kafka-cluster
Topic:my-topic
Cluster:kafka-cluster
bin/kafka-console-producer.sh --topic my-topic \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties --producer-property enable.idempotence=true --request-required-acks -1
bin/kafka-console-producer.sh --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --producer.config=/tmp/config.properties --producer-property enable.idempotence=true --request-required-acks -1
コンシューマーグループのリスト
コンシューマーグループのリスト表示時に、ユーザーが Describe
権限を持っているグループのみが返されます。また、ユーザーが Cluster:kafka-cluster
に対して Describe
パーミッションを持っている場合は、すべてのコンシューマーグループが返されます。
bin/kafka-consumer-groups.sh --list \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-consumer-groups.sh --list \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
コンシューマーグループの詳細の表示
コンシューマーグループの詳細を表示するには、グループとグループに関連するトピックに対して Describe
権限が必要です。
bin/kafka-consumer-groups.sh --describe --group my-group-1 \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-consumer-groups.sh --describe --group my-group-1 \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
トピック設定の変更
トピックの設定を変更するには、トピックに Describe
と Alter
の権限が必要です。
bin/kafka-topics.sh --alter --topic my-topic --partitions 2 \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-topics.sh --alter --topic my-topic --partitions 2 \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
Kafka ブローカー設定の表示
kafka-configs.sh
を使用してブローカーの設定を取得するためには、Cluster:kafka-cluster
に DescribeConfigs
パーミッションが必要です。
bin/kafka-configs.sh --entity-type brokers --entity-name 0 --describe --all \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-configs.sh --entity-type brokers --entity-name 0 --describe --all \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
Kafka ブローカー設定の変更
Kafka ブローカーの設定を変更するには、Cluster:kafka-cluster
に DescribeConfigs
および AlterConfigs
パーミッションが必要です。
bin/kafka-configs --entity-type brokers --entity-name 0 --alter --add-config log.cleaner.threads=2 \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-configs --entity-type brokers --entity-name 0 --alter --add-config log.cleaner.threads=2 \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
トピックを削除します
トピックを削除するには、トピックに Describe
と Delete
の権限が必要です。
bin/kafka-topics.sh --delete --topic my-topic \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
bin/kafka-topics.sh --delete --topic my-topic \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config=/tmp/config.properties
リードパーティションの選択
トピックパーティションのリーダー選択を実行するには、Cluster:kafka-cluster
に Alter
パーミッションが必要です。
bin/kafka-leader-election.sh --topic my-topic --partition 0 --election-type PREFERRED / --bootstrap-server my-cluster-kafka-bootstrap:9092 --admin.config /tmp/config.properties
bin/kafka-leader-election.sh --topic my-topic --partition 0 --election-type PREFERRED /
--bootstrap-server my-cluster-kafka-bootstrap:9092 --admin.config /tmp/config.properties
パーティションの再割り当て
パーティション再割り当てファイルを生成するためには、関係するトピックに対して Describe
権限が必要です。
bin/kafka-reassign-partitions.sh --topics-to-move-json-file /tmp/topics-to-move.json --broker-list "0,1" --generate \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties > /tmp/partition-reassignment.json
bin/kafka-reassign-partitions.sh --topics-to-move-json-file /tmp/topics-to-move.json --broker-list "0,1" --generate \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties > /tmp/partition-reassignment.json
パーティション再割り当てを実行するには、Cluster:kafka-cluster
に対して Describe
と Alter
のパーミッションが必要です。また、関係するトピックには、Describe の
パーミッションが必要です。
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --execute \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --execute \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
パーティション再割り当てを確認するには、Cluster:kafka-cluster
および関連する各トピックに対して Describe
および AlterConfigs
のパーミッションが必要です。
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --verify \ --bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
bin/kafka-reassign-partitions.sh --reassignment-json-file /tmp/partition-reassignment.json --verify \
--bootstrap-server my-cluster-kafka-bootstrap:9092 --command-config /tmp/config.properties
15.5.4. Red Hat Single Sign-On の Authorization Services の試行
この例では、Red Hat Single Sign-On Authorization Services を keycloak
認可で使用する方法を説明します。Red Hat Single Sign-On の Authorization Services を使用して、Kafka クライアントにアクセス制限を強制します。Red Hat Single Sign-On の Authorization Services では、承認スコープ、ポリシー、およびパーミッションを使用してアクセス制御をリソースに定義および適用します。
Red Hat Single Sign-On の Authorization Services REST エンドポイントは、認証されたユーザーのリソースに付与されたパーミッションのリストを提供します。許可 (パーミッション) のリストは、Kafka クライアントによって認証されたセッションが確立された後に最初のアクションとして Red Hat Single Sign-On サーバーから取得されます。付与の変更が検出されるように、バックグラウンドでリストが更新されます。付与は、各ユーザーセッションが迅速な承認決定を提供するために、Kafka ブローカーにてローカルでキャッシュおよび適用されます。
Streams for Apache Kafka は、設定ファイルのサンプル を提供します。これには、Red Hat Single Sign-On を設定するための以下のサンプルファイルが含まれます。
kafka-ephemeral-oauth-single-keycloak-authz.yaml
-
Red Hat Single Sign-On を使用して OAuth 2.0 トークンベースの承認に設定された
Kafka
カスタムリソースの例。カスタムリソースを使用して、keycloak
認可およびトークンベースのoauth
認証を使用する Kafka クラスターをデプロイできます。 kafka-authz-realm.json
- サンプルグループ、ユーザー、ロール、およびクライアントで設定された Red Hat Single Sign-On レルムの例。レルムを Red Hat Single Sign-On インスタンスにインポートし、Kafka にアクセスするための詳細なパーミッションを設定できます。
Red Hat Single Sign-On で例を試す場合は、これらのファイルを使用して、本セクションの順序で説明したタスクを実行します。
認証
トークンベースの oauth
認証を設定する場合、jwksEndpointUri
をローカル JWT 検証の URI として指定します。keycloak
承認を設定するとき、a tokenEndpointUri
を Red Hat Single Sign-On トークンエンドポイントの URI として指定します。両方の URI のホスト名は同じである必要があります。
グループまたはロールポリシーを使用した対象パーミッション
Red Hat Single Sign-On では、サービスアカウントが有効になっている機密性の高いクライアントを、クライアント ID とシークレットを使用して、独自の名前のサーバーに対して認証できます。これは、通常、特定ユーザーのエージェント (Web サイトなど) としてではなく、独自の名前で動作するマイクロサービスに便利です。サービスアカウントには、通常のユーザーと同様にロールを割り当てることができます。ただし、グループを割り当てることはできません。そのため、サービスアカウントを使用してマイクロサービスへのパーミッションをターゲットにする場合は、グループポリシーを使用できないため、代わりにロールポリシーを使用する必要があります。逆に、ユーザー名およびパスワードを使用した認証が必要な通常のユーザーアカウントにのみ特定のパーミッションを制限する場合は、ロールポリシーではなく、グループポリシーを使用すると、副次的に実現することができます。これは、ClusterManager
で始まるパーミッションの例で使用されるものです。通常、クラスター管理の実行は CLI ツールを使用して対話的に行われます。結果的に生成されるアクセストークンを使用して Kafka ブローカーに対して認証を行う前に、ユーザーのログインを要求することは妥当です。この場合、アクセストークンはクライアントアプリケーションではなく、特定のユーザーを表します。
15.5.4.1. Red Hat Single Sign-On 管理コンソールへのアクセス
Red Hat Single Sign-On を設定してから、管理コンソールに接続し、事前設定されたレルムを追加します。kafka-authz-realm.json
ファイルのサンプルを使用して、レルムをインポートします。管理コンソールのレルムに定義された承認ルールを確認できます。このルールは、Red Hat Single Sign-On レルムの例を使用するよう設定された Kafka クラスターのリソースへのアクセスを許可します。
前提条件
- 実行中の OpenShift クラスター。
-
事前設定されたレルムを含む Streams for Apache Kafka
examples/security/keycloak-authorization/kafka-authz-realm.json
ファイル。
手順
- Red Hat Single Sign-On ドキュメントの Server Installation and Configuration の説明にしたがって、Red Hat Single Sign-On Operator を使用して Red Hat Single Sign-On サーバーをインストールします。
- Red Hat Single Sign-On インスタンスが実行されるまで待ちます。
管理コンソールにアクセスできるように外部ホスト名を取得します。
NS=sso oc get ingress keycloak -n $NS
NS=sso oc get ingress keycloak -n $NS
Copy to Clipboard Copied! この例では、Red Hat Single Sign-On サーバーが
sso
namespace で実行されていることを前提としています。admin
ユーザーのパスワードを取得します。oc get -n $NS pod keycloak-0 -o yaml | less
oc get -n $NS pod keycloak-0 -o yaml | less
Copy to Clipboard Copied! パスワードはシークレットとして保存されるため、Red Hat Single Sign-On インスタンスの設定 YAML ファイルを取得して、シークレット名 (
secretKeyRef.name
) を特定します。シークレットの名前を使用して、クリアテキストのパスワードを取得します。
SECRET_NAME=credential-keycloak oc get -n $NS secret $SECRET_NAME -o yaml | grep PASSWORD | awk '{print $2}' | base64 -D
SECRET_NAME=credential-keycloak oc get -n $NS secret $SECRET_NAME -o yaml | grep PASSWORD | awk '{print $2}' | base64 -D
Copy to Clipboard Copied! この例では、シークレットの名前が
credential-keycloak
であることを前提としています。ユーザー名
admin
と取得したパスワードを使用して、管理コンソールにログインします。https://HOSTNAME
を使用して KubernetesIngress
にアクセスします。管理コンソールを使用して、サンプルレルムを Red Hat Single Sign-On にアップロードできるようになりました。
- Add Realm をクリックして、サンプルレルムをインポートします。
examples/security/keycloak-authorization/kafka-authz-realm.json
ファイルを追加してから Create をクリックします。これで、管理コンソールの現在のレルムとして
kafka-authz
が含まれるようになりました。デフォルトビューには、Master レルムが表示されます。
Red Hat Single Sign-On 管理コンソールで Clients > kafka > Authorization > Settings の順に移動し、Decision Strategy が Affirmative に設定されていることを確認します。
肯定的な (Affirmative) ポリシーとは、クライアントが Kafka クラスターにアクセスするためには少なくとも 1 つのポリシーが満たされている必要があることを意味します。
Red Hat Single Sign-On 管理コンソールで、Groups、Users、Roles、および Clients と移動して、レルム設定を表示します。
- グループ
-
Groups
は、ユーザーグループの作成やユーザー権限の設定に使用します。グループは、名前が割り当てられたユーザーのセットです。地域、組織、または部門単位に区分するために使用されます。グループは LDAP アイデンティティープロバイダーにリンクできます。Kafka リソースにパーミッションを付与するなど、カスタム LDAP サーバー管理ユーザーインターフェイスを使用して、ユーザーをグループのメンバーにすることができます。 - ユーザー
-
Users
は、ユーザーを作成するために使用されます。この例では、alice
とbob
が定義されています。alice
はClusterManager
グループのメンバーであり、bob
はClusterManager-my-cluster
グループのメンバーです。ユーザーは LDAP アイデンティティープロバイダーに保存できます。 - ロール
-
Roles
は、ユーザーやクライアントが特定の権限を持っていることを示すものです。ロールはグループに似た概念です。通常ロールは、組織ロールでユーザーを タグ付け するために使用され、必要なパーミッションを持ちます。ロールは LDAP アイデンティティープロバイダーに保存できません。LDAP が必須である場合は、代わりにグループを使用し、Red Hat Single Sign-On ロールをグループに追加して、ユーザーにグループを割り当てるときに対応するロールも取得するようにします。 - Clients
Clients
は特定の設定を持つことができます。この例では、kafka
、kafka-cli
、team-a-client
、team-b-client
の各クライアントが設定されています。-
kafka
クライアントは、Kafka ブローカーがアクセストークンの検証に必要な OAuth 2.0 通信を行うために使用されます。このクライアントには、Kafka ブローカーで承認を実行するために使用される承認サービスリソース定義、ポリシー、および承認スコープも含まれます。認可設定はkafka
クライアントの Authorization タブで定義され、Settings タブでAuthorization Enabled をオンにすると表示されます。 -
kafka-cli
クライアントは、アクセストークンまたは更新トークンを取得するためにユーザー名とパスワードを使用して認証するときに Kafka コマンドラインツールによって使用されるパブリッククライアントです。 -
team-a-client
およびteam-b-client
クライアントは、特定の Kafka トピックに部分的にアクセスできるサービスを表す機密クライアントです。
-
Red Hat Single Sign-On 管理コンソールで、Authorization > Permissions の順に移動し、レルムに定義されたリソースおよびポリシーを使用する付与されたパーミッションを確認します。
たとえば、
kafka
クライアントには以下のパーミッションがあります。Dev Team A can write to topics that start with x_ on any cluster Dev Team B can read from topics that start with x_ on any cluster Dev Team B can update consumer group offsets that start with x_ on any cluster ClusterManager of my-cluster Group has full access to cluster config on my-cluster ClusterManager of my-cluster Group has full access to consumer groups on my-cluster ClusterManager of my-cluster Group has full access to topics on my-cluster
Dev Team A can write to topics that start with x_ on any cluster Dev Team B can read from topics that start with x_ on any cluster Dev Team B can update consumer group offsets that start with x_ on any cluster ClusterManager of my-cluster Group has full access to cluster config on my-cluster ClusterManager of my-cluster Group has full access to consumer groups on my-cluster ClusterManager of my-cluster Group has full access to topics on my-cluster
Copy to Clipboard Copied! - Dev Team A
-
Dev チーム A レルムロールは、任意のクラスターで
x_
で始まるトピックに書き込みできます。これは、Topic:x_*
というリソース、Describe
とWrite
のスコープ、そしてDev Team A
のポリシーを組み合わせたものです。Dev Team A
ポリシーは、Dev Team A
というレルムロールを持つすべてのユーザーにマッチします。 - Dev Team B
-
Dev チーム B レルムロールは、任意のクラスターで
x_
で始まるトピックから読み取ることができます。これは、Topic:x_*、
Group:x_*
のリソース、Describe
とRead
のスコープ、およびDev Team B
のポリシーを組み合わせたものです。Dev Team B
ポリシーは、Dev Team B
というレルムロールを持つすべてのユーザーにマッチします。一致するユーザーおよびクライアントはトピックから読み取りでき、名前がx_
で始まるトピックおよびコンシューマーグループの消費されたオフセットを更新できます。
15.5.4.2. Red Hat Single Sign-On 承認をでの Kafka クラスターのデプロイメント
Red Hat Single Sign-On サーバーに接続するように設定された Kafka クラスターをデプロイします。サンプルの kafka-ephemeral-oauth-single-keycloak-authz.yaml
ファイルを使用して、Kafka
カスタムリソースとして Kafka クラスターをデプロイメントします。この例では、keycloak
承認と oauth
認証を使用して単一ノードの Kafka クラスターをデプロイします。
前提条件
- Red Hat Single Sign-On 認可サーバーが OpenShift クラスターにデプロイされ、サンプルレルムでロードされている。
- Cluster Operator が OpenShift クラスターにデプロイされている。
-
Streams for Apache Kafka の
examples/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml
カスタムリソース。
手順
デプロイした Red Hat Single Sign-On インスタンスのホスト名を使用して、Kafka ブローカーのトラストストア証明書を準備し、Red Hat Single Sign-On サーバーと通信します。
SSO_HOST=SSO-HOSTNAME SSO_HOST_PORT=$SSO_HOST:443 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $SSO_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/sso.pem
SSO_HOST=SSO-HOSTNAME SSO_HOST_PORT=$SSO_HOST:443 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $SSO_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/sso.pem
Copy to Clipboard Copied! Kubernetes
Ingress は
セキュアな (HTTPS) 接続を確立するために使用されるため、証明書が必要です。通常、単一の証明書ではなく、証明書チェーンがあります。指定する必要があるのは、
/tmp/sso.pem
ファイルの最後にリストされている最上位の発行者 CA だけです。手動で抽出するか、次のコマンドを使用して抽出できます。証明書チェーンの最上位の CA 証明書を抽出するコマンドの例
split -p "-----BEGIN CERTIFICATE-----" sso.pem sso- for f in $(ls sso-*); do mv $f $f.pem; done cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt
split -p "-----BEGIN CERTIFICATE-----" sso.pem sso- for f in $(ls sso-*); do mv $f $f.pem; done cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt
Copy to Clipboard Copied! 注記信頼できる CA 証明書は通常、
openssl
コマンドを使用するのではなく、信頼できるソースから取得します。シークレットとして OpenShift に証明書をデプロイします。
oc create secret generic oauth-server-cert --from-file=/tmp/sso-ca.crt -n $NS
oc create secret generic oauth-server-cert --from-file=/tmp/sso-ca.crt -n $NS
Copy to Clipboard Copied! ホスト名を環境変数として設定します。
SSO_HOST=SSO-HOSTNAME
SSO_HOST=SSO-HOSTNAME
Copy to Clipboard Copied! サンプル Kafka クラスターを作成およびデプロイします。
cat examples/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml | sed -E 's#\${SSO_HOST}'"#$SSO_HOST#" | oc create -n $NS -f -
cat examples/security/keycloak-authorization/kafka-ephemeral-oauth-single-keycloak-authz.yaml | sed -E 's#\${SSO_HOST}'"#$SSO_HOST#" | oc create -n $NS -f -
Copy to Clipboard Copied!
15.5.4.3. CLI Kafka クライアントセッションの TLS 接続の準備
対話型 CLI セッション用の新規 Pod を作成します。TLS 接続用の Red Hat Single Sign-On 証明書を使用してトラストストアを設定します。トラストストアは、Red Hat Single Sign-On および Kafka ブローカーに接続します。
前提条件
Red Hat Single Sign-On 認可サーバーが OpenShift クラスターにデプロイされ、サンプルレルムでロードされている。
Red Hat Single Sign-On 管理コンソールで、クライアントに割り当てられたロールが Clients > Service Account Roles に表示されることを確認します。
- Red Hat Single Sign-On に接続するように設定された Kafka クラスターが OpenShift クラスターにデプロイされている。
手順
Streams for Apache Kafka イメージを使用してインタラクティブな Pod コンテナーを新たに実行し、実行中の Kafka ブローカーに接続します。
NS=sso oc run -ti --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 kafka-cli -n $NS -- /bin/sh
NS=sso oc run -ti --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 kafka-cli -n $NS -- /bin/sh
Copy to Clipboard Copied! 注記イメージのダウンロードの待機中に
oc
がタイムアウトする場合、その後の試行によって AlreadyExists エラーが発生することがあります。Pod コンテナーにアタッチします。
oc attach -ti kafka-cli -n $NS
oc attach -ti kafka-cli -n $NS
Copy to Clipboard Copied! Red Hat Single Sign-On インスタンスのホスト名を使用して、TLS を使用してクライアントコネクションの証明書を準備します。
SSO_HOST=SSO-HOSTNAME SSO_HOST_PORT=$SSO_HOST:443 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $SSO_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/sso.pem
SSO_HOST=SSO-HOSTNAME SSO_HOST_PORT=$SSO_HOST:443 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $SSO_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/sso.pem
Copy to Clipboard Copied! 通常、単一の証明書ではなく、証明書チェーンがあります。指定する必要があるのは、
/tmp/sso.pem
ファイルの最後にリストされている最上位の発行者 CA だけです。手動で抽出するか、次のコマンドを使用して抽出できます。証明書チェーンの最上位の CA 証明書を抽出するコマンドの例
split -p "-----BEGIN CERTIFICATE-----" sso.pem sso- for f in $(ls sso-*); do mv $f $f.pem; done cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt
split -p "-----BEGIN CERTIFICATE-----" sso.pem sso- for f in $(ls sso-*); do mv $f $f.pem; done cp $(ls sso-* | sort -r | head -n 1) sso-ca.crt
Copy to Clipboard Copied! 注記信頼できる CA 証明書は通常、
openssl
コマンドを使用するのではなく、信頼できるソースから取得します。Kafka ブローカーへの TLS 接続のトラストストアを作成します。
keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias sso -storepass $STOREPASS -import -file /tmp/sso-ca.crt -noprompt
keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias sso -storepass $STOREPASS -import -file /tmp/sso-ca.crt -noprompt
Copy to Clipboard Copied! Kafka ブートストラップアドレスを Kafka ブローカーのホスト名および
tls
リスナーポート (9093) のホスト名として使用し、Kafka ブローカーの証明書を準備します。KAFKA_HOST_PORT=my-cluster-kafka-bootstrap:9093 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $KAFKA_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/my-cluster-kafka.pem
KAFKA_HOST_PORT=my-cluster-kafka-bootstrap:9093 STOREPASS=storepass echo "Q" | openssl s_client -showcerts -connect $KAFKA_HOST_PORT 2>/dev/null | awk ' /BEGIN CERTIFICATE/,/END CERTIFICATE/ { print $0 } ' > /tmp/my-cluster-kafka.pem
Copy to Clipboard Copied! 取得した
.pem
ファイルは通常、1 つの証明書ではなく、証明書チェーンです。指定する必要があるのは、/tmp/my-cluster-kafka.pem
ファイルの最後にリストされている最上位の発行者 CA のみです。手動で抽出するか、次のコマンドを使用して抽出できます。証明書チェーンの最上位の CA 証明書を抽出するコマンドの例
split -p "-----BEGIN CERTIFICATE-----" /tmp/my-cluster-kafka.pem kafka- for f in $(ls kafka-*); do mv $f $f.pem; done cp $(ls kafka-* | sort -r | head -n 1) my-cluster-kafka-ca.crt
split -p "-----BEGIN CERTIFICATE-----" /tmp/my-cluster-kafka.pem kafka- for f in $(ls kafka-*); do mv $f $f.pem; done cp $(ls kafka-* | sort -r | head -n 1) my-cluster-kafka-ca.crt
Copy to Clipboard Copied! 注記信頼できる CA 証明書は通常、
openssl
コマンドを使用するのではなく、信頼できるソースから取得します。この例では、Kafka クラスターがデプロイされたのと同じ namespace の Pod でクライアントが実行されていると想定しています。クライアントが OpenShift クラスターの外部から Kafka クラスターにアクセスしている場合は、最初にブートストラップアドレスを決定する必要があります。その場合、クラスター証明書を OpenShift シークレットから直接取得することもでき、openssl
は必要ありません。詳細は、14章Kafka クラスターへのクライアントアクセスの設定 を参照してください。Kafka ブローカーの証明書をトラストストアに追加します。
keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias my-cluster-kafka -storepass $STOREPASS -import -file /tmp/my-cluster-kafka-ca.crt -noprompt
keytool -keystore /tmp/truststore.p12 -storetype pkcs12 -alias my-cluster-kafka -storepass $STOREPASS -import -file /tmp/my-cluster-kafka-ca.crt -noprompt
Copy to Clipboard Copied! 承認されたアクセスを確認するために、セッションを開いたままにします。
15.5.4.4. CLI Kafka クライアントセッションを使用した Kafka への承認されたアクセスの確認
対話型 CLI セッションを使用して、Red Hat Single Sign-On レルムを通じて適用される承認ルールを確認します。Kafka のサンプルプロデューサーおよびコンシューマークライアントを使用してチェックを適用し、異なるレベルのアクセスを持つユーザーおよびサービスアカウントでトピックを作成します。
team-a-client
クライアントおよび team-b-client
クライアントを使用して、承認ルールを確認します。alice
admin ユーザーを使用して、Kafka で追加の管理タスクを実行します。
この例で使用される Streams for Apache Kafka イメージには、Kafka プロデューサーおよびコンシューマーのバイナリーが含まれています。
前提条件
- ZooKeeper および Kafka は OpenShift クラスターで実行され、メッセージを送受信できる。
対話型 CLI Kafka クライアントセッション が開始される。
クライアントおよび管理ユーザーの設定
team-a-client
クライアントの認証プロパティーで Kafka 設定ファイルを準備します。SSO_HOST=SSO-HOSTNAME cat > /tmp/team-a-client.properties << EOF security.protocol=SASL_SSL ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.client.id="team-a-client" \ oauth.client.secret="team-a-client-secret" \ oauth.ssl.truststore.location="/tmp/truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler EOF
SSO_HOST=SSO-HOSTNAME cat > /tmp/team-a-client.properties << EOF security.protocol=SASL_SSL ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.client.id="team-a-client" \ oauth.client.secret="team-a-client-secret" \ oauth.ssl.truststore.location="/tmp/truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler EOF
Copy to Clipboard Copied! SASL OAUTHBEARER メカニズムが使用されます。このメカニズムにはクライアント ID とクライアントシークレットが必要です。これは、クライアントが最初に Red Hat Single Sign-On サーバーに接続してアクセストークンを取得することを意味します。その後、クライアントは Kafka ブローカーに接続し、アクセストークンを使用して認証します。
team-b-client
クライアントの認証プロパティーで Kafka 設定ファイルを準備します。cat > /tmp/team-b-client.properties << EOF security.protocol=SASL_SSL ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.client.id="team-b-client" \ oauth.client.secret="team-b-client-secret" \ oauth.ssl.truststore.location="/tmp/truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler EOF
cat > /tmp/team-b-client.properties << EOF security.protocol=SASL_SSL ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.client.id="team-b-client" \ oauth.client.secret="team-b-client-secret" \ oauth.ssl.truststore.location="/tmp/truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler EOF
Copy to Clipboard Copied! curl
を使用して管理者ユーザーalice
を認証し、パスワード付与認証を実行して更新トークンを取得します。USERNAME=alice PASSWORD=alice-password GRANT_RESPONSE=$(curl -X POST "https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=password&username=$USERNAME&password=$PASSWORD&client_id=kafka-cli&scope=offline_access" -s -k) REFRESH_TOKEN=$(echo $GRANT_RESPONSE | awk -F "refresh_token\":\"" '{printf $2}' | awk -F "\"" '{printf $1}')
USERNAME=alice PASSWORD=alice-password GRANT_RESPONSE=$(curl -X POST "https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" -H 'Content-Type: application/x-www-form-urlencoded' -d "grant_type=password&username=$USERNAME&password=$PASSWORD&client_id=kafka-cli&scope=offline_access" -s -k) REFRESH_TOKEN=$(echo $GRANT_RESPONSE | awk -F "refresh_token\":\"" '{printf $2}' | awk -F "\"" '{printf $1}')
Copy to Clipboard Copied! 更新トークンは、有効期間がなく、期限切れにならないオフライントークンです。
admin ユーザー
alice
の認証プロパティーで Kafka 設定ファイルを準備します。cat > /tmp/alice.properties << EOF security.protocol=SASL_SSL ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.refresh.token="$REFRESH_TOKEN" \ oauth.client.id="kafka-cli" \ oauth.ssl.truststore.location="/tmp/truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler EOF
cat > /tmp/alice.properties << EOF security.protocol=SASL_SSL ssl.truststore.location=/tmp/truststore.p12 ssl.truststore.password=$STOREPASS ssl.truststore.type=PKCS12 sasl.mechanism=OAUTHBEARER sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \ oauth.refresh.token="$REFRESH_TOKEN" \ oauth.client.id="kafka-cli" \ oauth.ssl.truststore.location="/tmp/truststore.p12" \ oauth.ssl.truststore.password="$STOREPASS" \ oauth.ssl.truststore.type="PKCS12" \ oauth.token.endpoint.uri="https://$SSO_HOST/auth/realms/kafka-authz/protocol/openid-connect/token" ; sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler EOF
Copy to Clipboard Copied! kafka-cli
パブリッククライアントは、sasl.jaas .config
のoauth.client. id
に使用されます。これはパブリッククライアントであるため、シークレットは必要ありません。クライアントは直前の手順で認証された更新トークンで認証されます。更新トークンは背後でアクセストークンを要求します。これは、認証のために Kafka ブローカーに送信されます。
承認されたアクセスでのメッセージの生成
team-a-client
の設定を使用して、a_
や x_
で始まるトピックへのメッセージを作成できるかどうかを確認します。
トピック
my-topic
に書き込みます。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic my-topic \ --producer.config=/tmp/team-a-client.properties First message
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic my-topic \ --producer.config=/tmp/team-a-client.properties First message
Copy to Clipboard Copied! 以下のリクエストは、
Not authorized to access topics: [my-topic]
エラーを返します。team-a-client
はDev Team A
ロールを持っており、a_
で始まるトピックに対してサポートされているすべてのアクションを実行する権限を与えられていますが、x_
で始まるトピックへの書き込みのみ可能です。my-topic
という名前のトピックは、これらのルールのいずれにも一致しません。トピック
a_messages
に書き込む。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-a-client.properties First message Second message
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-a-client.properties First message Second message
Copy to Clipboard Copied! メッセージは Kafka に正常に生成されます。
- CTRL+C を押して CLI アプリケーションを終了します。
リクエストについて、Kafka コンテナーログで
Authorization GRANTED
のデバッグログを確認します。oc logs my-cluster-kafka-0 -f -n $NS
oc logs my-cluster-kafka-0 -f -n $NS
Copy to Clipboard Copied!
承認されたアクセスでのメッセージの消費
team-a-client
設定を使用して、トピック a_messages
からメッセージを消費します。
トピック
a_messages
からメッセージをフェッチします。bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties
bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties
Copy to Clipboard Copied! team-a-client
のDev Team A
ロールは、名前がa_
で始まるコンシューマーグループのみにアクセスできるため、リクエストはエラーを返します。team-a-client
プロパティーを更新し、使用が許可されているカスタムコンシューマーグループを指定します。bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_1
bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_1
Copy to Clipboard Copied! コンシューマーは
a_messages
トピックからすべてのメッセージを受信します。
承認されたアクセスでの Kafka の管理
team-a-client
はクラスターレベルのアクセスのないアカウントですが、一部の管理操作と使用することができます。
トピックをリスト表示します。
bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list
bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list
Copy to Clipboard Copied! a_messages
トピックが返されます。コンシューマーグループをリスト表示します。
bin/kafka-consumer-groups.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list
bin/kafka-consumer-groups.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list
Copy to Clipboard Copied! a_consumer_group_1
コンシューマーグループが返されます。クラスター設定の詳細を取得します。
bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties \ --entity-type brokers --describe --entity-default
bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties \ --entity-type brokers --describe --entity-default
Copy to Clipboard Copied! 操作には
team-a-client
にないクラスターレベルのパーミッションが必要なため、リクエストはエラーを返します。
異なるパーミッションを持つクライアントの使用
team-b-client
設定を使用して、b_
で始まるトピックにメッセージを生成します。
トピック
a_messages
に書き込む。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-b-client.properties Message 1
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic a_messages \ --producer.config /tmp/team-b-client.properties Message 1
Copy to Clipboard Copied! 以下のリクエストは、
Not authorized to access topics: [a_messages]
エラーを返します。トピック
b_messages
に書き込む。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic b_messages \ --producer.config /tmp/team-b-client.properties Message 1 Message 2 Message 3
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic b_messages \ --producer.config /tmp/team-b-client.properties Message 1 Message 2 Message 3
Copy to Clipboard Copied! メッセージは Kafka に正常に生成されます。
トピック
x_messages
に書き込む。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 1
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 1
Copy to Clipboard Copied! Not authorized to access topics: [x_messages]
エラーが返され、team-b-client
はトピックx_messages
からのみ読み取りできます。team-a-client
を使用してトピックx_messages
に書き込みます。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1
Copy to Clipboard Copied! このリクエストは、
Not authorized to access topics: [x_messages]
エラーを返します。team-a-client
はx_messages
トピックに書き込みできますが、トピックが存在しない場合に作成するパーミッションがありません。team-a-client
がx_messages
トピックに書き込みできるようにするには、管理者 power user はパーティションやレプリカの数などの適切な設定で作成する必要があります。
承認された管理ユーザーでの Kafka の管理
管理者ユーザー alice
を使用して Kafka を管理します。alice
は、すべての Kafka クラスターのすべての管理にフルアクセスできます。
alice
としてx_messages
トピックを作成します。bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --topic x_messages --create --replication-factor 1 --partitions 1
bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --topic x_messages --create --replication-factor 1 --partitions 1
Copy to Clipboard Copied! トピックが正常に作成されました。
alice
としてすべてのトピックをリスト表示します。bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties --list bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-b-client.properties --list
bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties --list bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-a-client.properties --list bin/kafka-topics.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/team-b-client.properties --list
Copy to Clipboard Copied! 管理者ユーザーの
alice
はすべてのトピックをリスト表示できますが、team-a-client
とteam-b
-client は自分がアクセスできるトピックのみをリスト表示できます。Dev Team A
ロールとDev Team B
ロールは、どちらもx_
で始まるトピックに対するDescribe
権限を持っていますが、他のチームのトピックに対するDescribe
権限を持っていないため、他のチームのトピックを見ることができません。team-a-client
を使用して、x_messages
トピックにメッセージを生成します。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1 Message 2 Message 3
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-a-client.properties Message 1 Message 2 Message 3
Copy to Clipboard Copied! alice
がx_messages
トピックを作成すると、メッセージが正常に Kafka に生成されます。team-b-client
を使用して、x_messages
トピックにメッセージを生成します。bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 4 Message 5
bin/kafka-console-producer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --producer.config /tmp/team-b-client.properties Message 4 Message 5
Copy to Clipboard Copied! このリクエストは、
Not authorized to access topics: [x_messages]
エラーを返します。team-b-client
を使用して、x_messages
トピックからメッセージを消費します。bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-b-client.properties --group x_consumer_group_b
bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-b-client.properties --group x_consumer_group_b
Copy to Clipboard Copied! コンシューマーは、
x_messages
トピックからすべてのメッセージを受け取ります。team-a-client
を使用して、x_messages
トピックからメッセージを消費します。bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group x_consumer_group_a
bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group x_consumer_group_a
Copy to Clipboard Copied! このリクエストは、
Not authorized to access topics: [x_messages]
エラーを返します。team-a-client
を使用して、a_
で始まるコンシューマーグループからのメッセージを消費します。bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_a
bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/team-a-client.properties --group a_consumer_group_a
Copy to Clipboard Copied! このリクエストは、
Not authorized to access topics: [x_messages]
エラーを返します。Dev Team A
には、x_
で始まるトピックのRead
権限がありません。alice
を使用して、x_messages
トピックへのメッセージを生成します。bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/alice.properties
bin/kafka-console-consumer.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --topic x_messages \ --from-beginning --consumer.config /tmp/alice.properties
Copy to Clipboard Copied! メッセージは Kafka に正常に生成されます。
alice
は、すべてのトピックに対して読み取りまたは書き込みを行うことができます。alice
を使用してクラスター設定を読み取ります。bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --entity-type brokers --describe --entity-default
bin/kafka-configs.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 --command-config /tmp/alice.properties \ --entity-type brokers --describe --entity-default
Copy to Clipboard Copied! この例のクラスター設定は空です。
第16章 TLS 証明書の管理
Streams for Apache Kafka は、Kafka と Streams for Apache Kafka コンポーネント間の暗号化通信用の TLS をサポートしています。
Kafka を KRaft モードで使用する場合、Streams for Apache Kafka は、次のコンポーネント間の通信用に暗号化された TLS 接続を確立します。
- Kafka ブローカー
- Kafka コントローラー
- Kafka ブローカーとコントローラー
- Streams for Apache Kafka Operator と Kafka
- Cruise Control ブローカーと Kafka ブローカー
- Kafka Exporter ブローカーと Kafka ブローカー
クライアントと Kafka ブローカー間の接続では、TLS 暗号化通信を使用するように設定する必要があるリスナーが使用されます。Kafka
カスタムリソースでこれらのリスナーを設定し、各リスナー名とポート番号はクラスター内で一意である必要があります。Kafka ブローカーと Kafka クライアント間の通信は、tls
プロパティーがリスナーに設定される方法に応じて暗号化されます。詳細は、14章Kafka クラスターへのクライアントアクセスの設定 を参照してください。
次の図は、セキュアな通信の接続を示しています。
図16.1 TLS 暗号化によって保護された KRaft ベースの Kafka 通信

図に示されているポートは次のように使用されます。
- コントロールプレーンリスナー (9090)
- ポート 9090 の内部コントロールプレーンリスナーは、Kafka コントローラー間のブローカー間通信、およびブローカーからコントローラーへの通信を容易にします。さらに、Cluster Operator はリスナーを通じてコントローラーと通信します。このリスナーは Kafka クライアントにアクセスできません。
- レプリケーションリスナー (9091)
- ブローカー間のデータレプリケーション、および Streams for Apache Kafka Operator、Cruise Control、および Kafka Exporter からのブローカーへの内部接続では、ポート 9091 のレプリケーションリスナーが使用されます。このリスナーは Kafka クライアントにアクセスできません。
- クライアント接続のリスナー (9092 以降)
- TLS 暗号化通信 (リスナーの設定による) の場合、内部クライアントと外部クライアントは Kafka ブローカーに接続します。外部クライアント (プロデューサーとコンシューマー) は、アドバタイズされたリスナーポートを介して Kafka ブローカーに接続します。
ブローカーへのクライアントアクセス用にリスナーを設定する場合、いくつかの例外を除き、ポート 9092 以降 (9093、9094 など) を使用できます。ブローカー間通信 (9090 および 9091)、Prometheus メトリック (9404)、および JMX (Java Management Extensions) モニタリング (9999) 用に予約されているポートを使用するようにリスナーを設定できません。
クラスター管理に ZooKeeper を使用している場合、ZooKeeper と Kafka ブローカーおよび Streams for Apache Kafka Operator の間に TLS 接続が存在されます。
次の図は、ZooKeeper を使用する場合の安全な通信のための接続を示しています。
図16.2 Kafka と ZooKeeper の通信は TLS 暗号化によってセキュリティー保護されています

ZooKeeper ポートは次のように使用されます。
- ZooKeeper ポート (2181)
- Kafka ブローカーに接続するための ZooKeeper ポート。さらに、Cluster Operator はこのポートを通じて ZooKeeper と通信します。Topic Operator を双方向モードで使用している場合は、このポートを介して ZooKeeper とも通信します。
- ZooKeeper の相互通信ポート (2888)
- ZooKeeper ノード間の相互通信用の ZooKeeper ポート。
- ZooKeeper リーダー選出ポート (3888)
- ZooKeeper クラスターにある ZooKeeper ノード間のリーダー選出のための ZooKeeper ポート。
16.1. 内部クラスター CA とクライアント CA
暗号化をサポートするには、Streams for Apache Kafka の各コンポーネントに独自の秘密鍵と公開鍵証明書が必要です。すべてのコンポーネント証明書は、クラスター CA と呼ばれる内部認証局 (CA) により署名されます。
認証局 (CA) 証明書は、コンポーネントとクライアントの ID 検証に Cluster Operator によって生成されます。
同様に、mTLS を使用して Streams for Apache Kafka に接続する各 Kafka クライアントアプリケーションでは、秘密鍵と証明書を使用する必要があります。クライアント CA という第 2 の内部 CA を使用して、Kafka クライアントの証明書に署名します。
クラスター CA とクライアント CA の両方には、自己署名の公開鍵証明書があります。
Kafka ブローカーは、クラスター CA またはクライアント CA のいずれかが署名した証明書を信頼するように設定されます。クライアントによる接続が不要なコンポーネント (ZooKeeper など) のみが、クラスター CA によって署名された証明書を信頼します。外部リスナーの TLS 暗号化が無効でない限り、クライアントアプリケーションはクラスター CA により署名された証明書を必ず信頼する必要があります。これは、mTLS 認証を実行するクライアントアプリケーションにも当てはまります。
デフォルトでは、Streams for Apache Kafka は、クラスター CA またはクライアント CA によって発行された CA 証明書を自動的に生成および更新します。Kafka.spec.clusterCa
プロパティーと Kafka.spec.clientsCa
プロパティーを使用して、これらの CA 証明書の管理を設定できます。
Cluster Operator によって生成された CA を使用しない場合は 独自のクラスターおよびクライアント CA 証明書をインストールできます。Cluster Operator では、独自に指定した証明書には更新されません。
16.2. Operator によって生成されたシークレット
Cluster Operator は、自動で TLS 証明書の設定および更新を行い、クラスター内での暗号化および認証を有効にします。また、Kafka ブローカーとクライアントとの間の暗号化または mTLS 認証を有効にする場合、他の TLS 証明書も設定されます。
シークレットは、Kafka
や KafkaUser
などのカスタムリソースがデプロイされるときに作成されます。Streams for Apache Kafka はこのシークレットを使用して、Kafka クラスター、クライアント、およびユーザーの秘密鍵と公開鍵の証明書を保存します。Secrets は、Kafka ブローカー間およびブローカーとクライアント間で TLS で暗号化された接続を確立するために使用されます。これらは mTLS 認証にも使用されます。
クラスターとクライアントのシークレットは常に、公開鍵と、秘密鍵のペアとなっています。
- クラスターシークレット
- クラスターシークレットには、Kafka ブローカー証明書に署名するためのクラスター CAが含まれています。接続するクライアントは、証明書を使用して、Kafka クラスターとの TLS 暗号化接続を確立します。証明書はブローカーのアイデンティティを確認します。
- クライアントシークレット
- クライアントシークレットには、ユーザーが独自のクライアント証明書に署名するためのクライアント CAが含まれています。これにより、Kafka クラスターに対する相互認証が可能になります。ブローカーは、証明書を使用してクライアントのアイデンティティを検証します。
- ユーザーシークレット
- ユーザーシークレットには、秘密鍵と証明書が含まれています。シークレットは、新しいユーザーの作成時にクライアント CA で作成され、署名されます。キーと証明書は、クラスターへのアクセス時にユーザーの認証および承認に使用されます。
TLS 暗号化が有効になっている TLS リスナーまたは外部リスナーに Kafka リスナー証明書 を指定できます。Kafka リスナー証明書を使用して、既存のセキュリティーインフラストラクチャーを組み込みます。
16.2.1. PEM または PKCS #12 形式の鍵と証明書を使用した TLS 認証
Streams for Apache Kafka によって作成されたシークレットは、PEM (Privacy Enhanced Mail) および PKCS #12 (Public-Key Cryptography Standards) 形式の秘密鍵と証明書を提供します。PEM および PKCS #12 は、SSL プロトコルを使用した TLS 通信用に OpenSSL で生成されたキー形式です。
Kafka クラスターおよびユーザー用に生成されたシークレットに含まれる認証情報を使用する相互 TLS (mTLS) 認証を設定できます。
mTLS をセットアップするには、まず次のことを行う必要があります。
Kafka クラスターをデプロイすると、クラスターを検証するために公開鍵を使用して <cluster_name>-cluster-ca-cert
シークレットが作成されます。公開鍵を使用して、クライアントのトラストストアを設定します。
KafkaUser
を作成すると、ユーザー (クライアント) を検証するためのキーと証明書を使用して <kafka_user_name>
シークレットが作成されます。これらの資格証明を使用して、クライアントのキーストアを設定します。
mTLS を使用するように Kafka クラスターとクライアントをセットアップしたら、シークレットから認証情報を抽出し、それらをクライアント設定に追加します。
- PEM キーと証明書
PEM の場合、クライアント設定に以下を追加します。
- Truststore
-
<cluster_name>-cluster-ca-cert
シークレットからのca.crt
。これは、クラスターの CA 証明書です。
-
- キーストア
-
ユーザーの公開証明書である
<kafka_user_name>
シークレットからのuser.crt
。 -
ユーザーの秘密鍵である
<kafka_user_name>
シークレットのuser.key
。
-
ユーザーの公開証明書である
- PKCS #12 キーと証明書
PKCS #12 の場合、クライアント設定に以下を追加します。
- Truststore
-
<cluster_name>-cluster-ca-cert
シークレットからのca.p12
。これは、クラスターの CA 証明書です。 -
<cluster_name>-cluster-ca-cert
シークレットのca.password
。これは、パブリッククラスター CA 証明書にアクセスするためのパスワードです。
-
- キーストア
-
<kafka_user_name>
シークレットからのuser.p12
。これは、ユーザーの公開鍵証明書です。 -
<kafka_user_name>
シークレットのuser.password
。これは、Kafka ユーザーの公開鍵証明書にアクセスするためのパスワードです。
-
PKCS #12 は Java でサポートされているため、証明書の値を Java クライアント設定に直接追加できます。セキュアな保管場所から証明書を参照することもできます。PEM ファイルを使用する場合、証明書を単一行形式でクライアント設定に直接追加する必要があります。Kafka クラスターとクライアント間の TLS 接続の確立に適した形式を選択します。PEM に慣れていない場合は、PKCS #12 を使用してください。
すべてのキーのサイズは 2048 ビットで、デフォルトでは、最初の生成から 365 日間有効です。有効期間は変更できます。
16.2.2. Cluster Operator で生成されたシークレット
Cluster Operator は、以下の証明書を生成します。これらの証明書は、OpenShift クラスターにシークレットとして保存されます。Streams for Apache Kafka はデフォルトでこれらのシークレットを使用します。
クラスター CA とクライアント CA には、秘密鍵と公開鍵に別々のシークレットがあります。
<cluster_name>-cluster-ca
- クラスター CA の秘密鍵が含まれています。Streams for Apache Kafka および Kafka コンポーネントは、秘密鍵を使用してサーバー証明書に署名します。
<cluster_name>-cluster-ca-cert
- クラスター CA の公開鍵が含まれています。Kafka クライアントは、公開鍵を使用して、TLS サーバー認証で接続している Kafka ブローカーの ID を確認します。
<cluster_name>-clients-ca
- クライアント CA の秘密鍵が含まれています。Kafka クライアントは、秘密鍵を使用して、Kafka ブローカーに接続するときに mTLS 認証用の新しいユーザー証明書に署名します。
<cluster_name>-clients-ca-cert
- クライアント CA の公開鍵が含まれています。mTLS 認証が使用されている場合、Kafka ブローカーは公開鍵を使用して、Kafka ブローカーにアクセスするクライアントの ID を確認します。
Streams for Apache Kafka コンポーネント間の通信用のシークレットには、クラスター CA によって署名された秘密鍵と公開鍵証明書が含まれています。
<cluster_name>-kafka-brokers
- Kafka ブローカーの秘密鍵と公開鍵が含まれています。
<cluster_name>-zookeeper-nodes
- ZooKeeper ノードの秘密鍵と公開鍵が含まれています。
<cluster_name>-cluster-operator-certs
- Cluster Operator と Kafka または ZooKeeper 間の通信を暗号化するための秘密鍵と公開鍵が含まれています。
<cluster_name>-entity-topic-operator-certs
- Topic Operator と Kafka または ZooKeeper 間の通信を暗号化するための秘密鍵と公開鍵が含まれています。
<cluster_name>-entity-user-operator-certs
- ユーザー Operator と Kafka または ZooKeeper 間の通信を暗号化するための秘密鍵と公開鍵が含まれています。
<cluster_name>-cruise-control-certs
- Cruise Control と Kafka または ZooKeeper の間の通信を暗号化するための秘密鍵と公開鍵が含まれています。
<cluster_name>-kafka-exporter-certs
- Kafka Exporter と Kafka または ZooKeeper 間の通信を暗号化するための秘密鍵と公開鍵が含まれています。
独自のサーバー証明書と秘密鍵を提供 して、クラスター CA によって署名された証明書ではなく、Kafka リスナー証明書 を使用して Kafka ブローカーに接続できます。
16.2.3. クラスター CA シークレット
クラスター CA シークレットは、Kafka クラスターの Cluster Operator によって管理されます。
<cluster_name>-cluster-ca-cert
シークレットのみがクライアントに必要です。その他のすべてのクラスターシークレットは、Streams for Apache Kafka コンポーネントによってアクセスされます。これは、必要な場合に OpenShift のロールベースアクセス制御を使用して強制できます。
TLS を介した Kafka ブローカーへの接続時に Kafka ブローカー証明書を検証するため、<cluster_name>-cluster-ca-cert
の CA 証明書は Kafka クライアントアプリケーションによって信頼される必要があります。
フィールド | 説明 |
---|---|
| クラスター CA の現在の秘密鍵。 |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
| クラスター CA の現在の証明書。 |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
|
Kafka ブローカー Pod <num> の証明書。 |
|
Kafka ブローカー Pod |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
|
ZooKeeper ノード <num> の証明書。 |
|
ZooKeeper Pod |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
|
Cluster Operator と Kafka または ZooKeeper との間の mTLS 通信の証明書。 |
| Cluster Operator と Kafka または ZooKeeper との間の mTLS 通信の秘密鍵。 |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
|
Topic Operator と Kafka または ZooKeeper との間の mTLS 通信の証明書。 |
| Topic Operator と Kafka または ZooKeeper との間の mTLS 通信の秘密鍵。 |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
|
ユーザー Operator と Kafka または ZooKeeper との間の mTLS 通信の証明書。 |
| ユーザー Operator と Kafka または ZooKeeper との間の mTLS 通信の秘密鍵。 |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
|
Cruise Control と Kafka または ZooKeeper との間の mTLS 通信の証明書。 |
| Cruise Control と Kafka または ZooKeeper との間の mTLS 通信の秘密鍵。 |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
|
Kafka Exporter と Kafka または ZooKeeper との間の mTLS 通信の証明書。 |
| Kafka Exporter と Kafka または ZooKeeper との間の mTLS 通信の秘密鍵。 |
16.2.4. クライアント CA シークレット
クライアント CA シークレットは、Kafka クラスターの Cluster Operator によって管理されます。
<cluster_name>-clients-ca-cert
の証明書は、Kafka ブローカーが信頼する証明書です。
<cluster_name>-clients-ca
シークレットは、クライアントアプリケーションの証明書の署名に使用されます。このシークレットには、Streams for Apache Kafka コンポーネントからアクセスできる必要があります。User Operator を使用せずにアプリケーション証明書を発行する予定の場合は、管理アクセス権からもアクセスできる必要があります。これは、必要な場合に OpenShift のロールベースアクセス制御を使用して強制できます。
フィールド | 説明 |
---|---|
| クライアント CA の現在の秘密鍵。 |
フィールド | 説明 |
---|---|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 |
| クライアント CA の現在の証明書。 |
16.2.5. User Operator によって生成されたユーザーシークレット
ユーザーシークレットは User Operator によって管理されます。
User Operator でユーザーが作成されると、ユーザーの名前を使用してシークレットが生成されます。
Secret 名 | Secret 内のフィールド | 説明 |
---|---|---|
|
| 証明書とキーを格納するための PKCS #12 ストア。 |
| PKCS #12 ストアを保護するためのパスワード。 | |
| ユーザーの証明書、クライアント CA により署名されます。 | |
| ユーザーの秘密鍵。 |
16.2.6. ラベルおよびアノテーションのクラスター CA シークレットへの追加
Kafka
カスタムリソースで clusterCaCert
テンプレートプロパティーを設定することで、Cluster Operator によって作成された Cluster CA シークレットにカスタムラベルとアノテーションを追加できます。ラベルとアノテーションは、オブジェクトを特定し、コンテキスト情報を追加するのに便利です。テンプレートプロパティーは、Streams for Apache Kafka カスタムリソースで設定します。
ラベルおよびアノテーションを Secret に追加するテンプレートのカスタマイズ例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... template: clusterCaCert: metadata: labels: label1: value1 label2: value2 annotations: annotation1: value1 annotation2: value2 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
template:
clusterCaCert:
metadata:
labels:
label1: value1
label2: value2
annotations:
annotation1: value1
annotation2: value2
# ...
16.2.7. CA シークレットでの ownerReference
の無効化
デフォルトでは、クラスターおよびクライアント CA シークレットは、Kafka
カスタムリソースに設定される ownerReference
プロパティーで作成されます。つまり、Kafka
カスタムリソースが削除されると、OpenShift によって CA シークレットも削除 (ガベッジコレクション) されます。
新しいクラスターで CA を再利用する場合は、Kafka
設定でクラスターおよびクライアント CA シークレットの generateSecretOwnerReference
プロパティーを false
に設定して、ownerReference
を無効にすることができます。ownerReference
が無効な場合に、対応する Kafka
カスタムリソースが削除されると、OpenShift では CA シークレットは削除されません。
クラスターおよびクライアント CA の ownerReference
が無効になっている Kafka 設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka # ... spec: # ... clusterCa: generateSecretOwnerReference: false clientsCa: generateSecretOwnerReference: false # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
clusterCa:
generateSecretOwnerReference: false
clientsCa:
generateSecretOwnerReference: false
# ...
16.3. 証明書の更新および有効期間
クラスター CA およびクライアント CA の証明書は、限定された期間、すなわち有効期間に限り有効です。通常、この期間は証明書の生成からの日数として定義されます。
Cluster Operator によって自動作成される CA 証明書の場合、以下の有効期間を設定できます。
-
Kafka.spec.clusterCa.validityDays
のクラスター CA 証明書 -
Kafka.spec.clientsCa.validityDays
のクライアント CA 証明書
デフォルトの有効期間は、両方の証明書で 365 日です。手動でインストールした CA 証明書には、独自の有効期間が定義されている必要があります。
CA 証明書の期限が切れると、その証明書を信頼しているコンポーネントおよびクライアントは、その CA 秘密鍵で署名された証明書を持つ相手からの接続を受け入れません。代わりに、コンポーネントおよびクライアントは 新しい CA 証明書を信頼する必要があります。
サービスを中断せずに CA 証明書を更新できるようにするため、Cluster Operator は古い CA 証明書が期限切れになる前に証明書の更新を開始します。
Cluster Operator によって作成される証明書の更新期間を設定できます。
-
Kafka.spec.clusterCa.renewalDays
のクラスター CA 証明書 -
Kafka.spec.clientsCa.renewalDays
のクライアント CA 証明書
デフォルトの更新期間は、両方の証明書とも 30 日です。
更新期間は、現在の証明書の有効期日から逆算されます。
更新期間に対する有効期間
Not Before Not After | | |<--------------- validityDays --------------->| <--- renewalDays --->|
Not Before Not After
| |
|<--------------- validityDays --------------->|
<--- renewalDays --->|
Kafka クラスターの作成後に有効期間と更新期間の変更を行うには、Kafka
カスタムリソースの設定と適用、およびmanually renew the CA certificatesを行います。証明書を手動で更新しないと、証明書が次回自動更新される際に新しい期間が使用されます。
証明書の有効および更新期間の Kafka 設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka # ... spec: # ... clusterCa: renewalDays: 30 validityDays: 365 generateCertificateAuthority: true clientsCa: renewalDays: 30 validityDays: 365 generateCertificateAuthority: true # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
# ...
spec:
# ...
clusterCa:
renewalDays: 30
validityDays: 365
generateCertificateAuthority: true
clientsCa:
renewalDays: 30
validityDays: 365
generateCertificateAuthority: true
# ...
更新期間中の Cluster Operator の動作は、クラスター CA およびクライアント CA の generateCertificateAuthority
証明書生成プロパティーの設定によって異なります。
true
-
プロパティーが
true
に設定されている場合、CA 証明書は Cluster Operator によって自動的に生成され、更新期間内に自動的に更新されます。 false
-
プロパティーが
false
に設定されている場合、CA 証明書は Cluster Operator によって生成されません。独自の証明書をインストールする 場合は、このオプションを使用します。
16.3.1. 自動生成された CA 証明書での更新プロセス
Cluster Operator は、CA 証明書を更新する時に以下のプロセスをこの順序で実行します。
新しい CA 証明書を生成しますが、既存のキーは保持します。
該当する
Secret
内のca.crt
という名前の古い証明書が新しい証明書に置き換えられます。新しいクライアント証明書を生成します (ZooKeeper ノード、Kafka ブローカー、および Entity Operator 用)。
署名鍵は変わっておらず、CA 証明書と同期してクライアント証明書の有効期間を維持するため、これは必須ではありません。
- ZooKeeper ノードを再起動して、ZooKeeper ノードが新しい CA 証明書を信頼し、新しいクライアント証明書を使用するようにします。
- Kafka ブローカーを再起動して、Kafka ブローカーが新しい CA 証明書を信頼し、新しいクライアント証明書を使用するようにします。
Topic Operator および User Operator を再起動して、それらの Operator が新しい CA 証明書を信頼し、新しいクライアント証明書を使用するようにします。
ユーザー証明書はクライアント CA により署名されます。User Operator によって生成されるユーザー証明書は、クライアント CA の更新時に更新されます。
16.3.2. クライアント証明書の更新
Cluster Operator は、Kafka クラスターを使用するクライアントアプリケーションを認識しません。
クラスターに接続し、クライアントアプリケーションが正しく機能するように確認するには、クライアントアプリケーションは以下を行う必要があります。
- <cluster>-cluster-ca-cert Secret でパブリッシュされるクラスター CA 証明書を信頼する必要があります。
<user-name> Secret でパブリッシュされたクレデンシャルを使用してクラスターに接続します。
User Secret は PEM および PKCS #12 形式のクレデンシャルを提供し、SCRAM-SHA 認証を使用する場合はパスワードを提供できます。ユーザーの作成時に User Operator によってユーザークレデンシャルが生成されます。
証明書の更新後もクライアントが動作するようにする必要があります。更新プロセスは、クライアントの設定によって異なります。
クライアント証明書と鍵のプロビジョニングを手動で行う場合、新しいクライアント証明書を生成し、更新期間内に新しい証明書がクライアントによって使用されるようにする必要があります。更新期間の終了までにこれが行われないと、クライアントアプリケーションがクラスターに接続できなくなる可能性があります。
同じ OpenShift クラスターおよび namespace 内で実行中のワークロードの場合、Secrets はボリュームとしてマウントできるので、クライアント Pod はそれらのキーストアとトラストストアを現在の状態の Secrets から構築できます。この手順の詳細は、クラスター CA を信頼する内部クライアントの設定 を参照してください。
16.3.3. Cluster Operator が管理する CA 証明書の手動更新
Cluster Operator によって生成されるクラスターおよびクライアント CA 証明書は、各証明書の更新期間の開始時に自動更新されます。ただし、strimzi.io/force-renew
アノテーションを使用して、証明書の更新期間が始まる前に、これらの証明書の一方または両方を手動で更新することができます。セキュリティー上の理由や、証明書の更新または有効期間を変更した 場合などに、自動更新を行うことがあります。
更新された証明書は、更新前の証明書と同じ秘密鍵を使用します。
独自の CA 証明書を使用している場合は、force-renew
アノテーションは使用できません。代わりに、独自の CA 証明書を更新する 手順に従ってください。
前提条件
- Cluster Operator がデプロイされている。
- CA 証明書と秘密鍵がインストールされている Kafka クラスターが必要です。
- CA 証明書の有効期間を確認するための OpenSSL TLS 管理ツール。
この手順では、my-project
namespace 内の my-cluster
という名前の Kafka クラスターを使用します。
手順
strimzi.io/force-renew
アノテーションを、更新対象の CA 証明書が含まれる secret に適用します。クラスター CA シークレットの更新
oc annotate secret my-cluster-cluster-ca-cert -n my-project strimzi.io/force-renew="true"
oc annotate secret my-cluster-cluster-ca-cert -n my-project strimzi.io/force-renew="true"
Copy to Clipboard Copied! クライアント CA シークレットの更新
oc annotate secret my-cluster-clients-ca-cert -n my-project strimzi.io/force-renew="true"
oc annotate secret my-cluster-clients-ca-cert -n my-project strimzi.io/force-renew="true"
Copy to Clipboard Copied! 次回の調整時に、Cluster Operator は新しい証明書を生成します。
メンテナンス時間枠が設定されている場合、Cluster Operator によって、最初の調整時に次のメンテナンス時間枠内で新規 CA 証明書が生成されます。
新しい CA 証明書の有効期間を確認します。
新しいクラスター CA 証明書の有効期間の確認
oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
Copy to Clipboard Copied! 新しいクライアント CA 証明書の有効期間の確認
oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
Copy to Clipboard Copied! このコマンドは、CA 証明書の有効な開始日と終了日である
notBefore
およびnotAfter
の日付を返します。新しいクラスター CA 証明書を信頼するようにクライアント設定を更新します。
参照:
16.3.4. 期限切れの Cluster Operator 管理の CA 証明書からの手動回復
Cluster Operator は、更新期間が開始されると、クラスターとクライアントの CA 証明書を自動的に更新します。ただし、Cluster Operator のダウンタイムが長引いたり、Kafka クラスターが利用できなくなったりするなど、予期しない運用上の問題や中断により、更新プロセスが妨げられる場合があります。CA 証明書の有効期限が切れると、Kafka クラスターコンポーネントは相互に通信できなくなり、Cluster Operator は手動介入なしに CA 証明書を更新できなくなります。
リカバリーを迅速に実行するには、この手順で説明されている手順を指定された順序で実行してください。期限切れのクラスターおよびクライアント CA 証明書から回復できます。このプロセスには、Cluster Operator によって新しい証明書が生成されるように、期限切れの証明書を含むシークレットを削除することが含まれます。Streams for Apache Kafka で管理されるシークレットの詳細は、「Cluster Operator で生成されたシークレット」 を参照してください。
独自の CA 証明書を使用していて期限切れになる場合、プロセスは似ていますが、Cluster Operator によって生成された証明書を使用するのではなく、CA 証明書を更新する 必要があります。
前提条件
- Cluster Operator がデプロイされている。
- CA 証明書と秘密鍵がインストールされている Kafka クラスターが必要です。
- CA 証明書の有効期間を確認するための OpenSSL TLS 管理ツール。
この手順では、my-project
namespace 内の my-cluster
という名前の Kafka クラスターを使用します。
手順
期限切れの CA 証明書を含むシークレットを削除します。
クラスター CA シークレットの削除
oc delete secret my-cluster-cluster-ca-cert -n my-project
oc delete secret my-cluster-cluster-ca-cert -n my-project
Copy to Clipboard Copied! クライアント CA シークレットの削除
oc delete secret my-cluster-clients-ca-cert -n my-project
oc delete secret my-cluster-clients-ca-cert -n my-project
Copy to Clipboard Copied! Cluster Operator が新しい証明書を生成するまで待ちます。
-
Kafka ブローカーの ID を検証するための新しい CA クラスター証明書が、同じ名前のシークレット (
my-cluster-cluster-ca-cert
) で作成されます。 -
Kafka ユーザーの ID を検証するための新しい CA クライアント証明書が、同じ名前のシークレット (
my-cluster-clients-ca-cert
) で作成されます。
-
Kafka ブローカーの ID を検証するための新しい CA クラスター証明書が、同じ名前のシークレット (
新しい CA 証明書の有効期間を確認します。
新しいクラスター CA 証明書の有効期間の確認
oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
oc get secret my-cluster-cluster-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
Copy to Clipboard Copied! 新しいクライアント CA 証明書の有効期間の確認
oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
oc get secret my-cluster-clients-ca-cert -n my-project -o=jsonpath='{.data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
Copy to Clipboard Copied! このコマンドは、CA 証明書の有効な開始日と終了日である
notBefore
およびnotAfter
の日付を返します。CA 証明書を使用するコンポーネント Pod とシークレットを削除します。
- ZooKeeper シークレットを削除します。
- Cluster Operator が欠落している ZooKeeper シークレットを検出し、再作成するまで待ちます。
- すべての ZooKeeper Pod を削除します。
- Kafka シークレットを削除します。
- Cluster Operator が欠落している Kafka シークレットを検出して再作成するまで待ちます。
- すべての Kafka Pod を削除します。
クライアント CA 証明書のみを回復する場合は、Kafka シークレットと Pod を削除するだけで済みます。
次の
oc
コマンドを使用してリソースを検索し、それらが削除されたことを確認することもできます。oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>
Copy to Clipboard Copied! <resource_type>
を、Pod
やSecret
などのリソースのタイプに置き換えます。Cluster Operator が欠落している Kafka および ZooKeeper Pod を検出し、更新された CA 証明書を使用してそれらを再作成するまで待ちます。
調整時に、Cluster Operator は新しい CA 証明書を信頼するように他のコンポーネントを自動的に更新します。
- Cluster Operator ログに証明書の検証に関連する問題がないことを確認します。
新しいクラスター CA 証明書を信頼するようにクライアント設定を更新します。
参照:
16.3.5. Cluster Operator が管理する CA 証明書で使用される秘密鍵の置き換え
Cluster Operator によって生成されるクラスター CA およびクライアント CA 証明書によって使用される秘密鍵を置換できます。秘密鍵が交換されると、Cluster Operator によって新しい秘密鍵の新しい CA 証明書が生成されます。
独自の CA 証明書を使用している場合は、force-replace
アノテーションは使用できません。代わりに、独自の CA 証明書を更新する 手順に従ってください。
前提条件
- Cluster Operator が稼働中である。
- CA 証明書と秘密鍵がインストールされている Kafka クラスターが必要です。
手順
更新対象の秘密鍵が含まれる
Secret
にstrimzi.io/force-replace
アノテーションを適用します。表16.13 秘密鍵を置き換えるコマンド 秘密鍵 Secret annotate コマンド クラスター CA
<cluster_name>-cluster-ca
oc annotate secret <cluster_name>-cluster-ca strimzi.io/force-replace="true"
クライアント CA
<cluster_name>-clients-ca
oc annotate secret <cluster_name>-clients-ca strimzi.io/force-replace="true"
次回の調整時に、Cluster Operator は以下を生成します。
-
アノテーションを付けた
Secret
の新しい秘密鍵 - 新規 CA 証明書
メンテナンス時間枠が設定されている場合、Cluster Operator によって、最初の調整時に次のメンテナンス時間枠内で新しい秘密鍵と CA 証明書が生成されます。
Cluster Operator によって更新されたクラスターおよびクライアント CA 証明書をクライアントアプリケーションがリロードする必要があります。
16.4. クラスター CA を信頼する内部クライアントの設定
この手順では、TLS リスナーに接続する OpenShift クラスター内部に存在する Kafka クライアントがクラスター CA 証明書を信頼するように設定する方法を説明します。
これを内部クライアントで実現するには、ボリュームマウントを使用して、必要な証明書および鍵が含まれる Secrets
にアクセスするのが最も簡単な方法です。
以下の手順に従い、クラスター CA によって署名された信頼できる証明書を Java ベースの Kafka Producer、Consumer、および Streams API に設定します。
クラスター CA の証明書の形式が PKCS #12 (.p12
) または PEM (.crt
) であるかに応じて、手順を選択します。
この手順では、Kafka クラスターの ID を検証する Cluster Secret をクライアント Pod にマウントする方法を説明します。
前提条件
- Cluster Operator が稼働している必要があります。
-
OpenShift クラスター内に
Kafka
リソースが必要です。 - TLS を使用して接続し、クラスター CA 証明書を必ず信頼する Kafka クライアントアプリケーションが、OpenShift クラスター内部に必要です。
-
クライアントアプリケーションが
Kafka
リソースと同じ namespace で実行している必要があります。
PKCS #12 形式 (.p12) の使用
クライアント Pod の定義時に、Cluster Secret をボリュームとしてマウントします。
以下に例を示します。
kind: Pod apiVersion: v1 metadata: name: client-pod spec: containers: - name: client-name image: client-name volumeMounts: - name: secret-volume mountPath: /data/p12 env: - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: my-secret key: my-password volumes: - name: secret-volume secret: secretName: my-cluster-cluster-ca-cert
kind: Pod apiVersion: v1 metadata: name: client-pod spec: containers: - name: client-name image: client-name volumeMounts: - name: secret-volume mountPath: /data/p12 env: - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: my-secret key: my-password volumes: - name: secret-volume secret: secretName: my-cluster-cluster-ca-cert
Copy to Clipboard Copied! ここでは、以下をマウントしています。
- PKCS #12 ファイルを設定可能な正確なパスにマウント。
- パスワードを Java 設定に使用できる環境変数にマウント。
Kafka クライアントを以下のプロパティーで設定します。
セキュリティープロトコルのオプション:
-
security.protocol: SSL
(mTLS 認証ありまたはなしで、暗号化に TLS を使用する場合)。 -
security.protocol: SASL_SSL
(TLS 経由で SCRAM-SHA 認証を使用する場合)。
-
-
ssl.truststore.location
(証明書がインポートされたトラストストアを指定)。 -
ssl.truststore.password
(トラストストアにアクセスするためのパスワードを指定)。 -
ssl.truststore.type=PKCS12
(トラストストアのタイプを識別)。
PEM 形式の使用 (.crt)
クライアント Pod の定義時に、Cluster Secret をボリュームとしてマウントします。
以下に例を示します。
kind: Pod apiVersion: v1 metadata: name: client-pod spec: containers: - name: client-name image: client-name volumeMounts: - name: secret-volume mountPath: /data/crt volumes: - name: secret-volume secret: secretName: my-cluster-cluster-ca-cert
kind: Pod apiVersion: v1 metadata: name: client-pod spec: containers: - name: client-name image: client-name volumeMounts: - name: secret-volume mountPath: /data/crt volumes: - name: secret-volume secret: secretName: my-cluster-cluster-ca-cert
Copy to Clipboard Copied! - 抽出した証明書を使用して、X.509 形式の証明書を使用するクライアントで TLS 接続を設定します。
16.5. クラスター CA を信頼する外部クライアントの設定
この手順では、external
に接続する OpenShift クラスター外部に存在する Kafka クライアントを設定し、クラスター CA 証明書を信頼する方法を説明します。クライアントのセットアップ時および更新期間中に、古いクライアント CA 証明書を交換する場合は、以下の手順に従います。
以下の手順に従い、クラスター CA によって署名された信頼できる証明書を Java ベースの Kafka Producer、Consumer、および Streams API に設定します。
クラスター CA の証明書の形式が PKCS #12 (.p12
) または PEM (.crt
) であるかに応じて、手順を選択します。
この手順では、Kafka クラスターの ID を検証する Cluster Secret から証明書を取得する方法を説明します。
CA 証明書の更新期間中に、<cluster_name>-cluster-ca-cert
シークレットに複数の CA 証明書が含まれます。クライアントは、それらを すべて をクライアントのトラストストアに追加する必要があります。
前提条件
- Cluster Operator が稼働している必要があります。
-
OpenShift クラスター内に
Kafka
リソースが必要です。 - TLS を使用して接続し、クラスター CA 証明書を必ず信頼する Kafka クライアントアプリケーションが、OpenShift クラスター外部に必要です。
PKCS #12 形式 (.p12) の使用
Kafka クラスターの
<cluster_name>-cluster-ca-cert
シークレットからクラスター CA 証明書とパスワードを抽出します。oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12
oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12
Copy to Clipboard Copied! oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password
oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password
Copy to Clipboard Copied! <cluster_name> は、Kafka クラスターの名前に置き換えます。
Kafka クライアントを以下のプロパティーで設定します。
セキュリティープロトコルのオプション:
-
security.protocol: TLS
を使用する場合の SSL。 -
security.protocol: SASL_SSL
(TLS 経由で SCRAM-SHA 認証を使用する場合)。
-
-
ssl.truststore.location
(証明書がインポートされたトラストストアを指定)。 -
ssl.truststore.password
(トラストストアにアクセスするためのパスワードを指定)。このプロパティーは、トラストストアで必要なければ省略できます。 -
ssl.truststore.type=PKCS12
(トラストストアのタイプを識別)。
PEM 形式の使用 (.crt)
Kafka クラスターの
<cluster_name>-cluster-ca-cert
シークレットからクラスター CA 証明書を抽出します。oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
Copy to Clipboard Copied! - 抽出した証明書を使用して、X.509 形式の証明書を使用するクライアントで TLS 接続を設定します。
16.6. 独自の CA 証明書と秘密鍵を使用する
Cluster Operator によって生成されたデフォルトを使用する代わりに、独自の CA 証明書と秘密鍵をインストールして使用します。クラスターとクライアントの CA 証明書および秘密鍵を置き換えることができます。
次の方法で、独自の CA 証明書と秘密鍵を使用するように切り替えることができます。
- Kafka クラスターをデプロイする前に、独自の CA 証明書と秘密鍵をインストールします。
- Kafka クラスターをデプロイした後、デフォルトの CA 証明書と秘密鍵を独自のものに置き換えます。
Kafka クラスターをデプロイした後にデフォルトの CA 証明書と秘密鍵を置き換える手順は、独自の CA 証明書と秘密鍵を更新するために使用する手順と同じです。
独自の証明書を使用する場合、証明書は自動的に更新されません。有効期限が切れる前に、CA 証明書と秘密鍵を更新する必要があります。
更新オプション:
- CA 証明書のみを更新する
- CA 証明書と秘密鍵を更新する (またはデフォルトを置き換える)
16.6.1. 独自の CA 証明書と秘密鍵のインストール
Cluster Operator によって生成されたクラスターおよびクライアントの CA 証明書と秘密鍵を使用する代わりに、独自の CA 証明書と秘密鍵をインストールします。
デフォルトでは、Streams for Apache Kafka は次の クラスター CA とクライアント CA シークレット を使用します。これらは自動的に更新されます。
クラスター CA シークレット
-
<cluster_name>-cluster-ca
-
<cluster_name>-cluster-ca-cert
-
クライアント CA シークレット
-
<cluster_name>-clients-ca
-
<cluster_name>-clients-ca-cert
-
独自の証明書をインストールするには、同じ名前を使用します。
前提条件
- Cluster Operator が稼働中である。
Kafka クラスターがデプロイされていない必要があります。
すでに Kafka クラスターをデプロイしている場合は、デフォルトの CA 証明書を独自の証明書に置き換える ことができます。
クラスター CA またはクライアントの、PEM 形式による独自の X.509 証明書および鍵が必要です。
ルート CA ではないクラスターまたはクライアント CA を使用する場合、証明書ファイルにチェーン全体を含める必要があります。チェーンの順序は以下のとおりです。
- クラスターまたはクライアント CA
- 1 つ以上の中間 CA
- ルート CA
- チェーン内のすべての CA は、X509v3 基本制約拡張を使用して設定する必要があります。Basic Constraints は、証明書チェーンのパスの長さを制限します。
- 証明書を変換するための OpenSSL TLS 管理ツール。
作業を開始する前に
Cluster Operator は、キーと証明書を PEM (Privacy Enhanced Mail) および PKCS #12 (Public-Key Cryptography Standards) 形式で生成します。どちらの形式でも独自の証明書を追加できます。
一部のアプリケーションは PEM 証明書を使用できず、PKCS #12 証明書のみに対応します。PKCS #12 形式のクラスター証明書がない場合は、OpenSSL TLS 管理ツールを使用して ca.crt
ファイルからこれを生成します。
証明書生成コマンドの例
openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt
openssl pkcs12 -export -in ca.crt -nokeys -out ca.p12 -password pass:<P12_password> -caname ca.crt
<P12_password> を独自のパスワードに置き換えます。
手順
CA 証明書を含む新しいシークレットを作成します。
PEM 形式の証明書を使用したクライアントシークレットの作成
oc create secret generic <cluster_name>-clients-ca-cert --from-file=ca.crt=ca.crt
oc create secret generic <cluster_name>-clients-ca-cert --from-file=ca.crt=ca.crt
Copy to Clipboard Copied! PEM および PKCS #12 形式の証明書を使用したクラスターシークレットの作成
oc create secret generic <cluster_name>-cluster-ca-cert \ --from-file=ca.crt=ca.crt \ --from-file=ca.p12=ca.p12 \ --from-literal=ca.password=P12-PASSWORD
oc create secret generic <cluster_name>-cluster-ca-cert \ --from-file=ca.crt=ca.crt \ --from-file=ca.p12=ca.p12 \ --from-literal=ca.password=P12-PASSWORD
Copy to Clipboard Copied! <cluster_name> は、独自の Kafka クラスターの名前に置き換えます。
秘密鍵を含む新しいシークレットを作成します。
oc create secret generic <ca_key_secret> --from-file=ca.key=ca.key
oc create secret generic <ca_key_secret> --from-file=ca.key=ca.key
Copy to Clipboard Copied! シークレットにラベルを付けます。
oc label secret <ca_certificate_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"
oc label secret <ca_certificate_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"
Copy to Clipboard Copied! oc label secret <ca_key_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"
oc label secret <ca_key_secret> strimzi.io/kind=Kafka strimzi.io/cluster="<cluster_name>"
Copy to Clipboard Copied! -
ラベル
strimzi.io/kind=Kafka
は Kafka カスタムリソースを識別します。 -
ラベル
strimzi.io/cluster="<cluster_name>"
は Kafka クラスターを識別します。
-
ラベル
シークレットにアノテーションを付けます。
oc annotate secret <ca_certificate_secret> strimzi.io/ca-cert-generation="<ca_certificate_generation>"
oc annotate secret <ca_certificate_secret> strimzi.io/ca-cert-generation="<ca_certificate_generation>"
Copy to Clipboard Copied! oc annotate secret <ca_key_secret> strimzi.io/ca-key-generation="<ca_key_generation>"
oc annotate secret <ca_key_secret> strimzi.io/ca-key-generation="<ca_key_generation>"
Copy to Clipboard Copied! -
アノテーション
strimzi.io/ca-cert-generation="<ca_certificate_generation>"
は、新しい CA 証明書の生成を定義します。 アノテーション
strimzi.io/ca-key-generation="<ca_key_generation>"
は、新しい CA キーの生成を定義します。独自の CA 証明書の増分値 (
strimzi.io/ca-cert-generation=0
) として 0 (ゼロ) から開始します。証明書を更新するときは、値を 1 つ増やして設定します。
-
アノテーション
クラスターの
Kafka
リソースを作成し、生成された CA を 使用しない ようにKafka.spec.clusterCa
またはKafka.spec.clientsCa
オブジェクトを設定します。独自指定の証明書を使用するようにクラスター CA を設定する
Kafka
リソースの例 (抜粋)kind: Kafka version: kafka.strimzi.io/v1beta2 spec: # ... clusterCa: generateCertificateAuthority: false
kind: Kafka version: kafka.strimzi.io/v1beta2 spec: # ... clusterCa: generateCertificateAuthority: false
Copy to Clipboard Copied!
16.6.2. 独自の CA 証明書の更新
独自の CA 証明書を使用している場合は、手動で更新する必要があります。Cluster Operator はそれらを自動的に更新しません。有効期限が切れる前に、更新期間内に CA 証明書を更新します。
CA 証明書を更新し、同じ秘密鍵を続行する場合は、この手順のステップを実行します。独自の CA 証明書 および 秘密鍵を更新する場合は、「CA 証明書と秘密鍵を独自のものに更新または置換する」 を参照してください。
この手順では、PEM 形式の CA 証明書の更新を説明します。
前提条件
- Cluster Operator が稼働中である。
- クラスターまたはクライアントの PEM 形式による新しい X.509 証明書が必要です。
手順
CA 証明書の
Secret
を更新します。既存のシークレットを編集して新規 CA 証明書を追加し、証明書生成アノテーション値を更新します。
oc edit secret <ca_certificate_secret_name>
oc edit secret <ca_certificate_secret_name>
Copy to Clipboard Copied! <ca_certificate_secret_name>は
Secret
の名前で、クラスター CA 証明書の場合は<kafka_cluster_name>-cluster-ca-cert
であり、クライアント CA 証明書の場合は<kafka_cluster_name>-clients-ca-cert
となります。以下の例は、
my-cluster
という名前の Kafka クラスターに関連付けられたクラスター CA 証明書のシークレットを示しています。クラスター CA 証明書のシークレット設定例
apiVersion: v1 kind: Secret data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... metadata: annotations: strimzi.io/ca-cert-generation: "0" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
apiVersion: v1 kind: Secret data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F...
1 metadata: annotations: strimzi.io/ca-cert-generation: "0"
2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
Copy to Clipboard Copied! 新規 CA 証明書を base64 にエンコードします。
cat <path_to_new_certificate> | base64
cat <path_to_new_certificate> | base64
Copy to Clipboard Copied! CA 証明書を更新します。
前の手順の base64 でエンコードされた CA 証明書を、
data
のca.crt
プロパティーの値としてコピーします。CA 証明書生成アノテーションの値を増やします。
strimzi.io/ca-cert-generation
アノテーションの値を 1 つ増分して更新します。たとえば、strimzi.io/ca-cert-generation=0
をstrimzi.io/ca-cert-generation=1
に変更します。Secret
にアノテーションがない場合、値は0
として扱われるため、1
を指定してアノテーションを追加します。Streams for Apache Kafka が証明書を生成すると、証明書生成アノテーションが Cluster Operator によって自動的に増分されます。独自の CA 証明書の場合は、より高い増分値でアノテーションを設定します。Cluster Operator が Pod をロールアウトし、証明書を更新できるように、アノテーションには現在のシークレットよりも高い値を指定する必要があります。
strimzi.io/ca-cert-generation
は、各 CA 証明書の更新で値を 1 増やす必要があります。新しい CA 証明書と証明書生成のアノテーション値でシークレットを保存します。
新しい CA 証明書で更新されるシークレット設定の例
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... metadata: annotations: strimzi.io/ca-cert-generation: "1" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F...
1 metadata: annotations: strimzi.io/ca-cert-generation: "1"
2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
Copy to Clipboard Copied!
次の調整時に、Cluster Operator は ZooKeeper、Kafka、およびその他のコンポーネントのローリング更新を実行して、新しい CA 証明書を信頼します。
メンテナンス時間枠が設定されている場合には、Cluster Operator は次のメンテナンス時間枠内で最初の調整時に Pod をローリングします。
16.6.3. CA 証明書と秘密鍵を独自のものに更新または置換する
独自の CA 証明書と秘密鍵を使用している場合は、手動で更新する必要があります。Cluster Operator はそれらを自動的に更新しません。有効期限が切れる前に、更新期間内に CA 証明書を更新します。同じ手順を使用して、Streams for Apache Kafka Operator によって生成された CA 証明書と秘密鍵を独自のものに置き換えることもできます。
CA 証明書と秘密鍵を更新または置換する場合は、この手順のステップを実行してください。独自の CA 証明書のみを更新する場合は、「独自の CA 証明書の更新」 を参照してください。
この手順では、PEM 形式の CA 証明書と秘密鍵の更新について説明します。
以下の手順を実行する前に、新規 CA 証明書の CN(コモンネーム) が現在の CA 証明書とは異なることを確認してください。たとえば、Cluster Operator が証明書を更新する場合には、バージョンの識別に v<version_number> 接尾辞を追加します。更新ごとに別の接尾辞を追加して、独自の CA 証明書で同じ作業を行います。別のキーを使用して新しい CA 証明書を生成して、シークレット
に保存されている現在の CA 証明書を保持します。
前提条件
- Cluster Operator が稼働中である。
- クラスターまたはクライアントの PEM 形式による新しい X.509 証明書と鍵が必要です。
手順
Kafka
カスタムリソースの調整を一時停止します。OpenShift でカスタムリソースにアノテーションを付け、
pause-reconciliation
アノテーションをtrue
に設定します。oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="true"
oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="true"
Copy to Clipboard Copied! たとえば、
my-cluster
という名前のKafka
カスタムリソースの場合:oc annotate Kafka my-cluster strimzi.io/pause-reconciliation="true"
oc annotate Kafka my-cluster strimzi.io/pause-reconciliation="true"
Copy to Clipboard Copied! カスタムリソースの status 条件で、
ReconciliationPaused
への変更が表示されることを確認し ます。oc describe Kafka <name_of_custom_resource>
oc describe Kafka <name_of_custom_resource>
Copy to Clipboard Copied! type
条件は、lastTransitionTime
でReconciliationPaused
に変わります。
Kafka
カスタムリソースのgenerateCertificateAuthority
プロパティーの設定を確認します。プロパティーが
false
に設定されている場合、CA 証明書は Cluster Operator によって生成されません。独自の証明書を使用している場合は、この設定が必要です。必要に応じて、既存の
Kafka
カスタムリソースを編集し、generateCertificateAuthority
プロパティーをfalse
に設定します。oc edit Kafka <name_of_custom_resource>
oc edit Kafka <name_of_custom_resource>
Copy to Clipboard Copied! 次の例は、クラスターとクライアントの両方の CA 証明書の生成がユーザーに委譲された
Kafka
カスタムリソースを示しています。独自の CA 証明書を使用した
Kafka
設定の例apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka # ... spec: # ... clusterCa: generateCertificateAuthority: false clientsCa: generateCertificateAuthority: false # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka # ... spec: # ... clusterCa: generateCertificateAuthority: false
1 clientsCa: generateCertificateAuthority: false
2 # ...
Copy to Clipboard Copied! CA 証明書の
Secret
を更新します。既存のシークレットを編集して新規 CA 証明書を追加し、証明書生成アノテーション値を更新します。
oc edit secret <ca_certificate_secret_name>
oc edit secret <ca_certificate_secret_name>
Copy to Clipboard Copied! <ca_certificate_secret_name> は
Secret
の名前で、クラスター CA 証明書の場合は<kafka_cluster_name>-cluster-ca-cert
、クライアント CA 証明書の場合は<kafka_cluster_name>-clients-ca-cert
となります。以下の例は、
my-cluster
という名前の Kafka クラスターに関連付けられたクラスター CA 証明書のシークレットを示しています。クラスター CA 証明書のシークレット設定例
apiVersion: v1 kind: Secret data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... metadata: annotations: strimzi.io/ca-cert-generation: "0" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
apiVersion: v1 kind: Secret data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F...
1 metadata: annotations: strimzi.io/ca-cert-generation: "0"
2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
Copy to Clipboard Copied! 保持する現在の CA 証明書の名前を変更します。
data
の配下にある現在のca.crt
プロパティー名をca-<date>.crt
に変更します。<date> は、証明書の有効期限を YEAR-MONTH-DAYTHOUR-MINUTE-SECONDZ の形式で指定します。たとえば、ca-2023-01-26T17-32-00Z.crt:
。現在の CA 証明書を保持するため、プロパティーの値を残します。新規 CA 証明書を base64 にエンコードします。
cat <path_to_new_certificate> | base64
cat <path_to_new_certificate> | base64
Copy to Clipboard Copied! CA 証明書を更新します。
data
の下に新しいca.crt
プロパティーを作成し、上の手順から base64 でエンコードされた CA 証明書をca.crt
プロパティーの値としてコピーします。CA 証明書生成アノテーションの値を増やします。
strimzi.io/ca-cert-generation
アノテーションの値を 1 つ増分して更新します。たとえば、strimzi.io/ca-cert-generation=0
をstrimzi.io/ca-cert-generation=1
に変更します。Secret
にアノテーションがない場合、値は0
として扱われるため、1
を指定してアノテーションを追加します。Streams for Apache Kafka が証明書を生成すると、証明書生成アノテーションが Cluster Operator によって自動的に増分されます。独自の CA 証明書の場合は、より高い増分値でアノテーションを設定します。Cluster Operator が Pod をロールアウトし、証明書を更新できるように、アノテーションには現在のシークレットよりも高い値を指定する必要があります。
strimzi.io/ca-cert-generation
は、各 CA 証明書の更新で値を 1 増やす必要があります。新しい CA 証明書と証明書生成のアノテーション値でシークレットを保存します。
新しい CA 証明書で更新されるシークレット設定の例
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... ca-2023-01-26T17-32-00Z.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F... metadata: annotations: strimzi.io/ca-cert-generation: "1" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F...
1 ca-2023-01-26T17-32-00Z.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0F...
2 metadata: annotations: strimzi.io/ca-cert-generation: "1"
3 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
Copy to Clipboard Copied!
新しい CA 証明書の署名に使用する CA キーの
Secret
を更新します。既存のシークレットを編集して新規 CA キーを追加し、キー生成アノテーション値を更新します。
oc edit secret <ca_key_name>
oc edit secret <ca_key_name>
Copy to Clipboard Copied! <ca_key_name> は CA キーの名前です。これは、クラスター CA キーの場合は
<kafka_cluster_name>-cluster-ca
、クライアント CA キーの場合は<kafka_cluster_name>-clients-ca
です。以下の例は、
my-cluster
という名前の Kafka クラスターに関連付けられたクラスター CA キーのシークレットを示しています。クラスター CA キーのシークレット設定例
apiVersion: v1 kind: Secret data: ca.key: SA1cKF1GFDzOIiPOIUQBHDNFGDFS... metadata: annotations: strimzi.io/ca-key-generation: "0" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca #... type: Opaque
apiVersion: v1 kind: Secret data: ca.key: SA1cKF1GFDzOIiPOIUQBHDNFGDFS...
1 metadata: annotations: strimzi.io/ca-key-generation: "0"
2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca #... type: Opaque
Copy to Clipboard Copied! CA キーを base64 にエンコードします。
cat <path_to_new_key> | base64
cat <path_to_new_key> | base64
Copy to Clipboard Copied! CA キーを更新します。
前の手順の base64 でエンコードされた CA キーを
data
にあるca.key
プロパティーの値としてコピーします。CA キー生成アノテーションの値を増やします。
strimzi.io/ca-key-generation
アノテーションの値を 1 つ増分して更新します。たとえば、strimzi.io/ca-key-generation=0
をstrimzi.io/ca-key-generation=1
に変更します。Secret
にアノテーションがない場合は0
として扱われるため、1
の値を指定してアノテーションを追加します。Streams for Apache Kafka が証明書を生成すると、鍵生成アノテーションが Cluster Operator によって自動的に増分されます。独自の CA 証明書と新しい CA キーの場合は、より高い増分値でアノテーションを設定します。Cluster Operator が Pod をロールアウトし、証明書およびキーを更新できるように、アノテーションには現在のシークレットよりも高い値が必要です。
strimzi.io/ca-key-generation
は、CA 証明書の更新ごとにインクリメントする必要があります。新しい CA キーおよびキー生成アノテーション値でシークレットを保存します。
新規 CA キーで更新されるシークレット設定の例
apiVersion: v1 kind: Secret data: ca.key: AB0cKF1GFDzOIiPOIUQWERZJQ0F... metadata: annotations: strimzi.io/ca-key-generation: "1" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca #... type: Opaque
apiVersion: v1 kind: Secret data: ca.key: AB0cKF1GFDzOIiPOIUQWERZJQ0F...
1 metadata: annotations: strimzi.io/ca-key-generation: "1"
2 labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca #... type: Opaque
Copy to Clipboard Copied!
一時停止から再開します。
Kafka
カスタムリソースの調整を再開するには、pause-reconciliation
アノテーションをfalse
に設定します。oc annotate --overwrite Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="false"
oc annotate --overwrite Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation="false"
Copy to Clipboard Copied! pause-reconciliation
アノテーションを削除してもこれを実行できます。oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation-
oc annotate Kafka <name_of_custom_resource> strimzi.io/pause-reconciliation-
Copy to Clipboard Copied! 次の調整時に、Cluster Operator は ZooKeeper、Kafka、およびその他のコンポーネントのローリング更新を実行して、新しい CA 証明書を信頼します。ローリング更新が完了すると、Cluster Operator は新しい CA キーで署名された新しいサーバー証明書を生成するために新しい証明書を起動します。
メンテナンス時間枠が設定されている場合には、Cluster Operator は次のメンテナンス時間枠内で最初の調整時に Pod をローリングします。
- 新しい CA 証明書に移行するためのローリング更新が完了するまで待ちます。
古い証明書をシークレット設定から削除して、クラスターがそれらを信頼しないようにします。
oc edit secret <ca_certificate_secret_name>
oc edit secret <ca_certificate_secret_name>
Copy to Clipboard Copied! 古い証明書を削除したシークレット設定の例
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... metadata: annotations: strimzi.io/ca-cert-generation: "1" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
apiVersion: v1 kind: Secret data: ca.crt: GCa6LS3RTHeKFiFDGBOUDYFAZ0F... metadata: annotations: strimzi.io/ca-cert-generation: "1" labels: strimzi.io/cluster: my-cluster strimzi.io/kind: Kafka name: my-cluster-cluster-ca-cert #... type: Opaque
Copy to Clipboard Copied! クラスターの手動ローリング更新を開始して、シークレット設定に加えられた変更を取得します。
第17章 Streams for Apache Kafka Pod およびコンテナーへのセキュリティーコンテキストの適用
セキュリティーコンテキストは、Pod とコンテナーの制約を定義します。セキュリティーコンテキストを指定すると、Pod およびコンテナーに必要なパーミッションのみが設定されます。たとえば、パーミッションはランタイム操作やリソースへのアクセスを制御できます。
17.1. OpenShift プラットフォームによるセキュリティーコンテキストの処理
セキュリティーコンテキストの処理は、使用している OpenShift プラットフォームのツールによって異なります。
たとえば、OpenShift はビルトイン SCC (Security Context Constraints)を使用してパーミッションを制御します。SCC は、Pod がアクセスできるセキュリティー機能を制御する設定およびストラテジーです。
デフォルトでは、OpenShift はセキュリティーコンテキスト設定を自動的に注入します。ほとんどの場合、Cluster Operator によって作成される Pod およびコンテナーのセキュリティーコンテキストを設定する必要はありません。ただし、引き続き独自の SCC を作成して管理することはできます。
詳細は、Openshift ドキュメント を参照してください。
第18章 ブローカーの追加または削除によるクラスターのスケーリング
ブローカーを追加して Kafka クラスターをスケーリングすると、クラスターのパフォーマンスと信頼性が向上します。ブローカーを追加すると、利用可能なリソースが増加し、クラスターがより大きなワークロードを処理し、より多くのメッセージを処理できるようになります。また、より多くのレプリカとバックアップを提供することでフォールトトレランスを向上させることもできます。逆に、十分に活用されていないブローカーを削除すると、リソースの消費が削減され、効率が向上します。中断やデータ損失を避けるために、スケーリングは慎重に行う必要があります。クラスター内のすべてのブローカーにパーティションを再分散することにより、各ブローカーのリソース使用率が削減され、クラスターの全体的なスループットが向上します。
Kafka トピックのスループットを向上させるには、そのトピックのパーティションの数を増やすことができます。これにより、トピックの負荷をクラスター内の異なるブローカー間で共有できるようになります。ただし、すべてのブローカーが特定のリソース (I/O など) によって制約されている場合、パーティションを追加してもスループットは向上しません。この場合、クラスターにブローカーをさらに追加する必要があります。
Kafka.spec.kafka.replicas
設定を調整すると、レプリカとして機能するクラスター内のブローカーの数に影響します。トピックの実際のレプリケーション係数は、default.replication.factor
および min.insync.replicas
の設定、および使用可能なブローカーの数によって決まります。たとえば、レプリケーション係数 3 は、トピックの各パーティションが 3 つのブローカー間でレプリケーションされ、ブローカーに障害が発生した場合のフォールトトレランスを確保することを意味します。
レプリカ設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 # ... config: # ... default.replication.factor: 3 min.insync.replicas: 2 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
replicas: 3
# ...
config:
# ...
default.replication.factor: 3
min.insync.replicas: 2
# ...
Kafka
リソース設定を通じてブローカーを追加する場合、ノード ID は 0 (ゼロ) から始まり、Cluster Operator は次に小さい ID を新しいノードに割り当てます。ブローカーの削除プロセスは、クラスター内で最も高い ID を持つブローカー Pod から開始されます。
ノードプールを使用してクラスター内のノードを管理している場合は、KafkaNodePool.spec.replicas
設定を調整して、ノードプール内のノードの数を変更します。さらに、ノードプールを使用して既存のクラスターをスケーリングする場合は、スケーリング操作用のノード ID を割り当てる ことができます。
ブローカーを追加または削除しても、Kafka はパーティションを自動的に再割り当てしません。これを行う最良の方法は、Cruise Control を使用することです。クラスターをスケールアップまたはスケールダウンするときに、Cruise Control の add-brokers
モードと remove-brokers
モードを使用できます。
-
Kafka クラスターをスケールアップした後、
add-brokers
モードを使用して、パーティションレプリカを既存のブローカーから新しく追加したブローカーに移動します。 -
Kafka クラスターをスケールダウンする前に、
remove-brokers
モードを使用して、削除されるブローカーからパーティションレプリカを移動します。
18.1. スケールダウン操作でのチェックのスキップ
デフォルトでは、Streams for Apache Kafka は、Kafka クラスターでスケールダウン操作を開始する前に、ブローカー上にパーティションレプリカが存在しないことをチェックします。このチェックは、broker 専用ロール、または broker と controller の二重のロールを実行するノードプール内のノードに適用されます。
レプリカが見つかった場合、データ損失の可能性を防ぐためにスケールダウンは行われません。クラスターをスケールダウンするには、ブローカーを再度スケールダウンする前に、ブローカー上にレプリカを残さないようにする必要があります。
ただし、このメカニズムをバイパスすることが必要な場合もあります。たとえば、新しいトピックがブローカーのレプリカを生成し続けるため、ビジー状態のクラスターではチェックを無効にする必要がある場合があります。この状況では、ブローカーがほぼ空の場合でも、スケールダウンが無期限にブロックされる可能性があります。この方法でブロックメカニズムをオーバーライドすると、影響が生じます。スケールダウンされているブローカー上にトピックが存在すると、Kafka クラスターの調整エラーが発生する可能性があります。
Kafka クラスターの Kafka
リソースにアノテーションを付けると、ブロックメカニズムを回避できます。strimzi.io/skip-broker-scaledown-check
アノテーションを true
に設定して、リソースにアノテーションを付けます。
スケールダウン操作のチェックをスキップするためのアノテーションの追加
oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check="true"
oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check="true"
このアノテーションは、Streams for Apache Kafka にスケールダウンチェックをスキップするように指示します。my-kafka-cluster
は、特定の Kafka
リソースの名前に置き換えます。
スケールダウン操作のチェックを復元するには、アノテーションを削除します。
スケールダウン操作のチェックをスキップするためのアノテーションの削除
oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check-
oc annotate Kafka my-kafka-cluster strimzi.io/skip-broker-scaledown-check-
第19章 Cruise Control を使用したクラスターのリバランス
Cruise Control は、次の Kafka 操作をサポートするオープンソースシステムです。
- クラスターワークロードのモニタリング
- 定義済みの制約に基づくクラスターのリバランス
この操作は、ブローカー Pod をより効率的に使用する、よりバランスの取れた Kafka クラスターを実行するのに役立ちます。
通常、クラスターの負荷は時間とともに不均等になります。大量のメッセージトラフィックを処理するパーティションは、使用可能なブローカー全体で均等に分散されない可能性があります。クラスターを再分散するには、管理者はブローカーの負荷を監視し、トラフィックの多いパーティションを容量に余裕のあるブローカーに手作業で再割り当てします。
Cruise Control はクラスターのリバランス処理を自動化します。CPU、ディスク、およびネットワーク負荷を基にして、クラスターにおけるリソース使用のワークロードモデルを構築し、パーティションの割り当てをより均等にする、最適化プロポーザル (承認または拒否可能) を生成します。これらのプロポーザルの算出には、設定可能な最適化ゴールが複数使用されます。
特定のモードで最適化の提案を生成できます。デフォルトの full
モードでは、すべてのブローカー間でパーティションがリバランスされます。add-brokers
および remove-brokers
モードを使用して、クラスターをスケールアップまたはスケールダウンするときの変更に対応することもできます。
最適化プロポーザルを承認すると、Cruise Control はそのプロポーザルを Kafka クラスターに適用します。KafkaRebalance
リソースを使用して、最適化の提案を設定および生成します。最適化の提案が自動または手動で承認されるように、アノテーションを使用してリソースを設定できます。
Streams for Apache Kafka には、Cruise Control のサンプル設定ファイル があります。
19.1. Cruise Control のコンポーネントと機能
Cruise Control は、Load Monitor、Analyzer、Anomaly Detector、Executor の 4 つの主要コンポーネントと、クライアントとの対話用の REST API で構成されています。Streams for Apache Kafka は、REST API を使用して次の Cruise Control 機能をサポートします。
- 最適化ゴールから最適化プロポーザルを生成します。
- 最適化プロポーザルを基にして Kafka クラスターのリバランスを行います。
- 最適化ゴール
最適化ゴールは、リバランスから達成する特定のゴールを表します。たとえば、トピックのレプリカをブローカー間でより均等に分散することがゴールになる場合があります。設定から追加するゴールを変更できます。ゴールは、ハードゴールまたはソフトゴールとして定義されます。Cruise Control 展開設定を使用してハード目標を追加できます。また、これらの各カテゴリーに適合するメイン、デフォルト、およびユーザー提供の目標もあります。
- ハードゴール は事前設定されており、最適化プロポーザルが正常に実行されるには満たされる必要があります。
- 最適化プロポーザルが正常に実行されるには、ソフトゴール を満たす必要はありません。これは、すべてのハードゴールが一致することを意味します。
- メインゴール は Cruise Control から継承されます。ハードゴールとして事前設定されているものもあります。メインゴールは、デフォルトで最適化プロポーザルで使用されます。
- デフォルトのゴール は、デフォルトでメインゴールと同じです。デフォルトゴールのセットを指定できます。
- ユーザー提供のゴール は、特定の最適化プロポーザルを生成するために設定されるデフォルトゴールのサブセットです。
- 最適化プロポーザル
最適化プロポーザルは、リバランスから達成するゴールで構成されます。最適化プロポーザルを生成して、提案された変更の概要と、リバランス可能な結果を作成します。ゴールは特定の優先順位で評価されます。その後、プロポーザルの承認または拒否を選択できます。プロポーザルを拒否し、調整したゴールセットを使用して再度実行できます。
3 つのモードのいずれかで最適化プロポーザルを生成できます。
-
full
はデフォルトのモードで、完全なリバランスを実行します。 -
add-brokers
は、Kafka クラスターをスケールアップするときにブローカーを追加した後に使用するモードです。 -
remove-brokers
は、Kafka クラスターを縮小するときにブローカーを削除する前に使用するモードです。
-
自己修復、通知、独自ゴールの作成、トピックレプリケーション係数の変更など、その他の Cruise Control の機能は現在サポートされていません。
19.2. 最適化ゴールの概要
最適化ゴールは、Kafka クラスター全体のワークロード再分散およびリソース使用の制約です。Cruise Control は Kafka クラスターをリバランスするために、最適化ゴールを使用して、承認または拒否可能な 最適化プロポーザル を生成します。
19.2.1. 優先度によるゴールの順序
Streams for Apache Kafka は、Cruise Control プロジェクトで開発された最適化ゴールのほとんどをサポートしています。以下に、サポートされるゴールをデフォルトの優先度順に示します。
- ラックアウェアネス (Rack Awareness)
- 一連のトピックに対するブローカーごとのリーダーレプリカの最小数
- レプリカの容量
容量ゴール
- ディスク容量
- ネットワークのインバウンド容量
- ネットワークアウトバウンド容量
- CPU 容量
- レプリカの分散
- 潜在的なネットワーク出力
リソース配分ゴール
- ディスク使用率の分散
- ネットワークインバウンド使用率の分散
- ネットワークアウトバウンド使用率の分散
- CPU 使用率の分散
- リーダーへの単位時間あたりバイト流入量の分布
- トピックレプリカの分散
- リーダーレプリカの分散
- 優先リーダーエレクション
- ブローカー内のディスク容量
- ブローカー内のディスク使用量の分散
各最適化ゴールの詳細は、Cruise Control Wiki の Goals を参照してください。
独自のゴールの記述および Kafka アサイナーゴールはまだサポートされていません。
19.2.2. Streams for Apache Kafka カスタムリソースでのゴールの設定
Kafka
および KafkaRebalance
カスタムリソースで最適化ゴールを設定します。Cruise Control には、満たなければならない厳しい最適化ゴールのほか、メイン、デフォルト、およびユーザーが指定した最適化ゴールの設定があります。
最適化ゴールは、以下の設定で指定できます。
-
Main goals —
Kafka.spec.cruiseControl.config.goals
-
Hard goals —
Kafka.spec.cruiseControl.config.hard.goals
-
Default goals —
Kafka.spec.cruiseControl.config.default.goals
-
ユーザー提供のゴール —
KafkaRebalance.spec.goals
リソース配分ゴールは、ブローカーリソースの 容量制限 の影響を受けます。
19.2.3. ハードおよびソフト最適化ゴール
ハードゴールは最適化プロポーザルで 必ず 満たさなければならないゴールです。Cruise Control コードで ハードゴール として定義されていないゴールは、ソフトゴール と呼ばれます。ソフトゴールは ベストエフォート 型のゴールと解釈できます。最適化プロポーザルで満たす必要はありませんが、最適化の計算に含まれます。すべてのハードゴールを満たし、1 つ以上のソフトゴールに違反する最適化プロポーザルは有効です。
Cruise Control は、すべてのハードゴールを満たし、優先度順にできるだけ多くのソフトゴールを満たす最適化プロポーザルを算出します。すべてのハードゴールを満たさない最適化プロポーザルは Cruise Control によって拒否され、ユーザーには送信されません。
たとえば、クラスター全体でトピックのレプリカを均等に分散するソフトゴールがあるとします (トピックレプリカ分散のゴール)。このソフトゴールを無視すると、設定されたハードゴールがすべて有効になる場合、Cruise Control はこのソフトゴールを無視します。
Cruise Control では、以下の メイン最適化ゴール がハードゴールです。
RackAwareGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal
RackAwareGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal
Cruise Control デプロイメント設定では、Kafka.spec.cruiseControl.config
の hard.goals
プロパティーを使用して、強制的に適用するハードゴールを指定できます。
-
すべてのハードゴールを強制的に実行するには、
hard.goals
プロパティーを省略します。 -
Cruise Control が強制的に適用するハードゴールを変更するには、完全修飾ドメイン名を使用して、
hard.goals
プロパティーで必要なゴールを指定します。 -
特定のハードゴールの実行を防ぐには、そのゴールが
default.goals
リスト設定にもhard.goals
リスト設定にも含まれていないことを確認してください。
どのゴールをソフトゴールとみなし、どのゴールをハードゴールとみなすかを設定することはできません。この区別は、Cruise Control コードで決定されます。
ハード最適化ゴールの Kafka
設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: topicOperator: {} userOperator: {} cruiseControl: brokerCapacity: inboundNetwork: 10000KB/s outboundNetwork: 10000KB/s config: # Note that `default.goals` (superset) must also include all `hard.goals` (subset) default.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal hard.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
topicOperator: {}
userOperator: {}
cruiseControl:
brokerCapacity:
inboundNetwork: 10000KB/s
outboundNetwork: 10000KB/s
config:
# Note that `default.goals` (superset) must also include all `hard.goals` (subset)
default.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal
hard.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal
# ...
ハードゴールの数を増やすと、Cruise Control が有効な最適化プロポーザルを生成する可能性が低くなります。
skipHardGoalCheck: true
が KafkaRebalance
カスタムリソースに指定された場合、Cruise Control はユーザー提供の最適化ゴールのリスト (KafkaRebalance.spec.goals
内) に設定済みのハードゴール (hard.goals
) がすべて含まれていることをチェックしません。そのため、すべてではなく一部のユーザー提供の最適化ゴールが hard.goals
リストにある場合、skipHardGoalCheck: true
が指定されていてもハードゴールとして処理されます。
19.2.4. メイン最適化ゴール
メイン最適化ゴールはすべてのユーザーが使用できます。メイン最適化ゴールにリストされていないゴールは、Cruise Control 操作で使用できません。
Cruise Control の デプロイメント設定 を変更しない限り、Streams for Apache Kafka は、次のメイン最適化ゴールを優先度順 (降順) に Cruise Control から継承します。
RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal
RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal
これらの目標の一部は、ハードゴール として事前設定されています。
複雑さを軽減するため、1 つ以上のゴールを KafkaRebalance
リソースでの使用から完全に 除外する必要がある場合を除き、継承される主な最適化ゴールを使用することが推奨されます。必要な場合、メイン最適化ゴールの優先順位は デフォルトの最適化ゴール の設定で変更できます。
Cruise Control のデプロイメント設定で、必要に応じてメインの最適化ゴールを設定します ( Kafka.spec.cruiseControl.config.goals
)。
-
継承された主な最適化ゴールを許可する場合は、
goals
プロパティーをKafka.spec.cruiseControl.config
に指定しないでください。 -
継承した主な最適化ゴールを変更する必要がある場合は、
goals
設定オプションで、優先順位の高い順に目標のリストを指定します。
最適化提案を生成する際のエラーを回避するには、Kafka.spec.cruiseControl.config
の goals
または default.goals
に加えた変更には、hard.goals
プロパティーに指定されたすべてのハードゴールが含まれていることを確認してください。明確にするために、主要な最適化ゴールとデフォルトの目標に対して、ハードゴールも (サブセットとして) 指定する必要があります。
19.2.5. デフォルトの最適化ゴール
Cruise Conrol はデフォルトの最適化ゴール を使用して キャッシュされた最適化プロポーザル を生成します。キャッシュされた最適化プロポーザルの詳細は、「最適化プロポーザルの概要」 を参照してください。
ユーザー提供の最適化ゴール を KafkaRebalance
カスタムリソースに設定すると、デフォルトの最適化ゴールを上書きできます。
Cruise Control のデプロイメント設定で default.goals
を指定しない限り、メインの最適化ゴールがデフォルトの最適化ゴールとして使用されます。この場合、メイン最適化ゴールを使用して、キャッシュされた最適化プロポーザルが生成されます。
-
主な最適化ゴールをデフォルトの目標として使用するには、
Kafka.spec.cruiseControl.config
にdefault.goals
プロパティーを指定しないでください。 -
デフォルトの最適化ゴールを編集するには、
Kafka.spec.cruiseControl.config
のdefault.goals
プロパティーを編集します。メイン最適化ゴールのサブセットを使用する必要があります。
デフォルト最適化ゴールの Kafka
設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: topicOperator: {} userOperator: {} cruiseControl: brokerCapacity: inboundNetwork: 10000KB/s outboundNetwork: 10000KB/s config: # Note that `default.goals` (superset) must also include all `hard.goals` (subset) default.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal hard.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
zookeeper:
# ...
entityOperator:
topicOperator: {}
userOperator: {}
cruiseControl:
brokerCapacity:
inboundNetwork: 10000KB/s
outboundNetwork: 10000KB/s
config:
# Note that `default.goals` (superset) must also include all `hard.goals` (subset)
default.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal,
com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal
hard.goals: >
com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal
# ...
デフォルトの最適化ゴールの指定がない場合、メイン最適化ゴールを使用して、キャッシュされたプロポーザルが生成されます。
19.2.6. ユーザー提供の最適化ゴール
ユーザー提供の最適化ゴール は、特定の最適化プロポーザルの設定済みのデフォルトゴールを絞り込みます。必要に応じて、KafkaRebalance
のカスタムリソースの spec.goals
で設定することができます。
KafkaRebalance.spec.goals
KafkaRebalance.spec.goals
ユーザー提供の最適化ゴールは、さまざまな状況の最適化プロポーザルを生成できます。たとえば、ディスクの容量やディスクの使用率を考慮せずに、Kafka クラスター全体でリーダーレプリカの分布を最適化したい場合があります。この場合、リーダーレプリカ分布の単一のユーザー提供のゴールが含まれる KafkaRebalance
カスタムリソースを作成します。
ユーザー提供の最適化ゴールには以下が必要になります。
- 設定済みの ハードゴール がすべて含まれるようにする必要があります。そうしないと、エラーが発生します。
- メイン最適化ゴールのサブセットである必要があります。
最適化プロポーザルの生成時に設定済みのハードゴールを無視するには、skipHardGoalCheck: true
プロパティーを KafkaRebalance
カスタムリソースに追加します。「最適化プロポーザルの生成」 を参照してください。
19.3. 最適化プロポーザルの概要
KafkaRebalance
リソースを設定して、最適化の提案を生成し、提案された変更を適用します。最適化プロポーザル は、パーティションのワークロードをブローカー間でより均等に分散することで、Kafka クラスターの負荷をより均等にするために提案された変更の概要です
各最適化プロポーザルは、それを生成するために使用された 最適化ゴール のセットに基づいており、ブローカーリソースに設定された 容量制限 が適用されます。
すべての最適化プロポーザルは、提案されたリバランスの影響の 見積もり です。提案は、承認または却下できます。最初に最適化プロポーザルを生成しなければに、クラスターのリバランスは承認できません。
次のリバランスモードのいずれかで最適化の提案を実行できます。
-
full
-
add-brokers
-
remove-brokers
19.3.1. リバランスモード
KafkaRebalance
カスタムリソースの spec.mode
プロパティーを使用して、リバランスモードを指定します。
full
-
full
モードでは、クラスター内のすべてのブローカー間でレプリカを移動することにより、完全なリバランスが実行されます。これは、KafkaRebalance
カスタムリソースでspec.mode
プロパティーが定義されていない場合のデフォルトモードです。 add-brokers
-
add-brokers
モードは、1 つ以上のブローカーを追加して Kafka クラスターをスケールアップした後に使用されます。通常、Kafka クラスターをスケールアップした後、新しいブローカーは、新しく作成されたトピックのパーティションのみをホストするために使用されます。新しいトピックが作成されないと、新たに追加されたブローカーは使用されず、既存のブローカーは同じ負荷のままになります。クラスターにブローカーを追加した直後にadd-brokers
モードを使用すると、リバランス操作によってレプリカが既存のブローカーから新しく追加されたブローカーに移動します。KafkaRebalance
カスタムリソースのspec.brokers
プロパティーを使用して、新しいブローカーをリストとして指定します。 remove-brokers
-
remove-brokers
モードは、1 つ以上のブローカーを削除して Kafka クラスターをスケールダウンする前に使用されます。Kafka クラスターをスケールダウンすると、レプリカをホストする場合でもブローカーはシャットダウンされます。これにより、レプリケートが不十分なパーティションとなる可能性があり、一部のパーティションが最小 In-Sync レプリカ (ISR) を下回る可能性があります。この潜在的な問題を回避するために、remove-brokers
モードは、削除されるブローカーからレプリカを移動します。これらのブローカーがレプリカをホストしなくなった場合は、スケールダウン操作を安全に実行できます。KafkaRebalance
カスタムリソースのspec.brokers
プロパティーで、削除するブローカーをリストとして指定します。
一般に、full
リバランスモードを使用して、ブローカー間で負荷を分散することにより Kafka クラスターをリバランスします。add-brokers
および remove-brokers
モードは、クラスターをスケールアップまたはスケールダウンし、それに応じてレプリカを再調整する場合にのみ使用してください。
リバランスを実行する手順は、実際には 3 つの異なるモードで同じです。唯一の違いは、spec.mode
プロパティーを介してモードを指定することと、必要に応じて、spec.brokers
プロパティーを介して追加または削除されるブローカーを一覧表示することです。
19.3.2. 最適化提案の結果
最適化の提案が生成されると、概要とブローカーの負荷が返されます。
- 概要
-
要約は
KafkaRebalance
リソースに含まれています。サマリーは、提案されたクラスターリバランスの概要を提供し、関係する変更の規模を示します。正常に生成された最適化プロポーザルの要約は、KafkaRebalance
リソースのStatus.OptimizationResult
プロパティーに含まれています。提供される情報は完全な最適化プロポーザルの概要になります。 - ブローカーの負荷
- ブローカーの負荷は、データが JSON 文字列として含まれる ConfigMap に保存されます。ブローカーの負荷は提案されたリバランスの前と後の値を表示するため、クラスターの各ブローカーへの影響を確認できます。
19.3.3. 最適化プロポーザルの手動承認または拒否
最適化プロポーザルのサマリーは、提案された変更の範囲を示しています。
KafkaRebalance
リソースの名前を使用して、コマンドラインから要約を返すことができます。
最適化プロポーザルの要約を返す方法
oc describe kafkarebalance <kafka_rebalance_resource_name> -n <namespace>
oc describe kafkarebalance <kafka_rebalance_resource_name> -n <namespace>
jq
コマンドライン JSON パーサーツール を使用することもできます。
jq を使用して最適化プロポーザルの要約を返す方法
oc get kafkarebalance -o json | jq <jq_query>.
oc get kafkarebalance -o json | jq <jq_query>.
サマリーを使用して、最適化プロポーザルを承認するか拒否するかを決定します。
- 最適化プロポーザルの承認
-
最適化プロポーザルを承認するには、
KafkaRebalance
リソースのstrimzi.io/rebalance
アノテーションをapprove
するように設定します。Cruise Control は、プロポーザルを Kafka クラスターに適用し、クラスターのリバランス操作を開始します。 - 最適化プロポーザルの拒否
-
最適化プロポーザルを承認しないことを選択した場合は、最適化ゴールの変更 または 任意のリバランスパフォーマンスチューニングオプションの更新 を行い、その後で別のプロポーザルを生成できます。
strimzi.io/rebalance
アノテーションをrefresh
に設定することで、KafkaRebalance
リソースの新しい最適化提案を生成できます。
最適化プロポーザルを使用して、リバランスに必要な動作を評価します。たとえば、要約ではブローカー間およびブローカー内の動きについて記述します。ブローカー間のリバランスは、別々のブローカー間でデータを移動します。JBOD ストレージ設定を使用していると、ブローカー内のリバランスでは同じブローカー上のディスク間でデータが移動します。このような情報は、プロポーザルを承認しない場合でも有用な場合があります。
リバランスの際には Kafka クラスターに追加の負荷がかかるため、最適化プロポーザルを却下したり、承認を遅らせたりする場合があります。
次の例では、プロポーザルは別々のブローカー間のデータのリバランスを提案しています。リバランスには、ブローカー間での 55 個のパーティションレプリカ (合計 12 MB のデータ) の移動が含まれます。パーティションレプリカのブローカー間の移動は、パフォーマンスに大きな影響を与えますが、データ総量はそれほど多くありません。合計データが膨大な場合は、プロポーザルを却下するか、リバランスを承認するタイミングを考慮して Kafka クラスターのパフォーマンスへの影響を制限できます。
リバランスパフォーマンスチューニングオプションは、データ移動の影響を減らすのに有用です。リバランス期間を延長できる場合は、リバランスをより小さなバッチに分割できます。一回のデータ移動が少なくなると、クラスターの負荷も軽減できます。
最適化プロポーザルサマリーの例
Name: my-rebalance Namespace: myproject Labels: strimzi.io/cluster=my-cluster Annotations: API Version: kafka.strimzi.io/v1alpha1 Kind: KafkaRebalance Metadata: # ... Status: Conditions: Last Transition Time: 2022-04-05T14:36:11.900Z Status: ProposalReady Type: State Observed Generation: 1 Optimization Result: Data To Move MB: 0 Excluded Brokers For Leadership: Excluded Brokers For Replica Move: Excluded Topics: Intra Broker Data To Move MB: 12 Monitored Partitions Percentage: 100 Num Intra Broker Replica Movements: 0 Num Leader Movements: 24 Num Replica Movements: 55 On Demand Balancedness Score After: 82.91290759174306 On Demand Balancedness Score Before: 78.01176356230222 Recent Windows: 5 Session Id: a4f833bd-2055-4213-bfdd-ad21f95bf184
Name: my-rebalance
Namespace: myproject
Labels: strimzi.io/cluster=my-cluster
Annotations: API Version: kafka.strimzi.io/v1alpha1
Kind: KafkaRebalance
Metadata:
# ...
Status:
Conditions:
Last Transition Time: 2022-04-05T14:36:11.900Z
Status: ProposalReady
Type: State
Observed Generation: 1
Optimization Result:
Data To Move MB: 0
Excluded Brokers For Leadership:
Excluded Brokers For Replica Move:
Excluded Topics:
Intra Broker Data To Move MB: 12
Monitored Partitions Percentage: 100
Num Intra Broker Replica Movements: 0
Num Leader Movements: 24
Num Replica Movements: 55
On Demand Balancedness Score After: 82.91290759174306
On Demand Balancedness Score Before: 78.01176356230222
Recent Windows: 5
Session Id: a4f833bd-2055-4213-bfdd-ad21f95bf184
このプロポーザルでは、24 のパーティションリーダーも別のブローカーに移動します。これには、パフォーマンスへの影響が少ない ZooKeeper の設定を変更する必要があります。
バランススコアは、最適化プロポーザルが承認される前後の Kafka クラスターの全体的なバランスの測定値です。バランススコアは、最適化ゴールに基づいています。すべてのゴールが満たされていると、スコアは 100 になります。達成されないゴールごとにスコアが減少します。バランススコアを比較して、Kafka クラスターのバランスがリバランス後よりも悪いかどうかを確認します。
19.3.4. 最適化プロポーザルの自動承認
時間を節約するために、最適化プロポーザルの承認プロセスを自動化できます。自動化により、最適化の提案を生成すると、クラスターのリバランスに直接進みます。
最適化プロポーザルの自動承認メカニズムを有効にするには、strimzi.io/rebalance-auto-approval
アノテーションを true
に設定して KafkaRebalance
リソースを作成します。アノテーションが設定されていないか、false
に設定されている場合、最適化プロポーザルには手動承認が必要です。
自動承認メカニズムが有効になっているリバランス要求の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster annotations: strimzi.io/rebalance-auto-approval: "true" spec: mode: # any mode # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaRebalance
metadata:
name: my-rebalance
labels:
strimzi.io/cluster: my-cluster
annotations:
strimzi.io/rebalance-auto-approval: "true"
spec:
mode: # any mode
# ...
最適化の提案を自動的に承認する場合でも、ステータスを確認できます。リバランスが完了すると、KafkaRebalance
リソースのステータスは Ready
に移動します。
19.3.5. 最適化プロポーザルサマリーのプロパティー
以下の表は、最適化プロポーザルのサマリーセクションに含まれるプロパティーについて説明しています。
JSON プロパティー | 説明 |
---|---|
| ディスクとクラスターのブローカーとの間で転送されるパーティションレプリカの合計数。
リバランス操作中のパフォーマンスへの影響度: 比較的高いが、 |
| サポートされていません。空のリストが返されます。 |
| 個別のブローカー間で移動されるパーティションレプリカの数。 リバランス操作中のパフォーマンスへの影響度: 比較的高い。 |
| 最適化プロポーザルの生成前および生成後における、Kafka クラスターの全体的な 分散度 (balancedness) の値。
スコアは、違反した各ソフトゴールの
|
|
同じブローカーのディスク間で移動される各パーティションレプリカのサイズの合計 (
リバランス操作中のパフォーマンスへの影響度: 場合による。値が大きいほど、クラスターのリバランスの完了にかかる時間が長くなります。大量のデータを移動する場合、同じブローカーのディスク間で移動する方が個別のブローカー間で移動するよりも影響度が低くなります ( |
| 最適化プロポーザルの基になるメトリックウインドウの数。 |
|
個別のブローカーに移動される各パーティションレプリカのサイズの合計 ( リバランス操作中のパフォーマンスへの影響度: 場合による。値が大きいほど、クラスターのリバランスの完了にかかる時間が長くなります。 |
|
最適化プロポーザルの対象となる Kafka クラスターのパーティションの割合 (パーセント)。 |
|
|
| リーダーが別のレプリカに切り替えられるパーティションの数。ZooKeeper 設定の変更を伴います。 リバランス操作中のパフォーマンスへの影響度: 比較的低い。 |
| サポートされていません。空のリストが返されます。 |
19.3.6. ブローカーのロードプロパティー
ブローカーの負荷は、JSON 形式の文字列として ConfigMap (KafkaRebalance カスタムリソースと同じ名前) に保存されます。この JSON 文字列は、各ブローカーのいくつかのメトリックにリンクする各ブローカー ID のキーを持つ JSON オブジェクトで設定されます。各メトリックは 3 つの値で設定されます。1 つ目は、最適化プロポーザルの適用前のメトリックの値です。2 つ目はプロポーザルの適用後に期待される値、3 つ目は、最初の 2 つの値の差 (後の値から前の値を引いた) です。
ConfigMap は、KafkaRebalance リソースが ProposalReady
状態にあると表示され、リバランスが完了すると残ります。
ConfigMap の名前を使用して、コマンドラインからデータを表示できます。
ConfigMap データを返す方法
oc describe configmaps <my_rebalance_configmap_name> -n <namespace>
oc describe configmaps <my_rebalance_configmap_name> -n <namespace>
jq
コマンドライン JSON パーサーツール を使用して、ConfigMap から JSON 文字列を抽出することもできます。
jq を使用した ConfigMap からの JSON 文字列の抽出
oc get configmaps <my_rebalance_configmap_name> -o json | jq '.["data"]["brokerLoad.json"]|fromjson|.'
oc get configmaps <my_rebalance_configmap_name> -o json | jq '.["data"]["brokerLoad.json"]|fromjson|.'
以下の表は、最適化プロポーザルのブローカー負荷 ConfigMap に含まれるプロパティーについて説明しています。
JSON プロパティー | 説明 |
---|---|
| パーティションリーダーであるこのブローカーのレプリカ数。 |
| このブローカーのレプリカ数。 |
| 定義された容量の割合をパーセントで表す CPU 使用率。 |
| 定義された容量の割合をパーセントで表す ディスク 使用率。 |
| 絶対ディスク使用量 (MB 単位) |
| ブローカーのネットワーク出力レートの合計。 |
| このブローカーのすべてのパーティションリーダーレプリカに対するネットワーク入力レート。 |
| このブローカーのすべてのフォロワーレプリカに対するネットワーク入力レート。 |
| このブローカーが現在ホストしているレプリカすべてのリーダーであった場合に実現される、仮定上の最大ネットワーク出力レート。 |
19.3.7. キャッシュされた最適化プロポーザル
Cruise Control は、設定済みのデフォルト最適化ゴールを基にして キャッシュされた最適化プロポーザル を維持します。キャッシュされた最適化プロポーザルはワークロードモデルから生成され、Kafka クラスターの現在の状況を反映するために 15 分ごとに更新されます。デフォルトの最適化ゴールを使用して最適化プロポーザルを生成する場合、Cruise Control は最新のキャッシュされたプロポーザルを返します。
キャッシュされた最適化プロポーザルの更新間隔を変更するには、Cruise Control デプロイメント設定の proposal.expiration.ms
設定を編集します。更新間隔を短くすると、Cruise Control サーバーの負荷が増えますが、変更が頻繁に行われるクラスターでは、更新間隔を短くするよう考慮してください。
19.4. リバランスパフォーマンスチューニングの概要
クラスターリバランスのパフォーマンスチューニングオプションを調整できます。このオプションは、リバランスのパーティションレプリカおよびリーダーシップの移動が行われる方法を制御し、また、リバランス操作に割り当てられた帯域幅も制御します。
19.4.1. パーティション再割り当てコマンド
最適化プロポーザル は、個別のパーティション再割り当てコマンドで設定されています。プロポーザルを 承認 すると、Cruise Control サーバーはこれらのコマンドを Kafka クラスターに適用します。
パーティション再割り当てコマンドは、以下のいずれかの操作で設定されます。
パーティションの移動: パーティションレプリカとそのデータを新しい場所に転送します。パーティションの移動は、以下の 2 つの形式のいずれかになります。
- ブローカー間の移動: パーティションレプリカを、別のブローカーのログディレクトリーに移動します。
- ブローカー内の移動: パーティションレプリカを、同じブローカーの異なるログディレクトリーに移動します。
- リーダーシップの移動: パーティションのレプリカのリーダーを切り替えます。
Cruise Control によって、パーティション再割り当てコマンドがバッチで Kafka クラスターに発行されます。リバランス中のクラスターのパフォーマンスは、各バッチに含まれる各タイプの移動数に影響されます。
19.4.2. レプリカの移動ストラテジー
クラスターリバランスのパフォーマンスは、パーティション再割り当てコマンドのバッチに適用される レプリカ移動ストラテジー の影響も受けます。デフォルトでは、Cruise Control は BaseReplicaMovementStrategy
を使用します。これは、生成された順序でコマンドを適用します。ただし、プロポーザルの初期に非常に大きなパーティションの再割り当てを行うと、このストラテジーではその他の再割り当ての適用が遅くなる可能性があります。
Cruise Control は、最適化プロポーザルに適用できる代替のレプリカ移動ストラテジーを 4 つ提供します。
-
PrioritizeSmallReplicaMovementStrategy
: サイズの昇順で再割り当てを並べ替えます。 -
PrioritizeLargeReplicaMovementStrategy
: サイズの降順で再割り当ての順序。 -
PostponeUrpReplicaMovementStrategy
: 非同期レプリカがないパーティションのレプリカの再割り当てを優先します。 -
PrioritizeMinIsrWithOfflineReplicasStrategy
: オフラインレプリカを持つ (At/Under) MinISR パーティションで再割り当てを優先します。この戦略は、Kafka
カスタムリソースの仕様でcruiseControl.config.concurrency.adjuster.min.isr.check.enabled
がtrue
に設定されている場合にのみ機能します。
これらのストラテジーをシーケンスとして設定できます。最初のストラテジーは、内部ロジックを使用して 2 つのパーティション再割り当ての比較を試みます。再割り当てが同等である場合は、順番を決定するために再割り当てをシーケンスの次のストラテジーに渡します。
19.4.3. ブローカー内のディスクバランシング
大量のデータを移動する場合、同じブローカーのディスク間で移動する方が個別のブローカー間で移動するよりも影響度が低くなります。Kafka デプロイメントで、同じブローカーにディスクが複数割り当てられた JBOD ストレージを使用している場合には、Cruise Control はディスク間でパーティションを分散できます。
1 つのディスクで JBOD ストレージを使用している場合は、分散するディスクがないため、ブローカー内でディスク分散すると、パーティションの移動が 0 と提案されます。
ブローカー内のディスク分散を実行するには、KafkaRebalance.spec
の下で rebalanceDisk
を true
に設定します。rebalanceDisk
を true
に設定する場合は、Cruise Control はブローカー内のゴールを自動的に設定し、ブローカー間のゴールを無視するため、KafkaRebalance.spec
の goals
フィールドを設定しないでください。Cruise Control はブローカー間およびブローカー内の分散を同時に実行しません。
19.4.4. リバランスチューニングオプション
Cruise Control には、上記のリバランスパラメーターを調整する設定オプションが複数あります。これらのチューニングオプションは、Kafka または 最適化提案 レベル で Cruise Control を設定および展開する ときに設定できます。
-
Cruise Control のサーバー設定は、Kafka カスタムリソースの下の
Kafka.spec.cruiseControl.config
で設定できます。 -
個々のリバランスのパフォーマンス設定は、
KafkaRebalance.spec
で設定できます。
関連する設定を以下の表にまとめています。
Cruise Control プロパティー | KafkaRebalance プロパティー | デフォルト | 説明 |
---|---|---|---|
|
| 5 | 各パーティション再割り当てバッチにおけるブローカー間パーティション移動の最大数。 |
|
| 2 | 各パーティション再割り当てバッチにおけるブローカー内パーティション移動の最大数。 |
|
| 1000 | 各パーティション再割り当てバッチにおけるパーティションリーダー変更の最大数。 |
|
| Null (制限なし) | パーティションの再割り当てに割り当てる帯域幅 (バイト/秒単位)。 |
|
|
|
パーティション再割り当てコマンドが、生成されたプロポーザルに対して実行される順番を決定するために使用されるストラテジー (優先順位順) の一覧。サーバーの設定には、ストラテジークラスの完全修飾名をコンマ区切りの文字列で指定します (各クラス名の先頭に |
- |
| false | ブローカー内のディスク分散を有効にし、同じブローカーのディスク間でディスク領域の使用率を分散します。ディスクが複数割り当てられた JBOD ストレージを使用する Kafka デプロイメントにのみ適用されます。 |
デフォルト設定を変更すると、リバランスの完了までにかかる時間と、リバランス中の Kafka クラスターの負荷に影響します。値を小さくすると負荷は減りますが、かかる時間は長くなります。その逆も同様です。
19.5. Configuring and deploying Cruise Control with Kafka
Kafka
リソースを設定して、Kafka クラスターと共に Cruise Control をデプロイします。Kafka
リソースの CruiseControl
プロパティーを使用して、デプロイを設定できます。Kafka クラスターごとに Cruise Control のインスタンスを 1 つデプロイします。
最適化の提案を生成するための最適化ゴールを指定するには、Cruise Control config
で goals
設定を使用します。brokerCapacity
を使用して、リソース配分に関連するゴールのデフォルトの容量制限を変更できます。ブローカーが異種ネットワークリソースを持つノードで実行されている場合、overrides
を使用して各ブローカーのネットワーク容量制限を設定できます。
空のオブジェクト ({}
) が CruiseControl
設定に使用されている場合、すべてのプロパティーはデフォルト値を使用します。
Cruise Control の設定オプションの詳細は、Streams for Apache Kafka カスタムリソース API リファレンス を参照してください。
前提条件
- OpenShift クラスター
- 稼働中の Cluster Operator
手順
Kafka
リソースのcruiseControl
プロパティーを編集します。設定可能なプロパティーは以下の例のとおりです。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... cruiseControl: brokerCapacity: inboundNetwork: 10000KB/s outboundNetwork: 10000KB/s overrides: - brokers: [0] inboundNetwork: 20000KiB/s outboundNetwork: 20000KiB/s - brokers: [1, 2] inboundNetwork: 30000KiB/s outboundNetwork: 30000KiB/s # ... config: # Note that `default.goals` (superset) must also include all `hard.goals` (subset) default.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal # ... hard.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal # ... cpu.balance.threshold: 1.1 metadata.max.age.ms: 300000 send.buffer.bytes: 131072 webserver.http.cors.enabled: true webserver.http.cors.origin: "*" webserver.http.cors.exposeheaders: "User-Task-ID,Content-Type" # ... resources: requests: cpu: 1 memory: 512Mi limits: cpu: 2 memory: 2Gi logging: type: inline loggers: rootLogger.level: INFO template: pod: metadata: labels: label1: value1 securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 metricsConfig: type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: cruise-control-metrics key: metrics-config.yml # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... cruiseControl: brokerCapacity:
1 inboundNetwork: 10000KB/s outboundNetwork: 10000KB/s overrides:
2 - brokers: [0] inboundNetwork: 20000KiB/s outboundNetwork: 20000KiB/s - brokers: [1, 2] inboundNetwork: 30000KiB/s outboundNetwork: 30000KiB/s # ... config:
3 # Note that `default.goals` (superset) must also include all `hard.goals` (subset) default.goals: >
4 com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal # ... hard.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal # ... cpu.balance.threshold: 1.1 metadata.max.age.ms: 300000 send.buffer.bytes: 131072 webserver.http.cors.enabled: true
5 webserver.http.cors.origin: "*" webserver.http.cors.exposeheaders: "User-Task-ID,Content-Type" # ... resources:
6 requests: cpu: 1 memory: 512Mi limits: cpu: 2 memory: 2Gi logging:
7 type: inline loggers: rootLogger.level: INFO template:
8 pod: metadata: labels: label1: value1 securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe:
9 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 metricsConfig:
10 type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: cruise-control-metrics key: metrics-config.yml # ...
Copy to Clipboard Copied! - 1
- ブローカーリソースの容量制限。
- 2
- オーバーライドは、異種ネットワークリソースを持つノード上で実行されている場合に、特定のブローカーのネットワーク容量制限を設定します。
- 3
- Cruise Control の設定。Streams for Apache Kafka によって直接管理されないプロパティーに限り、標準の Cruise Control 設定を指定できます。
- 4
- 最適化ゴールの設定。デフォルトの最適化ゴール (
default.goals
)、メインの最適化ゴール (goals
)、およびハードゴール (hard.goals
) の設定を含めることができます。 - 5
- CORS が有効になっており、Cruise Control API への読み取り専用アクセスが設定されています。
- 6
- 現在
cpu
およびmemory
である、サポートされるリソースの予約を要求し、消費可能な最大リソースを指定を制限します。 - 7
- Cruise Control ロガーとログレベルは、ConfigMap を通じて直接 (
inline
) または間接 (external
) に追加されます。カスタム Log4j 設定は、ConfigMap のlog4j.properties
キーの下に配置する必要があります。Cruise Control には、rootLogger.level
という名前の単一のロガーがあります。ログレベルは INFO、ERROR、WARN、TRACE、DEBUG、FATAL、または OFF に設定できます。 - 8
- テンプレートのカスタマイズ。ここでは、Pod が追加のセキュリティー属性でスケジュールされています。
- 9
- コンテナーを再起動するタイミング (liveness) およびコンテナーがトラフィックを許可できるタイミング (readiness) を把握するためのヘルスチェック。
- 10
- Prometheus メトリックが有効になりました。この例では、メトリクスは Prometheus JMX Exporter (デフォルトのメトリクスエクスポーター) に対して設定されます。
リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! デプロイメントのステータスを確認します。
oc get deployments -n <my_cluster_operator_namespace>
oc get deployments -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! デプロイメント名と準備状態が表示されている出力
NAME READY UP-TO-DATE AVAILABLE my-cluster-cruise-control 1/1 1 1
NAME READY UP-TO-DATE AVAILABLE my-cluster-cruise-control 1/1 1 1
Copy to Clipboard Copied! my-cluster
は Kafka クラスターの名前です。READY
は、Ready/expected 状態のレプリカ数を表示します。AVAILABLE
出力に1
が表示されれば、デプロイメントは成功しています。
自動作成されたトピック
以下の表は、Cruise Control のデプロイ時に自動作成される 3 つのトピックを表しています。このトピックは、Cruise Control が適切に動作するために必要であるため、削除または変更しないでください。指定された設定オプションを使用して、トピックの名前を変更できます。
自動作成されたトピック設定 | デフォルトのトピック名 | 作成元 | 機能 |
---|---|---|---|
|
| Streams for Apache Kafka Metrics Reporter | Metrics Reporter からの raw メトリクスを各 Kafka ブローカーに格納します。 |
|
| Cruise Control | 各パーティションの派生されたメトリックを格納します。これは Metric Sample Aggregator によって作成されます。 |
|
| Cruise Control | クラスターワークロードモデル の作成に使用されるメトリックサンプルを格納します。 |
Cruise Control に必要なレコードを削除しないようにするため、自動作成されたトピックではログの圧縮は無効になっています。
自動作成されたトピックの名前が、すでに Cruise Control が有効になっている Kafka クラスターで変更された場合、古いトピックは削除されないため、手動で削除する必要があります。
次のステップ
Cruise Control を設定およびデプロイした後、最適化プロポーザルを生成 できます。
19.6. 最適化プロポーザルの生成
KafkaRebalance
リソースを作成または更新すると、Cruise Control は 設定済みの 最適化ゴール を基にして、Kafka クラスターの 最適化プロポーザル を生成します。最適化プロポーザルの情報を分析して、プロポーザルを承認するかどうかを決定します。最適化プロポーザルの結果を使用して Kafka クラスターをリバランスできます。
最適化の提案は、次のいずれかのモードで実行できます。
-
full
(デフォルト) -
add-brokers
-
remove-brokers
使用するモードは、Kafka クラスターですでに実行されているすべてのブローカー間で再調整するかどうかによって異なります。または、Kafka クラスターをスケールアップした後またはスケールダウンする前に再調整したい場合。詳細については、ブローカーのスケーリングによるモードの再調整 を参照してください。
前提条件
- Streams for Apache Kafka クラスターに Cruise Control をデプロイ した。
- 最適化ゴールと、必要に応じてブローカーリソースの容量制限を設定した。
Cruise Control の設定の詳細については、「Configuring and deploying Cruise Control with Kafka」 を参照してください。
手順
KafkaRebalance
リソースを作成し、適切なモードを指定します。full
モード(デフォルト)Kafka
リソースに定義された デフォルトの最適化ゴール を使用するには、spec
プロパティーを空のままにします。Cruise Control は、デフォルトでfull
モードで Kafka クラスターを再調整します。デフォルトで完全なリバランスを行う設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: {}
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: {}
Copy to Clipboard Copied! spec.mode
プロパティーでfull
モードを指定して、完全なリバランスを実行することもできます。full
モードを指定した設定例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: mode: full
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: mode: full
Copy to Clipboard Copied! add-brokers
モードスケールアップ後に Kafka クラスターを再調整する場合は、
add-brokers
モードを指定します。このモードでは、既存のレプリカが新しく追加されたブローカーに移動されます。ブローカーをリストとして指定する必要があります。
add-brokers
モードを指定した設定例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: mode: add-brokers brokers: [3, 4]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: mode: add-brokers brokers: [3, 4]
1 Copy to Clipboard Copied! - 1
- スケールアップ操作によって追加された、新しく追加されたブローカーのリスト。このプロパティーは必須です。
remove-brokers
モードスケールダウンする前に Kafka クラスターを再調整する場合は、
remove-brokers
モードを指定します。このモードでは、削除されるブローカーからレプリカが移動されます。削除するブローカーをリストとして指定する必要があります。
remove-brokers
モードを指定した設定例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: mode: remove-brokers brokers: [3, 4]
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: mode: remove-brokers brokers: [3, 4]
1 Copy to Clipboard Copied! - 1
- スケールダウン操作によって削除されるブローカーのリスト。このプロパティーは必須です。
注記次の手順と、再調整を承認または停止する手順は、使用している再調整モードに関係なく同じです。
デフォルトのゴールを使用する代わりに ユーザー提供の最適化ゴール を設定するには、
goals
プロパティーを追加し、1 つ以上のゴールを入力します。以下の例では、ラックアウェアネス (Rack Awareness) およびレプリカの容量はユーザー提供の最適化ゴールとして設定されています。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: goals: - RackAwareGoal - ReplicaCapacityGoal
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: goals: - RackAwareGoal - ReplicaCapacityGoal
Copy to Clipboard Copied! 設定されたハードゴールを無視するには、
skipHardGoalCheck: true
プロパティーを追加します。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: goals: - RackAwareGoal - ReplicaCapacityGoal skipHardGoalCheck: true
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: goals: - RackAwareGoal - ReplicaCapacityGoal skipHardGoalCheck: true
Copy to Clipboard Copied! (オプション) 最適化プロポーザルを自動的に承認するには、
strimzi.io/rebalance-auto-approval
アノテーションをtrue
に設定します。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster annotations: strimzi.io/rebalance-auto-approval: "true" spec: goals: - RackAwareGoal - ReplicaCapacityGoal skipHardGoalCheck: true
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster annotations: strimzi.io/rebalance-auto-approval: "true" spec: goals: - RackAwareGoal - ReplicaCapacityGoal skipHardGoalCheck: true
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_rebalance_configuration_file>
oc apply -f <kafka_rebalance_configuration_file>
Copy to Clipboard Copied! Cluster Operator は Cruise Control から最適化プロポーザルを要求します。Kafka クラスターのサイズによっては処理に数分かかることがあります。
自動承認メカニズムを使用した場合は、最適化プロポーザルのステータスが
Ready
に変わるまで待ちます。自動承認メカニズムを有効にしていない場合は、最適化プロポーザルのステータスがProposalReady
に変わるまで待ちます。oc get kafkarebalance -o wide -w -n <namespace>
oc get kafkarebalance -o wide -w -n <namespace>
Copy to Clipboard Copied! PendingProposal
-
PendingProposal
ステータスは、最適化プロポーザルの準備できているかどうかを確認するために、リバランス Operator が Cruise Control API をポーリングしていることを意味します。 ProposalReady
-
ProposalReady
ステータスは、最適化プロポーザルのレビューおよび承認の準備ができていることを意味します。
ステータスが
ProposalReady
に変わると、最適化プロポーザルを承認する準備が整います。最適化プロポーザルを確認します。
最適化プロポーザルは
KafkaRebalance
カスタムリソースのStatus.Optimization Result
プロパティーに含まれます。oc describe kafkarebalance <kafka_rebalance_resource_name>
oc describe kafkarebalance <kafka_rebalance_resource_name>
Copy to Clipboard Copied! 最適化プロポーザルの例
Status: Conditions: Last Transition Time: 2020-05-19T13:50:12.533Z Status: ProposalReady Type: State Observed Generation: 1 Optimization Result: Data To Move MB: 0 Excluded Brokers For Leadership: Excluded Brokers For Replica Move: Excluded Topics: Intra Broker Data To Move MB: 0 Monitored Partitions Percentage: 100 Num Intra Broker Replica Movements: 0 Num Leader Movements: 0 Num Replica Movements: 26 On Demand Balancedness Score After: 81.8666802863978 On Demand Balancedness Score Before: 78.01176356230222 Recent Windows: 1 Session Id: 05539377-ca7b-45ef-b359-e13564f1458c
Status: Conditions: Last Transition Time: 2020-05-19T13:50:12.533Z Status: ProposalReady Type: State Observed Generation: 1 Optimization Result: Data To Move MB: 0 Excluded Brokers For Leadership: Excluded Brokers For Replica Move: Excluded Topics: Intra Broker Data To Move MB: 0 Monitored Partitions Percentage: 100 Num Intra Broker Replica Movements: 0 Num Leader Movements: 0 Num Replica Movements: 26 On Demand Balancedness Score After: 81.8666802863978 On Demand Balancedness Score Before: 78.01176356230222 Recent Windows: 1 Session Id: 05539377-ca7b-45ef-b359-e13564f1458c
Copy to Clipboard Copied! Optimization Result
セクションのプロパティーには、保留クラスターリバランス操作の詳細が表示されます。各プロパティーの説明は、最適化プロポーザルの内容 を参照してください。
CPU 容量が不足している
Kafka クラスターが CPU 使用率の観点から過負荷になっている場合には、 KafkaRebalance
ステータスで CPU 容量が十分でないというエラーが発生する可能性があります。この使用率の値は、excludedTopics
設定の影響を受けないことに注意してください。最適化の提案では、除外されたトピックのレプリカは再割り当てされませんが、負荷は使用率の計算で考慮されます。
CPU 使用率エラーの例
com.linkedin.kafka.cruisecontrol.exception.OptimizationFailureException: [CpuCapacityGoal] Insufficient capacity for cpu (Utilization 615.21, Allowed Capacity 420.00, Threshold: 0.70). Add at least 3 brokers with the same cpu capacity (100.00) as broker-0. Add at least 3 brokers with the same cpu capacity (100.00) as broker-0.
com.linkedin.kafka.cruisecontrol.exception.OptimizationFailureException:
[CpuCapacityGoal] Insufficient capacity for cpu (Utilization 615.21, Allowed Capacity 420.00, Threshold: 0.70). Add at least 3 brokers with the same cpu capacity (100.00) as broker-0. Add at least 3 brokers with the same cpu capacity (100.00) as broker-0.
このエラーは、CPU コアの数ではなく、CPU 容量をパーセンテージで示しています。このため、Kafka カスタムリソースで設定された CPU の数に直接マップされません。これは、Kafka.spec.kafka.resources.limits.cpu
で設定された CPU のサイクルを持つ、ブローカーごとに単一の 仮想 CPU を持つようなものです。CPU 使用率と容量の比率は同じであるため、これはリバランスの動作に影響はありません。
次のステップ
19.7. 最適化プロポーザルの承認
状態が ProposalReady
の場合、Cruise Control によって生成された 最適化プロポーザル を承認できます。その後、Cruise Control は最適化プロポーザルを Kafka クラスターに適用して、パーティションをブローカーに再割り当てし、パーティションのリーダーを変更します。
これはドライランではありません。最適化プロポーザルを承認する前に、以下を行う必要があります。
- 最新でない可能性があるため、プロポーザルを更新します。
- プロポーザルの内容 を注意して確認します。
前提条件
- Cruise Control から 最適化プロポーザルを生成済み である。
-
KafkaRebalance
カスタムリソースの状態がProposalReady
である必要があります。
手順
承認する最適化プロポーザルに対して、以下の手順を実行します。
最適化プロポーザルが新規生成された場合を除き、プロポーザルが Kafka クラスターの状態に関する現在の情報を基にしていることを確認します。これには、最適化プロポーザルを更新し、必ず最新のクラスターメトリクスを使用するようにします。
OpenShift の
KafkaRebalance
リソースにstrimzi.io/rebalance=refresh
でアノテーションを付けます。oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="refresh"
oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="refresh"
Copy to Clipboard Copied!
最適化提案のステータスが
ProposalReady
に変わるまで待ちます。oc get kafkarebalance -o wide -w -n <namespace>
oc get kafkarebalance -o wide -w -n <namespace>
Copy to Clipboard Copied! PendingProposal
-
PendingProposal
ステータスは、最適化プロポーザルの準備できているかどうかを確認するために、リバランス Operator が Cruise Control API をポーリングしていることを意味します。 ProposalReady
-
ProposalReady
ステータスは、最適化プロポーザルのレビューおよび承認の準備ができていることを意味します。
ステータスが
ProposalReady
に変わると、最適化プロポーザルを承認する準備が整います。Cruise Control が適用する最適化プロポーザルを承認します。
OpenShift の
KafkaRebalance
リソースにstrimzi.io/rebalance=approve
でアノテーションを付けます。oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="approve"
oc annotate kafkarebalance <kafka_rebalance_resource_name> strimzi.io/rebalance="approve"
Copy to Clipboard Copied! - Cluster Operator は アノテーションが付けられたリソースを検出し、Cruise Control に Kafka クラスターのリバランスを指示します。
最適化提案のステータスが
Ready
に変わるまで待ちます。oc get kafkarebalance -o wide -w -n <namespace>
oc get kafkarebalance -o wide -w -n <namespace>
Copy to Clipboard Copied! Rebalancing
-
Rebalancing
ステータスは、リバランスが進行中であることを意味します。 Ready
-
Ready
ステータスは、リバランスが完了したことを意味します。 NotReady
-
NotReady
ステータスは、エラーが発生したことを意味します —KafkaRebalance
リソースに関する問題の修正 を参照してください。
状態が
Ready
に変更されると、リバランスが完了します。同じ
KafkaRebalance
カスタムリソースを使用して別の最適化提案を生成するには、カスタムリソースにrefresh
アノテーションを適用します。これにより、カスタムリソースはPendingProposal
またはProposalReady
の状態に移行します。その後、最適化プロポーザルを確認し、必要に応じて承認することができます。
19.8. クラスターリバランスの停止
クラスターリバランス操作を開始すると、完了まで時間がかかることがあり、Kafka クラスターの全体的なパフォーマンスに影響します。
実行中のクラスターリバランス操作を停止するには、stop
アノテーションを KafkaRebalance
カスタムリソースに適用します。これにより、現在のパーティション再割り当てのバッチ処理を完了し、リバランスを停止するよう Cruise Control が指示されます。リバランスの停止時、完了したパーティション再割り当てはすで適用されています。そのため、Kafka クラスターの状態は、リバランス操作の開始前とは異なります。さらなるリバランスが必要な場合は、新しい最適化プロポーザルを生成してください。
中間 (停止) 状態の Kafka クラスターのパフォーマンスは、初期状態よりも低下している可能性があります。
前提条件
-
KafkaRebalance
カスタムリソースにapprove
アノテーションを付けて 最適化プロポーザルが承認済み である必要があります。 -
KafkaRebalance
カスタムリソースの状態がRebalancing
である必要があります。
手順
OpenShift の
KafkaRebalance
リソースにアノテーションを付けます。oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="stop"
oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="stop"
Copy to Clipboard Copied! KafkaRebalance
リソースの状態をチェックします。oc describe kafkarebalance rebalance-cr-name
oc describe kafkarebalance rebalance-cr-name
Copy to Clipboard Copied! -
状態が
Stopped
に変わるまで待ちます。
19.9. KafkaRebalance
リソースの問題の修正
KafkaRebalance
リソースの作成時や、Cruise Control との対話中に問題が発生した場合、エラーとその修正方法の詳細がリソースの状態で報告されます。また、リソースも NotReady
の状態に変わります。
クラスターのリバランス操作を続行するには、KafkaRebalance
リソース自体の問題、または Cruise Control のデプロイメント全体の問題を解決する必要があります。問題には以下が含まれる可能性があります。
-
KafkaRebalance
リソースのパラメーターが正しく設定されていません。 -
KafkaRebalance
リソースに Kafka クラスターを指定するためのstrimzi.io/cluster
ラベルがありません。 -
Kafka
リソースのcruiseControl
プロパティーが見つからないため、Cruise Control サーバーがデプロイされません。 - Cruise Control サーバーに接続できない。
問題の修正後、refresh
アノテーションを KafkaRebalance
リソースに付ける必要があります。refresh(更新) 中、Cruise Control サーバーから新しい最適化プロポーザルが要求されます。
前提条件
- 最適化プロポーザルが承認済み である必要があります。
-
リバランス操作の
KafkaRebalance
カスタムリソースの状態がNotReady
である必要があります。
手順
KafkaRebalance
の状態からエラーに関する情報を取得します。oc describe kafkarebalance rebalance-cr-name
oc describe kafkarebalance rebalance-cr-name
Copy to Clipboard Copied! -
KafkaRebalance
リソースで問題の解決を試みます。 OpenShift の
KafkaRebalance
リソースにアノテーションを付けます。oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="refresh"
oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance="refresh"
Copy to Clipboard Copied! KafkaRebalance
リソースの状態をチェックします。oc describe kafkarebalance rebalance-cr-name
oc describe kafkarebalance rebalance-cr-name
Copy to Clipboard Copied! -
状態が
PendingProposal
になるまで待つか、直接ProposalReady
になるまで待ちます。
第20章 パーティション再割り当てツールの使用
Kafka クラスターをスケーリングする場合、ブローカーを追加または削除し、パーティションの分散またはトピックのレプリケーション係数を更新する必要がある場合があります。パーティションとトピックを更新するには、kafka-reassign-partitions.sh
ツールを使用できます。
Streams for Apache Kafka Cruise Control 統合も Topic Operator も、トピックのレプリケーション係数の変更をサポートしていません。ただし、kafka-reassign-partitions.sh
ツールを使用してトピックのレプリケーション係数を変更できます。
このツールを使用して、パーティションを再割り当てし、ブローカー間でパーティションの分散のバランスをとり、パフォーマンスを向上させることもできます。ただし、パーティション再割り当てとクラスターの再バランシングを自動化するための Cruise Control を使用することを推奨します。Cruise Control は、ダウンタイムなしでトピックをあるブローカーから別のブローカーに移動でき、パーティションを再割り当てする最も効率的な方法です。
kafka-reassign-partitions.sh
ツールは、ブローカーコンテナー内ではなく、別個の対話型 Pod として実行することを推奨します。ブローカーコンテナー内で Kafka bin/
スクリプトを実行すると、JVM が Kafka ブローカーと同じ設定で起動する可能性があり、潜在的に中断を引き起こす可能性があります。kafka-reassign-partitions.sh
ツールを別の Pod で実行すると、この問題を回避できます。-ti
オプションを使用して Pod を実行すると、Pod 内でシェルコマンドを実行するためのターミナルを備えた対話型 Pod が作成されます。
ターミナルを使用した対話型 Pod の実行
oc run helper-pod -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bash
oc run helper-pod -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- bash
20.1. パーティション再割り当てツールの概要
パーティション再割り当てツールは、Kafka パーティションとブローカーを管理するための次の機能を提供します。
- パーティションレプリカの再配布
- ブローカーを追加または削除してクラスターをスケールアップおよびスケールダウンし、負荷の高いブローカーから使用率の低いブローカーに Kafka パーティションを移動します。これを行うには、移動するトピックとパーティションとそれらをどこに移動するかを特定するパーティション再割り当て計画を作成する必要があります。クラスターのリバランスプロセスを自動化 する Cruise Control は、このタイプの操作に推奨されます。
- トピックレプリケーション係数の増減のスケーリング
- Kafka トピックのレプリケーション係数を増減します。これを行うには、パーティション間の既存のレプリケーション割り当てと、レプリケーション係数の変更を伴う更新された割り当てを識別するパーティション再割り当て計画を作成する必要があります。
- 優先リーダーの変更
- Kafka パーティションの優先リーダーを変更します。これは、現在優先されているリーダーが使用できない場合、またはクラスター内のブローカー間で負荷を再分散したい場合に役立ちます。これを行うには、レプリカの順序を変更して各パーティションの新しい優先リーダーを指定するパーティション再割り当て計画を作成する必要があります。
- 特定の JBOD ボリュームを使用するようにログディレクトリーを変更する
- 特定の JBOD ボリュームを使用するように Kafka ブローカーのログディレクトリーを変更します。これは、Kafka データを別のディスクまたはストレージデバイスに移動する場合に便利です。これを行うには、トピックごとに新しいログディレクトリーを指定するパーティション再割り当て計画を作成する必要があります。
20.1.1. パーティション再割り当て計画の生成
パーティション再割り当てツール (kafka-reassign-partitions.sh
) は、どのパーティションを現在のブローカーから新しいブローカーに移動する必要があるかを指定するパーティション割り当てプランを生成することによって機能します。
計画に満足したら、実行できます。その後、ツールは次の処理を実行します。
- パーティションデータを新しいブローカーに移行する
- Kafka ブローカー上のメタデータを更新して、新しいパーティションの割り当てを反映する
- 新しい割り当てが確実に有効になるように、Kafka ブローカーのローリング再起動をトリガーする
パーティション再割り当てツールには 3 つの異なるモードがあります。
--generate
- トピックとブローカーのセットを取得し、再割り当て JSON ファイル を生成します。これにより、トピックのパーティションがブローカーに割り当てられます。これはトピック全体で動作するため、一部のトピックのパーティションを再度割り当てる場合は使用できません。
--execute
- 再割り当て JSON ファイル を取得し、クラスターのパーティションおよびブローカーに適用します。その結果、パーティションを取得したブローカーは、パーティションリーダーのフォロワーになります。特定のパーティションで、新しいブローカーが ISR (In-Sync レプリカ) に参加すると、古いブローカーがフォロワーでなくなり、そのレプリカが削除されます。
--verify
-
--verify
は、--execute
ステップと同じ 再割り当て JSON ファイル を使用して、ファイル内のすべてのパーティションが目的のブローカーに移動されたかどうかをチェックします。再割り当てが完了すると、--verify
は有効なトラフィックスロットル (--throttle
) も削除します。スロットルを削除しないと、再割り当てが完了した後もクラスターは影響を受け続けます。
クラスターでは、1 度に 1 つの再割り当てのみを実行でき、実行中の再割り当てをキャンセルすることはできません。再割り当てをキャンセルする必要がある場合は、完了するまで待ってから別の再割り当てを実行して、最初の再割り当ての効果を元に戻します。kafka-reassign-partitions.sh
によって、元に戻すための再割り当て JSON が出力の一部として生成されます。大規模な再割り当ては、進行中の再割り当てを停止する必要がある場合に備えて、複数の小さな再割り当てに分割するようにしてください。
20.1.2. パーティション再割り当て JSON ファイルでのトピックの指定
kafka-reassign-partitions.sh
ツールは、再割り当てを行うトピックを指定する再割り当て JSON ファイルを使用します。特定のパーティションを移動させたい場合は、再割り当て JSON ファイルを生成するか、手動でファイルを作成します。
基本的な再割り当て JSON ファイルの構造は次の例に示されており、2 つの Kafka トピックに属する 3 つのパーティションが記述されています。各パーティションは、ブローカー ID によって識別される新しいレプリカのセットに再割り当てされます。プロパティー version
、topic
、partition
、replicas
はすべて必須です。
パーティションの再割り当ての JSON ファイル構造の例
{ "version": 1, "partitions": [ { "topic": "example-topic-1", "partition": 0, "replicas": [1, 2, 3] }, { "topic": "example-topic-1", "partition": 1, "replicas": [2, 3, 4] }, { "topic": "example-topic-2", "partition": 0, "replicas": [3, 4, 5] } ] }
{
"version": 1,
"partitions": [
{
"topic": "example-topic-1",
"partition": 0,
"replicas": [1, 2, 3]
},
{
"topic": "example-topic-1",
"partition": 1,
"replicas": [2, 3, 4]
},
{
"topic": "example-topic-2",
"partition": 0,
"replicas": [3, 4, 5]
}
]
}
JSON に含まれていないパーティションは変更されません。
topics
配列を使用してトピックのみを指定すると、パーティション再割り当てツールは、指定されたトピックに属するすべてのパーティションを再割り当てします。
トピックのすべてのパーティションを再割り当てするための再割り当て JSON ファイル構造の例
{ "version": 1, "topics": [ { "topic": "my-topic"} ] }
{
"version": 1,
"topics": [
{ "topic": "my-topic"}
]
}
20.1.3. JBOD ボリューム間のパーティションの再割り当て
Kafka クラスターで JBOD ストレージを使用する場合は、特定のボリュームとログディレクトリー (各ボリュームに単一のログディレクトリーがある) との間でパーティションの再割り当てできます。
パーティションを特定のボリュームに再割り当てするには、再割り当て JSON ファイル内の各パーティションの log_dirs
値を追加します。各レプリカは特定のログディレクトリーに割り当てる必要があるため、各 log_dirs
配列には、replicas
配列と同じ数のエントリーが含まれます。log_dirs
配列には、ログディレクトリーへの絶対パスまたは特別な値 any
が含まれます。any
値は、Kafka がそのレプリカに対して使用可能な任意のログディレクトリーを選択できることを示します。これは、JBOD ボリューム間でパーティションを再割り当てするときに役立ちます。
ログディレクトリーを含む再割り当て JSON ファイル構造の例
{ "version": 1, "partitions": [ { "topic": "example-topic-1", "partition": 0, "replicas": [1, 2, 3] "log_dirs": ["/var/lib/kafka/data-0/kafka-log1", "any", "/var/lib/kafka/data-1/kafka-log2"] }, { "topic": "example-topic-1", "partition": 1, "replicas": [2, 3, 4] "log_dirs": ["any", "/var/lib/kafka/data-2/kafka-log3", "/var/lib/kafka/data-3/kafka-log4"] }, { "topic": "example-topic-2", "partition": 0, "replicas": [3, 4, 5] "log_dirs": ["/var/lib/kafka/data-4/kafka-log5", "any", "/var/lib/kafka/data-5/kafka-log6"] } ] }
{
"version": 1,
"partitions": [
{
"topic": "example-topic-1",
"partition": 0,
"replicas": [1, 2, 3]
"log_dirs": ["/var/lib/kafka/data-0/kafka-log1", "any", "/var/lib/kafka/data-1/kafka-log2"]
},
{
"topic": "example-topic-1",
"partition": 1,
"replicas": [2, 3, 4]
"log_dirs": ["any", "/var/lib/kafka/data-2/kafka-log3", "/var/lib/kafka/data-3/kafka-log4"]
},
{
"topic": "example-topic-2",
"partition": 0,
"replicas": [3, 4, 5]
"log_dirs": ["/var/lib/kafka/data-4/kafka-log5", "any", "/var/lib/kafka/data-5/kafka-log6"]
}
]
}
20.1.4. パーティション再割り当てのスロットル
パーティション再割り当てには、ブローカーの間で大量のデータを転送する必要があるため、処理が遅くなる可能性があります。クライアントへの悪影響を防ぐため、再割り当て処理をススロットルできます。--throttle
パラメーターを kafka-reassign-partitions.sh
ツールと共に使用して、再割り当てをスロットルします。ブローカー間のパーティションの移動の最大しきい値をバイト単位で指定します。たとえば --throttle 5000000
は、パーティションを移動する最大しきい値を 50 MBps に設定します。
スロットリングにより、再割り当ての完了に時間がかかる場合があります。
- スロットルが低すぎると、新たに割り当てられたブローカーは公開されるレコードに対応できず、再割り当ては完了しません。
- スロットルが高すぎると、クライアントに影響します。
たとえば、プロデューサーの場合は、確認応答を待つ通常のレイテンシーよりも高い可能性があります。コンシューマーの場合は、ポーリング間のレイテンシーが大きいことが原因でスループットが低下する可能性があります。
20.2. パーティションを再割り当てするための再割り当て JSON ファイルの生成
Kafka クラスターのスケーリング後にパーティションを再割り当てするには、kafka-reassign-partitions.sh
ツールを使用して再割り当て JSON ファイルを生成します。ブローカーを追加または削除しても、既存のパーティションは自動的に再配布されません。パーティション分散のバランスをとり、新しいブローカーを最大限に活用するには、kafka-reassign-partitions.sh
ツールを使用してパーティションを再割り当てできます。
このツールは、Kafka クラスターに接続された対話型 Pod コンテナーから実行します。
次の手順では、mTLS を使用したセキュアな再割り当てプロセスについて説明します。TLS 暗号化と mTLS 認証を使用する Kafka クラスターが必要です。
接続を確立するには、次のものが必要です。
- Kafka クラスターの作成時に Cluster Operator によって生成されたクラスター CA 証明書とパスワード
- ユーザーが Kafka クラスターへのクライアントアクセス用に作成されたときに User Operator によって生成されたユーザー CA 証明書とパスワード
この手順では、CA 証明書と対応するパスワードが、PKCS #12 (.p12
および .password
) 形式で含まれているクラスターとユーザーシークレットから抽出されます。パスワードは、証明書を含む .p12
ストアへのアクセスを許可します。.p12
ストアを使用してトラストストアとキーストアを指定し、Kafka クラスターへの接続を認証します。
前提条件
- Cluster Operator が実行中である。
内部 TLS 暗号化と mTLS 認証で設定された
Kafka
リソースに基づいて実行中の Kafka クラスターがあります。TLS 暗号化と mTLS 認証を使用した Kafka 設定
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... listeners: # ... - name: tls port: 9093 type: internal tls: true authentication: type: tls # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... listeners: # ... - name: tls port: 9093 type: internal tls: true
1 authentication: type: tls
2 # ...
Copy to Clipboard Copied! 稼働中の Kafka クラスターには、再割り当てするトピックおよびパーティションのセットが含まれます。
my-topic
のトピック設定例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 3 config: retention.ms: 7200000 segment.bytes: 1073741824 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 3 config: retention.ms: 7200000 segment.bytes: 1073741824 # ...
Copy to Clipboard Copied! Kafka ブローカーからトピックを生成および使用するパーミッションを指定する ACL ルールとともに
KafkaUser
が設定されています。my-topic
およびmy-cluster
での操作を許可する ACL ルールを使用した Kafka ユーザーの設定例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: # access to the topic - resource: type: topic name: my-topic operations: - Create - Describe - Read - AlterConfigs host: "*" # access to the cluster - resource: type: cluster operations: - Alter - AlterConfigs host: "*" # ... # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: authentication:
1 type: tls authorization: type: simple
2 acls: # access to the topic - resource: type: topic name: my-topic operations: - Create - Describe - Read - AlterConfigs host: "*" # access to the cluster - resource: type: cluster operations: - Alter - AlterConfigs host: "*" # ... # ...
Copy to Clipboard Copied!
手順
Kafka クラスターの
<cluster_name>-cluster-ca-cert
シークレットからクラスター CA 証明書とパスワードを抽出します。oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12
oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12
Copy to Clipboard Copied! oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password
oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password
Copy to Clipboard Copied! <cluster_name> は、Kafka クラスターの名前に置き換えます。
Kafka
リソースを使用して Kafka をデプロイすると、Kafka クラスター名 (<cluster_name>-cluster-ca-cert
) でクラスター CA 証明書のシークレットが作成されます。例:my-cluster-cluster-ca-cert
Streams for Apache Kafka イメージを使用してインタラクティブな Pod コンテナーを新たに実行し、実行中の Kafka ブローカーに接続します。
oc run --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 <interactive_pod_name> -- /bin/sh -c "sleep 3600"
oc run --restart=Never --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 <interactive_pod_name> -- /bin/sh -c "sleep 3600"
Copy to Clipboard Copied! <interactive_pod_name> は Pod の名前に置き換えます。
クラスター CA 証明書をインタラクティブな Pod コンテナーにコピーします。
oc cp ca.p12 <interactive_pod_name>:/tmp
oc cp ca.p12 <interactive_pod_name>:/tmp
Copy to Clipboard Copied! Kafka ブローカーへのアクセス権限を持つ Kafka ユーザーのシークレットから、ユーザー CA 証明書およびパスワードを抽出します。
oc get secret <kafka_user> -o jsonpath='{.data.user\.p12}' | base64 -d > user.p12
oc get secret <kafka_user> -o jsonpath='{.data.user\.p12}' | base64 -d > user.p12
Copy to Clipboard Copied! oc get secret <kafka_user> -o jsonpath='{.data.user\.password}' | base64 -d > user.password
oc get secret <kafka_user> -o jsonpath='{.data.user\.password}' | base64 -d > user.password
Copy to Clipboard Copied! <kafka_user> は Kafka ユーザーの名前に置き換えます。
KafkaUser
リソースを使用して Kafka ユーザーを作成すると、ユーザー CA 証明書のあるシークレットが Kafka ユーザー名で作成されます。例:my-user
ユーザー CA 証明書をインタラクティブな Pod コンテナーにコピーします。
oc cp user.p12 <interactive_pod_name>:/tmp
oc cp user.p12 <interactive_pod_name>:/tmp
Copy to Clipboard Copied! CA 証明書を使用すると、インタラクティブな Pod コンテナーが TLS を使用して Kafka ブローカーに接続できます。
config.properties
ファイルを作成し、Kafka クラスターへの認証に使用されるトラストストアおよびキーストアを指定します。前の手順でデプロイメントした証明書とパスワードを使用します。
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093 security.protocol=SSL ssl.truststore.location=/tmp/ca.p12 ssl.truststore.password=<truststore_password> ssl.keystore.location=/tmp/user.p12 ssl.keystore.password=<keystore_password>
bootstrap.servers=<kafka_cluster_name>-kafka-bootstrap:9093
1 security.protocol=SSL
2 ssl.truststore.location=/tmp/ca.p12
3 ssl.truststore.password=<truststore_password>
4 ssl.keystore.location=/tmp/user.p12
5 ssl.keystore.password=<keystore_password>
6 Copy to Clipboard Copied! - 1
- Kafka クラスターに接続するためのブートストラップサーバーアドレス。独自の Kafka クラスター名を使用して、<kafka_cluster_name> を置き換えます。
- 2
- 暗号化に TLS を使用する場合のセキュリティープロトコルオプション。
- 3
- トラストストアの場所には、Kafka クラスターの公開鍵証明書 (
ca.p12
) が含まれます。 - 4
- トラストストアにアクセスするためのパスワード (
ca.password
)。 - 5
- キーストアの場所には、Kafka ユーザーの公開鍵証明書 (
user.p12
) が含まれます。 - 6
- キーストアにアクセスするためのパスワード (
user.password
)。
config.properties
ファイルをインタラクティブな Pod コンテナーにコピーします。oc cp config.properties <interactive_pod_name>:/tmp/config.properties
oc cp config.properties <interactive_pod_name>:/tmp/config.properties
Copy to Clipboard Copied! 移動するトピックを指定する
topics.json
という名前の JSON ファイルを準備します。トピック名をコンマ区切りの一覧として指定します。
my-topic
のすべてのパーティションを再割り当てするための JSON ファイルの例{ "version": 1, "topics": [ { "topic": "my-topic"} ] }
{ "version": 1, "topics": [ { "topic": "my-topic"} ] }
Copy to Clipboard Copied! このファイルを使用して、トピックのレプリケーション係数を変更 することもできます。
topics.json
ファイルをインタラクティブな Pod コンテナーにコピーします。oc cp topics.json <interactive_pod_name>:/tmp/topics.json
oc cp topics.json <interactive_pod_name>:/tmp/topics.json
Copy to Clipboard Copied! インタラクティブな Pod コンテナーでシェルプロセスを開始します。
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
Copy to Clipboard Copied! <namespace> を Pod が実行されている OpenShift namespace に置き換えます。
kafka-reassign-partitions.sh
コマンドを使用して、再割り当て JSON を生成します。my-topic
のパーティションを指定したブローカーに移動するコマンドの例bin/kafka-reassign-partitions.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --topics-to-move-json-file /tmp/topics.json \ --broker-list 0,1,2,3,4 \ --generate
bin/kafka-reassign-partitions.sh --bootstrap-server my-cluster-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --topics-to-move-json-file /tmp/topics.json \ --broker-list 0,1,2,3,4 \ --generate
Copy to Clipboard Copied!
20.3. ブローカーの追加後のパーティションの再割り当て
Kafka クラスター内のブローカーの数を増やした後、kafka-reassign-partitions.sh
ツールによって生成された再割り当てファイルを使用してパーティションを再割り当てします。再割り当てファイルには、拡大された Kafka クラスター内のブローカーにパーティションを再度割り当てる方法を記述する必要があります。ファイルで指定された再割り当てをブローカーに適用し、新しいパーティションの割り当てを確認します。
この手順では、TLS を使用するセキュアなスケーリングプロセスについて説明します。TLS 暗号化と mTLS 認証を使用する Kafka クラスターが必要です。
kafka-reassign-partitions.sh
ツールは、クラスターを通じてすべてのノードを管理しているか、クラスター内のノードグループを管理するためにノードプールを使用しているかに関係なく、Kafka クラスター内のパーティションを再割り当てするために使用できます。
kafka-reassign-partitions.sh
ツールを使用することもできますが、パーティション再割り当てとクラスターの再バランシングを自動化 するには、Cruise Control の使用を推奨します。Cruise Control は、ダウンタイムなしでトピックをあるブローカーから別のブローカーに移動でき、パーティションを再割り当てする最も効率的な方法です。
前提条件
-
内部 TLS 暗号化と mTLS 認証で設定された
Kafka
リソースに基づいて実行中の Kafka クラスターがあります。 -
reassignment.json
という名前の 再割り当て JSON ファイルを生成 している。 - 実行中の Kafka ブローカーに接続されている対話型 Pod コンテナーを実行している。
-
KafkaUser
として接続されている。このユーザーは、Kafka クラスターとそのトピックの管理権限を指定する ACL ルールで設定されている。
手順
-
kafka.spec.kafka.replicas
設定オプションを増やして、新しいブローカーを必要なだけ追加します。 - 新しいブローカー Pod が起動したことを確認します。
-
まだ確認していない場合には、インタラクティブな Pod コンテナーを実行 して
reassignment.json
という名前の再割り当てJSONファイルを生成します。 reassignment.json
ファイルを対話型 Pod コンテナーにコピーします。oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
Copy to Clipboard Copied! <interactive_pod_name> は Pod の名前に置き換えます。
インタラクティブな Pod コンテナーでシェルプロセスを開始します。
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
Copy to Clipboard Copied! <namespace> を Pod が実行されている OpenShift namespace に置き換えます。
インタラクティブな Pod コンテナーから
kafka-reassign-partitions.sh
スクリプトを使用して、パーティション再割り当てを実行します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute
Copy to Clipboard Copied! <cluster_name> は、独自の Kafka クラスターの名前に置き換えます。例:
my-cluster-kafka-bootstrap:9093
レプリケーションにスロットリングを適用する場合、
--throttle
とブローカー間のスロットル率 (バイト/秒単位) を渡すこともできます。以下に例を示します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute
Copy to Clipboard Copied! このコマンドは、2 つの再割り当て JSON オブジェクトを出力します。最初の JSON オブジェクトには、移動されたパーティションの現在の割り当てが記録されます。後で再割り当てを元に戻す必要がある場合に備え、この値をローカルファイル (Pod のファイル以外) に保存します。2 つ目の JSON オブジェクトは、再割り当て JSON ファイルに渡したターゲットの再割り当てです。
再割り当ての最中にスロットルを変更する必要がある場合は、同じコマンドに別のスロットル率を指定して実行します。以下に例を示します。
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute
Copy to Clipboard Copied! ブローカー Pod のいずれかから
kafka-reassign-partitions.sh
コマンドラインツールを使用して、再割り当てが完了したかどうかを確認します。これは先ほどの手順と同じコマンドですが、--verify
オプションの代わりに--execute
オプションを使用します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --verify
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --verify
Copy to Clipboard Copied! --verify
コマンドによって、移動した各パーティションが正常に完了したことが報告されると、再割り当ては終了します。この最終的な--verify
によって、結果的に再割り当てスロットルも削除されます。- 割り当てを元のブローカーに戻すために JSON ファイルを保存した場合は、ここでそのファイルを削除できます。
20.4. ブローカーの削除前のパーティションの再割り当て
Kafka クラスター内のブローカーの数を減らす前に、kafka-reassign-partitions.sh
ツールによって生成された再割り当てファイルを使用してパーティションを再割り当てします。再割り当てファイルでは、Kafka クラスターの残りのブローカーにパーティションを再割り当てする方法を記述する必要があります。ファイルで指定された再割り当てをブローカーに適用し、新しいパーティションの割り当てを確認します。最も番号の大きい Pod のブローカーが最初に削除されます。
この手順では、TLS を使用するセキュアなスケーリングプロセスについて説明します。TLS 暗号化と mTLS 認証を使用する Kafka クラスターが必要です。
kafka-reassign-partitions.sh
ツールは、クラスターを通じてすべてのノードを管理しているか、クラスター内のノードグループを管理するためにノードプールを使用しているかに関係なく、Kafka クラスター内のパーティションを再割り当てするために使用できます。
kafka-reassign-partitions.sh
ツールを使用することもできますが、パーティション再割り当てとクラスターの再バランシングを自動化 するには、Cruise Control の使用を推奨します。Cruise Control は、ダウンタイムなしでトピックをあるブローカーから別のブローカーに移動でき、パーティションを再割り当てする最も効率的な方法です。
前提条件
-
内部 TLS 暗号化と mTLS 認証で設定された
Kafka
リソースに基づいて実行中の Kafka クラスターがあります。 -
reassignment.json
という名前の 再割り当て JSON ファイルを生成 している。 - 実行中の Kafka ブローカーに接続されている対話型 Pod コンテナーを実行している。
-
KafkaUser
として接続されている。このユーザーは、Kafka クラスターとそのトピックの管理権限を指定する ACL ルールで設定されている。
手順
-
まだ確認していない場合には、インタラクティブな Pod コンテナーを実行 して
reassignment.json
という名前の再割り当てJSONファイルを生成します。 reassignment.json
ファイルを対話型 Pod コンテナーにコピーします。oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
Copy to Clipboard Copied! <interactive_pod_name> は Pod の名前に置き換えます。
インタラクティブな Pod コンテナーでシェルプロセスを開始します。
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
Copy to Clipboard Copied! <namespace> を Pod が実行されている OpenShift namespace に置き換えます。
インタラクティブな Pod コンテナーから
kafka-reassign-partitions.sh
スクリプトを使用して、パーティション再割り当てを実行します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute
Copy to Clipboard Copied! <cluster_name> は、独自の Kafka クラスターの名前に置き換えます。例:
my-cluster-kafka-bootstrap:9093
レプリケーションにスロットリングを適用する場合、
--throttle
とブローカー間のスロットル率 (バイト/秒単位) を渡すこともできます。以下に例を示します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 5000000 \ --execute
Copy to Clipboard Copied! このコマンドは、2 つの再割り当て JSON オブジェクトを出力します。最初の JSON オブジェクトには、移動されたパーティションの現在の割り当てが記録されます。後で再割り当てを元に戻す必要がある場合に備え、この値をローカルファイル (Pod のファイル以外) に保存します。2 つ目の JSON オブジェクトは、再割り当て JSON ファイルに渡したターゲットの再割り当てです。
再割り当ての最中にスロットルを変更する必要がある場合は、同じコマンドに別のスロットル率を指定して実行します。以下に例を示します。
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --throttle 10000000 \ --execute
Copy to Clipboard Copied! ブローカー Pod のいずれかから
kafka-reassign-partitions.sh
コマンドラインツールを使用して、再割り当てが完了したかどうかを確認します。これは先ほどの手順と同じコマンドですが、--verify
オプションの代わりに--execute
オプションを使用します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --verify
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --verify
Copy to Clipboard Copied! --verify
コマンドによって、移動した各パーティションが正常に完了したことが報告されると、再割り当ては終了します。この最終的な--verify
によって、結果的に再割り当てスロットルも削除されます。- 割り当てを元のブローカーに戻すために JSON ファイルを保存した場合は、ここでそのファイルを削除できます。
すべてのパーティション再割り当てが終了すると、削除されるブローカーはクラスター内のいずれのパーティションにも対応しないはずです。これは、ブローカーのデータログディレクトリーにライブパーティションのログが含まれていないことを確認すると検証できます。ブローカのログディレクトリーに、拡張正規表現
\.[a-z0-9]-delete$
に一致しないディレクトリーが含まれている場合、ブローカには、まだライブパーティションがあるため、停止しないでください。これを確認するには、以下のコマンドを実行します。
oc exec my-cluster-kafka-0 -c kafka -it -- \ /bin/bash -c \ "ls -l /var/lib/kafka/kafka-log_<n>_ | grep -E '^d' | grep -vE '[a-zA-Z0-9.-]+\.[a-z0-9]+-delete$'"
oc exec my-cluster-kafka-0 -c kafka -it -- \ /bin/bash -c \ "ls -l /var/lib/kafka/kafka-log_<n>_ | grep -E '^d' | grep -vE '[a-zA-Z0-9.-]+\.[a-z0-9]+-delete$'"
Copy to Clipboard Copied! n は削除された Pod の数に置き換えます。
上記のコマンドによって出力が生成される場合、ブローカーにはライブパーティションがあります。この場合、再割り当てが終了していないか、再割り当て JSON ファイルが適切ではありません。
-
ブローカーにライブパーティションがないことを確認できたら、
Kafka
リソースのKafka.spec.kafka.replicas
プロパティーを編集してブローカーの数を減らすことができます。
20.5. トピックのレプリケーション係数の変更
Kafka クラスター内のトピックのレプリケーション係数を変更するには、kafka-reassign-partitions.sh
ツールを使用します。これを行うには、Kafka クラスターに接続されている対話型の Pod コンテナーからツールを実行し、再割り当てファイルを使用してトピックレプリカを変更する方法を記述します。
この手順では、TLS を使用するセキュアなプロセスについて説明します。TLS 暗号化と mTLS 認証を使用する Kafka クラスターが必要です。
前提条件
-
内部 TLS 暗号化と mTLS 認証で設定された
Kafka
リソースに基づいて実行中の Kafka クラスターがあります。 - 実行中の Kafka ブローカーに接続されている対話型 Pod コンテナーを実行している。
-
reassignment.json
という名前の再割り当て JSON ファイルを生成している。 -
KafkaUser
として接続されている。このユーザーは、Kafka クラスターとそのトピックの管理権限を指定する ACL ルールで設定されている。
再割り当て JSON ファイルの生成 を参照してください。
この手順では、my-topic
というトピックに 4 つのレプリカがあり、それを 3 つに減らしたいと考えています。topic.json
という名前の JSON ファイルはトピックを指定し、reassignment.json
ファイルの生成に使用されました。
my-topic
を指定する JSON ファイルの例
{ "version": 1, "topics": [ { "topic": "my-topic"} ] }
{
"version": 1,
"topics": [
{ "topic": "my-topic"}
]
}
手順
まだ確認していない場合には、インタラクティブな Pod コンテナーを実行 して
reassignment.json
という名前の再割り当てJSONファイルを生成します。現在のレプリカ割り当てと提案されたレプリカ割り当てを示す再割り当て JSON ファイルの例
Current partition replica assignment {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[3,4,2,0],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[0,2,3,1],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[1,3,0,4],"log_dirs":["any","any","any","any"]}]} Proposed partition reassignment configuration {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3,4],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4,0],"log_dirs":["any","any","any","any"]}]}
Current partition replica assignment {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[3,4,2,0],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[0,2,3,1],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[1,3,0,4],"log_dirs":["any","any","any","any"]}]} Proposed partition reassignment configuration {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3,4],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4,0],"log_dirs":["any","any","any","any"]}]}
Copy to Clipboard Copied! 後で変更を元に戻す必要がある場合に備えて、このファイルのコピーをローカルに保存します。
reassignment.json
を編集して、各パーティションからレプリカを削除します。たとえば、
jq
コマンドライン JSON パーサーツール を使用して、トピックの各パーティションのリストに含まれる最後のレプリカを削除します。各パーティションの最後のトピックレプリカの削除
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
Copy to Clipboard Copied! 更新されたレプリカを示す再割り当てファイルの例
{"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}
{"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}
Copy to Clipboard Copied! reassignment.json
ファイルを対話型 Pod コンテナーにコピーします。oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
Copy to Clipboard Copied! <interactive_pod_name> は Pod の名前に置き換えます。
インタラクティブな Pod コンテナーでシェルプロセスを開始します。
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
Copy to Clipboard Copied! <namespace> を Pod が実行されている OpenShift namespace に置き換えます。
インタラクティブな Pod コンテナーから
kafka-reassign-partitions.sh
スクリプトを使用して、トピックレプリカを変更します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --execute
Copy to Clipboard Copied! 注記ブローカーからレプリカを削除する場合、ブローカー間のデータ移動は必要ないため、レプリケーションを調整する必要はありません。レプリカを追加している場合は、スロットルレートを変更することができます。
いずれかのブローカー Pod から
kafka-reassign-partitions.sh
コマンドラインツールを使用して、トピックレプリカへの変更が完了したことを確認します。これは先ほどの手順と同じコマンドですが、--verify
オプションの代わりに--execute
オプションを使用します。bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --verify
bin/kafka-reassign-partitions.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --reassignment-json-file /tmp/reassignment.json \ --verify
Copy to Clipboard Copied! --verify
コマンドによって、移動した各パーティションが正常に完了したことが報告されると、再割り当ては終了します。この最終的な--verify
によって、結果的に再割り当てスロットルも削除されます。--describe
オプションを指定してbin/kafka-topics.sh
コマンドを実行して、トピックへの変更の結果を確認します。bin/kafka-topics.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --describe
bin/kafka-topics.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --describe
Copy to Clipboard Copied! トピックのレプリカ数を削減した結果
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4
Copy to Clipboard Copied! 最後に、
KafkaTopic
カスタムリソースを編集して.spec.replicas
を 3 に変更し、調整を待ちます。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 3 replicas: 3
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 3 replicas: 3
Copy to Clipboard Copied!
第21章 Streams for Apache Kafka のメトリクスとダッシュボードの設定
メトリックを収集することは、Kafka デプロイメントの健全性とパフォーマンスを理解するために重要です。メトリックを監視することで、問題が重大になる前に積極的に特定し、リソースの割り当てとキャパシティープランニングについて情報に基づいた意思決定を行うことができます。メトリックがないと、Kafka デプロイメントの動作の可視性が制限される可能性があります。これによりトラブルシューティングがより困難になり、時間がかかる可能性があります。メトリックをセットアップすると、長期的には時間とリソースを節約でき、Kafka デプロイメントの信頼性を確保するのに役立ちます。
Streams for Apache Kafka の各コンポーネントにはメトリクスが用意されており、個々のパフォーマンスに関する有用な知見を得ることができます。他のコンポーネントではメトリクスの公開設定が必要ですが、Streams for Apache Kafka Operator はデフォルトで Prometheus メトリクスを自動的に公開します。これらのメトリクスには以下が含まれます。
- 調整数
- 処理中のカスタムリソース数
- 調整期間
- JVM メトリック
さらに、Kafka
リソースのリスナーまたは認可設定で enableMetrics
プロパティーを有効にして、oauth
認証と opa
または keycloak
認可に固有のメトリックを収集できます。同様に、KafkaBridge
、KafkaConnect
、KafkaMirrorMaker
、KafkaMirrorMaker2
などのカスタムリソースで oauth
認証のメトリックを有効にできます。
Streams for Apache Kafka Console は、Kafka クラスター内のメトリクスを監視するためのユーザーインターフェイスを提供します。Streams for Apache Kafka によって管理される Kafka クラスターを Streams for Apache Kafka Console に接続すると、ブローカー、トピック、パーティション、コンシューマーグループなどのコンポーネントに関する詳細情報にアクセスできます。
Streams for Apache Kafka Console は現在、テクノロジープレビューとして利用できます。
Prometheus と Grafana を使用して Streams for Apache Kafka を監視することもできます。Prometheus ルールが設定されている場合、Prometheus はクラスター内で実行中の Pod からのメトリックを消費します。Grafana はこれらのメトリックをダッシュボード上で視覚化し、監視のための直感的なインターフェイスを提供します。
メトリクスの統合を容易にするために、Streams for Apache Kafka には、Streams for Apache Kafka コンポーネント用のサンプルの Prometheus ルールと Grafana ダッシュボードが用意されています。Grafana ダッシュボードの例は、特定のデプロイメント要件に合わせてカスタマイズできます。ルールを使用して、特定のメトリックに基づいてアラートをトリガーする条件を定義できます。
監視要件に応じて、次のことを実行できます。
さらに、分散トレースを設定して メッセージをエンドツーエンドで追跡するようにデプロイメントを設定したり、診断ツール (report.sh
) を使用してトラブルシューティングデータを取得したりすることができます。
Streams for Apache Kafka には、Prometheus および Grafana のサンプルインストールファイルが用意されています。これらのファイルを出発点として使用して、Streams for Apache Kafka のデプロイメントを監視できます。さらにサポートが必要な場合は、Prometheus および Grafana の開発者コミュニティーに参加することを推奨します。
メトリクスおよびモニタリングツールのサポートドキュメント
メトリクスおよびモニタリングツールの詳細は、サポートドキュメントを参照してください。
- Prometheus
- Prometheus の設定
- Kafka Exporter
- Grafana Labs
- Apache Kafka Monitoring では、Apache Kafka により公開される JMX メトリクスについて解説しています。
- ZooKeeper JMX では、Apache Zookeeper により公開される JMX メトリックについて解説しています。
21.1. Kafka Exporter でのコンシューマーラグの監視
Kafka Exporter は、Apache Kafka ブローカーおよびクライアントの監視を強化するオープンソースプロジェクトです。Kafka クラスターで Kafka Exporter をデプロイ するように、Kafka
リソースを設定できます。Kafka Exporter は、オフセット、コンシューマーグループ、コンシューマーラグ、およびトピックに関連する Kafka ブローカーから追加のメトリックデータを抽出します。一例として、メトリクスデータを使用すると、低速なコンシューマーの識別に役立ちます。ラグデータは Prometheus メトリクスとして公開され、解析のために Grafana で使用できます。
Kafka Exporter は __consumer_offsets
トピックから読み取り、このトピックには、コミットされたオフセットに関するコンシューマーグループの情報が格納されます。Kafka Exporter が適切に機能できるようにするには、コンシューマーグループを使用する必要があります。
Kafka Exporter 用の Grafana ダッシュボードが、Streams for Apache Kafka に付属する多数の サンプル Grafana ダッシュボード に含まれています。
Kafka Exporter は、コンシューマーラグおよびコンシューマーオフセットに関連する追加のメトリクスのみを提供します。通常の Kafka メトリクスでは、Kafka ブローカー で、Prometheus メトリクスを設定する必要があります。
コンシューマーラグは、メッセージの生成と消費の差を示しています。具体的には、指定のコンシューマーグループのコンシューマーラグは、パーティションの最後のメッセージと、そのコンシューマーが現在ピックアップしているメッセージとの時間差を示しています。
ラグには、パーティションログの最後を基準とする、コンシューマーオフセットの相対的な位置が反映されます。
プロデューサーおよびコンシューマーオフセット間のコンシューマーラグ
この差は、Kafka ブローカートピックパーティションの読み取りと書き込みの場所である、プロデューサーオフセットとコンシューマーオフセットの間の デルタ とも呼ばれます。
あるトピックで毎秒 100 個のメッセージがストリーミングされる場合を考えてみましょう。プロデューサーオフセット (トピックパーティションの先頭) と、コンシューマーが読み取った最後のオフセットとの間のラグが 1000 個のメッセージであれば、10 秒の遅延があることを意味します。
コンシューマーラグ監視の重要性
可能な限りリアルタイムのデータの処理に依存するアプリケーションでは、コンシューマーラグを監視して、ラグが過度に大きくならないようにチェックする必要があります。ラグが大きくなるほど、プロセスはリアルタイム処理の目的から遠ざかります。
たとえば、コンシューマーラグは、パージされていない古いデータを大量に消費したり、計画外のシャットダウンが原因である可能性があります。
コンシューマーラグの削減
Grafana のチャートを使用して、ラグを分析し、ラグ削減の方法が対象のコンシューマーグループに影響しているかどうかを確認します。たとえば、ラグを減らすように Kafka ブローカーを調整すると、ダッシュボードには コンシューマーグループ別のラグ のチャートが下降し 毎分のメッセージ消費 のチャートが上昇する状況が示されます。
通常、ラグを削減するには以下を行います。
- 新規コンシューマーを追加してコンシューマーグループをスケールアップします。
- メッセージがトピックに留まる保持時間を延長します。
- ディスク容量を追加してメッセージバッファーを増やします。
コンシューマーラグを減らす方法は、基礎となるインフラストラクチャーや、Streams for Apache Kafka によりサポートされるユースケースによって異なります。たとえば、ラグが生じているコンシューマーでは、ディスクキャッシュからフェッチリクエストに対応できるブローカーを活用できる可能性は低いでしょう。場合によっては、コンシューマーの状態が改善されるまで、自動的にメッセージをドロップすることが許容されることがあります。
21.2. Cruise Control 操作の監視
Cruise Control は、ブローカー、トピック、およびパーティションの使用状況を追跡するために Kafka ブローカーを監視します。Cruise Control は、独自のパフォーマンスを監視するためのメトリックのセットも提供します。
Cruise Control メトリックレポーターは、Kafka ブローカーから未加工のメトリックデータを収集します。データは、Cruise Control によって自動的に作成されるトピックに生成されます。メトリクスは、Kafka クラスターの最適化提案の生成 に使用されます。
Cruise Control メトリックは、Cruise Control 操作のリアルタイム監視で利用できます。たとえば、Cruise Control メトリックを使用して、実行中のリバランス操作のステータスを監視したり、操作のパフォーマンスで検出された異常についてアラートを提供したりできます。
Cruise Control 設定で Prometheus JMX Exporter を有効にして Cruise Control メトリクスを公開します。
センサー として知られる利用可能な Cruise Control メトリクスの完全なリストは、Cruise Control のドキュメントを 参照してください。
21.2.1. 分散スコアの監視
Cruise Control メトリックには、分散スコアが含まれます。分散度は、Kafka クラスター内でワークロードがどの程度均等に分散されているかを示す尺度です。
分散スコア (balancedness-score
) の Cruise Control メトリクスは、KafkaRebalance
リソースの分散スコアとは異なる可能性があります。Cruise Control は anomaly.detection.goals
を使用して各スコアを計算します。これは、KafkaRebalance
リソースで使用される default.goals
と同じでない可能性があります。anomaly.detection.goals
は、Kafka
カスタムリソースの spec.cruiseControl.config
に指定されます。
KafkaRebalance
リソースを更新すると、最適化プロポーザルをフェッチします。以下の条件のいずれかが適用されると、キャッシュされた最新の最適化プロポーザルがフェッチされます。
-
KafkaRebalance
goals
は、Kafka
リソースのdefault.goals
セクションに設定されたゴールと一致する。 -
KafkaRebalance
goals
は指定されていない。
これ以外の場合は、Cruise Control は KafkaRebalance goals
に基づいて、新しい最適化プロポーザルを生成します。更新ごとに新しいプロポーザルが生成されると、パフォーマンスの監視に影響を及ぼす可能性があります。
21.2.2. 異常検出のアラートを設定する
Cruise Control の 異常検出 は、ブローカーの障害などの最適化ゴールの生成をブロックする条件のメトリクスデータを提供します。可視性を高める場合は、異常検出器が提供するメトリックを使用して、アラートを設定し、通知を送信できます。Cruise Control の 異常通知機能 を設定して、指定された通知チャネルを介してこれらのメトリクスに基づいてアラートをルーティングできます。または、Prometheus を設定して、異常検出器によって提供されるメトリックデータをスクレープし、アラートを生成することもできます。その後、Prometheus Alertmanager は Prometheus で生成されるアラートをルーティングできます。
Cruise Control ドキュメント には、AnomalyDetector
メトリクスおよび異常通知機能に関する情報が記載されています。
21.3. メトリクスファイルの例
Grafana ダッシュボードおよびその他のメトリック設定ファイルの例は、Streams for Apache Kafka によって提供される 設定ファイルの例 を参照してください。
Streams for Apache Kafka で提供されるメトリックファイルの例
metrics ├── grafana-dashboards │ ├── strimzi-cruise-control.json │ ├── strimzi-kafka-bridge.json │ ├── strimzi-kafka-connect.json │ ├── strimzi-kafka-exporter.json │ ├── strimzi-kafka-mirror-maker-2.json │ ├── strimzi-kafka.json │ ├── strimzi-operators.json │ └── strimzi-zookeeper.json ├── grafana-install │ └── grafana.yaml ├── prometheus-additional-properties │ └── prometheus-additional.yaml ├── prometheus-alertmanager-config │ └── alert-manager-config.yaml ├── prometheus-install │ ├── alert-manager.yaml │ ├── prometheus-rules.yaml │ ├── prometheus.yaml │ └── strimzi-pod-monitor.yaml ├── kafka-bridge-metrics.yaml ├── kafka-connect-metrics.yaml ├── kafka-cruise-control-metrics.yaml ├── kafka-metrics.yaml └── kafka-mirror-maker-2-metrics.yaml
metrics
├── grafana-dashboards
│ ├── strimzi-cruise-control.json
│ ├── strimzi-kafka-bridge.json
│ ├── strimzi-kafka-connect.json
│ ├── strimzi-kafka-exporter.json
│ ├── strimzi-kafka-mirror-maker-2.json
│ ├── strimzi-kafka.json
│ ├── strimzi-operators.json
│ └── strimzi-zookeeper.json
├── grafana-install
│ └── grafana.yaml
├── prometheus-additional-properties
│ └── prometheus-additional.yaml
├── prometheus-alertmanager-config
│ └── alert-manager-config.yaml
├── prometheus-install
│ ├── alert-manager.yaml
│ ├── prometheus-rules.yaml
│ ├── prometheus.yaml
│ └── strimzi-pod-monitor.yaml
├── kafka-bridge-metrics.yaml
├── kafka-connect-metrics.yaml
├── kafka-cruise-control-metrics.yaml
├── kafka-metrics.yaml
└── kafka-mirror-maker-2-metrics.yaml
- 1
- 異なる Streams for Apache Kafka コンポーネントの Grafana ダッシュボードの例。
- 2
- Grafana イメージのインストールファイル。
- 3
- CPU、メモリー、およびディスクボリュームの使用状況についてのメトリックをスクレープする追加の設定。これらのメトリックは、ノード上の OpenShift cAdvisor エージェントおよび kubelet から直接提供されます。
- 4
- Alertmanager による通知送信のためのフック定義。
- 5
- Alertmanager をデプロイおよび設定するためのリソース。
- 6
- Prometheus Alertmanager と使用するアラートルールの例 (Prometheus とデプロイ)。
- 7
- Prometheus イメージのインストールリソースファイル。
- 8
- Prometheus Operator によって Prometheus サーバーのジョブに変換される PodMonitor の定義。これにより、Pod から直接メトリックデータをスクレープできます。
- 9
- メトリックが有効になっている Kafka Bridge リソース。
- 10
- Kafka Connect に対する Prometheus JMX Exporter の再ラベル付けルールを定義するメトリック設定。
- 11
- Cruise Control に対する Prometheus JMX Exporter の再ラベル付けルールを定義するメトリック設定。
- 12
- Kafka および ZooKeeper に対する Prometheus JMX Exporter の再ラベル付けルールを定義するメトリック設定。
- 13
- Kafka Mirror Maker 2 に対する Prometheus JMX Exporter の再ラベル付けルールを定義するメトリクス設定。
21.3.1. Prometheus メトリクス設定の例
Streams for Apache Kafka は、Prometheus JMX Exporter を使用して、Prometheus サーバーによってスクレープできる HTTP エンドポイント経由でメトリックを公開します。
Grafana ダッシュボードは、カスタムリソース設定の Streams for Apache Kafka コンポーネントに対して定義される Prometheus JMX Exporter の再ラベル付けルールに依存します。
ラベルは名前と値のペアです。再ラベル付けは、ラベルを動的に書き込むプロセスです。たとえば、ラベルの値は Kafka サーバーおよびクライアント ID の名前から派生されます。
Streams for Apache Kafka は、再ラベル付けルールが含まれるカスタムリソース設定 YAML ファイルのサンプルを提供します。Prometheus メトリック設定をデプロイする場合、カスタムリソースのサンプルをデプロイすることや、メトリック設定を独自のカスタムリソース定義にコピーすることができます。
コンポーネント | カスタムリソース | サンプル YAML ファイル |
---|---|---|
Kafka および ZooKeeper |
|
|
Kafka Connect |
|
|
Kafka MirrorMaker 2 |
|
|
Kafka Bridge |
|
|
Cruise Control |
|
|
21.3.2. アラート通知の Prometheus ルールの例
アラート通知の Prometheus ルールの例は、Streams for Apache Kafka によって提供される メトリック設定ファイルの例 と共に提供されます。ルールは、Prometheus デプロイメント で使用するための prometheus-rules.yaml
ファイルのサンプルに指定されています。
prometheus-rules.yaml
ファイルには、以下のコンポーネントのルールの例が含まれます。
- Kafka
- ZooKeeper
- Entitiy Operator
- Kafka Connect
- Kafka Bridge
- MirrorMaker
- Kafka Exporter
各ルールの例の説明は、ファイルに記載されています。
アラートルールによって、メトリックで監視される特定条件についての通知が提供されます。ルールは Prometheus サーバーで宣言されますが、アラート通知は Prometheus Alertmanager で対応します。
Prometheus アラートルールでは、継続的に評価される PromQL 表現を使用して条件が記述されます。
アラート表現が true になると、条件が満たされ、Prometheus サーバーからアラートデータが Alertmanager に送信されます。次に Alertmanager は、そのデプロイメントに設定された通信方法を使用して通知を送信します。
アラートルールの定義に関する一般的な留意点:
-
for
プロパティーは、ルールと併用し、アラートがトリガーされるまでに、条件を維持する必要のある期間を決定します。 -
ティック (tick) は ZooKeeper の基本的な時間単位です。ミリ秒単位で測定され、
Kafka.spec.zookeeper.config
のtickTime
パラメーターを使用して設定されます。たとえば、ZooKeeper でtickTime=3000
の場合、3 ティック (3 x 3000) は 9000 ミリ秒と等しくなります。 -
ZookeeperRunningOutOfSpace
メトリックおよびアラートを利用できるかどうかは、使用される OpenShift 設定およびストレージ実装によります。特定のプラットフォームのストレージ実装では、メトリクスによるアラートの提供に必要な利用可能な領域について情報が提供されない場合があります。
Alertmanager は、電子メール、チャットメッセージなどの通知方法を使用するように設定できます。ルールの例に含まれるデフォルト設定は、特定のニーズに合わせて調整してください。
21.3.3. Grafana ダッシュボードのサンプル
Prometheus をデプロイしてメトリックを提供する場合は、Streams for Apache Kafka で提供される Grafana ダッシュボードのサンプルを使用して、Streams for Apache Kafka コンポーネントを監視できます。
ダッシュボードのサンプルは、examples/metrics/grafana-dashboards
ディレクトリーに JSON ファイルで提供されます。
すべてのダッシュボードは、JVM メトリクスに加えてコンポーネントに固有のメトリクスを提供します。たとえば、Streams for Apache Kafka Operator の Grafana ダッシュボードは、調整の数または処理中のカスタムリソースに関する情報を提供します。
ダッシュボードのサンプルには、Kafka でサポートされるすべてのメトリックは表示されません。ダッシュボードには、監視用の代表的なメトリックのセットが表示されます。
コンポーネント | JSON ファイルの例: |
---|---|
Streams for Apache Kafka Operator |
|
Kafka |
|
ZooKeeper |
|
Kafka Connect |
|
Kafka MirrorMaker 2 |
|
Kafka Bridge |
|
Cruise Control |
|
Kafka Exporter |
|
クラスターにまだトラフィックがないため、Kafka Exporter でメトリックを使用できない場合、Kafka Exporter の Grafana ダッシュボードでは、数値フィールドに N/A
が、グラフに No data to show
が表示されます。
21.4. 設定による Prometheus メトリクスの有効化
Streams for Apache Kafka で Prometheus 用にメトリクスを有効にして公開するには、メトリクス設定プロパティーを使用します。
次のコンポーネントでは、メトリクスを公開するために metricsConfig
設定が必要です。
- Kafka
- KafkaConnect
- MirrorMaker
- Cruise Control
- ZooKeeper
この設定により、Prometheus JMX Exporter は HTTP エンドポイント経由でメトリクスを公開できます。JMX エクスポーター HTTP エンドポイントのポートは 9404 です。Prometheus はこのエンドポイントをスクレープして Kafka メトリクスを収集します。
これらのコンポーネントのメトリクスを公開するには、enableMetrics
プロパティーを true
に設定します。
- Kafka Bridge
- OAuth 2.0 認証および認可フレームワーク
- 認可のための Open Policy Agent (OPA)
Streams for Apache Kafka に Prometheus メトリクス設定をデプロイするには、独自の設定を使用するか、Streams for Apache Kafka に付属する サンプルのカスタムリソース設定ファイル を使用できます。
-
kafka-metrics.yaml
-
kafka-connect-metrics.yaml
-
kafka-mirror-maker-2-metrics.yaml
-
kafka-bridge-metrics.yaml
-
kafka-cruise-control-metrics.yaml
-
oauth-metrics.yaml
これらのファイルには、Prometheus メトリックを有効にするために必要な再ラベル付けルールと設定が含まれています。これらは、Streams for Apache Kafka で Prometheus を試す際の出発点として便利です。
この手順では、Prometheus メトリクス設定の例を Kafka
リソースにデプロイする方法を示します。このプロセスは、他のリソースのサンプルファイルをデプロイする場合と同じです。
Kafka Exporter メトリクスを含める場合は、kafkaExporter
設定を Kafka
リソースに追加します。
Kafka Exporter は、コンシューマーラグおよびコンシューマーオフセットに関連する追加のメトリクスのみを提供します。通常の Kafka メトリクスでは、Kafka ブローカー で、Prometheus メトリクスを設定する必要があります。
手順
Prometheus 設定でカスタムリソースのサンプルをデプロイします。
たとえば、
Kafka
リソースごとにkafka-metrics.yaml
ファイルを適用できます。サンプル設定のデプロイ
oc apply -f kafka-metrics.yaml
oc apply -f kafka-metrics.yaml
Copy to Clipboard Copied! または、
kafka-metrics.yaml
の設定例を独自のKafka
リソースにコピーすることもできます。サンプル設定のコピー
oc edit kafka <kafka_configuration_file>
oc edit kafka <kafka_configuration_file>
Copy to Clipboard Copied! metricsConfig
プロパティーと、Kafka
リソースを参照するConfigMap
をコピーします。Kafka のメトリクス設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... metricsConfig: type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: kafka-metrics key: kafka-metrics-config.yml --- kind: ConfigMap apiVersion: v1 metadata: name: kafka-metrics labels: app: strimzi data: kafka-metrics-config.yml: | # metrics configuration...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... metricsConfig:
1 type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: kafka-metrics key: kafka-metrics-config.yml --- kind: ConfigMap
2 apiVersion: v1 metadata: name: kafka-metrics labels: app: strimzi data: kafka-metrics-config.yml: | # metrics configuration...
Copy to Clipboard Copied! Kafka Exporter をデプロイするには、
kafkaExporter
設定を追加します。KafkaExporter
設定は、Kafka
リソースでのみ指定されます。Kafka Exporter のデプロイの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafkaExporter: image: my-registry.io/my-org/my-exporter-cluster:latest groupRegex: ".*" topicRegex: ".*" groupExcludeRegex: "^excluded-.*" topicExcludeRegex: "^excluded-.*" resources: requests: cpu: 200m memory: 64Mi limits: cpu: 500m memory: 128Mi logging: debug enableSaramaLogging: true template: pod: metadata: labels: label1: value1 imagePullSecrets: - name: my-docker-credentials securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafkaExporter: image: my-registry.io/my-org/my-exporter-cluster:latest
1 groupRegex: ".*"
2 topicRegex: ".*"
3 groupExcludeRegex: "^excluded-.*"
4 topicExcludeRegex: "^excluded-.*"
5 resources:
6 requests: cpu: 200m memory: 64Mi limits: cpu: 500m memory: 128Mi logging: debug
7 enableSaramaLogging: true
8 template:
9 pod: metadata: labels: label1: value1 imagePullSecrets: - name: my-docker-credentials securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe:
10 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe:
11 initialDelaySeconds: 15 timeoutSeconds: 5 # ...
Copy to Clipboard Copied! - 1
- 高度なオプション: コンテナーイメージの設定。特別な状況でのみ推奨されます。
- 2
- メトリクスに含まれるコンシューマーグループを指定する正規表現。
- 3
- メトリクスに含まれるトピックを指定する正規表現。
- 4
- メトリクスから除外するコンシューマーグループを指定する正規表現。
- 5
- メトリクスから除外するトピックを指定する正規表現。
- 6
- 予約する CPU およびメモリーリソース。
- 7
- 指定の重大度 (debug、info、warn、error、fatal) 以上でメッセージをログに記録するためのログ設定。
- 8
- Sarama ロギングを有効にするブール値 (Kafka Exporter によって使用される Go クライアントライブラリー)。
- 9
- デプロイメントテンプレートおよび Pod のカスタマイズ。
- 10
- ヘルスチェックの readiness プローブ。
- 11
- ヘルスチェックの liveness プローブ。
Kafka Exporter が適切に機能できるようにするには、コンシューマーグループを使用する必要があります。
Kafka Bridge のメトリクスを有効にする
Kafka Bridge のメトリクスを公開するには、KafkaBridge
リソースで enableMetrics
プロパティーを true
に設定します。
Kafka Bridge のメトリクス設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: # ... bootstrapServers: my-cluster-kafka:9092 http: # ... enableMetrics: true # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaBridge
metadata:
name: my-bridge
spec:
# ...
bootstrapServers: my-cluster-kafka:9092
http:
# ...
enableMetrics: true
# ...
OAuth 2.0 および OPA のメトリクスの有効化
OAuth 2.0 または OPA のメトリックを公開するには、適切なカスタムリソースで enableMetrics
プロパティーを true
に設定します。
- OAuth 2.0 メトリクス
Kafka
リソースで Kafka クラスター認可と Kafka リスナー認証のメトリクスを有効にします。他の サポートされているコンポーネント のカスタムリソースで OAuth 2.0 認証のメトリックを有効にすることもできます。
- OPA メトリクス
-
OAuth 2.0 の場合と同じ方法で、
Kafka
リソースに対する Kafka クラスター認可のメトリックを有効にします。
次の例では、OAuth 2.0 リスナー認証と OAuth 2.0 (keycloak
) クラスター認可に対してメトリックが有効になっています。
OAuth 2.0 に対してメトリクスが有効になっているクラスター設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external3 port: 9094 type: loadbalancer tls: true authentication: type: oauth enableMetrics: true configuration: #... authorization: type: keycloak enableMetrics: true # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
listeners:
- name: external3
port: 9094
type: loadbalancer
tls: true
authentication:
type: oauth
enableMetrics: true
configuration:
#...
authorization:
type: keycloak
enableMetrics: true
# ...
Prometheus で OAuth 2.0 メトリクスを使用するには、oauth-metrics.yaml
ファイルを使用して Prometheus メトリクス設定の例をデプロイします。oauth-metrics.yaml
ファイルに含まれる ConfigMap
設定を、OAUth 2.0 のメトリクスを有効にしたのと同じ Kafka
リソース設定ファイルにコピーします。
21.5. OpenShift での Kafka メトリクスおよびダッシュボードの表示
Streams for Apache Kafka が OpenShift Container Platform にデプロイされると、ユーザー定義プロジェクトのモニタリング によりメトリクスが提供されます。この OpenShift 機能により、開発者は独自のプロジェクト (例: Kafka
プロジェクト) を監視するために別の Prometheus インスタンスにアクセスできます。
ユーザー定義プロジェクトのモニタリングが有効な場合は、openshift-user-workload-monitoring
プロジェクトには以下のコンポーネントが含まれます。
- Prometheus operator
- Prometheus インスタンス (Prometheus Operator によって自動的にデプロイされます)
- Thanos Ruler インスタンス
Streams for Apache Kafka では、これらのコンポーネントを使用してメトリクスを消費します。
クラスター管理者は、ユーザー定義プロジェクトのモニタリングを有効にし、開発者およびその他のユーザーに自分のプロジェクトに含まれるアプリケーションを監視するパーミッションを付与する必要があります。
Grafana のデプロイメント
Grafana インスタンスを、Kafka クラスターが含まれるプロジェクトにデプロイできます。その後、サンプルの Grafana ダッシュボードを使用して、Grafana ユーザーインターフェイスで Streams for Apache Kafka の Prometheus メトリクスを視覚化できます。
openshift-monitoring
プロジェクトはコアプラットフォームコンポーネントをモニタリングできます。このプロジェクトの Prometheus および Grafana コンポーネントを使用して、OpenShift Container Platform 4.x 上の Streams for Apache Kafka の監視を設定 しないでください。
手順の概要
OpenShift Container Platform で Streams for Apache Kafka の監視を設定するには、次の手順を順番に実行します。
21.5.1. 前提条件
- YAML ファイルのサンプルを使用して、Prometheus メトリクス設定がデプロイされている。
-
ユーザー定義プロジェクトの監視が有効になっている。クラスター管理者が OpenShift クラスターに
cluster-monitoring-config
の Config Map を作成している。 -
クラスター管理者は、
monitoring-rules-edit
またはmonitoring-edit
ロールを割り当てている。
cluster-monitoring-config
config map を作成し、ユーザーにユーザー定義プロジェクトを監視する権限を付与する方法の詳細は、OpenShift のドキュメント を参照してください。
21.5.2. Prometheus リソースのデプロイ
Prometheus を使用して、Kafka クラスターのモニタリングデータを取得します。
独自の Prometheus デプロイメントを使用することも、Streams for Apache Kafka に付属する サンプルのメトリクス設定ファイル を使用して Prometheus をデプロイすることもできます。サンプルファイルを使用するには、PodMonitor
リソースを設定し、デプロイします。PodMonitors
は、Apache Kafka、ZooKeeper、Operator、Kafka Bridge、および Cruise Control から直接データをスクレープします。
次に、Alertmanager のアラートルールのサンプルをデプロイします。
前提条件
- Kafka クラスターが稼働している。
- Streams for Apache Kafka に付属する アラートルールのサンプル を確認した。
手順
ユーザー定義プロジェクトのモニタリングが有効であることを確認します。
oc get pods -n openshift-user-workload-monitoring
oc get pods -n openshift-user-workload-monitoring
Copy to Clipboard Copied! 有効であると、モニタリングコンポーネントの Pod が返されます。以下に例を示します。
NAME READY STATUS RESTARTS AGE prometheus-operator-5cc59f9bc6-kgcq8 1/1 Running 0 25s prometheus-user-workload-0 5/5 Running 1 14s prometheus-user-workload-1 5/5 Running 1 14s thanos-ruler-user-workload-0 3/3 Running 0 14s thanos-ruler-user-workload-1 3/3 Running 0 14s
NAME READY STATUS RESTARTS AGE prometheus-operator-5cc59f9bc6-kgcq8 1/1 Running 0 25s prometheus-user-workload-0 5/5 Running 1 14s prometheus-user-workload-1 5/5 Running 1 14s thanos-ruler-user-workload-0 3/3 Running 0 14s thanos-ruler-user-workload-1 3/3 Running 0 14s
Copy to Clipboard Copied! Pod が返されなければ、ユーザー定義プロジェクトのモニタリングは無効になっています。「OpenShift での Kafka メトリクスおよびダッシュボードの表示」 の前提条件を参照してください。
複数の
PodMonitor
リソースは、examples/metrics/prometheus-install/strimzi-pod-monitor.yaml
で定義されます。PodMonitor
リソースごとにspec.namespaceSelector.matchNames
プロパティーを編集します。apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: cluster-operator-metrics labels: app: strimzi spec: selector: matchLabels: strimzi.io/kind: cluster-operator namespaceSelector: matchNames: - <project-name> podMetricsEndpoints: - path: /metrics port: http # ...
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: cluster-operator-metrics labels: app: strimzi spec: selector: matchLabels: strimzi.io/kind: cluster-operator namespaceSelector: matchNames: - <project-name>
1 podMetricsEndpoints: - path: /metrics port: http # ...
Copy to Clipboard Copied! - 1
- メトリックをスクレープする Pod が実行されているプロジェクト (例:
Kafka
)。
strimzi-pod-monitor.yaml
ファイルを、Kafka クラスターが稼働しているプロジェクトにデプロイします。oc apply -f strimzi-pod-monitor.yaml -n MY-PROJECT
oc apply -f strimzi-pod-monitor.yaml -n MY-PROJECT
Copy to Clipboard Copied! Prometheus ルールのサンプルを同じプロジェクトにデプロイします。
oc apply -f prometheus-rules.yaml -n MY-PROJECT
oc apply -f prometheus-rules.yaml -n MY-PROJECT
Copy to Clipboard Copied!
21.5.3. Grafana のサービスアカウントの作成
Streams for Apache Kafka の Grafana インスタンスは、cluster-monitoring-view
ロールが割り当てられたサービスアカウントで実行する必要があります。
Grafana を使用してモニタリングのメトリクスを表示する場合は、サービスアカウントを作成します。
前提条件
手順
Kafka クラスターを含むプロジェクトに Grafana の
ServiceAccount
を作成します。oc create sa grafana-service-account -n my-project
oc create sa grafana-service-account -n my-project
Copy to Clipboard Copied! この例では、
grafana-service-account
という名前のサービスアカウントがmy-project
namespace に作成されます。cluster-monitoring-view
ロールを GrafanaServiceAccount
に割り当てるClusterRoleBinding
リソースを作成します。ここでは、リソースの名前はgrafana-cluster-monitoring-binding
です。apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: grafana-cluster-monitoring-binding labels: app: strimzi subjects: - kind: ServiceAccount name: grafana-service-account namespace: my-project roleRef: kind: ClusterRole name: cluster-monitoring-view apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: grafana-cluster-monitoring-binding labels: app: strimzi subjects: - kind: ServiceAccount name: grafana-service-account namespace: my-project roleRef: kind: ClusterRole name: cluster-monitoring-view apiGroup: rbac.authorization.k8s.io
Copy to Clipboard Copied! ClusterRoleBinding
を同じプロジェクトにデプロイします。oc apply -f grafana-cluster-monitoring-binding.yaml -n my-project
oc apply -f grafana-cluster-monitoring-binding.yaml -n my-project
Copy to Clipboard Copied! サービスアカウントのトークンシークレットを作成します。
apiVersion: v1 kind: Secret metadata: name: secret-sa annotations: kubernetes.io/service-account.name: "grafana-service-account" type: kubernetes.io/service-account-token
apiVersion: v1 kind: Secret metadata: name: secret-sa annotations: kubernetes.io/service-account.name: "grafana-service-account"
1 type: kubernetes.io/service-account-token
2 Copy to Clipboard Copied! Secret
オブジェクトとアクセストークンを作成します。oc create -f <secret_configuration>.yaml
oc create -f <secret_configuration>.yaml
Copy to Clipboard Copied! Grafana をデプロイするときにアクセストークンが必要です。
21.5.4. Prometheus データソースを使用した Grafana のデプロイ
Grafana をデプロイし、Prometheus メトリックを表示します。Grafana アプリケーションには、OpenShift Container Platform モニタリングスタックの設定が必要です。
OpenShift Container Platform では、openshift-monitoring
プロジェクトに Thanos Querier インスタンスが含まれています。Thanos Querier は、プラットフォームメトリクスを集約するために使用されます。
必要なプラットフォームメトリクスを使用するには、Grafana インスタンスには Thanos Querier に接続できる Prometheus データソースが必要です。この接続を設定するには、トークンを使用し、Thanos Querier と並行して実行される oauth-proxy
サイドカーに対して認証を行う config map を作成します。datasource.yaml
ファイルは config map のソースとして使用されます。
最後に、Kafka クラスターが含まれるプロジェクトにボリュームとしてマウントされた config map で Grafana アプリケーションをデプロイします。
前提条件
- Prometheus リソースをデプロイ している。
- Grafana のサービスアカウントを作成 している。
手順
Grafana
ServiceAccount
のアクセストークンを取得します。oc describe sa/grafana-service-account | grep Tokens: oc describe secret grafana-service-account-token-mmlp9 | grep token:
oc describe sa/grafana-service-account | grep Tokens: oc describe secret grafana-service-account-token-mmlp9 | grep token:
Copy to Clipboard Copied! この例では、サービスアカウントの名前は
grafana-service-account
です。次のステップで使用するアクセストークンをコピーします。Grafana の Thanos Querier 設定が含まれる
datasource.yaml
ファイルを作成します。以下に示すように、アクセストークンを
httpHeaderValue1
プロパティーに貼り付けます。apiVersion: 1 datasources: - name: Prometheus type: prometheus url: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091 access: proxy basicAuth: false withCredentials: false isDefault: true jsonData: timeInterval: 5s tlsSkipVerify: true httpHeaderName1: "Authorization" secureJsonData: httpHeaderValue1: "Bearer ${GRAFANA-ACCESS-TOKEN}" editable: true
apiVersion: 1 datasources: - name: Prometheus type: prometheus url: https://thanos-querier.openshift-monitoring.svc.cluster.local:9091 access: proxy basicAuth: false withCredentials: false isDefault: true jsonData: timeInterval: 5s tlsSkipVerify: true httpHeaderName1: "Authorization" secureJsonData: httpHeaderValue1: "Bearer ${GRAFANA-ACCESS-TOKEN}"
1 editable: true
Copy to Clipboard Copied! - 1
GRAFANA-ACCESS-TOKEN
: GrafanaServiceAccount
のアクセストークンの値。
datasource.yaml
ファイルからgrafana-config
という名前の config map を作成します。oc create configmap grafana-config --from-file=datasource.yaml -n MY-PROJECT
oc create configmap grafana-config --from-file=datasource.yaml -n MY-PROJECT
Copy to Clipboard Copied! Deployment
およびService
で設定される Grafana アプリケーションを作成します。grafana-config
config map はデータソース設定のボリュームとしてマウントされます。apiVersion: apps/v1 kind: Deployment metadata: name: grafana labels: app: strimzi spec: replicas: 1 selector: matchLabels: name: grafana template: metadata: labels: name: grafana spec: serviceAccountName: grafana-service-account containers: - name: grafana image: grafana/grafana:10.4.2 ports: - name: grafana containerPort: 3000 protocol: TCP volumeMounts: - name: grafana-data mountPath: /var/lib/grafana - name: grafana-logs mountPath: /var/log/grafana - name: grafana-config mountPath: /etc/grafana/provisioning/datasources/datasource.yaml readOnly: true subPath: datasource.yaml readinessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 15 periodSeconds: 20 volumes: - name: grafana-data emptyDir: {} - name: grafana-logs emptyDir: {} - name: grafana-config configMap: name: grafana-config --- apiVersion: v1 kind: Service metadata: name: grafana labels: app: strimzi spec: ports: - name: grafana port: 3000 targetPort: 3000 protocol: TCP selector: name: grafana type: ClusterIP
apiVersion: apps/v1 kind: Deployment metadata: name: grafana labels: app: strimzi spec: replicas: 1 selector: matchLabels: name: grafana template: metadata: labels: name: grafana spec: serviceAccountName: grafana-service-account containers: - name: grafana image: grafana/grafana:10.4.2 ports: - name: grafana containerPort: 3000 protocol: TCP volumeMounts: - name: grafana-data mountPath: /var/lib/grafana - name: grafana-logs mountPath: /var/log/grafana - name: grafana-config mountPath: /etc/grafana/provisioning/datasources/datasource.yaml readOnly: true subPath: datasource.yaml readinessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: /api/health port: 3000 initialDelaySeconds: 15 periodSeconds: 20 volumes: - name: grafana-data emptyDir: {} - name: grafana-logs emptyDir: {} - name: grafana-config configMap: name: grafana-config --- apiVersion: v1 kind: Service metadata: name: grafana labels: app: strimzi spec: ports: - name: grafana port: 3000 targetPort: 3000 protocol: TCP selector: name: grafana type: ClusterIP
Copy to Clipboard Copied! Grafana アプリケーションを、Kafka クラスターが含まれるプロジェクトにデプロイします。
oc apply -f <grafana-application> -n <my-project>
oc apply -f <grafana-application> -n <my-project>
Copy to Clipboard Copied!
21.5.5. Grafana サービスへのルートの作成
Grafana サービスを公開するルートを介して、Grafana ユーザーインターフェイスにアクセスできます。
手順
grafana
サービスへのルートを作成します。oc create route edge <my-grafana-route> --service=grafana --namespace=KAFKA-NAMESPACE
oc create route edge <my-grafana-route> --service=grafana --namespace=KAFKA-NAMESPACE
Copy to Clipboard Copied!
21.5.6. Grafana ダッシュボードサンプルのインポート
Grafana を使用して、カスタマイズ可能なダッシュボードで Prometheus メトリックを視覚化します。
Streams for Apache Kafka には、JSON 形式の Grafana ダッシュボード設定ファイルのサンプル が用意されています。
-
examples/metrics/grafana-dashboards
この手順では、Grafana ダッシュボードのサンプルを使用します。
ダッシュボードのサンプルは、キーメトリックを監視するを開始点として適していますが、Kafka でサポートされるすべてのメトリックは表示されません。使用するインフラストラクチャーに応じて、ダッシュボードのサンプルの編集や、他のメトリクスの追加を行うことができます。
前提条件
手順
Grafana サービスへのルートの詳細を取得します。以下に例を示します。
oc get routes NAME HOST/PORT PATH SERVICES MY-GRAFANA-ROUTE MY-GRAFANA-ROUTE-amq-streams.net grafana
oc get routes NAME HOST/PORT PATH SERVICES MY-GRAFANA-ROUTE MY-GRAFANA-ROUTE-amq-streams.net grafana
Copy to Clipboard Copied! - Web ブラウザーで、Route ホストおよびポートの URL を使用して Grafana ログイン画面にアクセスします。
ユーザー名とパスワードを入力し、続いて Log In をクリックします。
デフォルトの Grafana ユーザー名およびパスワードは、どちらも
admin
です。初回ログイン後に、パスワードを変更できます。- Configuration > Data Sources で、Prometheus データソースが作成済みであることを確認します。データソースは 「Prometheus データソースを使用した Grafana のデプロイ」 に作成されています。
- + アイコンをクリックしてから、Import をクリックします。
-
examples/metrics/grafana-dashboards
で、インポートするダッシュボードの JSON をコピーします。 - JSON をテキストボックスに貼り付け、Load をクリックします。
- 他の Grafana ダッシュボードのサンプル用に、ステップ 5-7 を繰り返します。
インポートされた Grafana ダッシュボードは、Dashboards ホームページから表示できます。
第22章 Introducing distributed tracing
分散トレースは、分散システム内のアプリケーション間のトランザクションの進行状況を追跡します。マイクロサービスのアーキテクチャーでは、トレースがサービス間のトランザクションの進捗を追跡します。トレースデータは、アプリケーションのパフォーマンスを監視し、ターゲットシステムおよびエンドユーザーアプリケーションの問題を調べるのに有用です。
Streams for Apache Kafka では、トレースによってメッセージのエンドツーエンドの追跡が容易になります。これは、ソースシステムから Kafka、さらに Kafka からターゲットシステムおよびアプリケーションへのメッセージの追跡です。分散トレーシングは、Grafana ダッシュボードおよびコンポーネントロガーでのメトリクスの監視を補完します。
トレースのサポートは、以下の Kafka コンポーネントに組み込まれています。
- ソースクラスターからターゲットクラスターへのメッセージをトレースする MirrorMaker
- Kafka Connect が使用して生成したメッセージをトレースする Kafka Connect
- Kafka と HTTP クライアントアプリケーション間のメッセージをトレースする Kafka Bridge
トレースは Kafka ブローカーではサポートされません。
カスタムリソースを使用して、これらのコンポーネントのトレースを有効にして設定します。spec.template
プロパティーを使用してトレース設定を追加します。
spec.tracing.type
プロパティーを使用してトレースタイプを指定することにより、トレースを有効にします。
opentelemetry
-
type: opentelemetry
を指定して、OpenTelemetry を使用します。デフォルトでは、OpenTelemetry は OTLP (OpenTelemetry Protocol) エクスポーターとエンドポイントを使用してトレースデータを取得します。Jaeger トレースなど、OpenTelemetry でサポートされている他のトレースシステムを指定できます。これを行うには、トレース設定で OpenTelemetry エクスポーターとエンドポイントを変更します。
Streams for Apache Kafka は OpenTracing をサポートしなくなりました。これまでに type: jaeger
オプションを指定して OpenTracing を使用していた場合は、代わりに OpenTelemetry の使用に移行することを推奨します。
22.1. トレースオプション
OpenTelemetry を Jaeger トレースシステムとともに使用します。
OpenTelemetry は、トレースまたは監視システムから独立した API 仕様を提供します。
API を使用して、トレース用にアプリケーションコードをインストルメント化します。
- インストルメント化されたアプリケーションは、分散システム全体で個別のリクエストの トレース を生成します。
- トレースは、時間軸の中で特定の作業単位を定義する スパン で構成されます。
Jaeger はマイクロサービスベースの分散システムのトレースシステムです。
- Jaeger ユーザーインターフェイスを使用すると、トレースデータをクエリー、フィルター、および分析できます。
簡単なクエリーを表示する Jaeger ユーザーインターフェイス
22.2. トレースの環境変数
Kafka コンポーネントのトレースを有効にするとき、または Kafka クライアントのトレーサーを初期化するときに、環境変数を使用します。
トレース環境変数は変更する可能性があります。最新情報は、OpenTelemetry のドキュメント を参照してください。
次の表は、トレーサーをセットアップするための主要な環境変数を説明します。
プロパティー | 必要性 | 説明 |
---|---|---|
| 必要 | OpenTelemetry 向け Jaeger トレースサービスの名前。 |
| 必要 | トレースに使用されるエクスポーター。 |
| 必要 |
トレースに使用されるエクスポーター。デフォルトでは |
22.3. 分散トレースの設定
カスタムリソースでトレースタイプを指定して、Kafka コンポーネントで分散トレースを有効にします。メッセージをエンドツーエンドで追跡するために Kafka クライアントにトレーサーをインストルメント化します。
分散トレースを設定するには、次の手順を順番に実行します。
- MirrorMaker、Kafka Connect、Kafka Bridge のトレースを設定します。
クライアントのトレースを設定します。
トレーサーでクライアントをインストルメント化します。
22.3.1. 前提条件
分散トレースを設定する前に、Jaeger バックエンドコンポーネントが OpenShift クラスターにデプロイされていることを確認してください。OpenShift クラスターに Jaeger をデプロイするには、Jaeger Operator を使用することを推奨します。
デプロイメント手順は、Jaeger のドキュメント を参照してください。
Streams for Apache Kafka 以外のアプリケーションおよびシステムのトレース設定は、このコンテンツの範囲外です。
22.3.2. MirrorMaker、Kafka Connect、および Kafka Bridge リソースでのトレーシングの有効化
分散トレーシングは、MirrorMaker、MirrorMaker 2、Kafka Connect、および Streams for Apache Kafka Bridge でサポートされています。コンポーネントのカスタムリソースを設定して、トレーサーサービスを指定して有効にします。
リソースでトレースを有効にすると、次のイベントがトリガーされます。
- インターセプタークラスは、コンポーネントの統合コンシューマーとプロデューサーで更新されます。
- MirrorMaker、MirrorMaker 2、および Kafka Connect の場合、トレースエージェントは、リソースで定義されたトレース設定に基づいてトレーサーを初期化します。
- Kafka Bridge の場合、リソースで定義されたトレース設定に基づくトレーサーは、Kafka Bridge 自体によって初期化されます。
OpenTelemetry を使用したトレースを有効にできます。
MirrorMaker および MirrorMaker 2 でのトレース
MirrorMaker および MirrorMaker 2 の場合、メッセージはソースクラスターからターゲットクラスターまでトレースされます。トレースデータは、MirrorMaker または MirrorMaker 2 コンポーネントに出入りするメッセージを記録します。
Kafka Connect でのトレーシング
Kafka Connect の場合、Kafka Connect によって生成および消費されたメッセージのみがトレースされます。Kafka Connect と外部システム間で送信されるメッセージをトレースするには、これらのシステムのコネクターでトレースを設定する必要があります。
Kafka Bridge でのトレーシング
Kafka Bridge の場合、Kafka Bridge によって生成および消費されるメッセージがトレースされます。Kafka Bridge を介してメッセージを送受信するクライアントアプリケーションから受信する HTTP リクエストもトレーシングされます。エンドツーエンドのトレーシングを設定するために、HTTP クライアントでトレーシングを設定する必要があります。
手順
以下の手順を、KafkaMirrorMaker
、KafkaMirrorMaker2
、KafkaConnect
、および KafkaBridge
リソースごとに実行します。
spec.template
プロパティーで、トレーサーサービスを設定します。- トレーシング環境変数 をテンプレートの設定プロパティーとして使用します。
-
OpenTelemetry の場合、
spec.tracing.type
プロパティーをopentelemetry
に設定します。
OpenTelemetry を使用した Kafka Connect のトレース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
Copy to Clipboard Copied! OpenTelemetry を使用した MirrorMaker のトレース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker metadata: name: my-mirror-maker spec: #... template: mirrorMakerContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker metadata: name: my-mirror-maker spec: #... template: mirrorMakerContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
Copy to Clipboard Copied! OpenTelemetry を使用した MirrorMaker 2 のトレース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
Copy to Clipboard Copied! OpenTelemetry を使用した Kafka Bridge のトレース設定の例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: #... template: bridgeContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: #... template: bridgeContainer: env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry #...
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <resource_configuration_file>
oc apply -f <resource_configuration_file>
Copy to Clipboard Copied!
22.3.3. Kafka クライアントのトレースの初期化
OpenTelemetry 用のトレーサーを初期化し、分散トレース用にクライアントアプリケーションをインストルメント化します。Kafka プロデューサークライアントとコンシューマークライアント、および Kafka Streams API アプリケーションをインストルメント化できます。
一連の トレース環境変数 を使用して、トレーサーを設定および初期化します。
手順
各クライアントアプリケーションで、トレーサーの依存関係を追加します。
クライアントアプリケーションの
pom.xml
ファイルに Maven 依存関係を追加します。OpenTelemetry の依存関係
<dependency> <groupId>io.opentelemetry.semconv</groupId> <artifactId>opentelemetry-semconv</artifactId> <version>1.21.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> <version>1.34.1</version> <exclusions> <exclusion> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-okhttp</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-grpc-managed-channel</artifactId> <version>1.34.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-kafka-clients-2.6</artifactId> <version>1.32.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-jdk</artifactId> <version>1.34.1-alpha</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.61.0</version> </dependency>
<dependency> <groupId>io.opentelemetry.semconv</groupId> <artifactId>opentelemetry-semconv</artifactId> <version>1.21.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> <version>1.34.1</version> <exclusions> <exclusion> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-okhttp</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-grpc-managed-channel</artifactId> <version>1.34.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-kafka-clients-2.6</artifactId> <version>1.32.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> <version>1.34.1</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-sender-jdk</artifactId> <version>1.34.1-alpha</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.61.0</version> </dependency>
Copy to Clipboard Copied! - トレース環境変数 を使用して、トレーサーの設定を定義します。
環境変数で初期化されるトレーサーを作成します。
OpenTelemetry のトレーサーの作成
OpenTelemetry ot = GlobalOpenTelemetry.get();
OpenTelemetry ot = GlobalOpenTelemetry.get();
Copy to Clipboard Copied! トレーサーをグローバルトレーサーとして登録します。
GlobalTracer.register(tracer);
GlobalTracer.register(tracer);
Copy to Clipboard Copied! クライアントをインストルメント化します。
22.3.4. Kafka プロデューサーおよびコンシューマーをトレース用にインストルメント化
アプリケーションコードを計測して、Kafka プロデューサーとコンシューマーでのトレースを有効にします。デコレーターパターンまたはインターセプターを使用して、Java プロデューサーおよびコンシューマーアプリケーションコードをトレース用にインストルメント化します。続いて、メッセージが生成されたとき、またはトピックから取得されたときにトレースを記録できます。
OpenTelemetry インストルメント化プロジェクトは、プロデューサーとコンシューマーのインストルメント化をサポートするクラスを提供します。
- デコレーターのインストルメント化
- デコレーターのインストルメント化では、トレース用に変更したプロデューサーまたはコンシューマーインスタンスを作成します。
- インターセプターのインストルメント化
- インターセプターのインストルメント化の場合、トレース機能をコンシューマーまたはプロデューサーの設定に追加します。
前提条件
クライアントのトレースを初期化 している。
トレース JAR を依存関係としてプロジェクトに追加して、プロデューサーアプリケーションとコンシューマーアプリケーションでインストルメント化を有効にしている。
手順
各プロデューサーおよびコンシューマーアプリケーションのアプリケーションコードで、これらの手順を実行します。デコレーターパターンまたはインターセプターのいずれかを使用して、クライアントアプリケーションコードをインストルメント化します。
デコレーターパターンを使用するには、変更したプロデューサーまたはコンシューマーインスタンスを作成して、メッセージを送受信します。
元の
KafkaProducer
またはKafkaConsumer
クラスを渡します。OpenTelemetry のデコレーターインストルメント化の例
// Producer instance Producer < String, String > op = new KafkaProducer < > ( configs, new StringSerializer(), new StringSerializer() ); Producer < String, String > producer = tracing.wrap(op); KafkaTracing tracing = KafkaTracing.create(GlobalOpenTelemetry.get()); producer.send(...); //consumer instance Consumer<String, String> oc = new KafkaConsumer<>( configs, new StringDeserializer(), new StringDeserializer() ); Consumer<String, String> consumer = tracing.wrap(oc); consumer.subscribe(Collections.singleton("mytopic")); ConsumerRecords<Integer, String> records = consumer.poll(1000); ConsumerRecord<Integer, String> record = ... SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);
// Producer instance Producer < String, String > op = new KafkaProducer < > ( configs, new StringSerializer(), new StringSerializer() ); Producer < String, String > producer = tracing.wrap(op); KafkaTracing tracing = KafkaTracing.create(GlobalOpenTelemetry.get()); producer.send(...); //consumer instance Consumer<String, String> oc = new KafkaConsumer<>( configs, new StringDeserializer(), new StringDeserializer() ); Consumer<String, String> consumer = tracing.wrap(oc); consumer.subscribe(Collections.singleton("mytopic")); ConsumerRecords<Integer, String> records = consumer.poll(1000); ConsumerRecord<Integer, String> record = ... SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);
Copy to Clipboard Copied! インターセプターを使用するには、プロデューサーまたはコンシューマーの設定でインターセプタークラスを設定します。
通常の方法で
KafkaProducer
クラスとKafkaConsumer
クラスを使用します。TracingProducerInterceptor
およびTracingConsumerInterceptor
インターセプタークラスは、トレース機能を処理します。インターセプターを使用したプロデューサー設定の例
senderProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps); producer.send(...);
senderProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps); producer.send(...);
Copy to Clipboard Copied! インターセプターを使用したコンシューマー設定の例
consumerProps.put(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName()); KafkaConsumer<Integer, String> consumer = new KafkaConsumer<>(consumerProps); consumer.subscribe(Collections.singletonList("messages")); ConsumerRecords<Integer, String> records = consumer.poll(1000); ConsumerRecord<Integer, String> record = ... SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);
consumerProps.put(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName()); KafkaConsumer<Integer, String> consumer = new KafkaConsumer<>(consumerProps); consumer.subscribe(Collections.singletonList("messages")); ConsumerRecords<Integer, String> records = consumer.poll(1000); ConsumerRecord<Integer, String> record = ... SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);
Copy to Clipboard Copied!
22.3.5. Kafka Streams アプリケーションのトレース用のインストルメント化
アプリケーションコードを計測して、Kafka Streams API アプリケーションでのトレースを有効にします。デコレーターパターンまたはインターセプターを使用して、トレース用に Kafka Streams API アプリケーションをインストルメント化します。続いて、メッセージが生成されたとき、またはトピックから取得されたときにトレースを記録できます。
- デコレーターのインストルメント化
-
デコレーターのインストルメント化は、トレース用に変更した Kafka Streams インスタンスを作成します。OpenTelemetry の場合、Kafka Streams のトレースのインストルメント化を提供する
TracingKafkaClientSupplier
カスタムクラスを作成する必要があります。 - インターセプターのインストルメント化
- インターセプターインストルメント化の場合は、トレース機能を Kafka Streams プロデューサーおよびコンシューマー設定に追加します。
前提条件
クライアントのトレースを初期化 している。
トレース JAR を依存関係としてプロジェクトに追加して、Kafka Streams アプリケーションでインストルメント化を有効にしている。
-
OpenTelemetry で Kafka Streams をインストルメント化するために、カスタムの
TracingKafkaClientSupplier
を記述している。 カスタム
TracingKafkaClientSupplier
が Kafka のDefaultKafkaClientSupplier
を拡張し、プロデューサーとコンシューマーの作成メソッドを上書きして、インスタンスを Telemetry 関連のコードでラップできるようにしている。カスタム
TracingKafkaClientSupplier
の例private class TracingKafkaClientSupplier extends DefaultKafkaClientSupplier { @Override public Producer<byte[], byte[]> getProducer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getProducer(config)); } @Override public Consumer<byte[], byte[]> getConsumer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getConsumer(config)); } @Override public Consumer<byte[], byte[]> getRestoreConsumer(Map<String, Object> config) { return this.getConsumer(config); } @Override public Consumer<byte[], byte[]> getGlobalConsumer(Map<String, Object> config) { return this.getConsumer(config); } }
private class TracingKafkaClientSupplier extends DefaultKafkaClientSupplier { @Override public Producer<byte[], byte[]> getProducer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getProducer(config)); } @Override public Consumer<byte[], byte[]> getConsumer(Map<String, Object> config) { KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get()); return telemetry.wrap(super.getConsumer(config)); } @Override public Consumer<byte[], byte[]> getRestoreConsumer(Map<String, Object> config) { return this.getConsumer(config); } @Override public Consumer<byte[], byte[]> getGlobalConsumer(Map<String, Object> config) { return this.getConsumer(config); } }
Copy to Clipboard Copied!
手順
Kafka Streams API アプリケーションごとにこの手順を実行します。
デコレーターパターンを使用するには、
TracingKafkaClientSupplier
サプライヤーインターフェイスのインスタンスを作成し、そのサプライヤーインターフェイスをKafkaStreams
に提供します。デコレーターのインストルメント化の例
KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer); KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier); streams.start();
KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer); KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier); streams.start();
Copy to Clipboard Copied! インターセプターを使用するには、Kafka Streams プロデューサーおよびコンシューマー設定でインターセプタークラスを設定します。
TracingProducerInterceptor
およびTracingConsumerInterceptor
インターセプタークラスは、トレース機能を処理します。インターセプターを使用したプロデューサーとコンシューマーの設定例
props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); props.put(StreamsConfig.CONSUMER_PREFIX + ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName());
props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName()); props.put(StreamsConfig.CONSUMER_PREFIX + ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName());
Copy to Clipboard Copied!
22.3.6. 別の OpenTelemetry トレースシステムの導入
デフォルトの OTLP システムの代わりに、OpenTelemetry でサポートされている他のトレースシステムを指定できます。これを行うには、Streams for Apache Kafka で提供される Kafka イメージに必要なアーティファクトを追加します。必要な実装固有の環境変数も設定する必要があります。次に、OTEL_TRACES_EXPORTER
環境変数を使用して、新しいトレースの実装を有効にします。
この手順では、Zipkin トレースを実装する方法を示します。
手順
トレーシングアーティファクトを Streams for Apache Kafka イメージの
/opt/Kafka/libs/
ディレクトリーに追加します。新しいカスタムイメージを作成するための基本イメージとして、Red Hat Ecosystem Catalog の Kafka コンテナーイメージを使用できます。
Zipkin の OpenTelemetry アーティファクト
io.opentelemetry:opentelemetry-exporter-zipkin
io.opentelemetry:opentelemetry-exporter-zipkin
Copy to Clipboard Copied! 新しいトレース実装のトレースエクスポーターとエンドポイントを設定します。
Zikpin トレーサーの設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-zipkin-service - name: OTEL_EXPORTER_ZIPKIN_ENDPOINT value: http://zipkin-exporter-host-name:9411/api/v2/spans - name: OTEL_TRACES_EXPORTER value: zipkin tracing: type: opentelemetry #...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mm2-cluster spec: #... template: connectContainer: env: - name: OTEL_SERVICE_NAME value: my-zipkin-service - name: OTEL_EXPORTER_ZIPKIN_ENDPOINT value: http://zipkin-exporter-host-name:9411/api/v2/spans
1 - name: OTEL_TRACES_EXPORTER value: zipkin
2 tracing: type: opentelemetry #...
Copy to Clipboard Copied!
22.3.7. OpenTelemetry のカスタムスパン名の指定
トレース スパン は Jaeger の論理作業単位で、操作名、開始時間、および期間が含まれます。スパンには組み込みの名前がありますが、使用する Kafka クライアントインストルメント化で、カスタムスパン名を指定できます。
カスタムスパン名の指定はオプションであり、プロデューサーおよびコンシューマークライアントインストルメント化 または Kafka Streams インストルメント化 でデコレーターパターンを使用する場合にのみ適用されます。
OpenTelemetry でカスタムスパン名を直接指定できません。代わりに、コードをクライアントアプリケーションに追加してスパン名を取得し、追加のタグと属性を抽出します。
属性を抽出するコード例
//Defines attribute extraction for a producer private static class ProducerAttribExtractor implements AttributesExtractor < ProducerRecord < ? , ? > , Void > { @Override public void onStart(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord) { set(attributes, AttributeKey.stringKey("prod_start"), "prod1"); } @Override public void onEnd(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) { set(attributes, AttributeKey.stringKey("prod_end"), "prod2"); } } //Defines attribute extraction for a consumer private static class ConsumerAttribExtractor implements AttributesExtractor < ConsumerRecord < ? , ? > , Void > { @Override public void onStart(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord) { set(attributes, AttributeKey.stringKey("con_start"), "con1"); } @Override public void onEnd(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) { set(attributes, AttributeKey.stringKey("con_end"), "con2"); } } //Extracts the attributes public static void main(String[] args) throws Exception { Map < String, Object > configs = new HashMap < > (Collections.singletonMap(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092")); System.setProperty("otel.traces.exporter", "jaeger"); System.setProperty("otel.service.name", "myapp1"); KafkaTracing tracing = KafkaTracing.newBuilder(GlobalOpenTelemetry.get()) .addProducerAttributesExtractors(new ProducerAttribExtractor()) .addConsumerAttributesExtractors(new ConsumerAttribExtractor()) .build();
//Defines attribute extraction for a producer
private static class ProducerAttribExtractor implements AttributesExtractor < ProducerRecord < ? , ? > , Void > {
@Override
public void onStart(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord) {
set(attributes, AttributeKey.stringKey("prod_start"), "prod1");
}
@Override
public void onEnd(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
set(attributes, AttributeKey.stringKey("prod_end"), "prod2");
}
}
//Defines attribute extraction for a consumer
private static class ConsumerAttribExtractor implements AttributesExtractor < ConsumerRecord < ? , ? > , Void > {
@Override
public void onStart(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord) {
set(attributes, AttributeKey.stringKey("con_start"), "con1");
}
@Override
public void onEnd(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
set(attributes, AttributeKey.stringKey("con_end"), "con2");
}
}
//Extracts the attributes
public static void main(String[] args) throws Exception {
Map < String, Object > configs = new HashMap < > (Collections.singletonMap(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"));
System.setProperty("otel.traces.exporter", "jaeger");
System.setProperty("otel.service.name", "myapp1");
KafkaTracing tracing = KafkaTracing.newBuilder(GlobalOpenTelemetry.get())
.addProducerAttributesExtractors(new ProducerAttribExtractor())
.addConsumerAttributesExtractors(new ConsumerAttribExtractor())
.build();
第23章 Streams for Apache Kafka Drain Cleaner を使用した Pod のエビクト
Kafka および ZooKeeper Pod は、OpenShift のアップグレード、メンテナンス、または Pod の再スケジュール中にエビクトされる可能性があります。Kafka および ZooKeeper Pod を Streams for Apache Kafka によってデプロイした場合、Streams for Apache Kafka Drain Cleaner ツールを使用して Pod のエビクションを処理できます。OpenShift の代わりに、Streams for Apache Kafka Drain Cleaner がエビクションを処理します。
Streams for Apache Kafka Drain Cleaner をデプロイすると、OpenShift の代わりに Cluster Operator を使用して Kafka Pod を移動できるようになります。Cluster Operator は、トピックの複製の数が最低数未満とならないようにし、エビクションプロセス中も Kafka が稼働状態を維持できるようにします。Cluster Operator は、OpenShift ワーカーノードが連続してドレイン (解放) されるため、トピックが同期するのを待ちます。
アドミッション Webhook が、Kubernetes API への Pod エビクション要求を Streams for Apache Kafka Drain Cleaner に通知します。次に、Streams for Apache Kafka Drain Cleaner が、ドレインする Pod にローリング更新アノテーションを追加します。このアノテーションにより、ローリング更新を実行する指示が Cluster Operator に通知されます。
Streams for Apache Kafka Drain Cleaner を使用していない場合は、Pod アノテーションを追加して、ローリング更新を手動で実行 できます。
Webhook の設定
Streams for Apache Kafka Drain Cleaner のデプロイメントファイルには、ValidatingWebhookConfiguration
リソースファイルが含まれています。リソースでは、Kubernetes API で Webhook を登録する設定が可能です。
この設定は、Pod のエビクション要求の場合に使用する Kubernetes API の ルール
を定義します。ルールは、pods/eviction
サブリソースに関連する CREATE
操作だけがインターセプトされることを指定します。これらのルールが満たされている場合、API は通知を転送します。
clientConfig
は、Streams for Apache Kafka Drain Cleaner サービスと、Webhook を公開する /drainer
エンドポイントを参照します。Webhook は、認証を必要とする、セキュアな TLS 接続を使用します。caBundle
プロパティーは、HTTPS 通信を検証する証明書チェーンを指定します。証明書は Base64 でエンコードされます。
Pod エビクション通知の Webhook 設定
apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration # ... webhooks: - name: strimzi-drain-cleaner.strimzi.io rules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE"] resources: ["pods/eviction"] scope: "Namespaced" clientConfig: service: namespace: "strimzi-drain-cleaner" name: "strimzi-drain-cleaner" path: /drainer port: 443 caBundle: Cg== # ...
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
# ...
webhooks:
- name: strimzi-drain-cleaner.strimzi.io
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods/eviction"]
scope: "Namespaced"
clientConfig:
service:
namespace: "strimzi-drain-cleaner"
name: "strimzi-drain-cleaner"
path: /drainer
port: 443
caBundle: Cg==
# ...
23.1. Streams for Apache Kafka Drain Cleaner のデプロイメントファイルのダウンロード
Streams for Apache Kafka Drain Cleaner をデプロイして使用するには、デプロイメントファイルをダウンロードする必要があります。
Streams for Apache Kafka Drain Cleaner のデプロイメントファイルは、Streams for Apache Kafka ソフトウェアダウンロードページ から入手できます。
23.2. インストールファイルを使用した Streams for Apache Kafka Drain Cleaner のデプロイ
Cluster Operator と Kafka クラスターが実行されている OpenShift クラスターに、Streams for Apache Kafka Drain Cleaner をデプロイします。
Streams for Apache Kafka Drain Cleaner は、2 つの異なるモードで実行できます。デフォルトでは、Drain Cleaner は OpenShift のエビクション要求を拒否 (ブロック) して、OpenShift が Pod をエビクションするのを防ぎ、代わりに Cluster Operator を使用して Pod を移動します。このモードは、さまざまなクラスター自動スケーリングツールとの互換性が高く、特定の PodDisuptionBudget
設定を必要としません。あるいは、レガシーモードを有効にして、Cluster Operator に Pod の移動を指示しながら、エビクション要求を許可することもできます。レガシーモードを機能させるには、maxUnavailable
オプションを 0
に設定して、Pod の削除を許可しないように PodDisruptionBudget
を設定する必要があります。
前提条件
- Streams for Apache Kafka Drain Cleaner のデプロイメントファイルをダウンロード した。
- 更新する OpenShift ワーカーノードで実行している高可用性 Kafka クラスターデプロイメントがある。
トピックを複製して高可用性に対応する
少なくとも 3 つのレプリケーション係数と、レプリケーション係数よりも 1 つ少ない In-Sync レプリカの最小数を指定するトピック設定。
高可用性のためにレプリケートされた Kafka トピック
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
Copy to Clipboard Copied!
Kafka または ZooKeeper の除外
Drain Cleaner 操作に Kafka または ZooKeeper Pod を含めない場合、または Drain Cleaner をレガシーモードで使用する場合は、Drain Cleaner Deployment
設定ファイルでデフォルトの環境変数を変更します。
-
PodDisruptionBudget
設定に依存するレガシーモードを使用するには、STRIMZI_DENY_EVICTION
をfalse
に設定します。 -
KafkaPod を除外するには、
STRIMZI_DRAIN_KAFKA
をfalse
に設定します。 -
ZooKeeper Pod を除外するには、
STRIMZI_DRAIN_ZOOKEEPER
をfalse
に設定します。
ZooKeeper Pod を除外する設定例
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-drain-cleaner containers: - name: strimzi-drain-cleaner # ... env: - name: STRIMZI_DENY_EVICTION value: "true" - name: STRIMZI_DRAIN_KAFKA value: "true" - name: STRIMZI_DRAIN_ZOOKEEPER value: "false" # ...
apiVersion: apps/v1
kind: Deployment
spec:
# ...
template:
spec:
serviceAccountName: strimzi-drain-cleaner
containers:
- name: strimzi-drain-cleaner
# ...
env:
- name: STRIMZI_DENY_EVICTION
value: "true"
- name: STRIMZI_DRAIN_KAFKA
value: "true"
- name: STRIMZI_DRAIN_ZOOKEEPER
value: "false"
# ...
手順
STRIMZI_DENY_EVICTION
環境変数をfalse
に設定して、レガシーモードをアクティベートしている場合は、PodDisruptionBudget
リソースも設定する必要があります。template
設定を使用して、Kafka
リソースの Kafka セクションと ZooKeeper セクションでmaxUnavailable
を0
(ゼロ) に設定します。Pod の Disruption Budget の指定
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: template: podDisruptionBudget: maxUnavailable: 0 # ... zookeeper: template: podDisruptionBudget: maxUnavailable: 0 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: template: podDisruptionBudget: maxUnavailable: 0 # ... zookeeper: template: podDisruptionBudget: maxUnavailable: 0 # ...
Copy to Clipboard Copied! この設定により、計画的な停止の際に Pod の自動エビクションが防止され、Streams for Apache Kafka Drain Cleaner および Cluster Operator が Pod を別のワーカーノードにロールできるようになります。
Streams for Apache Kafka Drain Cleaner を使用して ZooKeeper ノードをドレインする場合は、ZooKeeper に同じ設定を追加します。
Kafka
リソースを更新します。oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! Streams for Apache Kafka Drain Cleaner をデプロイします。
OpenShift で Drain Cleaner を実行するには、
/install/drain-cleaner/openshift
ディレクトリーにあるリソースを適用します。oc apply -f ./install/drain-cleaner/openshift
oc apply -f ./install/drain-cleaner/openshift
Copy to Clipboard Copied!
23.3. Streams for Apache Kafka Drain Cleaner の使用
Streams for Apache Kafka Drain Cleaner を Cluster Operator と組み合わせて使用し、ドレイン対象のノードから Kafka ブローカーまたは ZooKeeper Pod を移動します。Streams for Apache Kafka Drain Cleaner を実行すると、ローリング更新 Pod アノテーションが Pod に付けられます。Cluster Operator はアノテーションに基づいてローリング更新を実行します。
アンチアフィニティー設定を使用する場合の考慮事項
Kafka または ZooKeeper Pod で アンチアフィニティー を使用する場合は、クラスターに予備のワーカーノードを追加することを検討してください。スペアノードを含めることで、ノードのドレイン中や他のノードが一時的に利用できなくなったときにクラスターに Pod を再スケジュールできる容量が確保されます。ワーカーノードがドレインされ、反アフィニティールールによって代替ノードでの Pod の再スケジュールが制限されている場合、スペアノードは、再起動した Pod がスケジュール不能になるのを防ぐのに役立ちます。これにより、ドレイン操作が失敗するリスクが軽減されます。
手順
Kafka ブローカーまたは ZooKeeper Pod をホストする、特定の OpenShift ノードをドレイン (解放) します。
oc get nodes oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --force
oc get nodes oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --force
Copy to Clipboard Copied! Streams for Apache Kafka Drain Cleaner のログのエビクションイベントをチェックして、Pod に再起動のアノテーションが付けられていることを確認します。
Pod のアノテーションを示す Streams for Apache Kafka Drain Cleaner のログ
INFO ... Received eviction webhook for Pod my-cluster-zookeeper-2 in namespace my-project INFO ... Pod my-cluster-zookeeper-2 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-zookeeper-2 in namespace my-project found and annotated for restart INFO ... Received eviction webhook for Pod my-cluster-kafka-0 in namespace my-project INFO ... Pod my-cluster-kafka-0 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-kafka-0 in namespace my-project found and annotated for restart
INFO ... Received eviction webhook for Pod my-cluster-zookeeper-2 in namespace my-project INFO ... Pod my-cluster-zookeeper-2 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-zookeeper-2 in namespace my-project found and annotated for restart INFO ... Received eviction webhook for Pod my-cluster-kafka-0 in namespace my-project INFO ... Pod my-cluster-kafka-0 in namespace my-project will be annotated for restart INFO ... Pod my-cluster-kafka-0 in namespace my-project found and annotated for restart
Copy to Clipboard Copied! Cluster Operator ログで調整イベントを確認し、ローリング更新を確認します。
Cluster Operator log shows rolling updates (Cluster Operator ログによるローリング更新の表示)
INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-zookeeper-2 INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-kafka-0 INFO AbstractOperator:500 - Reconciliation #13(timer) Kafka(my-project/my-cluster): reconciled
INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-zookeeper-2 INFO PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-kafka-0 INFO AbstractOperator:500 - Reconciliation #13(timer) Kafka(my-project/my-cluster): reconciled
Copy to Clipboard Copied!
23.4. Streams for Apache Kafka Drain Cleaner で使用される TLS 証明書の監視
デフォルトでは、Drain Cleaner デプロイメントは、認証に使用する TLS 証明書を含むシークレットを監視します。Drain Cleaner は、証明書の更新などの変更を監視します。変更を検出すると、TLS 証明書の再ロードが再開されます。Drain Cleaner インストールファイルは、デフォルトでこの動作を有効にします。ただし、Drain Cleaner インストールファイルの Deployment
設定 (060-Deployment.yaml
) で STRIMZI_CERTIFICATE_WATCH_ENABLED
環境変数を false
に設定することで、証明書の監視を無効にすることができます。
STRIMZI_CERTIFICATE_WATCH_ENABLED
を有効にすると、TLS 証明書の監視に次の環境変数を使用することもできます。
環境変数 | 説明 | デフォルト |
---|---|---|
| 証明書監視を有効または無効にします。 |
|
| Drain Cleaner がデプロイされ、証明書シークレットが存在する namespace |
|
| Drain Cleaner の Pod 名 | - |
| TLS 証明書を含むシークレットの名前 |
|
| TLS 証明書を含むシークレット内のフィールドのリスト |
|
監視動作を制御するための環境変数設定の例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-drain-cleaner labels: app: strimzi-drain-cleaner namespace: strimzi-drain-cleaner spec: # ... spec: serviceAccountName: strimzi-drain-cleaner containers: - name: strimzi-drain-cleaner # ... env: - name: STRIMZI_DRAIN_KAFKA value: "true" - name: STRIMZI_DRAIN_ZOOKEEPER value: "true" - name: STRIMZI_CERTIFICATE_WATCH_ENABLED value: "true" - name: STRIMZI_CERTIFICATE_WATCH_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_CERTIFICATE_WATCH_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name # ...
apiVersion: apps/v1
kind: Deployment
metadata:
name: strimzi-drain-cleaner
labels:
app: strimzi-drain-cleaner
namespace: strimzi-drain-cleaner
spec:
# ...
spec:
serviceAccountName: strimzi-drain-cleaner
containers:
- name: strimzi-drain-cleaner
# ...
env:
- name: STRIMZI_DRAIN_KAFKA
value: "true"
- name: STRIMZI_DRAIN_ZOOKEEPER
value: "true"
- name: STRIMZI_CERTIFICATE_WATCH_ENABLED
value: "true"
- name: STRIMZI_CERTIFICATE_WATCH_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: STRIMZI_CERTIFICATE_WATCH_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
# ...
Downward API メカニズムを使用して、STRIMZI_CERTIFICATE_WATCH_NAMESPACE
および STRIMZI_CERTIFICATE_WATCH_POD_NAME
を設定します。
第24章 診断およびトラブルシューティングデータの取得
report.sh
診断ツールは Red Hat が提供するスクリプトです。これは、OpenShift 上の Streams for Apache Kafka デプロイメントのトラブルシューティングに不可欠なデータを収集するためのものです。関連するログ、設定ファイル、その他の診断データを収集して、問題の特定と解決に役立てることができます。スクリプトを実行するときに、追加のパラメーターを指定して特定のデータを取得できます。
前提条件
- Bash 4 以降があり、スクリプトを実行できる。
-
OpenShift
oc
コマンドラインツールがインストールされ、稼働中のクラスターに接続するように設定されている。
これにより、oc
コマンドラインツールがクラスターと対話し、必要な診断データを取得するのに必要な認証が確立されます。
手順
ツールをダウンロードして展開します。
診断ツールは、Streams for Apache Kafka ソフトウェアダウンロードページ から入手できます。
ツールを展開したディレクトリーから、ターミナルを開き、レポートツールを実行します。
./report.sh --namespace=<cluster_namespace> --cluster=<cluster_name> --out-dir=<local_output_directory>
./report.sh --namespace=<cluster_namespace> --cluster=<cluster_name> --out-dir=<local_output_directory>
Copy to Clipboard Copied! <cluster_namespace>
は Streams for Apache Kafka デプロイメントの実際の OpenShift namespace に、<cluster_name>
は Kafka クラスターの名前に、<local_output_directory>
は生成されたレポートを保存するローカルディレクトリーへのパスに置き換えます。ディレクトリーを指定しない場合は、一時ディレクトリーが作成されます。必要に応じて、他のオプションのレポートオプションを含めます。
- --bridge=<string>
- Kafka Bridge クラスターの名前を指定して、その Pod とログのデータを取得します。
- --connect=<string>
- Kafka Connect クラスターの名前を指定して、その Pod とログ上のデータを取得します。
- --mm2=<string>
- Pod およびログのデータを取得するために Mirror Maker 2 クラスターの名前を指定します。
- --secrets=(off|hidden|all)
シークレットの詳細レベルを指定します。デフォルトは
hidden
です。利用可能なオプションは以下のとおりです。-
All
: シークレットキーおよびデータの値が報告されます。 -
hidden
: キーだけが含まれるシークレットが報告されます。パスワードなどのデータ値が削除されます。 -
off
: シークレットはまったく報告されません。
-
データ収集オプションを含む要求の例
./report.sh --namespace=my-amq-streams-namespace --cluster=my-kafka-cluster --bridge=my-bridge-component --secrets=all --out-dir=~/reports
./report.sh --namespace=my-amq-streams-namespace --cluster=my-kafka-cluster --bridge=my-bridge-component --secrets=all --out-dir=~/reports
Copy to Clipboard Copied! 注記必要に応じて、
chmod
コマンドを使用して、スクリプトの実行権限をユーザーに割り当てます。たとえば、chmod +x report.sh
などです。
スクリプトの実行が完了すると、出力ディレクトリーに、Streams for Apache Kafka デプロイメントの各コンポーネントについて収集されたログ、設定、およびその他の診断データのファイルとディレクトリーが格納されます。
レポート診断ツールによって収集されるデータ
次のコンポーネントのデータが存在する場合は、それが返されます。
Cluster Operator
- デプロイメント YAML およびログ
- 関連するすべての Pod およびそのログ
- Cluster Operator に関連するリソースの YAML ファイル (ClusterRoles、ClusterRoleBindings)
drain Cleaner (存在する場合)
- デプロイメント YAML およびログ
- Pod ログ
Custom Resources
- カスタムリソース定義 (CRD) YAML
- 関連するすべてのカスタムリソース (CR) の YAML ファイル
Events
- 指定された namespace に関連するイベント
設定
-
Kafka Pod のログおよび設定ファイル (
strimzi.properties
) -
ZooKeeper Pod のログおよび設定ファイル (
zookeeper.properties
) - Entity Operator (Topic Operator、User Operator) Pod ログ
- Cruise Control の Pod ログ
- Kafka Exporter Pod ログ
- Bridge Pod ログ (オプションで指定されている場合)
- Connect Pod ログ (オプションで指定されている場合)
- MirrorMaker 2 Pod ログ (オプションで指定されている場合)
シークレット (オプションで要求された場合)
- 指定された Kafka クラスターに関連するすべてのシークレットの YAML ファイル
第25章 Streams for Apache Kafka のアップグレード
Streams for Apache Kafka インストールをバージョン 2.7 にアップグレードすると、新機能、パフォーマンスの向上、強化されたセキュリティーオプションのメリットが得られます。アップグレード中に、Kafka もサポートされている最新バージョンに更新され、Streams for Apache Kafka のデプロイメントに追加機能とバグ修正が導入されます。
Cluster Operator をアップグレードするには、最初のデプロイ方法と同じ方法を使用します。たとえば、Streams for Apache Kafka のインストールファイルを使用した場合は、そのファイルを変更してアップグレードを実行します。Cluster Operator を 2.7 にアップグレードした後の次のステップは、すべての Kafka ノードをサポートされている最新バージョンの Kafka にアップグレードすることです。Kafka のアップグレードは、Kafka ノードのローリング更新によって Cluster Operator によって実行されます。
新しいバージョンで問題が発生した場合は、Streams for Apache Kafka を以前のバージョンに ダウングレード できます。
リリース済みの Streams for Apache Kafka のバージョンは、Streams for Apache Kafka ソフトウェアダウンロードページ で確認できます。
ダウンタイムなしのアップグレード
高可用性 (レプリケーション係数 3 以上、および均等に分散されたパーティション) で設定されたトピックの場合、アップグレードプロセスによってコンシューマーとプロデューサーにダウンタイムが発生することはありません。
アップグレードによりローリング更新がトリガーされ、プロセスのさまざまな段階でブローカーが 1 つずつ再起動されます。この間、クラスター全体の可用性が一時的に低下するため、ブローカーに障害が発生した場合にメッセージが失われるリスクが増加する可能性があります。
25.1. 必要なアップグレード手順
ダウンタイムなしでブローカーとクライアントをアップグレードするには、Streams for Apache Kafka のアップグレード手順を次の順序で完了する 必要があります。
OpenShift クラスターのバージョンがサポート対象であることを確認します。
Streams for Apache Kafka 2.7 には OpenShift 4.12 - 4.15 が必要です。
- Cluster Operator をアップグレードします。
クラスター設定に応じて Kafka をアップグレードします。
-
KRaft モードで Kafka を使用している場合は、Kafka バージョンと
spec.kafka.metadataVersion
を更新して、すべての Kafka ブローカーとクライアントアプリケーションをアップグレードします。 -
ZooKeeper ベースの Kafka を使用している場合は、Kafka バージョンと
inter.broker.protocol.version
を更新して、すべての Kafka ブローカーとクライアントアプリケーションをアップグレード します。
-
KRaft モードで Kafka を使用している場合は、Kafka バージョンと
Streams for Apache Kafka 2.7 以降、KRaft ベースのクラスター間のアップグレードとダウングレードがサポートされています。
25.2. Streams for Apache Kafka のアップグレードパス
Streams for Apache Kafka には 2 つのアップグレードパスがあります。
- 増分アップグレード
- 増分アップグレードでは、Streams for Apache Kafka を前のマイナーバージョンからバージョン 2.7 にアップグレードします。
- マルチバージョンアップグレード
- マルチバージョンアップグレードでは、1 つ以上の中間バージョンをスキップして、1 回のアップグレードで Streams for Apache Kafka の古いバージョンをバージョン 2.7 にアップグレードします。たとえば、Streams for Apache Kafka 2.3.0 から Streams for Apache Kafka 2.7 に直接アップグレードすることが可能です。
25.2.1. アップグレード時の Kafka バージョンのサポート
Streams for Apache Kafka をアップグレードする場合、使用中の Kafka バージョンとの互換性を確保することが重要です。
サポートされている Kafka バージョンが新旧バージョンで異なる場合でも、マルチバージョンアップグレードが可能です。ただし、現在の Kafka バージョンをサポートしていない新しい Streams for Apache Kafka バージョンにアップグレードしようとすると、Kafka バージョンがサポートされていないことを示すエラーが生成 されます。この場合、Kafka
カスタムリソースの spec.kafka.version
を、新しい Streams for Apache Kafka バージョンでサポートされているバージョンに変更して、Streams for Apache Kafka のアップグレード中に Kafka バージョンをアップグレードする必要があります。
25.2.2. 1.7 より前のバージョンの Streams for Apache Kafka からアップグレードする
バージョン 1.7 より前のバージョンから Streams for Apache Kafka の最新バージョンにアップグレードする場合は、次の手順を実行します。
- 標準の手順 に従って、Streams for Apache Kafka をバージョン 1.7 にアップグレードします。
-
Streams for Apache Kafka に付属する API 変換ツール を使用して、Streams for Apache Kafka カスタムリソースを
v1beta2
に変換します。 次のいずれかを行います。
-
Streams for Apache Kafka をバージョン 1.8 にアップグレードします(
ControlPlaneListener
フィーチャーゲートはデフォルトで無効になっています)。 -
ControlPlaneListener
フィーチャーゲートを無効にして、Streams for Apache Kafka をバージョン 2.0 - 0.31 (ControlPlaneListener
フィーチャーゲートがデフォルトで有効) にアップグレードします。
-
Streams for Apache Kafka をバージョン 1.8 にアップグレードします(
-
ControlPlaneListener
フィーチャーゲートを有効化します。 - 標準の手順 に従って、Streams for Apache Kafka 2.7 にアップグレードします。
Streams for Apache Kafka のカスタムリソースでは、リリース 1.7 から v1beta2
API バージョンの使用を開始しました。Streams for Apache Kafka 1.8 にアップグレードする 前 に、CRD とカスタムリソースを変換する必要があります。API 変換ツールの使用方法については、Streams for Apache Kafka 1.7 アップグレードドキュメント を参照してください。
最初にバージョン 1.7 にアップグレードする代わりに、カスタムリソースをバージョン 1.7 からインストールしてから、リソースを変換することができます。
ControlPlaneListener
機能が、Streams for Apache Kafka で永続的に有効になりました。この機能が無効な Streams for Apache Kafka のバージョンにアップグレードしてから、Cluster Operator 設定の STRIMZI_FEATURE_GATES
環境変数を使用して有効にする必要があります。
ControlPlaneListener
フィーチャーゲートの無効化
env: - name: STRIMZI_FEATURE_GATES value: -ControlPlaneListener
env:
- name: STRIMZI_FEATURE_GATES
value: -ControlPlaneListener
ControlPlaneListener
フィーチャーゲートの有効化
env: - name: STRIMZI_FEATURE_GATES value: +ControlPlaneListener
env:
- name: STRIMZI_FEATURE_GATES
value: +ControlPlaneListener
25.2.3. Kafka バージョンおよびイメージマッピング
Kafka のアップグレード時に、STRIMZI_KAFKA_IMAGES
環境変数と Kafka.spec.kafka.version
プロパティーの設定について考慮してください。
-
各
Kafka
リソースはKafka.spec.kafka.version
を使用して設定できます。指定しない場合は、デフォルトでサポートされている最新の Kafka バージョン (3.7.0) が設定されます。 Cluster Operator の
STRIMZI_KAFKA_IMAGES
環境変数は、Kafka バージョンと、特定のKafka
リソースで特定の Kafka バージョンが要求されたときに使用されるイメージとの間のマッピング (<kafka_version>=<image>) を提供します。たとえば、3.7.0=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 です。-
Kafka.spec.kafka.image
を設定しないと、そのバージョンのデフォルトのイメージが使用されます。 -
Kafka.spec.kafka.image
を設定すると、デフォルトのイメージがオーバーライドされます。
-
Cluster Operator は、Kafka ブローカーの想定されるバージョンが実際にイメージに含まれているかどうかを検証できません。所定のイメージが所定の Kafka バージョンに対応することを必ず確認してください。
25.3. クライアントをアップグレードするストラテジー
Kafka クライアントをアップグレードすると、Kafka の新しいバージョンで導入された機能、修正、改善の恩恵を受けることができます。アップグレードされたクライアントは、他のアップグレードされた Kafka コンポーネントとの互換性を維持します。クライアントのパフォーマンスと安定性も向上する可能性があります。
スムーズな移行を確保するために、Kafka クライアントとブローカーをアップグレードするための最適なアプローチを検討してください。選択するアップグレード戦略は、ブローカーを最初にアップグレードするかクライアントを最初にアップグレードするかによって異なります。Kafka 3.0 以降、ブローカーとクライアントを独立して任意の順序でアップグレードできるようになりました。クライアントまたはブローカーをアップグレードするかどうかは、最初に、アップグレードする必要があるアプリケーションの数や許容できるダウンタイムの量など、いくつかの要因によって決まります。
ブローカーより前にクライアントをアップグレードすると、一部の新機能はブローカーによってまだサポートされていないため、機能しない可能性があります。ただし、ブローカーは、異なるバージョンで実行され、異なるログメッセージバージョンをサポートするプロデューサーとコンシューマーを処理できます。
25.4. 最小限のダウンタイムでの OpenShift のアップグレード
OpenShift をアップグレードする場合は、OpenShift アップグレードのドキュメントを参照して、アップグレードパスとノードを正しくアップグレードする手順を確認してください。OpenShift をアップグレードする前に、Streams for Apache Kafka のバージョンでサポートされているバージョン を確認してください。
アップグレードを実行するときは、次の手順に従って Kafka クラスターの可用性を確認してください。
- Pod の Disruption Budget を設定します。
次のいずれかの方法を使用して Pod をロールします。
- Streams for Apache Kafka Drain Cleaner を使用する (推奨)
- Pod にアノテーションを適用して手動で Pod をロールする
Kafka を稼働し続けるには、高可用性のためにトピックも複製する必要があります。これには、少なくとも 3 つのレプリケーション係数と、レプリケーション係数よりも 1 つ少ない In-Sync レプリカの最小数を指定するトピック設定が必要です。
高可用性のためにレプリケートされた Kafka トピック
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: my-topic
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 1
replicas: 3
config:
# ...
min.insync.replicas: 2
# ...
高可用性環境では、Cluster Operator はアップグレードプロセス時にトピックの In-Sync レプリカの最小数を維持し、ダウンタイムが発生しないようにします。
25.4.1. Drain Cleaner を使用した Pod のローリング
Streams for Apache Kafka Drain Cleaner を使用して OpenShift のアップグレード中にノードを削除する場合、手動のローリング更新アノテーションを使用して Pod にアノテーションを付け、削除する必要がある Pod のローリング更新を実行し、アップグレード中の OpenShift ノードから移動するように Cluster Operator に通知します。
詳細は、23章Streams for Apache Kafka Drain Cleaner を使用した Pod のエビクト を参照してください。
25.4.2. Pod の手動によるローリング(Drain Cleaner の代わり)
Drain Cleaner を使用して Pod をロールする代わりに、Cluster Operator を通じて Pod の手動ローリング更新をトリガーできます。Pod
リソースを使用して、ローリング更新は新規 Pod でリソースの Pod を再起動します。トピックを利用可能な状態に保つことで Drain Cleaner の操作を複製するには、Pod Disruption Budget の maxUnavailable
値を 0 に設定する必要もあります。Pod の Disruption Budget をゼロに減らすと、OpenShift が Pod を自動的にエビクトできなくなります。
Pod の Disruption Budget の指定
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... template: podDisruptionBudget: maxUnavailable: 0 # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: myproject
spec:
kafka:
# ...
template:
podDisruptionBudget:
maxUnavailable: 0
# ...
ドレイン (解放) する必要のある Pod を監視する必要があります。次に Pod アノテーションを追加して更新を行います。
ここで、アノテーションは my-cluster-pool-a-1
という名前の Kafka Pod を更新します。
Kafka Pod での手動ローリング更新の実行
oc annotate pod my-cluster-pool-a-1 strimzi.io/manual-rolling-update="true"
oc annotate pod my-cluster-pool-a-1 strimzi.io/manual-rolling-update="true"
25.5. Cluster Operator のアップグレード
Cluster Operator をアップグレードするには、最初のデプロイ方法と同じ方法を使用します。
25.5.1. インストールファイルを使用した Cluster Operator のアップグレード
この手順では、Streams for Apache Kafka 2.7 を使用するように Cluster Operator デプロイメントをアップグレードする方法を説明します。
インストール YAML ファイルを使用して Cluster Operator をデプロイした場合は、以下の手順に従います。
Cluster Operator によって管理される Kafka クラスターの可用性は、アップグレード操作による影響を受けません。
特定バージョンの Streams for Apache Kafka をサポートするドキュメントを参照して、そのバージョンにアップグレードする方法を確認してください。
前提条件
- 既存の Cluster Operator デプロイメントを利用できる。
- Streams for Apache Kafka 2.7 のリリースアーティファクトをダウンロード した。
手順
-
既存の Cluster Operator リソース (
/install/cluster-operator
ディレクトリー内) に追加した設定変更を書留めておきます。すべての変更は、新しいバージョンの Cluster Operator によって上書きされます。 - カスタムリソースを更新して、Streams for Apache Kafka バージョン 2.7 で使用できるサポート対象の設定オプションを反映します。
Cluster Operator を更新します。
Cluster Operator を実行している namespace に従い、新しい Cluster Operator バージョンのインストールファイルを編集します。
Linux の場合は、以下を使用します。
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! MacOS の場合は、以下を使用します。
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! -
既存の Cluster Operator
Deployment
で 1 つ以上の環境変数を編集した場合、install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
ファイルを編集し、これらの環境変数を使用します。
設定を更新したら、残りのインストールリソースとともにデプロイします。
oc replace -f install/cluster-operator
oc replace -f install/cluster-operator
Copy to Clipboard Copied! ローリング更新が完了するのを待ちます。
新しい Operator バージョンがアップグレード元の Kafka バージョンをサポートしなくなった場合、Cluster Operator はバージョンがサポートされていないことを示すエラーメッセージを返します。そうでない場合は、エラーメッセージは返されません。
エラーメッセージが返される場合は、新しい Cluster Operator バージョンでサポートされる Kafka バージョンにアップグレードします。
-
Kafka
カスタムリソースを編集します。 -
spec kafka.version
プロパティーをサポートされる Kafka バージョンに変更します。
-
- エラーメッセージが返されない場合は、次のステップに進みます。Kafka のバージョンを後でアップグレードします。
Kafka Pod のイメージを取得して、アップグレードが正常に完了したことを確認します。
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
Copy to Clipboard Copied! イメージタグに、新しい Streams for Apache Kafka バージョンと Kafka バージョンが表示されます。
registry.redhat.io/amq-streams/strimzi-kafka-37-rhel9:2.7.0
registry.redhat.io/amq-streams/strimzi-kafka-37-rhel9:2.7.0
Copy to Clipboard Copied!
Cluster Operator はバージョン 2.7 にアップグレードされましたが、管理するクラスターで稼働している Kafka のバージョンは変更されていません。
25.5.2. OperatorHub を使用した Cluster Operator のアップグレード
OperatorHub から Streams for Apache Kafka をデプロイした場合、Operator Lifecycle Manager (OLM) を使用して、Streams for Apache Kafka Operator の更新チャネルを新しい Streams for Apache Kafka バージョンに変更します。
チャネルを更新すると、選択したアップグレード戦略に応じて、次のタイプのアップグレードのいずれかが開始されます。
- 自動アップグレード
- インストール開始前に承認が必要な手動アップグレード
安定した チャンネルに登録すると、チャンネルを変更せずに自動更新を取得できます。ただし、インストール前のアップグレード手順が失われる可能性があるため、自動更新を有効にすることは推奨しません。バージョン固有のチャネルでのみ自動アップグレードを使用します。
OperatorHub を使用した Operator のアップグレードについての詳細は、Upgrading installed Operators (OpenShift documentation) を参照してください。
25.5.3. 一方向のトピック管理への移行
Topic Operator をデプロイしてトピックを管理する場合、Cluster Operator はデフォルトで一方向のトピック管理を有効にします。双方向トピック管理を使用する Streams for Apache Kafka のバージョンから切り替える場合は、Cluster Operator のアップグレード後にいくつかのクリーンアップタスクを実行する必要があります。詳細は、「Topic Operator モード間の切り替え」 を参照してください。
25.5.4. Cluster Operator をアップグレードすると Kafka バージョンエラーが返される
Cluster Operator を、使用している Kafka の現在のバージョンをサポートしていないバージョンにアップグレードすると、サポートされていない Kafka バージョン エラーが発生します。このエラーはすべてのインストール方法に適用され、Kafka をサポートされている Kafka バージョンにアップグレードする必要があることを意味します。Kafka
リソースの spec.kafka.version
をサポートされているバージョンに変更します。
oc
を使用して、Kafka
リソースの ステータス
でこのようなエラーメッセージを確認できます。
エラーの Kafka ステータスの確認
oc get kafka <kafka_cluster_name> -n <namespace> -o jsonpath='{.status.conditions}'
oc get kafka <kafka_cluster_name> -n <namespace> -o jsonpath='{.status.conditions}'
<kafka_cluster_name> は、Kafka クラスターの名前に、<namespace> は、Pod が実行されている OpenShift namespace に置き換えます。
25.5.5. OperatorHub を使用した Streams for Apache Kafka 1.7 以前からのアップグレード
OperatorHub を使用して Streams for Apache Kafka 1.7 以前からアップグレードする場合に必要な操作
Streams for Apache Kafka Operator をバージョン 2.7 にアップグレードする前に、次の変更を行う必要があります。
-
カスタムリソースおよび CRD を
v1beta2
に変換します。 -
ControlPlaneListener
フィーチャーゲートが無効な Streams for Apache Kafka のバージョンにアップグレードします。
これらの要件については、「1.7 より前のバージョンの Streams for Apache Kafka からアップグレードする」 を参照してください。
Streams for Apache Kafka 1.7 以前からアップグレードする場合は、次の手順を実行します。
- Streams for Apache Kafka 1.7 にアップグレードします。
- Streams for Apache Kafka 1.8 に付属する Red Hat Streams for Apache Kafka API 変換ツール を、Streams for Apache Kafka ソフトウェアダウンロードページ からダウンロードします。
カスタムリソースおよび CRD を
v1beta2
に変換します。詳細は、Streams for Apache Kafka 1.7 のアップグレードドキュメント を参照してください。
- OperatorHub で、Streams for Apache Kafka Operator のバージョン 1.7 を削除します。
Streams for Apache Kafka Operator のバージョン 2.7 も存在する場合は削除します。
存在しない場合は、次のステップに進みます。
Streams for Apache Kafka Operator の Approval Strategy が Automatic に設定されている場合、Operator のバージョン 2.7 がクラスター内にすでに存在している可能性があります。リリース前にカスタムリソースおよび CRD を
v1beta2
API バージョンに 変換しなかった 場合、Operator が管理するカスタムリソースおよび CRD は古い API バージョンを使用します。その結果、2.7 Operator は Pending ステータスで停止します。このような場合、Streams for Apache Kafka Operator のバージョン 1.7 だけでなくバージョン 2.7 も削除する必要があります。両方の Operator を削除すると、新しい Operator バージョンがインストールされるまで、調整は一時停止されます。カスタムリソースへの変更が遅延しないように、次の手順を直ちに実行します。
OperatorHub で、次のいずれかを実行します。
-
Streams for Apache Kafka Operator のバージョン 1.8 (
ControlPlaneListener
フィーチャーゲートがデフォルトで無効) にアップグレードします。 -
ControlPlaneListener
フィーチャーゲートを無効にして、Streams for Apache Kafka Operator のバージョン 2.0 または 2.2 (ControlPlaneListener
フィーチャーゲートがデフォルトで有効) にアップグレードします。
-
Streams for Apache Kafka Operator のバージョン 1.8 (
速やかに Streams for Apache Kafka Operator のバージョン 2.7 にアップグレードします。
インストールされた 2.7 Operator はクラスターの監視を開始し、ローリング更新を実行します。このプロセス中に、クラスターのパフォーマンスが一時的に低下する場合があります。
25.6. KRaft ベースの Kafka クラスターとクライアントアプリケーションのアップグレード
KRaft ベースの Streams for Apache Kafka クラスターを、サポートされている新しい Kafka バージョンと KRaft メタデータバージョンにアップグレードします。
クライアントをアップグレードするストラテジー を選択する必要もあります。Kafka クライアントは、この手順の 6 でアップグレードされます。
KRaft ベースのアップグレードのサポートに関する最新情報は、Apache Kafka のドキュメントを参照してください。
前提条件
- Cluster Operator が稼働中である。
-
Streams for Apache Kafka クラスターをアップグレードする前に、
Kafka
リソースのプロパティーに、新しい Kafka バージョンでサポートされていない設定オプションが 含まれていない ことを確認した。
手順
Kafka クラスター設定を更新します。
oc edit kafka <kafka_configuration_file>
oc edit kafka <kafka_configuration_file>
Copy to Clipboard Copied! 設定されている場合は、現在の
spec.kafka.metadataVersion
が、アップグレード先の Kafka のバージョンでサポートされているバージョンに設定されていることを確認してください。たとえば、Kafka バージョン 3.6.0 から 3.7.0 にアップグレードする場合、現在のバージョンは 3.6-IV2 です。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2 version: 3.6.0 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2 version: 3.6.0 # ...
Copy to Clipboard Copied! metadataVersion
が設定されていない場合、次のステップで Kafka バージョンを更新した後、Streams for Apache Kafka はそれを現在のデフォルトに自動的に更新します。注記metadataVersion
の値は、浮動小数点数として解釈されないように文字列にする必要があります。Kafka.spec.kafka.version
を変更して、新しい Kafka バージョンを指定します。現在の Kafka バージョンでは、metadataVersion
をデフォルトのままにしておきます。注記kafka.version
を変更すると、クラスターのすべてのブローカーがアップグレードされ、新しいブローカーバイナリーの使用が開始されます。このプロセスでは、一部のブローカーは古いバイナリーを使用し、他のブローカーはすでに新しいバイナリーにアップグレードされています。metadataVersion
を現在の設定のままにしておくと、Kafka ブローカーとコントローラーがアップグレード中も相互に通信し続けることができます。たとえば、Kafka 3.6.0 から 3.7.0 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2 version: 3.7.0 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2
1 version: 3.7.0
2 # ...
Copy to Clipboard Copied! Kafka クラスターのイメージが
Kafka.spec.kafka.image
のKafka
カスタムリソースで定義されている場合、image
を更新して、新しい Kafka バージョンでコンテナーイメージを示すようにします。Kafka バージョンおよびイメージマッピング を参照してください。
保存してエディターを終了し、ローリング更新による Kafka ノードのアップグレードが完了するまで待ちます。
Pod の状態の遷移を監視して、ローリング更新の進捗を確認します。
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
Copy to Clipboard Copied! ローリング更新により、各 Pod が新バージョンの Kafka のブローカーバイナリーを使用するようになります。
クライアントのアップグレードに選択したストラテジー に応じて、新バージョンのクライアントバイナリーを使用するようにすべてのクライアントアプリケーションをアップグレードします。
必要に応じて、Kafka Connect および MirrorMaker の
version
プロパティーを新バージョンの Kafka として設定します。-
Kafka Connect では、
KafkaConnect.spec.version
を更新します。 -
MirrorMaker では、
KafkaMirrorMaker.spec.version
を更新します。 MirrorMaker 2 の場合は、
KafkaMirrorMaker2.spec.version
を更新します。注記手動でビルドしたカスタムイメージを使用している場合は、最新の Streams for Apache Kafka ベースイメージを使用してそのイメージを最新の状態にするために、イメージを再ビルドする必要があります。たとえば、Kafka Connect のベースイメージからコンテナーイメージを作成した 場合は、最新のベースイメージとビルド設定を参照するように Dockerfile を更新します。
-
Kafka Connect では、
- アップグレードされたクライアントアプリケーションが新しい Kafka ブローカーで正しく動作することを確認します。
設定されている場合は、新しい
metadataVersion
バージョンを使用するように Kafka リソースを更新します。それ以外の場合は、ステップ 9 に進みます。たとえば、Kafka 3.7.0 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.7-IV2 version: 3.7.0 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.7-IV2 version: 3.7.0 # ...
Copy to Clipboard Copied! 警告ダウングレードできない可能性があるため、
metadataVersion
を変更する場合は注意してください。新しい Kafka バージョンのmetadataVersion
が、ダウングレード先の Kafka バージョンよりも高い場合は、Kafka をダウングレードすることができません。ただし、古いバージョンを維持する場合は、サポートと互換性に潜在的な影響があることを理解してください。Cluster Operator によってクラスターが更新されるまで待ちます。
25.7. ZooKeeper 使用時の Kafka のアップグレード
ZooKeeper ベースの Kafka クラスターを使用している場合、アップグレードには Kafka バージョンとブローカー間プロトコルバージョンの更新が必要です。
メタデータ管理に ZooKeeper を使用する状態から KRaft モードで動作する状態へと Kafka クラスターを切り替える場合は、アップグレードとは別の手順を実行する必要があります。KRaft ベースのクラスターへの移行については、8章KRaft モードへの移行 を参照してください。
25.7.1. Kafka バージョンの更新
クラスター管理に ZooKeeper を使用する場合に Kafka をアップグレードするには、Kafka
リソースの設定内の Kafka バージョン (Kafka.spec.kafka.version
) とそのブローカー間プロトコルバージョン (inter.broker.protocol.version
) を更新する必要があります。Kafka の各バージョンには、互換性のあるバージョンの Inter-broker プロトコルがあります。ブローカー間プロトコルは、ブローカー間の通信に使用されます。上記の表が示すように、プロトコルのマイナーバージョンは、通常 Kafka のマイナーバージョンと一致するように番号が増加されます。Inter-broker プロトコルのバージョンは、Kafka
リソースでクラスター全体に設定されます。これを変更するには、Kafka.spec.kafka.config
の inter.broker.protocol.version
プロパティーを編集します。
以下の表は、Kafka バージョンの違いを示しています。
Streams for Apache Kafka バージョン | Kafka バージョン | Inter-broker プロトコルバージョン | ログメッセージ形式バージョン | ZooKeeper バージョン |
---|---|---|---|---|
2.7 | 3.7.0 | 3.7 | 3.7 | 3.8.3 |
2.6 | 3.6.0 | 3.6 | 3.6 | 3.8.3 |
- Kafka 3.7.0 は実稼働環境での使用がサポートされています。
- Kafka 3.6.0 は、Streams for Apache Kafka 2.7 にアップグレードする目的でのみサポートされます。
ログメッセージ形式バージョン
プロデューサーが Kafka ブローカーにメッセージを送信すると、特定の形式を使用してメッセージがエンコードされます。この形式は Kafka のリリース間で変更になる可能性があるため、メッセージにはエンコードに使用されたメッセージ形式のバージョンが指定されます。
特定のメッセージ形式のバージョンを設定するために使用されるプロパティーは以下のとおりです。
-
トピック用の
message.format.version
プロパティー -
Kafka ブローカーの
log.message.format.version
プロパティー
Kafka 3.0.0 以降、メッセージ形式のバージョンの値は inter.broker.protocol.version
と一致すると見なされ、設定する必要はありません。値は、使用される Kafka バージョンを反映します。
Kafka 3.0.0 以降にアップグレードする場合は、inter.broker.protocol.version
を更新する際にこの設定を削除できます。それ以外の場合は、アップグレード先の Kafka バージョンに基づいてメッセージ形式のバージョンを設定できます。
トピックの message.format.version
のデフォルト値は、Kafka ブローカーに設定される log.message.format.version
によって定義されます。トピックの message.format.version
は、トピック設定を編集すると手動で設定できます。
Kafka バージョン変更によるローリング更新
Cluster Operator は、Kafka バージョンが更新されると、Kafka ブローカーへのローリング更新を開始します。さらなるローリング更新は、inter.broker.protocol.version
および log.message.format.version
の設定に応じて異なります。
Kafka.spec.kafka.config に以下が含まれている場合 | Cluster Operator によって開始されるもの |
---|---|
|
単一のローリング更新。更新後、 |
| 2 つのローリング更新 |
| 2 つのローリング更新 |
Kafka 3.0.0 以降、inter.broker.protocol.version
が 3.0
以上に設定されていると、log.message.format.version
オプションは無視されるため、設定する必要はありません。ブローカーの log.message.format.version
プロパティーおよびトピックの message.format.version
プロパティーは、非推奨となり、Kafka の今後のリリースで削除されます。
Cluster Operator は、Kafka のアップグレードの一環として、ZooKeeper のローリング更新を開始します。
- ZooKeeper バージョンが変更されなくても、単一のローリング更新が発生します。
- 新しいバージョンの Kafka に新しいバージョンの ZooKeeper が必要な場合、追加のローリング更新が発生します。
25.7.2. 古いメッセージ形式を使用したクライアントのアップグレード
Kafka 3.0 より前では、log.message.format.version
プロパティー (またはトピックレベルの message.format.version
プロパティー) を使用して、ブローカーの特定のメッセージ形式を設定できました。これにより、ブローカーは、古いメッセージ形式を使用していた古い Kafka クライアントに対応できるようになりました。Kafka は本質的に、このプロパティーを明示的に設定しなくても古いクライアントをサポートしますが、ブローカーは古いクライアントからのメッセージを変換する必要があり、これにはかなりのパフォーマンスコストが伴います。
Apache Kafka Java クライアントは、バージョン 0.11 以降、最新のメッセージ形式バージョンをサポートしています。すべてのクライアントが最新のメッセージバージョンを使用している場合は、ブローカーをアップグレードするときに、log.message.format.version
または message.format.version
のオーバーライドを削除できます。
ただし、古いメッセージ形式バージョンを使用しているクライアントがまだある場合は、まずクライアントをアップグレードすることを推奨します。コンシューマーから始めて、ブローカーのアップグレード時に log.message.format.version
または message.format.version
のオーバーライドを削除する前に、プロデューサーをアップグレードします。これにより、すべてのクライアントが最新のメッセージ形式バージョンをサポートできるようになり、アップグレードプロセスがスムーズに進むようになります。
次のメトリックを使用して、Kafka クライアントの名前とバージョンを追跡できます。
-
kafka.server:type=socket-server-metrics,clientSoftwareName=<name>,clientSoftwareVersion=<version>,listener=<listener>,networkProcessor=<processor>
次の Kafka ブローカーメトリックは、メッセージのダウンコンバージョンのパフォーマンスを監視するのに役立ちます。
-
kafka.network:type=RequestMetrics,name=MessageConversionsTimeMs,request={Produce|Fetch}
はメッセージ変換の実行にかかる時間に関するメトリックを提供します。 -
kafka.server:type=BrokerTopicMetrics,name={Produce|Fetch}MessageConversionsPerSec,topic=(-.\w+)
は一定期間に変換されたメッセージの数に関するメトリックを提供します。
25.7.3. ZooKeeper ベースの Kafka クラスターとクライアントアプリケーションのアップグレード
ZooKeeper ベースの Streams for Apache Kafka クラスターを、サポートされている新しい Kafka バージョンとブローカー間プロトコルバージョンにアップグレードします。
クライアントをアップグレードするストラテジー を選択する必要もあります。Kafka クライアントは、この手順の 6 でアップグレードされます。
前提条件
- Cluster Operator が稼働中である。
-
Streams for Apache Kafka クラスターをアップグレードする前に、
Kafka
リソースのプロパティーに、新しい Kafka バージョンでサポートされていない設定オプションが 含まれていない ことを確認した。
手順
Kafka クラスター設定を更新します。
oc edit kafka <kafka_configuration_file>
oc edit kafka <kafka_configuration_file>
Copy to Clipboard Copied! 設定されている場合は、
inter.broker.protocol.version
およびlog.message.format.version
プロパティーが 現在の バージョンに設定されていることを確認してください。たとえば、Kafka バージョン 3.6.0 から 3.7.0 にアップグレードする場合、現在のバージョンは 3.6 です。
kind: Kafka spec: # ... kafka: version: 3.6.0 config: log.message.format.version: "3.6" inter.broker.protocol.version: "3.6" # ...
kind: Kafka spec: # ... kafka: version: 3.6.0 config: log.message.format.version: "3.6" inter.broker.protocol.version: "3.6" # ...
Copy to Clipboard Copied! log.message.format.version
およびinter.broker.protocol.version
が設定されていない場合、Streams for Apache Kafka では、次のステップでの Kafka バージョンの更新後、これらのバージョンを現在のデフォルトに自動的に更新します。注記log.message.format.version
およびinter.broker.protocol.version
の値は、浮動小数点数として解釈されないように文字列である必要があります。Kafka.spec.kafka.version
を変更して、新しい Kafka バージョンを指定します。現在の Kafka バージョンのデフォルトでlog.message.format.version
およびinter.broker.protocol.version
のままにします。注記kafka.version
を変更すると、クラスターのすべてのブローカーがアップグレードされ、新しいブローカーバイナリーの使用が開始されます。このプロセスでは、一部のブローカーは古いバイナリーを使用し、他のブローカーはすでに新しいバイナリーにアップグレードされています。inter.broker.protocol.version
を現在の設定のままにしておくと、ブローカーはアップグレード中に相互に通信し続けることができます。たとえば、Kafka 3.6.0 から 3.7.0 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.6" inter.broker.protocol.version: "3.6" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0
1 config: log.message.format.version: "3.6"
2 inter.broker.protocol.version: "3.6"
3 # ...
Copy to Clipboard Copied! 警告新しい Kafka バージョンの
inter.broker.protocol.version
が変更された場合は、Kafka をダウングレードできません。ブローカー間プロトコルのバージョンは、__consumer_offsets
に書き込まれたメッセージなど、ブローカーによって保存される永続メタデータに使用されるスキーマを判断します。ダウングレードされたクラスターはメッセージを理解しません。Kafka クラスターのイメージが
Kafka.spec.kafka.image
のKafka
カスタムリソースで定義されている場合、image
を更新して、新しい Kafka バージョンでコンテナーイメージを示すようにします。Kafka バージョンおよびイメージマッピング を参照してください。
エディターを保存して終了し、ローリング更新の完了を待ちます。
Pod の状態の遷移を監視して、ローリング更新の進捗を確認します。
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
Copy to Clipboard Copied! ローリング更新により、各 Pod が新バージョンの Kafka のブローカーバイナリーを使用するようになります。
クライアントのアップグレードに選択したストラテジー に応じて、新バージョンのクライアントバイナリーを使用するようにすべてのクライアントアプリケーションをアップグレードします。
必要に応じて、Kafka Connect および MirrorMaker の
version
プロパティーを新バージョンの Kafka として設定します。-
Kafka Connect では、
KafkaConnect.spec.version
を更新します。 -
MirrorMaker では、
KafkaMirrorMaker.spec.version
を更新します。 MirrorMaker 2 の場合は、
KafkaMirrorMaker2.spec.version
を更新します。注記手動でビルドしたカスタムイメージを使用している場合は、最新の Streams for Apache Kafka ベースイメージを使用してそのイメージを最新の状態にするために、イメージを再ビルドする必要があります。たとえば、Kafka Connect のベースイメージからコンテナーイメージを作成した 場合は、最新のベースイメージとビルド設定を参照するように Dockerfile を更新します。
-
Kafka Connect では、
- アップグレードされたクライアントアプリケーションが新しい Kafka ブローカーで正しく動作することを確認します。
設定されている場合、新しい
inter.broker.protocol.version
バージョンを使用するように Kafka リソースを更新します。それ以外の場合は、ステップ 9 に進みます。たとえば、Kafka 3.7.0 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.6" inter.broker.protocol.version: "3.7" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.6" inter.broker.protocol.version: "3.7" # ...
Copy to Clipboard Copied! - Cluster Operator によってクラスターが更新されるまで待ちます。
設定されている場合、新しい
log.message.format.version
バージョンを使用するように Kafka リソースを更新します。それ以外の場合は、ステップ 10 に進みます。たとえば、Kafka 3.7.0 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.7" inter.broker.protocol.version: "3.7" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.7" inter.broker.protocol.version: "3.7" # ...
Copy to Clipboard Copied! 重要Kafka 3.0.0 以降、
inter.broker.protocol.version
が3.0
以上に設定されていると、log.message.format.version
オプションは無視されるため、設定する必要はありません。Cluster Operator によってクラスターが更新されるまで待ちます。
25.8. アップグレードのステータスの確認
アップグレード (またはダウングレード) を実行するときは、Kafka
カスタムリソースのステータスで正常に完了したことを確認できます。ステータスには、使用中の Streams for Apache Kafka および Kafka のバージョンに関する情報が表示されます。
アップグレードの完了後に正しいバージョンを確保するには、Kafka ステータスの kafkaVersion
および operatorLastSuccessfulVersion
の値を確認します。
-
operatorLastSuccessfulVersion
は、最後に正常に調整を実行した Streams for Apache Kafka Operator のバージョンです。 -
kafkaVersion
は、Kafka クラスターによって使用されている Kafka のバージョンです。 -
kafkaMetadataVersion
は、KRaft ベースの Kafka クラスターで使用されるメタデータのバージョンです。
これらの値を使用して、Streams for Apache Kafka または Kafka のアップグレードが完了したかどうかを確認できます。
Kafka ステータスからのアップグレードの確認
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: spec: # ... status: # ... kafkaVersion: 3.7.0 operatorLastSuccessfulVersion: 2.7 kafkaMetadataVersion: 3.7
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
spec:
# ...
status:
# ...
kafkaVersion: 3.7.0
operatorLastSuccessfulVersion: 2.7
kafkaMetadataVersion: 3.7
25.9. Streams for Apache Kafka のアップグレード時に FIPS モードに切り替える
FIPS 対応の OpenShift クラスターで FIPS モードで実行できるように、Streams for Apache Kafka をアップグレードします。Streams for Apache Kafka 2.3 までは、FIPS 対応の OpenShift クラスターで実行するには、FIPS_MODE
環境変数を使用して FIPS モードを無効にする必要がありました。リリース 2.3 以降の Streams for Apache Kafka は、FIPS モードをサポートします。FIPS_MODE
が disabled
に設定されている FIPS 対応の OpenShift クラスターで Streams for Apache Kafka を実行する場合は、次の手順に従って FIPS モードを有効にできます。
前提条件
- FIPS 対応の OpenShift クラスター
-
FIPS_MODE
環境変数がdisabled
に設定された既存の Cluster Operator デプロイメント
手順
-
Cluster Operator をバージョン 2.3 以降にアップグレードしますが、
FIPS_MODE
環境変数をdisabled
に設定したままにします。 最初に 2.3 より古いバージョンの Streams for Apache Kafka をデプロイした場合、PKCS #12 ストアで古い暗号化およびダイジェストアルゴリズムが使用される可能性があります。これらは、FIPS が有効になっている場合はサポートされません。更新されたアルゴリズムで証明書を再作成するには、クラスターとクライアントの CA 証明書を更新します。
-
Cluster Operator によって生成された CA を更新するには、
force-renew
アノテーションを CA シークレットに追加して更新をトリガー します。 -
独自の CA を更新するには、新しい証明書を CA シークレットに追加し、より高い増分値で
ca-cert-generation
アノテーションを更新して、更新をキャプチャー します。
-
Cluster Operator によって生成された CA を更新するには、
SCRAM-SHA-512 認証を使用する場合は、ユーザーのパスワードの長さを確認してください。長さが 32 文字未満の場合は、次のいずれかの方法で新しいパスワードを生成します。
- ユーザーシークレットを削除して、User Operator が十分な長さの新しいパスワードで新しいユーザーシークレットを生成できるようにします。
-
KafkaUser
カスタムリソースの.spec.authentication.password
プロパティーを使用してパスワードを指定した場合は、同じパスワード設定で参照されている OpenShift シークレットのパスワードを更新します。新しいパスワードを使用するようにクライアントを更新することを忘れないでください。
- CA 証明書が正しいアルゴリズムを使用していること、および SCRAM-SHA-512 パスワードが十分な長さであることを確認してください。その後、FIPS モードを有効にできます。
-
Cluster Operator デプロイメントから
FIPS_MODE
環境変数を削除します。これにより Cluster Operator が再起動され、すべてのオペランドがロールされて FIPS モードが有効になります。再起動が完了すると、すべての Kafka クラスターが FIPS モードを有効にして実行されるようになります。
第26章 Streams for Apache Kafka のダウングレード
アップグレードしたバージョンの Streams for Apache Kafka で問題が発生した場合は、インストールを直前のバージョンに戻すことができます。
YAML インストールファイルを使用して Streams for Apache Kafka をインストールした場合は、以前のリリースの YAML インストールファイルを使用してダウングレード手順を実行できます。Cluster Operator と使用中の Kafka のバージョンを更新することで、Streams for Apache Kafka をダウングレードできます。Kafka バージョンのダウングレードは、Cluster Operator によって実行されます。
次のダウングレード手順は、インストールファイルを使用して Streams for Apache Kafka をインストールした場合にのみ適しています。OperatorHub などの別の方法を使用して Streams for Apache Kafka をインストールした場合、ドキュメントに記載されていない限り、その方法ではダウングレードがサポートされていない可能性があります。ダウングレードプロセスを確実に成功させるには、サポートされているアプローチを使用することが不可欠です。
26.1. Cluster Operator の以前のバージョンへのダウングレード
Streams for Apache Kafka で問題が発生した場合は、インストールを元に戻すことができます。
この手順では、Cluster Operator デプロイメントを以前のバージョンにダウングレードする方法を説明します。
前提条件
- 既存の Cluster Operator デプロイメントを利用できる。
- 以前のバージョンのインストールファイルがダウンロード済み である必要があります。
作業を開始する前に
Streams for Apache Kafka フィーチャーゲート のダウングレード要件を確認します。フィーチャーゲートが永続的に有効になっている場合は、ターゲットバージョンにダウングレードする前に、フィーチャーゲートを無効にできるバージョンにダウングレードする必要がある場合があります。
手順
-
既存の Cluster Operator リソース (
/install/cluster-operator
ディレクトリー内) に追加した設定変更を書留めておきます。すべての変更は、以前のバージョンの Cluster Operator によって上書きされます。 - カスタムリソースを元に戻して、ダウングレードする Streams for Apache Kafka バージョンで利用可能なサポート対象の設定オプションを反映します。
Cluster Operator を更新します。
Cluster Operator を実行している namespace に従い、以前のバージョンのインストールファイルを編集します。
Linux の場合は、以下を使用します。
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! MacOS の場合は、以下を使用します。
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
Copy to Clipboard Copied! -
既存の Cluster Operator
Deployment
で 1 つ以上の環境変数を編集した場合、install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
ファイルを編集し、これらの環境変数を使用します。
設定を更新したら、残りのインストールリソースとともにデプロイします。
oc replace -f install/cluster-operator
oc replace -f install/cluster-operator
Copy to Clipboard Copied! ローリング更新が完了するのを待ちます。
Kafka Pod のイメージを取得して、ダウングレードが正常に完了したことを確認します。
oc get pod my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
oc get pod my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
Copy to Clipboard Copied! イメージタグには、新しい Streams for Apache Kafka バージョンと Kafka バージョンが表示されます。たとえば、
<strimzi_version>-kafka-<kafka_version>
です。
26.2. KRaft ベースの Kafka クラスターとクライアントアプリケーションのダウングレード
KRaft ベースの Streams for Apache Kafka クラスターを以前のバージョンにダウングレードします。KRaft ベースの Streams for Apache Kafka クラスターを下位バージョンにダウングレードする場合 (3.7.0 から 3.6.0 に移行する場合など)、Kafka クラスターで使用されているメタデータバージョンが、ダウングレード先の Kafka バージョンでサポートされているバージョンであることを確認してください。ダウングレード元の Kafka バージョンのメタデータバージョンは、ダウングレード先のバージョンより高くすることはできません。
KRaft ベースのダウングレードに関連するサポートと制限事項については、Apache Kafka のドキュメントを参照してください。
前提条件
- Cluster Operator が稼働中である。
Streams for Apache Kafka クラスターをダウングレードする前に、
Kafka
リソースについて次の点を確認してください。-
Kafka
カスタムリソースには、ダウングレードされる Kafka バージョンでサポートされていないオプションは含まれません。 -
spec.kafka.metadataVersion
は、ダウングレードされる Kafka バージョンでサポートされるバージョンに設定されます。
-
手順
Kafka クラスター設定を更新します。
oc edit kafka <kafka_configuration_file>
oc edit kafka <kafka_configuration_file>
Copy to Clipboard Copied! metadataVersion
バージョンを、ダウングレードする Kafka バージョンでサポートされているバージョンに変更します。Kafka.spec.kafka.version
は 現在の Kafka バージョンのままにしておきます。たとえば、Kafka 3.7.0 から 3.6.0 にダウングレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2 version: 3.7.0 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2
1 version: 3.7.0
2 # ...
Copy to Clipboard Copied! 注記metadataVersion
の値は、浮動小数点数として解釈されないように文字列にする必要があります。-
変更を保存し、Cluster Operator が
Kafka
リソースの.status.kafkaMetadataVersion
を更新するまで待ちます。 Kafka.spec.kafka.version
を以前のバージョンに変更します。たとえば、Kafka 3.7.0 から 3.6.0 にダウングレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2 version: 3.6.0 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 metadataVersion: 3.6-IV2
1 version: 3.6.0
2 # ...
Copy to Clipboard Copied! Kafka バージョンのイメージが Cluster Operator の
STRIMZI_KAFKA_IMAGES
に定義されているイメージとは異なる場合は、Kafka.spec.kafka.image
を更新します。「Kafka バージョンおよびイメージマッピング」を参照してください。
Cluster Operator によってクラスターが更新されるまで待ちます。
すべてのクライアントアプリケーション (コンシューマー) をダウングレードして、以前のバージョンのクライアントバイナリーを使用します。
これで、Kafka クラスターおよびクライアントは以前の Kafka バージョンを使用するようになります。
26.3. ZooKeeper 使用時の Kafka のダウングレード
ZooKeeper モードで Kafka を使用している場合、ダウングレードプロセスには、Kafka バージョンと、関連する log.message.format.version
および inter.broker.protocol.version
プロパティーの変更が含まれます。
26.3.1. ダウングレードでの Kafka バージョンの互換性
Kafka のダウングレードは、互換性のある現在およびターゲットの Kafka バージョン と、メッセージがログに記録された状態に依存します。
そのバージョンが、クラスターでこれまで使用された inter.broker.protocol.version
設定をサポートしない場合、または新しい log.message.format.version
を使用するメッセージログにメッセージが追加された場合は、下位バージョンの Kafka に戻すことはできません。
Inter.broker.protocol.version
は、__consumer_offsets
に書き込まれたメッセージのスキーマなど、ブローカーによって保存される永続メタデータに使用されるスキーマを判断します。クラスターで以前使用された inter.broker.protocol.version
が認識されない Kafka バージョンにダウングレードすると、ブローカーが認識できないデータが発生します。
ダウングレードする Kafka のバージョンの関係は次のとおりです。
-
ダウングレードする Kafka バージョンの
log.message.format.version
が現行バージョンと 同じ である場合、Cluster Operator は、ブローカーのローリング再起動を 1 回実行してダウングレードを行います。 別の
log.message.format.version
の場合、ダウングレード後の Kafka バージョンが使用するバージョンに設定されたlog.message.format.version
が常に 実行中のクラスターに存在する場合に限り、ダウングレードが可能です。通常は、アップグレードの手順がlog.message.format.version
の変更前に中止された場合にのみ該当します。その場合、ダウングレードには以下が必要です。- 2 つのバージョンで Interbroker プロトコルが異なる場合、ブローカーのローリング再起動が 2 回必要です。
- 両バージョンで同じ場合は、ローリング再起動が 1 回必要です。
以前のバージョンでサポートされない log.message.format.version
が新バージョンで使われていた場合 (log.message.format.version
のデフォルト値が使われていた場合など)、ダウングレードは実行 できません。たとえば、log.message.format.version
が変更されていないため、このリソースは Kafka バージョン 3.6.0 にダウングレードできます。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.7.0 config: log.message.format.version: "3.6" # ...
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
# ...
kafka:
version: 3.7.0
config:
log.message.format.version: "3.6"
# ...
log.message.format.version
が "3.7"
に設定されているか、値が指定されていない場合、パラメーターが 3.7.0 ブローカーのデフォルト値 3.7 を取得した場合、ダウングレードは不可能です。
Kafka 3.0.0 以降、inter.broker.protocol.version
が 3.0
以上に設定されていると、log.message.format.version
オプションは無視されるため、設定する必要はありません。
26.3.2. ZooKeeper ベースの Kafka クラスターとクライアントアプリケーションのダウングレード
ZooKeeper ベースの Streams for Apache Kafka クラスターを以前のバージョンにダウングレードします。ZooKeeper ベースの Streams for Apache Kafka クラスターを下位バージョンにダウングレードする場合 (3.7.0 から 3.6.0 に移行する場合など)、Kafka クラスターで使用されているブローカー間プロトコルバージョンが、ダウングレード先の Kafka バージョンでサポートされているバージョンであることを確認します。ダウングレード元の Kafka バージョンのブローカー間プロトコルバージョンは、ダウングレード先のバージョンより高くする必要があります。
ZooKeeper ベースのダウングレードに関連するサポートと制限事項については、Apache Kafka のドキュメントを参照してください。
前提条件
- Cluster Operator が稼働中である。
Streams for Apache Kafka クラスターをダウングレードする前に、
Kafka
リソースについて次の点を確認してください。- 重要: Kafka バージョンの互換性。
-
Kafka
カスタムリソースには、ダウングレードされる Kafka バージョンでサポートされていないオプションは含まれません。 Kafka.spec.kafka.config
に、ダウングレード先の Kafka バージョンでサポートされるlog.message.format.version
とinter.broker.protocol.version
がある。Kafka 3.0.0 以降、
inter.broker.protocol.version
が3.0
以上に設定されていると、log.message.format.version
オプションは無視されるため、設定する必要はありません。
手順
Kafka クラスター設定を更新します。
oc edit kafka <kafka_configuration_file>
oc edit kafka <kafka_configuration_file>
Copy to Clipboard Copied! inter.broker.protocol.version
バージョン (および該当する場合はlog.message.format.version
) を、ダウングレードする Kafka バージョンでサポートされているバージョンに変更します。Kafka.spec.kafka.version
は 現在の Kafka バージョンのままにしておきます。たとえば、Kafka 3.7.0 から 3.6.0 にダウングレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafka: version: 3.7.0 config: inter.broker.protocol.version: "3.6" log.message.format.version: "3.6" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafka: version: 3.7.0
1 config: inter.broker.protocol.version: "3.6"
2 log.message.format.version: "3.6" # ...
Copy to Clipboard Copied! 注記log.message.format.version
およびinter.broker.protocol.version
の値は、浮動小数点数として解釈されないように文字列である必要があります。エディターを保存して終了し、ローリング更新の完了を待ちます。
Pod の状態の遷移を監視して、ローリング更新の進捗を確認します。
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
Copy to Clipboard Copied! ローリング更新により、各 Pod が指定された Kafka ブローカー間プロトコルバージョンを使用していることが保証されます。
Kafka.spec.kafka.version
を以前のバージョンに変更します。たとえば、Kafka 3.7.0 から 3.6.0 にダウングレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafka: version: 3.6.0 config: inter.broker.protocol.version: "3.6" log.message.format.version: "3.6" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... kafka: version: 3.6.0
1 config: inter.broker.protocol.version: "3.6"
2 log.message.format.version: "3.6" # ...
Copy to Clipboard Copied! Kafka バージョンのイメージが Cluster Operator の
STRIMZI_KAFKA_IMAGES
に定義されているイメージとは異なる場合は、Kafka.spec.kafka.image
を更新します。「Kafka バージョンおよびイメージマッピング」を参照してください。
Cluster Operator によってクラスターが更新されるまで待ちます。
すべてのクライアントアプリケーション (コンシューマー) をダウングレードして、以前のバージョンのクライアントバイナリーを使用します。
これで、Kafka クラスターおよびクライアントは以前の Kafka バージョンを使用するようになります。
トピックメタデータの保存に ZooKeeper を使用する 1.7 よりも前のバージョンの Streams for Apache Kafka に戻す場合は、Kafka クラスターから内部トピックストアのトピックを削除します。
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
Copy to Clipboard Copied!
第27章 Streams for Apache Kafka のアンインストール
OpenShift Container Platform の Web コンソールまたは CLI を使用して、OperatorHub から OpenShift 4.12 - 4.15 上の Streams for Apache Kafka をアンインストールできます。
Streams for Apache Kafka のインストールに使用したのと同じ方法を使用します。
Streams for Apache Kafka をアンインストールする場合は、デプロイメント専用に作成され、Streams for Apache Kafka リソースから参照されるリソースを特定する必要があります。
このようなリソースには以下があります。
- シークレット (カスタム CA および証明書、Kafka Connect Secrets、その他の Kafka シークレット)
-
ロギング
ConfigMap
(external
タイプ)
Kafka
、KafkaConnect
、KafkaMirrorMaker
、KafkaBridge
のいずれかの設定で参照されるリソースです。
CRD および関連するカスタムリソースの削除
CustomResourceDefinition
が削除されると、そのタイプのカスタムリソースも削除されます。これには、Streams for Apache Kafka によって管理される Kafka
、KafkaConnect
、KafkaMirrorMaker
、および KafkaBridge
リソース、および Streams for Apache Kafka が Kafka コンポーネントの Pod を管理するために使用する StrimziPodSet
リソースが含まれます。さらに、これらのカスタムリソースによって作成された OpenShift リソース (Deployment
、Pod
、Service
、ConfigMap
リソースなど) も削除されます。これらのリソースを削除する場合は、意図しないデータ損失を避けるため、常に注意してください。
27.1. Web コンソールを使用した OperatorHub からの Streams for Apache Kafka のアンインストール
この手順では、OperatorHub から Streams for Apache Kafka をアンインストールし、デプロイメントに関連するリソースを削除する方法について説明します。
コンソールから手順を実行したり、別の CLI コマンドを使用したりできます。
前提条件
-
cluster-admin
またはstrimzi-admin
パーミッションを持つアカウントを使用して OpenShift Container Platform Web コンソールにアクセスできる。 削除するリソースを特定している。
次の
oc
CLI コマンドを使用してリソースを検索し、Streams for Apache Kafka のアンインストール時にリソースが削除されたことを確認することもできます。Streams for Apache Kafka デプロイメントに関連するリソースを検索するコマンド
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>
Copy to Clipboard Copied! <resource_type> は、
secret
またはconfigmap
などのチェックするリソースのタイプに置き換えます。
手順
- OpenShift Web コンソールで、Operators > Installed Operators に移動します。
インストールされている Streams for Apache Kafka Operator のオプションアイコン (縦に並んだ 3 つのドット) を選択し、Uninstall Operator をクリックします。
Operator が Installed Operators から削除されます。
- Home > Projects に移動し、Streams for Apache Kafka と Kafka コンポーネントをインストールしたプロジェクトを選択します。
Inventory のオプションをクリックして関連リソースを削除します。
リソースには以下が含まれます。
- Deployments
- StatefulSets
- Pod
- Services
- ConfigMap
- Secrets
ヒント検索を使用して、Kafka クラスターの名前で始まる関連リソースを検索します。また、Workloads でもリソースを検索できます。
代わりの CLI コマンド
CLI コマンドを使用して、OperatorHub から Streams for Apache Kafka をアンインストールできます。
Streams for Apache Kafka のサブスクリプションを削除します。
oc delete subscription amq-streams -n openshift-operators
oc delete subscription amq-streams -n openshift-operators
Copy to Clipboard Copied! クラスターサービスバージョン (CSV) を削除します。
oc delete csv amqstreams.<version> -n openshift-operators
oc delete csv amqstreams.<version> -n openshift-operators
Copy to Clipboard Copied! 関連する CRD を削除します。
oc get crd -l app=strimzi -o name | xargs oc delete
oc get crd -l app=strimzi -o name | xargs oc delete
Copy to Clipboard Copied!
27.2. CLI を使用した Streams for Apache Kafka をアンインストール
この手順では、oc
コマンドラインツールを使用して Streams for Apache Kafka をアンインストールし、デプロイメントに関連するリソースを削除する方法について説明します。
前提条件
-
cluster-admin
またはstrimzi-admin
権限を持つアカウントを使用して、OpenShift クラスターにアクセスできる。 削除するリソースを特定している。
次の
oc
CLI コマンドを使用してリソースを検索し、Streams for Apache Kafka のアンインストール時にリソースが削除されたことを確認することもできます。Streams for Apache Kafka デプロイメントに関連するリソースを検索するコマンド
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>
oc get <resource_type> --all-namespaces | grep <kafka_cluster_name>
Copy to Clipboard Copied! <resource_type> は、
secret
またはconfigmap
などのチェックするリソースのタイプに置き換えます。
手順
Cluster Operator
Deployment
、関連するCustomResourceDefinitions
、およびRBAC
リソースを削除します。Cluster Operator のデプロイに使用するインストールファイルを指定します。
oc delete -f install/cluster-operator
oc delete -f install/cluster-operator
Copy to Clipboard Copied! 前提条件で特定したリソースを削除します。
oc delete <resource_type> <resource_name> -n <namespace>
oc delete <resource_type> <resource_name> -n <namespace>
Copy to Clipboard Copied! <resource_type> は削除するリソースのタイプに、 <resource_name> はリソースの名前に置き換えます。
シークレットの削除例
oc delete secret my-cluster-clients-ca-cert -n my-project
oc delete secret my-cluster-clients-ca-cert -n my-project
Copy to Clipboard Copied!
第28章 Kafka の再起動に関する情報の検索
Cluster Operator が OpenShift クラスターで Kafka Pod を再起動した後、Pod が再起動した理由を説明する OpenShift イベントを Pod の namespace に発行します。クラスターの動作を理解するために、コマンドラインから再起動イベントを確認できます。
Prometheus などのメトリック収集ツールを使用して、再起動イベントをエクスポートおよび監視できます。出力を適切な形式でエクスポートできる イベントエクスポーター でメトリックツールを使用します。
28.1. 再起動イベントの理由
Cluster Operator は、特定の理由で再起動イベントを開始します。再起動イベントに関する情報をフェッチすることで、理由を確認できます。
Event | 説明 |
---|---|
CaCertHasOldGeneration | Pod はまだ古い CA で署名されたサーバー証明書を使用しているため、証明書の更新の一環として再起動する必要があります。 |
CaCertRemoved | 期限切れの CA 証明書が削除され、Pod が再起動されて現在の証明書で実行されます。 |
CaCertRenewed | CA 証明書が更新され、Pod が再起動され、更新された証明書で実行されます。 |
ClientCaCertKeyReplaced | クライアント CA 証明書の署名に使用されるキーが置き換えられ、CA 更新プロセスの一環として Pod が再起動されています。 |
ClusterCaCertKeyReplaced | クラスターの CA 証明書の署名に使用されたキーが置き換えられ、CA 更新プロセスの一環として Pod が再起動されています。 |
ConfigChangeRequiresRestart | 一部の Kafka 設定プロパティーは動的に変更されますが、ブローカーの再始動が必要になるものもあります。 |
FileSystemResizeNeeded | ファイルシステムのサイズが大きくなり、適用するには再起動が必要です。 |
KafkaCertificatesChanged | Kafka ブローカーによって使用される 1 つ以上の TLS 証明書が更新されており、それらを使用するには再起動が必要です。 |
ManualRollingUpdate |
ユーザーは、再起動をトリガーするために、Pod、または Pod が属する |
PodForceRestartOnError | 修正するには Pod の再起動が必要なエラーが発生しました。 |
PodHasOldRevision |
Kafka ボリュームに対してディスクが追加または削除されました。変更を適用するには再起動が必要です。 |
PodHasOldRevision |
Pod がメンバーである |
PodStuck | Pod はまだ保留中であり、スケジュールされていないかスケジュールできないため、Operator は稼働を続けるための最終手段として Pod を再起動しました。 |
PodUnresponsive | Streams for Apache Kafka が Pod に接続できませんでした。これはブローカーが正しく起動していないことを示している可能性があるため、Operator が問題を解決するために Pod を再起動しました。 |
28.2. イベントフィルターの再起動
コマンドラインから再起動イベントをチェックする場合は、field-selector
を指定して、OpenShift イベントフィールドをフィルタリングできます。
次のフィールドは、field-selector
でイベントをフィルタリングするときに使用できます。
regardingObject.kind
-
再起動されたオブジェクト。再起動イベントの場合、種類は常に
Pod
です。 regarding.namespace
- Pod が属する namespace。
regardingObject.name
-
Pod の名前 (例:
strimzi-cluster-kafka-0)
。 regardingObject.uid
- Pod の一意の ID。
reason
-
Pod が再起動された理由 (
JbodVolumesChanged
など)。 reportingController
-
Streams for Apache Kafka の再起動イベントのレポートコンポーネントは、常に
strimzi.io/cluster-operator
です。 source
-
source
は、reportingController
の古いバージョンです。Streams for Apache Kafka の再起動イベントのレポートコンポーネントは、常にstrimzi.io/cluster-operator
です。 type
-
Warning
またはNormal
のいずれかのイベントタイプ。Streams for Apache Kafka の再起動イベントの場合、タイプはNormal
です。
古いバージョンの OpenShift
では、requiring 接頭辞を使用するフィールドは、代わにり includedObject
接頭辞を使用する場合があります。以前は reportingController
は reportingComponent
と呼ばれていました。
28.3. Kafka の再起動の確認
Cluster Operator によって開始された再起動イベントを一覧表示するには、oc
コマンドを使用します。reportingController
または ソース
イベントフィールドを使用して Cluster Operator をレポートコンポーネントとして設定し、Cluster Operator によって出力される再起動イベントをフィルターします。
前提条件
- Cluster Operator は OpenShift クラスターで実行されています。
手順
Cluster Operator によって発行されたすべての再起動イベントを取得します。
oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator
oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator
Copy to Clipboard Copied! 返されたイベントを示す例
LAST SEEN TYPE REASON OBJECT MESSAGE 2m Normal CaCertRenewed pod/strimzi-cluster-kafka-0 CA certificate renewed 58m Normal PodForceRestartOnError pod/strimzi-cluster-kafka-1 Pod needs to be forcibly restarted due to an error 5m47s Normal ManualRollingUpdate pod/strimzi-cluster-kafka-2 Pod was manually annotated to be rolled
LAST SEEN TYPE REASON OBJECT MESSAGE 2m Normal CaCertRenewed pod/strimzi-cluster-kafka-0 CA certificate renewed 58m Normal PodForceRestartOnError pod/strimzi-cluster-kafka-1 Pod needs to be forcibly restarted due to an error 5m47s Normal ManualRollingUpdate pod/strimzi-cluster-kafka-2 Pod was manually annotated to be rolled
Copy to Clipboard Copied! reason
またはその他のfield-selector
オプションを指定して、返されるイベントを制限することもできます。ここで、特定の理由が追加されます。
oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator,reason=PodForceRestartOnError
oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator,reason=PodForceRestartOnError
Copy to Clipboard Copied! YAML などの出力形式を使用して、1 つ以上のイベントに関するより詳細な情報を返します。
oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator,reason=PodForceRestartOnError -o yaml
oc -n kafka get events --field-selector reportingController=strimzi.io/cluster-operator,reason=PodForceRestartOnError -o yaml
Copy to Clipboard Copied! 詳細なイベント出力を示す例
apiVersion: v1 items: - action: StrimziInitiatedPodRestart apiVersion: v1 eventTime: "2022-05-13T00:22:34.168086Z" firstTimestamp: null involvedObject: kind: Pod name: strimzi-cluster-kafka-1 namespace: kafka kind: Event lastTimestamp: null message: Pod needs to be forcibly restarted due to an error metadata: creationTimestamp: "2022-05-13T00:22:34Z" generateName: strimzi-event name: strimzi-eventwppk6 namespace: kafka resourceVersion: "432961" uid: 29fcdb9e-f2cf-4c95-a165-a5efcd48edfc reason: PodForceRestartOnError reportingController: strimzi.io/cluster-operator reportingInstance: strimzi-cluster-operator-6458cfb4c6-6bpdp source: {} type: Normal kind: List metadata: resourceVersion: "" selfLink: ""
apiVersion: v1 items: - action: StrimziInitiatedPodRestart apiVersion: v1 eventTime: "2022-05-13T00:22:34.168086Z" firstTimestamp: null involvedObject: kind: Pod name: strimzi-cluster-kafka-1 namespace: kafka kind: Event lastTimestamp: null message: Pod needs to be forcibly restarted due to an error metadata: creationTimestamp: "2022-05-13T00:22:34Z" generateName: strimzi-event name: strimzi-eventwppk6 namespace: kafka resourceVersion: "432961" uid: 29fcdb9e-f2cf-4c95-a165-a5efcd48edfc reason: PodForceRestartOnError reportingController: strimzi.io/cluster-operator reportingInstance: strimzi-cluster-operator-6458cfb4c6-6bpdp source: {} type: Normal kind: List metadata: resourceVersion: "" selfLink: ""
Copy to Clipboard Copied!
以下のフィールドは非推奨となったため、これらのイベントでは入力されません。
-
firstTimestamp
-
lastTimestamp
-
source
第29章 Streams for Apache Kafka の管理
Streams for Apache Kafka を管理するには、Kafka クラスターと関連リソースのスムーズな実行を維持するためにさまざまなタスクを実行する必要があります。oc
コマンドを使用してリソースのステータスを確認し、ローリング更新のメンテナンス期間を設定し、Streams for Apache Kafka Drain Cleaner や Kafka Static Quota プラグインなどのツールを活用してデプロイメントを効果的に管理します。
29.1. ローリング更新のメンテナンス時間枠
メンテナンス時間枠によって、Kafka および ZooKeeper クラスターの特定のローリング更新が便利な時間に開始されるようにスケジュールできます。
29.1.1. メンテナンス時間枠の概要
ほとんどの場合、Cluster Operator は対応する Kafka
リソースの変更に対応するために Kafka または ZooKeeper クラスターのみを更新します。これにより、Kafka
リソースの変更を適用するタイミングを計画し、Kafka クライアントアプリケーションへの影響を最小限に抑えることができます。
ただし、Kafka
リソースの変更がなくても Kafka および ZooKeeper クラスターの更新が発生することがあります。たとえば、Cluster Operator によって管理される CA (認証局) 証明書が期限切れ直前である場合にローリング再起動の実行が必要になります。
サービスの 可用性 は Pod のローリング再起動による影響を受けないはずですが (ブローカーおよびトピックの設定が適切である場合)、Kafka クライアントアプリケーションの パフォーマンス は影響を受ける可能性があります。メンテナンス時間枠によって、Kafka および ZooKeeper クラスターのこのような自発的な更新が便利な時間に開始されるようにスケジュールできます。メンテナンス時間枠がクラスターに設定されていない場合は、予測できない高負荷が発生する期間など、不便な時間にこのような自発的なローリング更新が行われる可能性があります。
29.1.2. メンテナンス時間枠の定義
Kafka.spec.maintenanceTimeWindows
プロパティーに文字列の配列を入力して、メンテナンス時間枠を設定します。各文字列は、UTC (協定世界時、Coordinated Universal Time) であると解釈される cron 式 です。UTC は実用的にはグリニッジ標準時と同じです。
以下の例では、日、月、火、水、および木曜日の午前 0 時に開始し、午前 1 時 59 分 (UTC) に終わる、単一のメンテナンス時間枠が設定されます。
# ... maintenanceTimeWindows: - "* * 0-1 ? * SUN,MON,TUE,WED,THU *" # ...
# ...
maintenanceTimeWindows:
- "* * 0-1 ? * SUN,MON,TUE,WED,THU *"
# ...
実際には、必要な CA 証明書の更新が設定されたメンテナンス時間枠内で完了できるように、Kafka
リソースの Kafka.spec.clusterCa.renewalDays
および Kafka.spec.clientsCa.renewalDays
プロパティーとともにメンテナンス期間を設定する必要があります。
Streams for Apache Kafka は、指定された期間に従ってメンテナンス操作を正確にスケジュールするわけではありません。その代わりに、調整ごとにメンテナンス期間が現在オープンであるかどうかを確認します。これは、特定の時間枠内でのメンテナンス操作の開始が、最大で Cluster Operator の調整が行われる間隔の長さ分、遅れる可能性があることを意味します。したがって、メンテナンス時間枠は最低でもその間隔の長さにする必要があります。
29.1.3. メンテナンス時間枠の設定
サポートされるプロセスによってトリガーされるローリング更新のメンテナンス時間枠を設定できます。
前提条件
- OpenShift クラスター
- Cluster Operator が稼働中である。
手順
Kafka
リソースのmaintenanceTimeWindows
プロパティー を追加または編集します。たとえば、0800 から 1059 までと、1400 から 1559 までのメンテナンスを可能にするには、以下のようにmaintenanceTimeWindows
を設定します。apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... maintenanceTimeWindows: - "* * 8-10 * * ?" - "* * 14-15 * * ?"
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... maintenanceTimeWindows: - "* * 8-10 * * ?" - "* * 14-15 * * ?"
Copy to Clipboard Copied! リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied!
29.2. アノテーションを使用した Kafka およびその他のオペランドのローリング更新の開始
Streams for Apache Kafka は、Cluster Operator を通じて Kafka やその他のオペランドのローリング更新を手動でトリガーするアノテーションの使用をサポートしています。アノテーションを使用して、Kafka、Kafka Connect、MirrorMaker 2、および ZooKeeper クラスターのローリング更新を開始します。
通常、例外的な状況でのみ、特定の Pod や Pod のセットを手動で実行する必要があります。ただし、Pod を直接削除せずに、Cluster Operator 経由でローリング更新を実行すると、以下を確実に行うことができます。
- Pod を手動で削除しても、他の Pod を並行して削除するなどの、同時に行われる Cluster Operator の操作とは競合しません。
- Cluster Operator ロジックによって、In-Sync レプリカの数などの Kafka 設定で指定された内容が処理されます。
29.2.1. Pod 管理のアノテーションを使用したローリング更新の実行
この手順では、Kafka、Kafka Connect、MirrorMaker 2、または ZooKeeper クラスターのローリング更新をトリガーする方法について説明します。更新をトリガーするには、クラスター上で実行されている Pod を管理するアノテーションを StrimziPodSet
に追加します。
前提条件
手動ローリング更新を実行するには、Cluster Operator が実行されている必要があります。Kafka、Kafka Connect、MirrorMaker 2、または ZooKeeper のいずれであっても、更新するコンポーネントのクラスターも実行されている必要があります。
手順
手動で更新する Pod を制御するリソースの名前を見つけます。
たとえば、Kafka クラスターの名前が my-cluster の場合には、対応する名前は my-cluster-kafka および my-cluster-zookeeper になります。my-connect-cluster という名前の Kafka Connect クラスターの場合に、対応する名前は my-connect-cluster-connect です。my-mm2-cluster という名前の MirrorMaker 2 クラスターの場合、対応する名前は my-mm2-cluster-mirrormaker2 です。
oc annotate
を使用して、OpenShift で適切なリソースにアノテーションを付けます。StrimziPodSet のアノテーション
oc annotate strimzipodset <cluster_name>-kafka strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-zookeeper strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-connect strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-mirrormaker2 strimzi.io/manual-rolling-update="true"
oc annotate strimzipodset <cluster_name>-kafka strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-zookeeper strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-connect strimzi.io/manual-rolling-update="true" oc annotate strimzipodset <cluster_name>-mirrormaker2 strimzi.io/manual-rolling-update="true"
Copy to Clipboard Copied! - 次の調整が発生するまで待ちます (デフォルトでは 2 分ごとです)。アノテーションが調整プロセスで検出されれば、アノテーションが付いたリソース内のすべての Pod でローリング更新がトリガーされます。すべての Pod のローリング更新が完了すると、アノテーションはリソースから自動的に削除されます。
29.2.2. Pod アノテーションを使用したローリング更新の実行
この手順では、OpenShift Pod
アノテーションを使用して、既存の Kafka、Kafka Connect、MirrorMaker 2、または ZooKeeper クラスターのローリング更新を手動でトリガーする方法について説明します。複数の Pod にアノテーションが付けられると、連続したローリング更新は同じ調整実行内で実行されます。
前提条件
手動ローリング更新を実行するには、Cluster Operator が実行されている必要があります。Kafka、Kafka Connect、MirrorMaker 2、または ZooKeeper のいずれであっても、更新するコンポーネントのクラスターも実行されている必要があります。
使用されるトピックレプリケーション係数に関係なく、Kafka クラスターでローリング更新を実行できます。ただし、更新中に Kafka を稼働し続けるには、以下が必要になります。
- 更新するノードで実行されている高可用性 Kafka クラスターデプロイメント。
高可用性のためにレプリケートされたトピック。
少なくとも 3 つのレプリケーション係数と、レプリケーション係数よりも 1 つ少ない In-Sync レプリカの最小数を指定するトピック設定。
高可用性のためにレプリケートされた Kafka トピック
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 1 replicas: 3 config: # ... min.insync.replicas: 2 # ...
Copy to Clipboard Copied!
手順
手動で更新する
Pod
の名前を見つけます。Pod の命名規則は以下のとおりです。
-
Kafka クラスターの
<cluster_name>-kafka-<index_number>
-
ZooKeeper クラスターの
<cluster_name>-zookeeper-<index_number>
-
Kafka Connect クラスターの
<cluster_name>-connect-<index_number>
-
MirrorMaker 2 クラスターの
<cluster_name>-mirrormaker2-<index_number>
Pod に割り当てられる
<index_number>
は 0 から始まり、レプリカの合計数から 1 を引いた値で終わります。-
Kafka クラスターの
oc annotate
を使用して、OpenShift でPod
リソースにアノテーションを付けます。oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-connect-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-mirrormaker2-<index_number> strimzi.io/manual-rolling-update="true"
oc annotate pod <cluster_name>-kafka-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-zookeeper-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-connect-<index_number> strimzi.io/manual-rolling-update="true" oc annotate pod <cluster_name>-mirrormaker2-<index_number> strimzi.io/manual-rolling-update="true"
Copy to Clipboard Copied! -
次の調整が発生するまで待ちます (デフォルトでは 2 分ごとです)。アノテーションが調整プロセスで検出されれば、アノテーションが付けられた
Pod
のローリング更新がトリガーされます。Pod のローリング更新が完了すると、アノテーションはPod
から自動的に削除されます。
29.3. 永続ボリュームからのクラスターの復元
Kafka クラスターは、永続ボリューム (PV) が存在していれば、そこから復元できます。
たとえば、以下の場合に行います。
- namespace が意図せずに削除された後。
- OpenShift クラスター全体が失われた後でも PV がインフラストラクチャーに残っている場合。
29.3.1. namespace が削除された場合の復元
永続ボリュームと namespace の関係により、namespace の削除から復元することが可能です。PersistentVolume
(PV) は、namespace の外部に存在するストレージリソースです。PV は、namespace 内部に存在する PersistentVolumeClaim
(PVC) を使用して Kafka Pod にマウントされます。
PV の回収 (reclaim) ポリシーは、namespace が削除されるときにクラスターに動作方法を指示します。以下に、回収 (reclaim) ポリシーの設定とその結果を示します。
- Delete (デフォルト) に設定すると、PVC が namespace 内で削除されるときに PV が削除されます。
- Retain に設定すると、namespace の削除時に PV は削除されません。
namespace が意図せず削除された場合に PV から復旧できるようにするには、PV 仕様で persistentVolumeReclaimPolicy
プロパティーを使用してポリシーを Delete から Retain にリセットする必要があります。
apiVersion: v1 kind: PersistentVolume # ... spec: # ... persistentVolumeReclaimPolicy: Retain
apiVersion: v1
kind: PersistentVolume
# ...
spec:
# ...
persistentVolumeReclaimPolicy: Retain
または、PV は、関連付けられたストレージクラスの回収 (reclaim) ポリシーを継承できます。ストレージクラスは、動的ボリュームの割り当てに使用されます。
ストレージクラスの reclaimPolicy
プロパティーを設定することで、ストレージクラスを使用する PV が適切な回収 (reclaim) ポリシー で作成されます。ストレージクラスは、storageClassName
プロパティーを使用して PV に対して設定されます。
apiVersion: v1 kind: StorageClass metadata: name: gp2-retain parameters: # ... # ... reclaimPolicy: Retain
apiVersion: v1
kind: StorageClass
metadata:
name: gp2-retain
parameters:
# ...
# ...
reclaimPolicy: Retain
apiVersion: v1 kind: PersistentVolume # ... spec: # ... storageClassName: gp2-retain
apiVersion: v1
kind: PersistentVolume
# ...
spec:
# ...
storageClassName: gp2-retain
Retain を回収 (reclaim) ポリシーとして使用しながら、クラスター全体を削除する場合は、PV を手動で削除する必要があります。そうしないと、PV は削除されず、リソースに不要な経費がかかる原因になります。
29.3.2. OpenShift クラスター喪失からの復旧
クラスターが失われた場合、ディスク/ボリュームのデータがインフラストラクチャー内に保持されていれば、それらのデータを使用してクラスターを復旧できます。PV が復旧可能でそれらが手動で作成されていれば、復旧の手順は namespace の削除と同じです。
29.3.3. 削除したクラスターの永続ボリュームからの復元
この手順では、削除されたクラスターを永続ボリューム (PV) から復元する方法を説明します。
この状況では、Topic Operator はトピックが Kafka に存在することを認識しますが、KafkaTopic
リソースは存在しません。
クラスター再作成の手順を行うには、2 つの方法があります。
すべての
KafkaTopic
リソースを復旧できる場合は、オプション 1 を使用します。これにより、クラスターが起動する前に
KafkaTopic
リソースを復旧することで、該当するトピックが Topic Operator によって削除されないようにする必要があります。すべての
KafkaTopic
リソースを復旧できない場合は、オプション 2 を使用します。この場合、Topic Operator なしでクラスターをデプロイし、Topic Operator のトピックストアメタデータを削除してから、Topic Operator で Kafka クラスターを再デプロイすることで、該当するトピックから
KafkaTopic
リソースを再作成できるようにします。
Topic Operator がデプロイされていない場合は、PersistentVolumeClaim
(PVC) リソースのみを復旧する必要があります。
作業を開始する前に
この手順では、データの破損を防ぐために PV を正しい PVC にマウントする必要があります。volumeName
が PVC に指定されており、それが PV の名前に一致する必要があります。
詳細は、永続ストレージ を参照してください。
この手順には、手動での再作成が必要な KafkaUser
リソースの復旧は含まれません。パスワードと証明書を保持する必要がある場合は、KafkaUser
リソースの作成前にシークレットを再作成する必要があります。
手順
クラスターの PV についての情報を確認します。
oc get pv
oc get pv
Copy to Clipboard Copied! PV の情報がデータとともに表示されます。
この手順で重要な列を示す出力例:
NAME RECLAIMPOLICY CLAIM pvc-5e9c5c7f-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-my-cluster-zookeeper-1 pvc-5e9cc72d-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-my-cluster-zookeeper-0 pvc-5ead43d1-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-my-cluster-zookeeper-2 pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-0-my-cluster-kafka-0 pvc-7e21042e-3317-11ea-9786-02deaf9aa87e ... Retain ... myproject/data-0-my-cluster-kafka-1 pvc-7e226978-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-0-my-cluster-kafka-2
NAME RECLAIMPOLICY CLAIM pvc-5e9c5c7f-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-my-cluster-zookeeper-1 pvc-5e9cc72d-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-my-cluster-zookeeper-0 pvc-5ead43d1-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-my-cluster-zookeeper-2 pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-0-my-cluster-kafka-0 pvc-7e21042e-3317-11ea-9786-02deaf9aa87e ... Retain ... myproject/data-0-my-cluster-kafka-1 pvc-7e226978-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-0-my-cluster-kafka-2
Copy to Clipboard Copied! - NAME は各 PV の名前を示します。
- RECLAIM POLICY は PV が 保持される ことを示します。
- CLAIM は元の PVC へのリンクを示します。
元の namespace を再作成します。
oc create namespace myproject
oc create namespace myproject
Copy to Clipboard Copied! 元の PVC リソース仕様を再作成し、PVC を該当する PV にリンクします。
以下に例を示します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-0-my-cluster-kafka-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: gp2-retain volumeMode: Filesystem volumeName: pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-0-my-cluster-kafka-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: gp2-retain volumeMode: Filesystem volumeName: pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c
Copy to Clipboard Copied! PV 仕様を編集して、元の PVC にバインドされた
claimRef
プロパティーを削除します。以下に例を示します。
apiVersion: v1 kind: PersistentVolume metadata: annotations: kubernetes.io/createdby: aws-ebs-dynamic-provisioner pv.kubernetes.io/bound-by-controller: "yes" pv.kubernetes.io/provisioned-by: kubernetes.io/aws-ebs creationTimestamp: "<date>" finalizers: - kubernetes.io/pv-protection labels: failure-domain.beta.kubernetes.io/region: eu-west-1 failure-domain.beta.kubernetes.io/zone: eu-west-1c name: pvc-7e226978-3317-11ea-97b0-0aef8816c7ea resourceVersion: "39431" selfLink: /api/v1/persistentvolumes/pvc-7e226978-3317-11ea-97b0-0aef8816c7ea uid: 7efe6b0d-3317-11ea-a650-06e1eadd9a4c spec: accessModes: - ReadWriteOnce awsElasticBlockStore: fsType: xfs volumeID: aws://eu-west-1c/vol-09db3141656d1c258 capacity: storage: 100Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-kafka-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: failure-domain.beta.kubernetes.io/zone operator: In values: - eu-west-1c - key: failure-domain.beta.kubernetes.io/region operator: In values: - eu-west-1 persistentVolumeReclaimPolicy: Retain storageClassName: gp2-retain volumeMode: Filesystem
apiVersion: v1 kind: PersistentVolume metadata: annotations: kubernetes.io/createdby: aws-ebs-dynamic-provisioner pv.kubernetes.io/bound-by-controller: "yes" pv.kubernetes.io/provisioned-by: kubernetes.io/aws-ebs creationTimestamp: "<date>" finalizers: - kubernetes.io/pv-protection labels: failure-domain.beta.kubernetes.io/region: eu-west-1 failure-domain.beta.kubernetes.io/zone: eu-west-1c name: pvc-7e226978-3317-11ea-97b0-0aef8816c7ea resourceVersion: "39431" selfLink: /api/v1/persistentvolumes/pvc-7e226978-3317-11ea-97b0-0aef8816c7ea uid: 7efe6b0d-3317-11ea-a650-06e1eadd9a4c spec: accessModes: - ReadWriteOnce awsElasticBlockStore: fsType: xfs volumeID: aws://eu-west-1c/vol-09db3141656d1c258 capacity: storage: 100Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-kafka-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: failure-domain.beta.kubernetes.io/zone operator: In values: - eu-west-1c - key: failure-domain.beta.kubernetes.io/region operator: In values: - eu-west-1 persistentVolumeReclaimPolicy: Retain storageClassName: gp2-retain volumeMode: Filesystem
Copy to Clipboard Copied! この例では、以下のプロパティーが削除されます。
claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-kafka-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea
claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-kafka-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea
Copy to Clipboard Copied! Cluster Operator をデプロイします。
oc create -f install/cluster-operator -n my-project
oc create -f install/cluster-operator -n my-project
Copy to Clipboard Copied! クラスターを再作成します。
クラスターの再作成に必要なすべての
KafkaTopic
リソースがあるかどうかに応じて、以下の手順を実行します。オプション 1: クラスターを失う前に存在した
KafkaTopic
リソースが すべて ある場合 (__consumer_offsets
からコミットされたオフセットなどの内部トピックを含む)。すべての
KafkaTopic
リソースを再作成します。クラスターをデプロイする前にリソースを再作成する必要があります。そうでないと、Topic Operator によってトピックが削除されます。
Kafka クラスターをデプロイします。
以下に例を示します。
oc apply -f kafka.yaml
oc apply -f kafka.yaml
Copy to Clipboard Copied!
オプション 2: クラスターを失う前に存在したすべての
KafkaTopic
リソースがない場合。オプション 1 と同様に Kafka クラスターをデプロイしますが、デプロイ前に Kafka リソースから
topicOperator
プロパティーを削除して、Topic Operator がない状態でデプロイします。デプロイメントに Topic Operator が含まれると、Topic Operator によってすべてのトピックが削除されます。
Kafka クラスターから内部トピックストアのトピックを削除します。
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-37-rhel9:2.7.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
Copy to Clipboard Copied! このコマンドは、Kafka クラスターへのアクセスに使用されるリスナーおよび認証のタイプに対応している必要があります。
Kafka クラスターを
topicOperator
プロパティーで再デプロイして TopicOperator を有効にし、KafkaTopic
リソースを再作成します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} #...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {}
1 #...
Copy to Clipboard Copied!
- 1
- ここで示すデフォルト設定には、追加のプロパティーはありません。
EntityTopicOperatorSpec
スキーマリファレンス で説明されているプロパティーを使用して、必要な設定を指定します。
KafkaTopic
リソースのリストを表示して、復旧を確認します。oc get KafkaTopic
oc get KafkaTopic
Copy to Clipboard Copied!
29.4. よくある質問
第30章 Streams for Apache Kafka でのメータリングの使用
OCP 4 で利用可能なメータリングツールを使用して、異なるデータソースからメータリングレポートを生成できます。クラスター管理者として、メータリングを使用してクラスターの内容を分析できます。独自のクエリーを作成するか、事前定義 SQL クエリーを使用して、利用可能な異なるデータソースからデータを処理する方法を定義できます。Prometheus をデフォルトのデータソースとして使用すると、Pod、namespace、およびその他ほとんどの OpenShift リソースのレポートを生成できます。
OpenShift Metering Operator を使用すると、インストールされている Streams for Apache Kafka コンポーネントを分析し、Red Hat サブスクリプションに準拠しているかどうかを判断することもできます。
Streams for Apache Kafka でメータリングを使用するには、まず OpenShift Container Platform に Metering Operator をインストールして設定する必要があります。
30.1. メータリングリソース
メータリングには、メータリングのデプロイメントやインストール、およびメータリングが提供するレポート機能を管理するために使用できるリソースが多数含まれています。メータリングは以下の CRD を使用して管理されます。
名前 | 説明 |
---|---|
| デプロイメントのメータリングスタックを設定します。メータリングスタック設定用の各コンポーネントを制御するカスタマイズおよび設定オプションが含まれます。 |
| 使用するクエリー、クエリーを実行するタイミングおよび頻度、および結果を保存する場所を制御します。 |
|
|
| ReportQuery および Report で利用可能なデータを制御します。メータリング内で使用できるように複数の異なるデータベースへのアクセスの設定を可能にします。 |
30.2. Streams for Apache Kafka のメータリングラベル
次の表は、Streams for Apache Kafka のインフラストラクチャーコンポーネントと統合のメータリングラベルを示しています。
ラベル | 使用できる値 |
---|---|
|
|
|
|
|
|
|
|
|
|
| インフラストラクチャー
|
アプリケーション
| |
|
|
例
インフラストラクチャーの例 (インフラストラクチャーコンポーネントが entity-operator の場合)
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2024.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.7 rht.subcomp=entity-operator rht.subcomp_t=infrastructure
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2024.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.7 rht.subcomp=entity-operator rht.subcomp_t=infrastructure
Copy to Clipboard Copied! アプリケーションの例 (インテグレーションのデプロイメント名が kafka-bridge の場合)
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2024.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.7 rht.subcomp=kafka-bridge rht.subcomp_t=application
com.company=Red_Hat rht.prod_name=Red_Hat_Application_Foundations rht.prod_ver=2024.Q2 rht.comp=AMQ_Streams rht.comp_ver=2.7 rht.subcomp=kafka-bridge rht.subcomp_t=application
Copy to Clipboard Copied!
付録A サブスクリプションの使用
Streams for Apache Kafka は、ソフトウェアサブスクリプションを通じて提供されます。サブスクリプションを管理するには、Red Hat カスタマーポータルでアカウントにアクセスします。
アカウントへのアクセス
- access.redhat.com に移動します。
- アカウントがない場合は作成します。
- アカウントにログインします。
サブスクリプションのアクティベート
- access.redhat.com に移動します。
- My Subscriptions に移動します。
- Activate a subscription に移動し、16 桁のアクティベーション番号を入力します。
Zip および Tar ファイルのダウンロード
zip または tar ファイルにアクセスするには、カスタマーポータルを使用して、ダウンロードする関連ファイルを検索します。RPM パッケージを使用している場合、この手順は必要ありません。
- ブラウザーを開き、access.redhat.com/downloads で Red Hat カスタマーポータルの Product Downloads ページにログインします。
- INTEGRATION AND AUTOMATION カテゴリーで、Streams for Apache Kafka エントリーを見つけます。
- 必要な Streams for Apache Kafka 製品を選択します。Software Downloads ページが開きます。
- コンポーネントの Download リンクをクリックします。
DNF を使用したパッケージのインストール
パッケージとすべてのパッケージ依存関係をインストールするには、以下を使用します。
dnf install <package_name>
dnf install <package_name>
ローカルディレクトリーからダウンロード済みのパッケージをインストールするには、以下を使用します。
dnf install <path_to_download_package>
dnf install <path_to_download_package>
改訂日時: 2024-09-25