8.3. (预览)配置节点池


更新 KafkaNodePool 自定义资源的 spec 属性来配置节点池部署。

注意

节点池功能作为技术预览提供。节点池不会被默认启用,因此您必须在使用 KafkaNodePools 功能门前启用 KafkaNodePools 功能门

节点池指的是 Kafka 集群中不同的 Kafka 节点组。每个池都有自己的唯一的配置,其中包括副本、角色和存储分配数量的强制设置。

另外,您还可以为以下属性指定值:

  • 指定内存和 cpu 请求和限值 的资源
  • 模板 为 Pod 和其他 OpenShift 资源指定自定义配置
  • jvmOptions,用于指定堆大小、运行时和其他选项的自定义 JVM 配置

Kafka 资源代表 Kafka 集群中所有节点的配置。KafkaNodePool 资源仅代表节点池中的节点的配置。如果没有在 KafkaNodePool 中指定配置属性,它将继承自 Kafka 资源。如果在两个资源中设置,则 KafkaNodePool 资源中指定的配置具有优先权。例如,如果节点池和 Kafka 配置都包含 jvmOptions,则使用节点池配置中指定的值。当在 KafkaNodePool.spec.jvmOptions 中设置了 -Xmx: 1024m,在 Kafka.spec.kafka.jvmOptions 中设置了 -Xms: 512m,节点会使用其节点池配置中的值。

KafkaKafkaNodePool 模式的属性不会被合并。为了说明,如果 KafkaNodePool.spec.template 只包含 podSet.metadata.labels,并且 Kafka.spec.kafka.template 包含 podSet.metadata.annotationspod.metadata.labels,则 Kafka 配置中的模板值会被忽略,因为节点池配置中有一个模板值。

节点池可用于以 KRaft 模式(使用 Kafka Raft 元数据)运行的 Kafka 集群,或使用 ZooKeeper 进行集群管理。如果使用 KRaft 模式,您可以为节点池中的所有节点指定角色,以作为代理、控制器或两者运行。如果使用 ZooKeeper,则节点必须设置为代理。

重要

KRaft 模式在 Apache Kafka 或 AMQ Streams 中不适用于生产环境。

要深入了解节点池配置选项,请参阅 AMQ Streams 自定义资源 API 参考

注意

虽然启用节点池的 KafkaNodePools 功能门处于 alpha 阶段,但 KafkaNodePool 资源中的副本和存储配置属性还必须存在于 Kafka 资源中。当使用节点池时,Kafka 资源中的配置会被忽略。同样,在使用 KRaft 模式时,在 Kafka 资源中也必须存在 ZooKeeper 配置属性。这些属性也会被忽略。

使用 ZooKeeper 在集群中节点池的配置示例

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: pool-a 
1

  labels:
    strimzi.io/cluster: my-cluster 
2

spec:
  replicas: 3 
3

  roles:
    - broker 
4

  storage: 
5

    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
  resources: 
6

      requests:
        memory: 64Gi
        cpu: "8"
      limits:
        memory: 64Gi
        cpu: "12"

1
节点池的唯一名称。
2
节点池所属的 Kafka 集群。节点池只能属于单个集群。
3
节点的副本数。
4
节点池中的节点的角色,只有使用带有 ZooKeeper 的 Kafka 时,才可以 代理
5
节点的存储规格。
6
用于保留支持的资源、当前 cpu 和内存 以及限制的请求,以指定可消耗的最大资源。

使用 KRaft 模式的集群中节点池的配置示例

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
  name: kraft-dual-role
  labels:
    strimzi.io/cluster: my-cluster
spec:
  replicas: 3
  roles: 
1

    - controller
    - broker
  storage:
    type: jbod
    volumes:
      - id: 0
        type: persistent-claim
        size: 20Gi
        deleteClaim: false
  resources:
      requests:
        memory: 64Gi
        cpu: "8"
      limits:
        memory: 64Gi
        cpu: "12"

1
节点池中的节点的角色。在本例中,节点具有双角色作为控制器和代理。
注意

Kafka 资源的配置必须适合 KRaft 模式。目前,KRaft 模式有很多限制

此流程描述了如何在节点池中执行扩展操作时,Cluster Operator 对高级节点 ID 处理使用注解。您可以按顺序使用下一个 ID 来指定要使用的节点 ID,而不是 Cluster Operator。以这种方式管理节点 ID 可提供更多控制。

要添加一系列 ID,您可以为 KafkaNodePool 资源分配以下注解:

  • strimzi.io/next-node-ids 来添加用于新代理的 ID 范围
  • strimzi.io/remove-node-ids 来添加一系列 ID 以删除现有代理

您可以指定单个节点 ID、ID 范围或两者的组合。例如,您可以指定以下 ID 范围: [0, 1, 2, 10-20, 30] 来扩展 Kafka 节点池。通过这种格式,您可以指定单个节点 ID (01230)以及一系列 ID (10-20)。

在典型的场景中,您可以指定一个 ID 范围来向上扩展和单一节点 ID,以便在缩减时删除特定节点。

在此过程中,我们将扩展注解添加到节点池中,如下所示:

  • pool-a 分配一系列 ID 进行扩展
  • pool-b 分配一系列 ID 用于缩减

在扩展操作过程中,使用 ID,如下所示:

  • 扩展获取新节点范围内的最低可用 ID。
  • 缩减会删除范围中具有最高可用 ID 的节点。

如果在节点池中分配的节点 ID 序列中有差距,则要添加的下一个节点会被分配一个填充空白的 ID。

每次扩展操作后,不需要更新注解。任何未使用的 ID 仍对下一个扩展事件有效。

Cluster Operator 允许您以升序或降序指定 ID 范围,以便您可以按照节点扩展的顺序定义它们。例如,在扩展时,您可以指定一个范围,如 [1000-1999],并且新节点分配下一个最低 ID: 1000100110021003 等。相反,当缩减时,您可以指定一个范围,如 [1999-1000],确保具有下一个最高 ID 的节点已被删除 :100 3、100210011000 等。

如果没有使用注解指定 ID 范围,Cluster Operator 遵循其在扩展操作期间处理 ID 的默认行为。节点 ID 以 0 (零)开始,并在 Kafka 集群中按顺序运行。下一个最低 ID 分配给新节点。在集群中填充节点 ID 的差距。这意味着它们可能无法在节点池中按顺序运行。扩展的默认行为是在集群中添加下一个最低可用节点 ID;在缩减时,它会删除具有最高可用节点 ID 的节点。如果分配的 ID 范围被误格式化,则扩展范围没有 ID,或者缩减范围不适用于任何正在使用的节点,则应用默认方法。

流程

  1. 使用 ID 为节点池添加在扩展或缩减时要使用的 ID,如下例所示。

    用于向上扩展的 ID 会被分配给节点 池池

    为扩展分配 ID

    oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"

    将节点添加到 时使用此范围内的最低可用 ID。

    用于缩减的 ID 分配给节点池 pool-b

    为缩减分配 ID

    oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"

    缩减 pool-b 时会删除此范围内的最高可用 ID。

  2. 现在,您可以扩展节点池。

    如需更多信息,请参阅以下:

    在协调时,如果注解被错误格式化,则会提供一个警告。

8.3.2. (预览)将节点添加到节点池中

这个步骤描述了如何扩展节点池来添加新节点。

在此过程中,我们从三个节点池( )开始:

节点池中的 Kafka 节点

NAME                       READY  STATUS   RESTARTS
my-cluster-pool-a-kafka-0  1/1    Running  0
my-cluster-pool-a-kafka-1  1/1    Running  0
my-cluster-pool-a-kafka-2  1/1    Running  0

节点 ID 在创建时附加到节点的名称中。我们添加节点 my-cluster-pool-a-kafka-3,节点 ID 为 3

注意

在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。

先决条件

流程

  1. 在节点池中创建新节点。

    例如,节点池 pool-a 有三个副本。我们通过增加副本数量来添加节点:

    oc scale kafkanodepool pool-a --replicas=4
  2. 检查部署的状态,并等待节点池中的 pod 创建,并且状态为 READY

    oc get pods -n <my_cluster_operator_namespace>

    输出显示节点池中的四个 Kafka 节点

    NAME                       READY  STATUS   RESTARTS
    my-cluster-pool-a-kafka-0  1/1    Running  0
    my-cluster-pool-a-kafka-1  1/1    Running  0
    my-cluster-pool-a-kafka-2  1/1    Running  0
    my-cluster-pool-a-kafka-3  1/1    Running  0

  3. 在增加节点池中的节点数后重新分配分区。

    在扩展节点池后,您可以使用 Cruise Control add-brokers 模式将分区副本从现有代理移到新添加的代理中。

8.3.3. (预览)从节点池中删除节点

这个步骤描述了如何缩减节点池来删除节点。

在此过程中,我们从四个节点池( )开始:

节点池中的 Kafka 节点

NAME                       READY  STATUS   RESTARTS
my-cluster-pool-a-kafka-0  1/1    Running  0
my-cluster-pool-a-kafka-1  1/1    Running  0
my-cluster-pool-a-kafka-2  1/1    Running  0
my-cluster-pool-a-kafka-3  1/1    Running  0

节点 ID 在创建时附加到节点的名称中。我们删除节点 my-cluster-pool-a-kafka-3,节点 ID 为 3

注意

在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。

先决条件

流程

  1. 在减少节点池中的节点数前重新分配分区。

    在缩减节点池前,您可以使用 Cruise Control remove-brokers 模式将分区副本移出要删除的代理。

  2. 在重新分配过程完成后,删除的节点没有实时分区,从而减少节点池中的 Kafka 节点数量。

    例如,节点池 pool-a 有四个副本。我们通过减少副本数来删除节点:

    oc scale kafkanodepool pool-a --replicas=3

    输出显示节点池中的三个 Kafka 节点

    NAME                        READY   STATUS    RESTARTS
    my-cluster-pool-b-kafka-0   1/1     Running   0
    my-cluster-pool-b-kafka-1   1/1     Running   0
    my-cluster-pool-b-kafka-2   1/1     Running   0

8.3.4. (预览)在节点池之间移动节点

这个步骤描述了如何在不停机的情况下在源和目标 Kafka 节点池之间移动节点。您可以在目标节点池中创建新节点并重新分配分区,以便从源节点池中的旧节点移动数据。当新节点上的副本同步时,您可以删除旧节点。

在此过程中,我们从两个节点池开始:

  • 具有三个副本的池 是目标节点池
  • 带有四个副本的 pool-b 是源节点池

我们扩展 pool-a,并重新分配分区并缩减 pool-b,这会导致以下内容:

  • pool-a 带有四个副本
  • 带有三个副本的 pool-b
注意

在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。

先决条件

流程

  1. 在目标节点池中创建新节点。

    例如,节点池 pool-a 有三个副本。我们通过增加副本数量来添加节点:

    oc scale kafkanodepool pool-a --replicas=4
  2. 检查部署的状态,并等待节点池中的 pod 创建,并且状态为 READY

    oc get pods -n <my_cluster_operator_namespace>

    输出显示目标节点池中的四个 Kafka 节点

    NAME                       READY  STATUS   RESTARTS
    my-cluster-pool-a-kafka-0  1/1    Running  0
    my-cluster-pool-a-kafka-1  1/1    Running  0
    my-cluster-pool-a-kafka-4  1/1    Running  0
    my-cluster-pool-a-kafka-5  1/1    Running  0

    节点 ID 在创建时附加到节点的名称中。我们添加节点 my-cluster-pool-a-kafka-5,其节点 ID 为 5

  3. 将分区从旧节点重新分配给新节点。

    在缩减源节点池前,您可以使用 Cruise Control remove-brokers 模式将分区副本移出要删除的代理。

  4. 重新分配过程完成后,减少源节点池中的 Kafka 节点数量。

    例如,节点池 pool-b 具有四个副本。我们通过减少副本数来删除节点:

    oc scale kafkanodepool pool-b --replicas=3

    池中具有最高 ID 的节点已被删除。

    输出显示源节点池中的三个 Kafka 节点

    NAME                       READY  STATUS   RESTARTS
    my-cluster-pool-b-kafka-2  1/1    Running  0
    my-cluster-pool-b-kafka-3  1/1    Running  0
    my-cluster-pool-b-kafka-6  1/1    Running  0

这个步骤描述了如何迁移现有 Kafka 集群以使用 Kafka 节点池。更新 Kafka 集群后,您可以使用节点池来管理每个池中的节点配置。

注意

虽然启用节点池的 KafkaNodePools 功能门处于 alpha 阶段,但 KafkaNodePool 资源中的副本和存储配置还必须存在于 Kafka 资源中。使用节点池时会忽略配置。

流程

  1. 创建新的 KafkaNodePool 资源。

    1. 将资源命名为 kafka
    2. strimzi.io/cluster 标签指向现有的 Kafka 资源。
    3. 设置副本数和存储配置以匹配您当前的 Kafka 集群。
    4. 将角色设置为 代理

    迁移 Kafka 集群的节点池配置示例

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: kafka
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      roles:
        - broker
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false

  2. 应用 KafkaNodePool 资源:

    oc apply -f <node_pool_configuration_file>

    通过应用此资源,您可以将 Kafka 切换到使用节点池。

    没有更改或滚动更新和资源与之前的资源相同。

  3. 更新 Cluster Operator 配置中的 STRIMZI_FEATURE_GATES 环境变量,使其包含 +KafkaNodePools

    env:
      - name: STRIMZI_FEATURE_GATES
        value: +KafkaNodePools
  4. 使用 strimzi.io/node-pools: enabled 注解,在 Kafka 资源中启用 KafkaNodePools 功能门。

    使用 ZooKeeper 在集群中节点池的配置示例

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      annotations:
        strimzi.io/node-pools: enabled
    spec:
      kafka:
        version: 3.5.0
        replicas: 3
      # ...
      storage:
          type: jbod
          volumes:
          - id: 0
            type: persistent-claim
            size: 100Gi
            deleteClaim: false

  5. 应用 Kafka 资源:

    oc apply -f <kafka_configuration_file>
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部