第 1 章 部署概述
Apache Kafka 的流简化了在 OpenShift 集群中运行 Apache Kafka 的过程。
本指南提供有关部署和管理 Apache Kafka Streams 的说明。部署选项和步骤使用 Apache Kafka Streams 中包含的示例安装文件进行。虽然指南突出显示了重要的配置注意事项,但它并不涵盖所有可用选项。要深入了解 Kafka 组件配置选项,请参阅 Apache Kafka 自定义资源 API 参考。
除了部署说明外,指南还提供了部署前和部署后指导。它涵盖了设置并保护对 Kafka 集群的客户端访问。另外,它探索额外的部署选项,如指标集成、分布式追踪和集群管理工具,如 Cruise Control,以及 Apache Kafka Drain Cleaner 的 Streams。您还将发现有关管理 Apache Kafka 的流的建议,并微调 Kafka 配置以获得最佳性能。
为 Apache Kafka 和 Kafka 的 Streams 提供了升级说明,以帮助保持部署最新。
Apache Kafka 的 Streams 旨在与所有类型的 OpenShift 集群兼容,无论它们的发布是什么。无论您的部署涉及公共云或私有云,还是要设置本地开发环境,本指南中的说明适用于所有情况。
1.1. Apache Kafka 自定义资源流
使用 Streams for Apache Kafka 将 Kafka 组件部署到 OpenShift 集群上,强烈建议您使用自定义资源进行配置。这些资源作为自定义资源定义(CRD)引入的 API 实例创建,后者扩展 OpenShift 资源。
CRD 作为描述 OpenShift 集群中自定义资源的配置说明,为部署中使用的每个 Kafka 组件提供 Apache Kafka 的流,以及用户和主题。CRD 和自定义资源被定义为 YAML 文件。Apache Kafka 发行版的 Streams 提供了 YAML 文件示例。
CRD 还允许 Apache Kafka 资源的 Streams 从原生 OpenShift 功能中受益,如 CLI 访问和配置验证。
1.1.1. Apache Kafka 自定义资源流示例
CRD 需要在集群中一次性安装,以定义用于实例化和管理 Apache Kafka 特定资源的 Streams 的 schema。
在安装 CRD 中添加新的自定义资源类型后,您可以根据规格创建资源实例。
根据集群设置,安装通常需要集群管理员特权。
访问自定义资源仅限于 Apache Kafka 管理员的 Streams。如需更多信息,请参阅 第 4.6 节 “为 Apache Kafka 管理员设计流”。
在 OpenShift 集群中,CRD 定义了一个新的资源 kind
,如 kind:Kafka
。
Kubernetes API 服务器允许根据类型
创建自定义资源,并通过 CRD 了解在添加到 OpenShift 时如何验证和存储自定义资源。
每个特定于 Apache Kafka 的自定义资源流都符合为资源类型定义的 CRD 定义的 schema。Apache Kafka 组件的 Streams 自定义资源具有通用配置属性,这些属性在
spec
下定义。
要了解 CRD 和自定义资源之间的关系,请参阅 Kafka 主题的 CRD 示例。
Kafka 主题 CRD
apiVersion: kafka.strimzi.io/v1beta2 kind: CustomResourceDefinition metadata: 1 name: kafkatopics.kafka.strimzi.io labels: app: strimzi spec: 2 group: kafka.strimzi.io versions: v1beta2 scope: Namespaced names: # ... singular: kafkatopic plural: kafkatopics shortNames: - kt 3 additionalPrinterColumns: 4 # ... subresources: status: {} 5 validation: 6 openAPIV3Schema: properties: spec: type: object properties: partitions: type: integer minimum: 1 replicas: type: integer minimum: 1 maximum: 32767 # ...
- 1
- 主题 CRD 的元数据、名称和标签来标识 CRD。
- 2
- 此 CRD 的规格,包括组(域)名称、复数名称和受支持的模式版本,它们用于 URL 用于访问主题的 API。其他名称用于识别 CLI 中的实例资源。例如,
oc get kafkatopic my-topic
或oc get kafkatopics
。 - 3
- CLI 命令可以使用短名称。例如,
oc get kt
是oc get kafkatopic
的缩写形式。 - 4
- 对自定义资源使用
get
命令时显示的信息。 - 5
- CRD 的当前状态,如资源的 schema 引用 中所述。
- 6
- openAPIV3Schema 验证提供了创建主题自定义资源的验证。例如,主题至少需要一个分区和一个副本。
您可以识别由 Apache Kafka 安装文件流提供的 CRD YAML 文件,因为文件名包含索引号,后跟 'Crd'。
以下是 KafkaTopic
自定义资源的对应示例。
Kafka 主题自定义资源
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic 1 metadata: name: my-topic labels: strimzi.io/cluster: my-cluster 2 spec: 3 partitions: 1 replicas: 1 config: retention.ms: 7200000 segment.bytes: 1073741824 status: conditions: 4 lastTransitionTime: "2019-08-20T11:37:00.706Z" status: "True" type: Ready observedGeneration: 1 / ...
自定义资源可以通过平台 CLI 应用到集群。创建自定义资源时,它使用与 Kubernetes API 内置资源相同的验证。
创建 KafkaTopic
自定义资源后,主题 Operator 会收到通知,并在 Apache Kafka 的 Streams 中创建对应的 Kafka 主题。
1.1.2. 对自定义资源执行 oc
操作
您可以使用 oc
命令检索信息,并在 Apache Kafka 自定义资源的 Streams 上执行其他操作。使用 oc
命令,如 get
, describe
, edit
, 或 delete
, 对资源类型执行操作。例如,oc get kafkatopics
检索所有 Kafka 主题和 oc get kafkas
列表,检索所有部署的 Kafka 集群。
当引用资源类型时,您可以使用单数和复数名称: oc get kafkas
获取与 oc get kafka
相同的结果。
您还可以使用资源 的短名称。学习短名称可在为 Apache Kafka 管理流时节省时间。Kafka
的短名称为 k
,因此您也可以运行 oc get k
来列出所有 Kafka 集群。
列出 Kafka 集群
oc get k NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS my-cluster 3 3
Apache Kafka 资源流 | 长名称 | 短名称 |
---|---|---|
Kafka | kafka | k |
Kafka 节点池 | kafkanodepool | knp |
Kafka 主题 | kafkatopic | kt |
Kafka 用户 | 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
命令中使用。
Apache Kafka 自定义资源的所有流属于类别 strimzi
,因此您可以使用 strimzi
获取 Apache Kafka 资源的所有流。
例如,运行 oc get strimzi
列出给定命名空间中 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 -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
您可以将这个 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
删除单个操作中的所有资源可能很有用,例如,当您为 Apache Kafka 功能测试新流时。
1.1.2.2. 查询子资源的状态
您可以使用其他值传递给 -o
选项。例如,通过使用 -o yaml
,您可以以 YAML 格式获取输出。使用 -o json
将返回 JSON。
您可以查看 oc get --help
中的所有选项。
其中一个最有用的选项是 JSONPath 支持,它允许您传递 JSONPath 表达式来查询 Kubernetes API。JSONPath 表达式可以提取或导航任何资源的特定部分。
例如,您可以使用 JSONPath 表达式 {.status.listeners[? (@.name=="tls")].bootstrapServers}
从 Kafka 自定义资源的状态中获取 bootstrap 地址,并在 Kafka 客户端中使用它。
在这里,命令检索名为 tls
的监听程序的 bootstrapServers
值:
检索 bootstrap 地址
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="tls")].bootstrapServers}{"\n"}' my-cluster-kafka-bootstrap.myproject.svc:9093
通过更改 name 条件,您还可以获取其他 Kafka 侦听程序的地址。
您可以使用 jsonpath
从任何自定义资源中提取任何其他属性或属性组。
1.1.3. Apache Kafka 自定义资源状态信息的流
status 属性提供某些自定义资源的状态信息。
下表列出了提供状态信息(部署时)以及定义 status 属性的 schema 的自定义资源。
如需有关 schema 的更多信息,请参阅 Apache Kafka 自定义资源 API 参考流。
Apache Kafka 资源流 | 模式参考 | 在… 中发布状态信息 |
---|---|---|
|
| Kafka 集群、其监听程序和节点池 |
|
| 节点池中的节点、其角色和关联的 Kafka 集群 |
|
| Kafka 集群中的 Kafka 主题 |
|
| Kafka 集群中的 Kafka 用户 |
|
| Kafka Connect 集群和连接器插件 |
|
|
|
|
| Kafka MirrorMaker 2 集群和内部连接器 |
|
| Kafka MirrorMaker 集群 |
|
| Apache Kafka Bridge 的流 |
|
| 重新平衡的状态和结果 |
|
| 受管、使用当前版本和就绪状态的 pod 数量 |
资源的 status
属性提供有关资源状态的信息。status.conditions
和 status.observedGeneration
属性适用于所有资源。
status.conditions
-
状态条件描述了资源的当前状态。状态条件属性可用于跟踪与资源相关的进度,实现 其所需状态,如
spec
中指定的配置所定义。Status 条件属性提供资源更改的时间和原因,以及防止或延迟 Operator 正常状态的事件详情。 status.observedGeneration
-
最后观察到的生成表示 Cluster Operator 资源的最新协调。如果
observedGeneration
的值与metadata.generation
的值(部署的当前版本)不同,Operator 尚未处理对资源的最新更新。如果这些值相同,状态信息反映了资源的最新更改。
status
属性还提供特定于资源的信息。例如,KafkaStatus
提供有关侦听器地址的信息,以及 Kafka 集群的 ID。
KafkaStatus
还提供有关使用的 Apache Kafka 版本的 Kafka 和 Streams 的信息。您可以检查 operatorLastSuccessfulVersion
和 kafkaVersion
的值,以确定是否完成了对 Apache Kafka 的 Streams 升级
Apache Kafka 的 Streams 创建和维护自定义资源的状态,定期评估自定义资源的当前状态并相应地更新其状态。当使用 oc edit
在自定义资源上执行更新时,则其状态
不可编辑。另外,更改 状态
不会影响 Kafka 集群的配置。
在这里,我们看到 Kafka
自定义资源的状态
属性。
Kafka 自定义资源状态
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: spec: # ... status: clusterId: XP9FP2P-RByvEy0W4cOEUA 1 conditions: 2 - lastTransitionTime: '2023-01-20T17:56:29.396588Z' status: 'True' type: Ready 3 kafkaMetadataState: KRaft 4 kafkaVersion: 3.7.0 5 kafkaNodePools: 6 - name: broker - name: controller listeners: 7 - 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 8 operatorLastSuccessfulVersion: 2.7 9
- 1
- Kafka 集群 ID。
- 2
状态条件
描述了 Kafka 集群的当前状态。- 3
Ready
条件表示 Cluster Operator 认为 Kafka 集群可以处理流量。- 4
- 显示使用(KRaft 或 ZooKeeper)的机制来管理 Kafka 元数据和协调操作的 Kafka 元数据状态。
- 5
- Kafka 集群使用的 Kafka 版本。
- 6
- 属于 Kafka 集群的节点池。
- 7
监听器根据类型
描述 Kafka bootstrap 地址。- 8
observedGeneration
值表示 Cluster Operator 的Kafka
自定义资源的最后协调。- 9
- 成功完成最后一次协调的 Operator 版本。
状态中列出的 Kafka bootstrap 地址没有表示这些端点或 Kafka 集群处于 Ready
状态。
1.1.4. 查找自定义资源的状态
将 oc
与自定义资源 的状态
子资源搭配使用,以检索资源的相关信息。
先决条件
- 一个 OpenShift 集群。
- Cluster Operator 正在运行。
流程
指定自定义资源,并使用
-o jsonpath
选项应用标准 JSONPath 表达式来选择status
属性:oc get kafka <kafka_resource_name> -o jsonpath='{.status}' | jq
此表达式返回指定自定义资源的所有状态信息。您可以使用点表示法(如
status.listeners
或status.observedGeneration
)来微调您要查看的状态信息。使用
jq
命令行 JSON 解析器工具 可以更轻松地读取输出。
其他资源
- 有关使用 JSONPath 的更多信息,请参阅 JSONPath 支持。