5.2. 使用主题 Operator
当您使用 KafkaTopic
资源创建、修改或删除主题时,Tpic Operator 可确保这些更改反映在 Kafka 集群中。
OpenShift 指南中的部署和升级 AMQ Streams 提供了部署 Topic Operator 的说明:
5.2.1. Kafka 主题资源
KafkaTopic
资源用于配置主题,包括分区和副本的数量。
KafkaTopic
的完整 schema 包括在 KafkaTopic schema
引用 中。
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
该标签供主题 Operator 用于标识 KafkaTopic
资源、创建一个新主题,以及后续处理该主题。
如果标签与 Kafka 集群不匹配,主题 Operator 无法识别 KafkaTopic
,且不会创建该主题。
5.2.1.2. 处理主题的更改
Topic Operator 必须解决的一个根本问题是没有单一数据源:KafkaTopic
资源和 Kafka 主题都可以独立于 Operator 修改。复杂的情况是,Topic Operator 可能无法实时观察每个末尾的更改(例如,操作器可能会停机)。
为解决这个问题,操作员会保留自己的专用副本,其中包含每个主题的信息。当 Kafka 集群或 OpenShift 中发生更改时,它会同时查看其他系统的状态及其私有副本,以确定需要更改的内容以保持一切同步。每当操作器启动时都会发生同样的事情,并在操作器运行时定期进行。
例如,假设主题 Operator 未在运行,并创建一个 KafkaTopic
my-topic
。当 Operator 启动时,它将缺少"my-topic"的私有副本,因此可以推断出 KafkaTopic
自上次运行以来已创建。操作器将创建与 my-topic
对应的主题,同时存储 my-topic
的元数据私有副本。
私有副本允许操作员应对在 Kafka 和 OpenShift 中主题配置都已更改的情况,只要这些更改不兼容(例如,更改同一主题配置键,但更改为不同的值)。如果出现不兼容的更改,Kafka 配置胜出,KafkaTopic
将更新来反映这一点。
私有副本保存在 Kafka 本身使用的同一 ZooKeeper 识别中。这缓解了可用性问题,因为如果 ZooKeeper 没有运行,则 Kafka 本身将无法运行,因此即使其无状态也少于 Operator 的可用性。
5.2.1.3. Kafka 主题使用建议
处理主题时,应保持一致。始终在 OpenShift 中直接对 KafkaTopic
资源或主题运行。对于给定主题,避免在这两种方法之间进行定期切换。
使用反映主题性质的主题名称,并记住以后无法更改名称。
如果在 Kafka 中创建主题,请使用有效的 OpenShift 资源名称,否则 Topic Operator 将需要使用符合 OpenShift 规则的名称创建对应的 KafkaTopic
。
OpenShift 中的标识符和名称建议在 OpenShift 社区文章中概述了标识符和名称。
5.2.1.4. Kafka 主题命名约定
Kafka 和 OpenShift 分别为 Kafka 和 KafkaTopic.metadata.name
中的主题命名实施自己的验证规则。每个名称都无效。
使用 spec.topicName
属性,可以在 Kafka 中创建有效的主题,其名称对 OpenShift 中的 Kafka 主题无效。
spec.topicName
属性继承 Kafka 命名验证规则:
- 名称不能超过 249 个字符。
-
Kafka 主题的有效字符为 ASCII 字母数字、
.
、_
和-
。 -
该名称不能为. 或
.
。
但是,可以在
名称中使用,如exampleTopic. or
.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 客户端应用程序(如 Kafka Streams)可以以编程方式在 Kafka 中创建主题。如果这些主题的名称具有无效的 OpenShift 资源名称,Topic Operator 会根据 Kafka 名称为其指定有效的名称。将替换无效字符,并在名称中附加一个哈希值。