5.2. Topic Operator の使用
KafkaTopic
リソースを使用してトピックを作成、編集、または削除する場合、Topic Operator によって変更が確実に Kafka クラスターで反映されます。
『OpenShift での AMQ Streams のデプロイおよびアップグレード』には、Topic Operator をデプロイする手順が記載されています。
5.2.1. Kafka トピックリソース
KafkaTopic
リソースは、パーティションやレプリカの数を含む、トピックの設定に使用されます。
KafkaTopic
の完全なスキーマは、「KafkaTopic
スキーマ参照」で確認できます。
5.2.1.1. トピック処理用の Kafka クラスターの特定
KafkaTopic
リソースには、このリソースが属する Kafka クラスターの適した名前 (Kafka
リソースの名前から派生) を定義するラベルが含まれます。
以下は例になります。
apiVersion: kafka.strimzi.io/v1beta1 kind: KafkaTopic metadata: name: topic-name-1 labels: strimzi.io/cluster: my-cluster
ラベルは、KafkaTopic
リソースを特定し、新しいトピックを作成するために、Topic Operator によって使用されます。また、以降のトピックの処理でも使用されます。
ラベルが Kafka クラスターと一致しない場合、Topic Operator は KafkaTopic
を識別できず、トピックは作成されません。
5.2.1.2. トピック変更の処理
Topic Operator にとって解決しなければならない基本的な問題として、信頼できるソースが 1 つないことがあります。KafkaTopic
リソースと Kafka トピックはいずれも Operator とは別に変更できます。面倒なことに、Topic Operator は KafkaTopic リソースと Kafka トピックで変更を常にリアルタイムで監視できるとは限りません (たとえば Operator が停止している場合もあります)。
これを解決するために、Operator は各トピックに関する情報の独自のプライベートコピーを維持します。Kafka クラスターまたは OpenShift で変更が生じると、他のシステムの状態とプライベートコピーの両方を確認し、すべての同期が保たれるように何を変更する必要があるかを判断します。同じことが Operator の起動時に必ず実行され、また Operator の稼働中にも定期的に行われます。
たとえば、Topic Operator が実行されていないときに KafkaTopic
の my-topic
が作成された場合を考えてみましょう。Operator は、起動時に「my-topic」のプライベートコピーを持たないので、Operator が前回稼働状態であった後に KafkaTopic
が作成されたと推測できます。Operator は my-topic
に対応するトピックを作成し、さらに my-topic
のメタデータのプライベートコピーを保存します。
このプライベートコピーによって、Operator は、Kafka と OpenShift の両方でトピック設定が変更される場合に対処できますが、それができるのは変更に矛盾 (たとえば両方で同じトピックの config キーが異なる値に変更される場合など) がない場合に限ります。変更に矛盾がある場合、Kafka の設定が優先され、KafkaTopic
はそれを反映する形で更新されます。
プライベートコピーは、Kafka が使用するのと同じ ZooKeeper アンサンブルに保持されます。これにより可用性の懸念が軽減されます。これは、ZooKeeper が実行中でなければ Kafka 自体を実行できないため、Operator がステートレスであっても可用性は下がらないからです。
5.2.1.3. Kafka トピックの使用に関する推奨事項
トピックを使用する場合は、整合性を保ちます。常に KafkaTopic
リソースで作業を行うか、直接 OpenShift でトピックを扱います。特定のトピックで、両方の方法を頻繁に切り替えないでください。
トピックの性質を反映するトピック名を使用し、後で名前を変更できないことに注意してください。
Kafka でトピックを作成する場合は、有効な OpenShift リソース名である名前を使用します。それ以外の場合は、Topic Operator は対応する KafkaTopic
を OpenShift ルールに準じた名前で作成する必要があります。
OpenShift の識別子および名前の推奨事項については、OpenShift コミュニティーの記事「Identifiers and Names」を参照してください。
5.2.1.4. Kafka トピックの命名規則
Kafka と OpenShift では、Kafka と KafkaTopic.metadata.name
でのトピックの命名にそれぞれ独自の検証ルールを適用します。トピックごとに有効な名前があり、他のトピックには無効です。
spec.topicName
プロパティーを使用すると、OpenShift の Kafka トピックでは無効な名前を使用して、Kafka で有効なトピックを作成できます。
spec.topicName
プロパティーは Kafka の命名検証ルールを継承します。
- 249 文字を超える名前は使用できません。
-
Kafka トピックの有効な文字は ASCII 英数字、
.
、_
、および-
です。 -
名前を
.
または..
にすることはできませんが、.
はexampleTopic.
や.exampleTopic
のように名前で使用できます。
spec.topicName
は変更しないでください。
以下は例になります。
apiVersion: {KafkaApiVersion}
kind: KafkaTopic
metadata:
name: topic-name-1
spec:
topicName: topicName-1 1
# ...
- 1
- OpenShift では大文字は無効です。
上記は下記のように変更できません。
apiVersion: {KafkaApiVersion} kind: KafkaTopic metadata: name: topic-name-1 spec: topicName: name-2 # ...
Kafka Streams など一部の Kafka クライアントアプリケーションは、プログラムを使用して Kafka でトピックを作成できます。これらのトピックに、OpenShift リソース名としては無効な名前が付いている場合、Topic Operator はそれらのトピックに Kafka 名に基づく有効な名前を付けます。無効な文字が置き換えられ、ハッシュが名前に追加されます。