7.3. 部署 Kafka


要使用 Cluster Operator 管理 Kafka 集群,您必须将它部署为 Kafka 资源。Apache Kafka 的流提供了示例部署文件来执行此操作。您可以使用这些文件同时部署主题 Operator 和 User Operator。

部署 Cluster Operator 后,使用 Kafka 资源来部署以下组件:

节点池以 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 属性。

流程

  1. 部署基于 KRaft 的 Kafka 集群。

    使用双角色节点的单一节点池部署 Kafka 集群:

    oc apply -f examples/kafka/kraft/kafka-with-dual-role-nodes.yaml
    Copy to Clipboard
  2. 检查部署的状态:

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard

    输出显示节点池名称和就绪

    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

    • 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 属性。

流程

  1. 部署基于 ZooKeeper 的 Kafka 集群。

    • 部署临时集群:

      oc apply -f examples/kafka/kafka-ephemeral.yaml
      Copy to Clipboard
    • 部署持久集群:

      oc apply -f examples/kafka/kafka-persistent.yaml
      Copy to Clipboard
  2. 检查部署的状态:

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard

    输出显示 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
    Copy to Clipboard

    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 部署为独立组件

有关配置 entityOperatortopicOperator 属性的更多信息,请参阅配置 Entity Operator

流程

  1. 编辑 Kafka 资源的 entityOperator 属性,使其包含 topicOperator

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      #...
      entityOperator:
        topicOperator: {}
        userOperator: {}
    Copy to Clipboard
  2. 使用 EntityTopicOperatorSpec schema reference 中所述的属性配置 Topic Operator spec

    如果您希望所有属性都使用其默认值,请使用空对象({})。

  3. 创建或更新资源:

    oc apply -f <kafka_configuration_file>
    Copy to Clipboard
  4. 检查部署的状态:

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard

    输出显示 pod 名称和就绪状态

    NAME                        READY   STATUS    RESTARTS
    my-cluster-entity-operator  3/3     Running   0
    # ...
    Copy to Clipboard

    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 部署为独立组件

有关配置 entityOperatoruserOperator 属性的更多信息,请参阅配置 Entity Operator

流程

  1. 编辑 Kafka 资源的 entityOperator 属性,使其包含 userOperator

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
    spec:
      #...
      entityOperator:
        topicOperator: {}
        userOperator: {}
    Copy to Clipboard
  2. 使用 EntityUserOperatorSpec schema reference 中所述的属性配置 User Operator spec

    如果您希望所有属性都使用其默认值,请使用空对象({})。

  3. 创建或更新资源:

    oc apply -f <kafka_configuration_file>
    Copy to Clipboard
  4. 检查部署的状态:

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard

    输出显示 pod 名称和就绪状态

    NAME                        READY   STATUS    RESTARTS
    my-cluster-entity-operator  3/3     Running   0
    # ...
    Copy to Clipboard

    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 正在运行。

流程

  1. 使用 OpenShift 控制台打开一个终端,或者从 CLI 运行 exec 命令。

    例如:

    oc exec -ti my-cluster-zookeeper-0 -- bin/zookeeper-shell.sh localhost:12181 ls /
    Copy to Clipboard

    务必使用 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 服务的访问。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat