6.3. 部署 Kafka
要使用 Cluster Operator 管理 Kafka 集群,您必须将它部署为 Kafka
资源。Apache Kafka 的流提供了示例部署文件来执行此操作。您可以使用这些文件同时部署主题 Operator 和 User Operator。
部署 Cluster Operator 后,使用 Kafka
资源来部署以下组件:
使用 KRaft 或 ZooKeeper 的 Kafka 集群:
- Topic Operator
- User Operator
节点池为一组 Kafka 节点提供配置。通过使用节点池,节点可以在同一 Kafka 集群中有不同的配置。
如果您没有将 Kafka 集群部署为 Kafka
资源,则无法使用 Cluster Operator 管理它。例如,这适用于在 OpenShift 外部运行的 Kafka 集群。但是,您可以将主题 Operator 和 User Operator 与 不是由 Apache Kafka 管理的 Kafka 集群一起使用,方法是将 它们部署为独立组件。您还可以在不是由 Apache Kafka 的 Streams 管理的 Kafka 集群中部署和使用其他 Kafka 组件。
6.3.1. 使用节点池部署 Kafka 集群
此流程演示了如何使用 Cluster Operator 将带有节点池的 Kafka 部署到 OpenShift 集群。节点池代表 Kafka 集群中共享相同配置的 Kafka 节点组。对于节点池中的每个 Kafka 节点,节点池中没有定义的任何配置都会继承 kafka
资源中的集群配置。
部署使用 YAML 文件来提供规格来创建 KafkaNodePool
资源。您可以将节点池与 Kafka 集群一起使用,该集群使用 KRaft (Kafka Raft metadata)模式或 ZooKeeper 进行集群管理。要以 KRaft 模式部署 Kafka 集群,您必须使用 KafkaNodePool
资源。
Apache Kafka 的 Streams 提供了以下 示例文件,您可以使用它来创建使用节点池的 Kafka 集群:
kafka-with-dual-role-kraft-nodes.yaml
- 使用共享代理和控制器角色的 KRaft 节点池部署 Kafka 集群。
kafka-with-kraft.yaml
- 部署具有一个控制器节点池的持久 Kafka 集群,以及一个代理节点池。
kafka-with-kraft-ephemeral.yaml
- 部署一个临时 Kafka 集群,它具有一个控制器节点池和一个代理节点池。
kafka.yaml
- 使用 3 个节点和 2 个不同的 Kafka 代理池部署 ZooKeeper。每个池都有 3 个代理。示例中的池使用不同的存储配置。
您可以执行此处概述的步骤,以使用 KafkaNodePool
资源部署新的 Kafka 集群,或 迁移现有的 Kafka 集群。
流程
部署基于 KRaft 的 Kafka 集群。
使用使用 dual-role 节点的单一节点池,以 KRaft 模式部署 Kafka 集群:
oc apply -f examples/kafka/kraft/kafka-with-dual-role-nodes.yaml
以 KRaft 模式为代理和控制器节点部署持久的 Kafka 集群:
oc apply -f examples/kafka/kraft/kafka.yaml
以 KRaft 模式为代理和控制器节点部署临时 Kafka 集群:
oc apply -f examples/kafka/kraft/kafka-ephemeral.yaml
使用三个代理的两个节点池部署 Kafka 集群和 ZooKeeper 集群:
oc apply -f examples/kafka/kafka-with-node-pools.yaml
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示节点池名称和就绪
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
-
my-cluster
是 Kafka 集群的名称。 pool-a
是节点池的名称。以
0
开始的连续索引号标识每个创建的 Kafka pod。如果使用 ZooKeeper,您还会看到 ZooKeeper pod。READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。有关部署的信息也会显示在
KafkaNodePool
资源的状态中,包括池中节点的 ID 列表。注意节点 ID 按顺序分配自集群中所有节点池中的 0 (零)。这意味着节点 ID 可能无法在特定节点池中按顺序运行。如果集群中节点 ID 序列出现差距,则会为要添加的下一个节点分配一个填充空白的 ID。缩减时,池中具有最高节点 ID 的节点会被删除。
-
其他资源
6.3.2. 在没有节点池的情况下部署基于 ZooKeeper 的 Kafka 集群
此流程演示了如何使用 Cluster Operator 将基于 ZooKeeper 的 Kafka 集群部署到 OpenShift 集群。
部署使用 YAML 文件来提供规格来创建 Kafka
资源。
Apache Kafka 的 Streams 提供了 以下示例 文件来创建使用 ZooKeeper 进行集群管理的 Kafka 集群:
kafka-persistent.yaml
- 使用三个 ZooKeeper 和三个 Kafka 节点部署持久集群。
kafka-jbod.yaml
- 使用三个 ZooKeeper 和三个 Kafka 节点(各自使用多个持久性卷)部署持久集群。
kafka-persistent-single.yaml
- 使用单个 ZooKeeper 节点和单个 Kafka 节点部署持久性集群。
kafka-ephemeral.yaml
- 使用三个 ZooKeeper 和三个 Kafka 节点部署临时集群。
kafka-ephemeral-single.yaml
- 使用三个 ZooKeeper 节点和一个 Kafka 节点部署临时集群。
在此过程中,我们对 ephemeral(临时)和persistent(持久) Kafka 集群部署使用示例。
- 临时集群
-
通常,临时(或临时)Kafka 集群适合开发和测试目的,不适用于生产环境。此部署使用
emptyDir
卷来存储代理信息(用于 ZooKeeper)和主题或分区(用于 Kafka)。使用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 可以置备 Persistent Disk 卷
- 如果您的 OpenShift 集群在裸机上运行,OpenShift 可以置备本地持久性卷
示例 YAML 文件指定最新支持的 Kafka 版本,以及其支持的日志消息格式版本和 inter-broker 协议版本的配置。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" # ...
流程
部署基于 ZooKeeper 的 Kafka 集群。
部署临时集群:
oc apply -f examples/kafka/kafka-ephemeral.yaml
部署持久集群:
oc apply -f examples/kafka/kafka-persistent.yaml
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示 pod 名称和就绪状态
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
my-cluster
是 Kafka 集群的名称。从
0
开始的连续索引号会标识每个 Kafka 和 ZooKeeper pod 创建。使用默认部署,您可以创建一个 Entity Operator 集群、3 Kafka pod 和 3 ZooKeeper pod。
READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
其他资源
6.3.3. 使用 Cluster Operator 部署主题 Operator
此流程描述了如何使用 Cluster Operator 部署主题 Operator。可以部署主题 Operator 以在双向模式或单向模式中使用。要了解更多有关双向和单向主题管理的信息,请参阅 第 10.1 节 “主题管理模式”。
您可以配置 Kafka
资源的 entityOperator
属性,使其包含 topicOperator
。默认情况下,Topic Operator 会监视 Cluster Operator 部署的 Kafka 集群命名空间中的 KafkaTopic
资源。您还可以使用 Topic Operator spec
中的 watchedNamespace
指定一个命名空间。单个主题 Operator 可以监视单个命名空间。一个命名空间应该只由一个 Topic Operator 监视。
如果您使用 Streams for Apache Kafka 将多个 Kafka 集群部署到同一命名空间中,请只为一个 Kafka 集群启用 Topic Operator,或使用 watchedNamespace
属性配置主题 Operator 来监视其他命名空间。
如果要将主题 Operator 与不是由 Apache Kafka 的 Streams 管理的 Kafka 集群搭配使用,您必须将 Topic Operator 部署为独立组件。
有关配置 entityOperator
和 topicOperator
属性的更多信息,请参阅配置 Entity Operator。
流程
编辑
Kafka
资源的entityOperator
属性,使其包含topicOperator
:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
使用
EntityTopicOperatorSpec
schema reference 中所述的属性配置 Topic Operatorspec
。如果您希望所有属性都使用其默认值,请使用空对象(
{}
)。创建或更新资源:
oc apply -f <kafka_configuration_file>
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示 pod 名称和就绪状态
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
my-cluster
是 Kafka 集群的名称。READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
6.3.4. 使用 Cluster Operator 部署 User Operator
此流程描述了如何使用 Cluster Operator 部署 User Operator。
您可以配置 Kafka
资源的 entityOperator
属性,使其包含 userOperator
。默认情况下,User Operator 会监视 Kafka 集群部署命名空间中的 KafkaUser
资源。您还可以使用 User Operator spec
中的 watchedNamespace
指定命名空间。单个 User Operator 可以监视单个命名空间。一个命名空间应该只由一个 User Operator 监视。
如果要将 User Operator 与不是由 Apache Kafka 的 Streams 管理的 Kafka 集群搭配使用,您必须将 User Operator 部署为独立组件。
有关配置 entityOperator
和 userOperator
属性的更多信息,请参阅配置 Entity Operator。
流程
编辑
Kafka
资源的entityOperator
属性,使其包含userOperator
:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
使用
EntityUserOperatorSpec
schema reference 中所述的属性配置 User Operatorspec
。如果您希望所有属性都使用其默认值,请使用空对象(
{}
)。创建或更新资源:
oc apply -f <kafka_configuration_file>
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示 pod 名称和就绪状态
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
my-cluster
是 Kafka 集群的名称。READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
6.3.5. 从一个终端连接到 ZooKeeper
ZooKeeper 服务使用加密和身份验证进行保护,不应被不是 Apache Kafka Streams 的一部分的外部应用程序使用。
但是,如果要使用需要连接到 ZooKeeper 的 CLI 工具,您可以使用 ZooKeeper pod 中的终端,并连接到 localhost:12181
作为 ZooKeeper 地址。
先决条件
- OpenShift 集群可用。
- Kafka 集群正在运行。
- Cluster Operator 正在运行。
流程
使用 OpenShift 控制台打开一个终端,或者从 CLI 运行
exec
命令。例如:
oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181 ls /
务必使用
localhost:12181
。
6.3.6. Kafka 集群资源列表
以下资源由 OpenShift 集群中的 Cluster Operator 创建。
共享资源
<kafka_cluster_name>-cluster-ca
- 带有用于加密集群通信的 Cluster CA 私钥的 secret。
<kafka_cluster_name>-cluster-ca-cert
- 带有集群 CA 公钥的 secret。此密钥可用于验证 Kafka 代理的身份。
<kafka_cluster_name>-clients-ca
- 带有用于签署用户证书的 Clients CA 私钥的 secret
<kafka_cluster_name>-clients-ca-cert
- 带有客户端 CA 公钥的 secret。此密钥可用于验证 Kafka 用户的身份。
<kafka_cluster_name>-cluster-operator-certs
- 带有 Cluster operator 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
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 辅助配置的 ConfigMap,由 ZooKeeper 节点 pod 挂载为卷。
<kafka_cluster_name>-zookeeper-nodes
- 使用 ZooKeeper 节点密钥的 secret。
<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 客户端的 bootstrap 服务器。
<kafka_cluster_name>-kafka-external-bootstrap
-
从 OpenShift 集群外部连接的客户端的 bootstrap 服务。只有在启用外部监听程序时,才会创建此资源。当监听器名称为
external
且端口为9094
时,旧的服务名称将用于向后兼容。 <kafka_cluster_name>-kafka-<pod_id>
-
用于将流量从 OpenShift 集群外部路由到各个容器集的服务。只有在启用外部监听程序时,才会创建此资源。当监听器名称为
external
且端口为9094
时,旧的服务名称将用于向后兼容。 <kafka_cluster_name>-kafka-external-bootstrap
-
从 OpenShift 集群外部连接的客户端的 bootstrap 路由。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。当监听器名称为external
且端口为9094
时,旧的路由名称将用于向后兼容。 <kafka_cluster_name>-kafka-<pod_id>
-
将来自 OpenShift 集群外的流量路由到各个容器集。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。当监听器名称为external
且端口为9094
时,旧的路由名称将用于向后兼容。 <kafka_cluster_name>-kafka-<listener_name>-bootstrap
- 从 OpenShift 集群外部连接的客户端的 bootstrap 服务。只有在启用外部监听程序时,才会创建此资源。新的服务名称将用于所有其他外部监听程序。
<kafka_cluster_name>-kafka-<listener_name>-<pod_id>
- 用于将流量从 OpenShift 集群外部路由到各个容器集的服务。只有在启用外部监听程序时,才会创建此资源。新的服务名称将用于所有其他外部监听程序。
<kafka_cluster_name>-kafka-<listener_name>-bootstrap
-
从 OpenShift 集群外部连接的客户端的 bootstrap 路由。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。新路由名称将用于所有其他外部监听程序。 <kafka_cluster_name>-kafka-<listener_name>-<pod_id>
-
将来自 OpenShift 集群外的流量路由到各个容器集。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。新路由名称将用于所有其他外部监听程序。 <kafka_cluster_name>-kafka-config
-
包含 Kafka 辅助配置的 ConfigMap,当禁用
UseStrimziPodSets
功能门时,代理 pod 会作为卷挂载。 <kafka_cluster_name>-kafka-brokers
- 带有 Kafka 代理密钥的 secret。
<kafka_cluster_name>-network-policy-kafka
- 网络策略管理对 Kafka 服务的访问。
strimzi-namespace-name-<kafka_cluster_name>-kafka-init
- Kafka 代理使用的集群角色绑定。
<kafka_cluster_name>-jmx
- 带有 JMX 用户名和密码的 secret,用于保护 Kafka 代理端口。只有在 Kafka 中启用 JMX 时,才会创建此资源。
data-<kafka_cluster_name>-kafka-<pod_id>
- 用于存储特定 Kafka 代理数据的卷的持久性卷声明。只有选择了持久性存储来存储数据时,才会创建此资源。
data-<id>-<kafka_cluster_name>-kafka-<pod_id>
-
卷
id
的持久性卷声明用于存储特定 Kafka 代理的数据。只有在置备持久性卷来存储数据时,才会为 JBOD 卷选择持久性存储来创建此资源。
Kafka 节点池
如果您使用 Kafka 节点池,则创建的资源适用于节点池中管理的节点,无论它们是否作为代理、控制器或两者运行。命名惯例包括 Kafka 集群名称和节点池: <kafka_cluster_name>-<pool_name>
。
<kafka_cluster_name>-<pool_name>
- 提供给 StrimziPodSet 的名称,用于管理 Kafka 节点池。
<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 卷选择持久性存储来创建此资源。
Entity Operator
只有在使用 Cluster Operator 部署 Entity Operator 时,才会创建这些资源。
<kafka_cluster_name>-entity-operator
提供给以下实体 Operator 资源的名称:
- 使用主题和用户 Operator 部署。
- Entity Operator 使用的服务帐户。
- 网络策略管理对实体 Operator 指标的访问。
<kafka_cluster_name>-entity-operator-<random_string>
- 由实体 Operator 部署创建的 Pod。
<kafka_cluster_name>-entity-topic-operator-config
- 带有主题 Operator 的辅助配置的 ConfigMap。
<kafka_cluster_name>-entity-user-operator-config
- 带有用户 Operator 的辅助配置的 ConfigMap。
<kafka_cluster_name>-entity-topic-operator-certs
- 带有主题 Operator 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
<kafka_cluster_name>-entity-user-operator-certs
- 带有用户 Operator 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
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 导出器资源的名称:
- 使用 Kafka 导出器进行部署。
- 用于收集消费者滞后指标的服务。
- Kafka Exporter 使用的服务帐户。
- 网络策略用于管理对 Kafka 导出器指标的访问。
<kafka_cluster_name>-kafka-exporter-<random_string>
- 由 Kafka Exporter 部署创建的 Pod。
Sything Control
只有在使用 Cluster Operator 部署 Cruise Control 时,才会创建这些资源。
<kafka_cluster_name>-cruise-control
给定以下 Cruise 控制资源的名称:
- 使用 Cruise Control 部署。
- 用于与 Cruise Control 进行通信的服务。
- Cruise Control 使用的服务帐户。
<kafka_cluster_name>-cruise-control-<random_string>
- 由 Cruise Control 部署创建的 Pod。
<kafka_cluster_name>-cruise-control-config
- 包含 Cruise Control 辅助配置的 ConfigMap,并由 Cruise Control pod 挂载为卷。
<kafka_cluster_name>-cruise-control-certs
- 带有 Cruise Control 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
<kafka_cluster_name>-network-policy-cruise-control
- 网络策略管理对 Cruise Control 服务的访问。