6.3. 部署 Kafka


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

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

节点池为一组 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 集群

流程

  1. 部署基于 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
  2. 检查部署的状态:

    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 configinter.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"
  # ...

流程

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

    • 部署临时集群:

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

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

    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 时,部署成功。

其他资源

Kafka 集群配置

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

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

流程

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

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

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

  3. 创建或更新资源:

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

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

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

流程

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

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

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

  3. 创建或更新资源:

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

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

流程

  1. 使用 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 服务的访问。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.