7.3. 部署 Kafka
要使用 Cluster Operator 管理 Kafka 集群,您必须将它部署为 Kafka
资源。Apache Kafka 的流提供了示例部署文件来执行此操作。您可以使用这些文件同时部署主题 Operator 和 User Operator。
部署 Cluster Operator 后,使用 Kafka
资源来部署以下组件:
使用 KRaft 或 ZooKeeper 的 Kafka 集群:
- Topic Operator
- User Operator
节点池以 KRaft (Kafka Raft metadata)模式部署 Kafka 集群,可用于使用 ZooKeeper 部署 Kafka 集群。节点池代表 Kafka 集群中共享同一配置的 Kafka 节点组。对于节点池中的每个 Kafka 节点,任何没有在节点池中定义的配置都会继承 Kafka
资源中的集群配置。
如果您没有将 Kafka 集群部署为 Kafka
资源,则无法使用 Cluster Operator 管理它。例如,这适用于在 OpenShift 外部运行的 Kafka 集群。但是,您可以将主题 Operator 和 User Operator 与 不是由 Apache Kafka 管理的 Kafka 集群一起使用,方法是将 它们部署为独立组件。您还可以在不是由 Apache Kafka 的 Streams 管理的 Kafka 集群中部署和使用其他 Kafka 组件。
7.3.1. 以 KRaft 模式部署 Kafka 集群
此流程演示了如何在 KRaft 模式中使用 Cluster Operator 部署 Kafka 集群,以及相关的节点池。
部署使用 YAML 文件来提供规格来创建 Kafka
资源和 KafkaNodePool
资源。
Apache Kafka 的流提供 以下示例部署文件,您可以使用它来创建使用节点池的 Kafka 集群:
kafka/kraft/kafka-with-dual-role-nodes.yaml
- 使用共享代理和控制器角色的节点池部署 Kafka 集群。
kafka/kraft/kafka.yaml
- 使用一个控制器节点池和一个代理节点池部署持久 Kafka 集群。
kafka/kraft/kafka-ephemeral.yaml
- 使用一个控制器节点池和一个代理节点池部署临时 Kafka 集群。
kafka/kraft/kafka-single-node.yaml
- 使用单一节点部署 Kafka 集群。
kafka/kraft/kafka-jbod.yaml
- 使用每个代理节点中的多个卷部署 Kafka 集群。
在此过程中,我们使用示例部署文件来部署 Kafka 集群,它使用一个共享代理和控制器角色的节点池。
每个示例的 Kafka
资源配置包括 strimzi.io/node-pools: enabled
注解,在使用节点池时是必需的。使用 KRaft 模式的 Kafka
资源还必须具有注解 strimzi.io/kraft: enabled
。
示例 YAML 文件指定 Kafka 集群使用的最新支持的 Kafka 版本和 KRaft 元数据版本。
您可以执行此处概述的步骤,以使用 KafkaNodePool
资源部署新的 Kafka 集群,或 迁移现有的 Kafka 集群。
开始前
默认情况下,部署文件示例将 my-cluster
指定为 Kafka 集群名称。部署集群后无法更改名称。要在部署集群前更改集群名称,请编辑相关 YAML 文件中的 Kafka
资源的 Kafka.metadata.name
属性。
流程
部署基于 KRaft 的 Kafka 集群。
使用双角色节点的单一节点池部署 Kafka 集群:
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! 检查部署的状态:
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
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。有关部署的信息也会显示在
KafkaNodePool
资源的状态中,包括池中节点的 ID 列表。注意节点 ID 按顺序分配自集群中所有节点池中的 0 (零)。这意味着节点 ID 可能无法在特定节点池中按顺序运行。如果集群中节点 ID 序列出现差距,则会为要添加的下一个节点分配一个填充空白的 ID。缩减时,池中具有最高节点 ID 的节点会被删除。
-
7.3.2. 部署基于 ZooKeeper 的 Kafka 集群
此流程演示了如何使用 Cluster Operator 将基于 ZooKeeper 的 Kafka 集群部署到 OpenShift 集群。
部署使用 YAML 文件来提供规格来创建 Kafka
资源。
Apache Kafka 的流提供了 以下示例部署文件,以创建使用 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 节点部署临时集群。
要部署使用节点池的 Kafka 集群,以下示例 YAML 文件提供了创建 Kafka 资源和
资源的规格:
Kafka
NodePool
kafka/kafka-with-node-pools.yaml
- 使用 3 个节点和 2 个不同的 Kafka 代理池部署 ZooKeeper。每个池都有 3 个代理。示例中的池使用不同的存储配置。
在此过程中,我们将示例用于临时和持久 Kafka 集群部署。
示例 YAML 文件指定最新支持的 Kafka 版本和 inter-broker 协议版本。
从 Kafka 3.0.0,当 inter.broker.protocol.version
设置为 3.0
或更高版本时,log.message.format.version
选项会被忽略,且不需要设置。
开始前
默认情况下,部署文件示例将 my-cluster
指定为 Kafka 集群名称。部署集群后无法更改名称。要在部署集群前更改集群名称,请编辑相关 YAML 文件中的 Kafka
资源的 Kafka.metadata.name
属性。
流程
部署基于 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 名称和就绪状态
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
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
7.3.3. 使用 Cluster Operator 部署主题 Operator
此流程描述了如何使用 Cluster Operator 部署主题 Operator。
您可以配置 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: {}
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
Copy to Clipboard Copied! 使用
EntityTopicOperatorSpec
schema reference 中所述的属性配置 Topic Operatorspec
。如果您希望所有属性都使用其默认值,请使用空对象(
{}
)。创建或更新资源:
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
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
7.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: {}
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
Copy to Clipboard Copied! 使用
EntityUserOperatorSpec
schema reference 中所述的属性配置 User Operatorspec
。如果您希望所有属性都使用其默认值,请使用空对象(
{}
)。创建或更新资源:
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
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
7.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 /
oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181 ls /
Copy to Clipboard Copied! 务必使用
localhost:12181
。
7.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 服务的访问。