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
,节点会使用其节点池配置中的值。
Kafka
和 KafkaNodePool
模式的属性不会被合并。为了说明,如果 KafkaNodePool.spec.template
只包含 podSet.metadata.labels
,并且 Kafka.spec.kafka.template
包含 podSet.metadata.annotations
和 pod.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 在集群中节点池的配置示例
使用 KRaft 模式的集群中节点池的配置示例
- 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 (0
、1
、2
、30
)以及一系列 ID (10-20
)。
在典型的场景中,您可以指定一个 ID 范围来向上扩展和单一节点 ID,以便在缩减时删除特定节点。
在此过程中,我们将扩展注解添加到节点池中,如下所示:
-
为
pool-a
分配一系列 ID 进行扩展 -
为
pool-b
分配一系列 ID 用于缩减
在扩展操作过程中,使用 ID,如下所示:
- 扩展获取新节点范围内的最低可用 ID。
- 缩减会删除范围中具有最高可用 ID 的节点。
如果在节点池中分配的节点 ID 序列中有差距,则要添加的下一个节点会被分配一个填充空白的 ID。
每次扩展操作后,不需要更新注解。任何未使用的 ID 仍对下一个扩展事件有效。
Cluster Operator 允许您以升序或降序指定 ID 范围,以便您可以按照节点扩展的顺序定义它们。例如,在扩展时,您可以指定一个范围,如 [1000-1999]
,并且新节点分配下一个最低 ID: 1000
、1001
、1002
、1003
等。相反,当缩减时,您可以指定一个范围,如 [1999-1000]
,确保具有下一个最高 ID 的节点被删除 :1003
, 1002
, 1001
, 1000
等。
如果没有使用注解指定 ID 范围,Cluster Operator 遵循其在扩展操作期间处理 ID 的默认行为。节点 ID 以 0 (零)开始,并在 Kafka 集群中按顺序运行。下一个最低 ID 分配给新节点。在集群中填充节点 ID 的差距。这意味着它们可能无法在节点池中按顺序运行。扩展的默认行为是在集群中添加下一个最低可用节点 ID;在缩减时,它会删除具有最高可用节点 ID 的节点。如果分配的 ID 范围被误格式化,则扩展范围没有 ID,或者缩减范围不适用于任何正在使用的节点,则应用默认方法。
先决条件
- 必须部署 Cluster Operator。
-
(可选)使用
reserved.broker-max.id
配置属性来扩展节点池中节点 ID 的允许范围。
默认情况下,Apache Kafka 将节点 ID 限制为范围从 0 到 999。要使用大于 999 的节点 ID 值,请将 reserved.broker-max.id
配置属性添加到 Kafka
自定义资源中,并指定所需的最大节点 ID 值。
在本例中,最大节点 ID 设置为 10000。然后,节点 ID 可以分配给该值。
最大节点 ID 数量配置示例
流程
使用 ID 为节点池添加在扩展或缩减时要使用的 ID,如下例所示。
用于向上扩展的 ID 会被分配给节点
池池
:为扩展分配 ID
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将节点添加到
池
时使用此范围内的最低可用 ID。用于缩减的 ID 分配给节点池
pool-b
:为缩减分配 ID
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 缩减
pool-b
时会删除此范围内的最高可用 ID。注意如果要删除特定节点,您可以为缩减注解分配一个单一节点 ID:
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[3]"
。现在,您可以扩展节点池。
如需更多信息,请参阅以下:
在协调时,如果注解被错误格式化,则会提供一个警告。
执行扩展操作后,如果需要,可以删除注解。
删除扩展注解
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids-
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids-
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除缩减注解
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids-
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids-
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
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
节点 ID 在创建时附加到节点的名称中。我们添加节点 my-cluster-pool-a-3
,节点 ID 为 3
。
在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
- Cruise Control 使用 Kafka 部署。
(可选)要扩展操作 ,您可以指定要在操作中使用的节点 ID。
如果您为操作分配了一系列节点 ID,正在添加的节点 ID 由给定的节点序列决定。如果您分配了单一节点 ID,则使用指定 ID 添加节点。否则,会使用集群中的最低可用节点 ID。
流程
在节点池中创建新节点。
例如,节点池
pool-a
有三个副本。我们通过增加副本数量来添加节点:oc scale kafkanodepool pool-a --replicas=4
oc scale kafkanodepool pool-a --replicas=4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查部署的状态,并等待节点池中的 pod 创建,并且状态为
READY
。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示节点池中的四个 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
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 Copied! Toggle word wrap Toggle overflow 在增加节点池中的节点数后重新分配分区。
在扩展节点池后,您可以使用 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
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
节点 ID 在创建时附加到节点的名称中。我们删除节点 my-cluster-pool-a-3
,节点 ID 为 3
。
在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
- Cruise Control 使用 Kafka 部署。
(可选)为了缩减操作 ,您可以指定要在操作中使用的节点 ID。
如果您为操作分配了一系列节点 ID,则要删除的节点的 ID 由给定的节点序列决定。如果您分配了单一节点 ID,则将删除具有指定 ID 的节点。否则,节点池中具有最高可用 ID 的节点会被删除。
流程
在减少节点池中的节点数前重新分配分区。
在缩减节点池前,您可以使用 Cruise Control
remove-brokers
模式将分区副本移出要删除的代理。在重新分配过程完成后,删除的节点没有实时分区,从而减少节点池中的 Kafka 节点数量。
例如,节点池
pool-a
有四个副本。我们通过减少副本数来删除节点:oc scale kafkanodepool pool-a --replicas=3
oc scale kafkanodepool pool-a --replicas=3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示节点池中的三个 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
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 Copied! Toggle word wrap Toggle overflow
8.3.4. (预览)在节点池之间移动节点 复制链接链接已复制到粘贴板!
这个步骤描述了如何在不停机的情况下在源和目标 Kafka 节点池之间移动节点。您可以在目标节点池中创建新节点并重新分配分区,以便从源节点池中的旧节点移动数据。当新节点上的副本同步时,您可以删除旧节点。
在此过程中,我们从两个节点池开始:
-
具有三个副本的池
是目标节点池 -
带有四个副本的
pool-b
是源节点池
我们扩展 pool-a
,并重新分配分区并缩减 pool-b
,这会导致以下内容:
-
pool-a
带有四个副本 -
带有三个副本的
pool-b
在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
- Cruise Control 使用 Kafka 部署。
(可选)要扩展和缩减操作 ,您可以指定要使用的节点 ID 范围。
如果您为操作分配了节点 ID,正在添加或删除的节点 ID 由给定的节点序列决定。否则,在添加节点时会使用集群中可用的最低节点 ID;并删除节点池中可用 ID 的节点。
流程
在目标节点池中创建新节点。
例如,节点池
pool-a
有三个副本。我们通过增加副本数量来添加节点:oc scale kafkanodepool pool-a --replicas=4
oc scale kafkanodepool pool-a --replicas=4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查部署的状态,并等待节点池中的 pod 创建,并且状态为
READY
。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示目标节点池中的四个 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
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 Copied! Toggle word wrap Toggle overflow 节点 ID 在创建时附加到节点的名称中。我们添加节点
my-cluster-pool-a-5
,其节点 ID 为5
。将分区从旧节点重新分配给新节点。
在缩减源节点池前,您可以使用 Cruise Control
remove-brokers
模式将分区副本移出要删除的代理。重新分配过程完成后,减少源节点池中的 Kafka 节点数量。
例如,节点池
pool-b
具有四个副本。我们通过减少副本数来删除节点:oc scale kafkanodepool pool-b --replicas=3
oc scale kafkanodepool pool-b --replicas=3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 池中具有最高 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
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 Copied! Toggle word wrap Toggle overflow
8.3.5. (预览)使用节点池管理存储 复制链接链接已复制到粘贴板!
AMQ Streams 中的存储管理通常非常简单,设置时需要很少更改,但在某些情况下您可能需要修改存储配置。节点池简化了这个过程,因为您可以设置指定新存储要求的独立节点池。
在此过程中,我们为一个包含三个节点的、名为 pool-a
的节点池创建和管理存储。我们演示了如何更改定义其使用的持久性存储类型的存储类 (volumes.class
)。您可以使用相同的步骤来更改存储大小 (volume.size
)。
我们强烈建议您使用块存储。AMQ Streams 仅测试用于块存储。
先决条件
- 必须部署 Cluster Operator。
- Cruise Control 使用 Kafka 部署。
- 对于使用持久性卷声明进行动态卷分配的存储,存储类在与您需要的存储解决方案对应的 OpenShift 集群中定义并可用。
流程
使用自己的存储设置创建节点池。
例如,节点池
pool-a
使用带有持久性卷的 JBOD 存储:Copy to Clipboard Copied! Toggle word wrap Toggle overflow pool-a
中的节点配置为使用 Amazon EBS (Elastic Block Store) GP2 卷。-
为
pool-a
应用节点池配置。 检查部署的状态,并等待
pool-a
中的 pod 创建并且状态为READY
。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示节点池中的三个 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
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 Copied! Toggle word wrap Toggle overflow 要迁移到新存储类,请使用所需存储配置创建新节点池:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow pool-b
中的节点配置为使用 Amazon EBS (Elastic Block Store) GP3 卷。-
为
pool-b
应用节点池配置。 -
检查部署的状态,并等待
pool-b
中的 pod 创建并且状态为READY
。 将分区从
pool-a
重新分配给pool-b
。迁移到新的存储配置时,您可以使用 Cruise Control
remove-brokers
模式将分区副本移出要删除的代理。重新分配过程完成后,删除旧节点池:
oc delete kafkanodepool pool-a
oc delete kafkanodepool pool-a
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.6. (预览)使用节点池管理存储关联性 复制链接链接已复制到粘贴板!
如果存储资源(如本地持久性卷)受到特定 worker 节点或可用区的限制,配置存储关联性有助于将 pod 调度到正确的节点。
节点池允许您独立配置关联性。在此过程中,我们为两个可用区创建和管理存储关联性: zone-1
和 zone-2
。
您可以为单独的可用区配置节点池,但使用相同的存储类。我们定义了一个 all-zones
持久性存储类,代表每个区域中可用的存储资源。
我们还使用 .spec.template.pod
属性来配置节点关联性,并在 zone-1
和 zone-2
worker 节点上调度 Kafka pod。
存储类和关联性在代表每个可用区中的节点池中指定:
-
pool-zone-1
-
pool-zone-2
.
先决条件
- 必须部署 Cluster Operator。
- 如果您不熟悉关联性概念,请参阅 Kubernetes 节点和 pod 关联性文档。
流程
定义用于每个可用区的存储类:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建代表两个可用区的节点池,指定每个区的
all-zones
存储类和关联性:zone-1 的节点池配置
Copy to Clipboard Copied! Toggle word wrap Toggle overflow zone-2 的节点池配置
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 应用节点池配置。
检查部署的状态,并等待节点池中的 pod 创建,并且状态为
READY
。oc get pods -n <my_cluster_operator_namespace>
oc get pods -n <my_cluster_operator_namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示
pool-zone-1
和 4 Kafka 节点中的 3 个 Kafka 节点,在pool-zone-2
中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.7. (预览)迁移现有 Kafka 集群以使用 Kafka 节点池 复制链接链接已复制到粘贴板!
这个步骤描述了如何迁移现有 Kafka 集群以使用 Kafka 节点池。更新 Kafka 集群后,您可以使用节点池来管理每个池中的节点配置。
虽然启用节点池的 KafkaNodePools
功能门处于 alpha 阶段,但 KafkaNodePool
资源中的副本和存储配置还必须存在于 Kafka
资源中。使用节点池时会忽略配置。
流程
创建新的
KafkaNodePool
资源。-
将资源命名为
kafka
。 -
将
strimzi.io/cluster
标签指向现有的Kafka
资源。 - 设置副本数和存储配置以匹配您当前的 Kafka 集群。
-
将角色设置为
代理
。
迁移 Kafka 集群的节点池配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告要在保留其数据以及节点和资源的名称时迁移集群,节点池名称必须是
kafka
,并且strimzi.io/cluster
标签必须使用 Kafka 资源的名称。否则,节点和资源会使用新名称创建,包括节点使用的持久性卷存储。因此,您之前的数据可能不可用。-
将资源命名为
应用
KafkaNodePool
资源:oc apply -f <node_pool_configuration_file>
oc apply -f <node_pool_configuration_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过应用此资源,您可以将 Kafka 切换到使用节点池。
没有更改或滚动更新和资源与之前的资源相同。
更新 Cluster Operator 配置中的
STRIMZI_FEATURE_GATES
环境变量,使其包含+KafkaNodePools
。env: - name: STRIMZI_FEATURE_GATES value: +KafkaNodePools
env: - name: STRIMZI_FEATURE_GATES value: +KafkaNodePools
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重启后,Cluster Operator 会记录一个警告,表示添加了 Kafka 节点池,但还没有与 Cluster Operator 集成。这是进程的预期部分。
使用
strimzi.io/node-pools: enabled
注解,在Kafka
资源中启用KafkaNodePools
功能门。使用 ZooKeeper 在集群中节点池的配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
Kafka
资源:oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 没有更改或滚动更新。这些资源与之前的资源相同。