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 模式有很多限制

8.3.1. (预览)将 ID 分配给节点池以进行扩展操作

此流程描述了如何在节点池中执行扩展操作时,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

8.3.5. (预览)迁移现有 Kafka 集群以使用 Kafka 节点池

这个步骤描述了如何迁移现有 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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

© 2024 Red Hat, Inc.