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"
Copy to Clipboard Toggle word wrap

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

使用 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"
Copy to Clipboard Toggle word wrap

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 的节点被删除 :1003, 1002, 1001, 1000 等。

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

先决条件

默认情况下,Apache Kafka 将节点 ID 限制为范围从 0 到 999。要使用大于 999 的节点 ID 值,请将 reserved.broker-max.id 配置属性添加到 Kafka 自定义资源中,并指定所需的最大节点 ID 值。

在本例中,最大节点 ID 设置为 10000。然后,节点 ID 可以分配给该值。

最大节点 ID 数量配置示例

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    config:
      reserved.broker.max.id: 10000
  # ...
Copy to Clipboard Toggle word wrap

流程

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

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

    为扩展分配 ID

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

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

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

    为缩减分配 ID

    oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"
    Copy to Clipboard Toggle word wrap

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

    注意

    如果要删除特定节点,您可以为缩减注解分配一个单一节点 ID: oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[3]"

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

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

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

  3. 执行扩展操作后,如果需要,可以删除注解。

    删除扩展注解

    oc annotate kafkanodepool pool-a strimzi.io/next-node-ids-
    Copy to Clipboard Toggle word wrap

    删除缩减注解

    oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids-
    Copy to Clipboard Toggle word wrap

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

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

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

节点池中的 Kafka 节点

NAME                 READY  STATUS   RESTARTS
my-cluster-pool-a-0  1/1    Running  0
my-cluster-pool-a-1  1/1    Running  0
my-cluster-pool-a-2  1/1    Running  0
Copy to Clipboard Toggle word wrap

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

注意

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

先决条件

流程

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

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

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

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard Toggle word wrap

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

    NAME                 READY  STATUS   RESTARTS
    my-cluster-pool-a-0  1/1    Running  0
    my-cluster-pool-a-1  1/1    Running  0
    my-cluster-pool-a-2  1/1    Running  0
    my-cluster-pool-a-3  1/1    Running  0
    Copy to Clipboard Toggle word wrap

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

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

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

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

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

节点池中的 Kafka 节点

NAME                 READY  STATUS   RESTARTS
my-cluster-pool-a-0  1/1    Running  0
my-cluster-pool-a-1  1/1    Running  0
my-cluster-pool-a-2  1/1    Running  0
my-cluster-pool-a-3  1/1    Running  0
Copy to Clipboard Toggle word wrap

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

注意

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

先决条件

流程

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

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

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

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

    oc scale kafkanodepool pool-a --replicas=3
    Copy to Clipboard Toggle word wrap

    输出显示节点池中的三个 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
    Copy to Clipboard Toggle word wrap

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
    Copy to Clipboard Toggle word wrap
  2. 检查部署的状态,并等待节点池中的 pod 创建,并且状态为 READY

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard Toggle word wrap

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

    NAME                 READY  STATUS   RESTARTS
    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-pool-a-5  1/1    Running  0
    Copy to Clipboard Toggle word wrap

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

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

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

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

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

    oc scale kafkanodepool pool-b --replicas=3
    Copy to Clipboard Toggle word wrap

    池中具有最高 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
    Copy to Clipboard Toggle word wrap

8.3.5. (预览)使用节点池管理存储

AMQ Streams 中的存储管理通常非常简单,设置时需要很少更改,但在某些情况下您可能需要修改存储配置。节点池简化了这个过程,因为您可以设置指定新存储要求的独立节点池。

在此过程中,我们为一个包含三个节点的、名为 pool-a 的节点池创建和管理存储。我们演示了如何更改定义其使用的持久性存储类型的存储类 (volumes.class)。您可以使用相同的步骤来更改存储大小 (volume.size)。

注意

我们强烈建议您使用块存储。AMQ Streams 仅测试用于块存储。

先决条件

流程

  1. 使用自己的存储设置创建节点池。

    例如,节点池 pool-a 使用带有持久性卷的 JBOD 存储:

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-a
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 500Gi
            class: gp2-ebs
      # ...
    Copy to Clipboard Toggle word wrap

    pool-a 中的节点配置为使用 Amazon EBS (Elastic Block Store) GP2 卷。

  2. pool-a 应用节点池配置。
  3. 检查部署的状态,并等待 pool-a 中的 pod 创建并且状态为 READY

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard Toggle word wrap

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

    NAME                 READY  STATUS   RESTARTS
    my-cluster-pool-a-0  1/1    Running  0
    my-cluster-pool-a-1  1/1    Running  0
    my-cluster-pool-a-2  1/1    Running  0
    Copy to Clipboard Toggle word wrap

  4. 要迁移到新存储类,请使用所需存储配置创建新节点池:

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-b
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      roles:
        - broker
      replicas: 3
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 1Ti
            class: gp3-ebs
      # ...
    Copy to Clipboard Toggle word wrap

    pool-b 中的节点配置为使用 Amazon EBS (Elastic Block Store) GP3 卷。

  5. pool-b 应用节点池配置。
  6. 检查部署的状态,并等待 pool-b 中的 pod 创建并且状态为 READY
  7. 将分区从 pool-a 重新分配给 pool-b

    迁移到新的存储配置时,您可以使用 Cruise Control remove-brokers 模式将分区副本移出要删除的代理。

  8. 重新分配过程完成后,删除旧节点池:

    oc delete kafkanodepool pool-a
    Copy to Clipboard Toggle word wrap

8.3.6. (预览)使用节点池管理存储关联性

如果存储资源(如本地持久性卷)受到特定 worker 节点或可用区的限制,配置存储关联性有助于将 pod 调度到正确的节点。

节点池允许您独立配置关联性。在此过程中,我们为两个可用区创建和管理存储关联性: zone-1zone-2

您可以为单独的可用区配置节点池,但使用相同的存储类。我们定义了一个 all-zones 持久性存储类,代表每个区域中可用的存储资源。

我们还使用 .spec.template.pod 属性来配置节点关联性,并在 zone-1zone-2 worker 节点上调度 Kafka pod。

存储类和关联性在代表每个可用区中的节点池中指定:

  • pool-zone-1
  • pool-zone-2.

先决条件

流程

  1. 定义用于每个可用区的存储类:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: all-zones
    provisioner: kubernetes.io/my-storage
    parameters:
      type: ssd
    volumeBindingMode: WaitForFirstConsumer
    Copy to Clipboard Toggle word wrap
  2. 创建代表两个可用区的节点池,指定每个区的 all-zones 存储类和关联性:

    zone-1 的节点池配置

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-zone-1
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 500Gi
            class: all-zones
      template:
        pod:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                    - key: topology.kubernetes.io/zone
                      operator: In
                      values:
                      - zone-1
      # ...
    Copy to Clipboard Toggle word wrap

    zone-2 的节点池配置

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: pool-zone-2
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 4
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 500Gi
            class: all-zones
      template:
        pod:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                    - key: topology.kubernetes.io/zone
                      operator: In
                      values:
                      - zone-2
      # ...
    Copy to Clipboard Toggle word wrap

  3. 应用节点池配置。
  4. 检查部署的状态,并等待节点池中的 pod 创建,并且状态为 READY

    oc get pods -n <my_cluster_operator_namespace>
    Copy to Clipboard Toggle word wrap

    输出显示 pool-zone-1 和 4 Kafka 节点中的 3 个 Kafka 节点,在 pool-zone-2 中:

    NAME                       READY  STATUS   RESTARTS
    my-cluster-pool-zone-1-kafka-0  1/1    Running  0
    my-cluster-pool-zone-1-kafka-1  1/1    Running  0
    my-cluster-pool-zone-1-kafka-2  1/1    Running  0
    my-cluster-pool-zone-2-kafka-3  1/1    Running  0
    my-cluster-pool-zone-2-kafka-4  1/1    Running  0
    my-cluster-pool-zone-2-kafka-5  1/1    Running  0
    my-cluster-pool-zone-2-kafka-6  1/1    Running  0
    Copy to Clipboard Toggle word wrap

这个步骤描述了如何迁移现有 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
    Copy to Clipboard Toggle word wrap

    警告

    要在保留其数据以及节点和资源的名称时迁移集群,节点池名称必须是 kafka,并且 strimzi.io/cluster 标签必须使用 Kafka 资源的名称。否则,节点和资源会使用新名称创建,包括节点使用的持久性卷存储。因此,您之前的数据可能不可用。

  2. 应用 KafkaNodePool 资源:

    oc apply -f <node_pool_configuration_file>
    Copy to Clipboard Toggle word wrap

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

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

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

    env:
      - name: STRIMZI_FEATURE_GATES
        value: +KafkaNodePools
    Copy to Clipboard Toggle word wrap

    重启后,Cluster Operator 会记录一个警告,表示添加了 Kafka 节点池,但还没有与 Cluster Operator 集成。这是进程的预期部分。

  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:
        # ...
      zookeeper:
        # ...
    Copy to Clipboard Toggle word wrap

  5. 应用 Kafka 资源:

    oc apply -f <kafka_configuration_file>
    Copy to Clipboard Toggle word wrap

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat