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 在集群中节点池的配置示例
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"
使用 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 (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 的节点已被删除 :100
3、1002
、1001
、1000
等。
如果没有使用注解指定 ID 范围,Cluster Operator 遵循其在扩展操作期间处理 ID 的默认行为。节点 ID 以 0 (零)开始,并在 Kafka 集群中按顺序运行。下一个最低 ID 分配给新节点。在集群中填充节点 ID 的差距。这意味着它们可能无法在节点池中按顺序运行。扩展的默认行为是在集群中添加下一个最低可用节点 ID;在缩减时,它会删除具有最高可用节点 ID 的节点。如果分配的 ID 范围被误格式化,则扩展范围没有 ID,或者缩减范围不适用于任何正在使用的节点,则应用默认方法。
流程
使用 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。现在,您可以扩展节点池。
如需更多信息,请参阅以下:
在协调时,如果注解被错误格式化,则会提供一个警告。
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 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
(可选)要扩展操作 ,您可以指定要使用的节点 ID 范围。
如果您为操作分配了一系列节点 ID,正在添加的节点 ID 由给定的节点序列决定。否则,会使用集群中的最低可用节点 ID。
流程
在节点池中创建新节点。
例如,节点池
pool-a
有三个副本。我们通过增加副本数量来添加节点:oc scale kafkanodepool pool-a --replicas=4
检查部署的状态,并等待节点池中的 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
在增加节点池中的节点数后重新分配分区。
在扩展节点池后,您可以使用 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 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
(可选)为了缩减操作 ,您可以指定要在操作中使用的节点 ID 范围。
如果您为操作分配了一系列节点 ID,则要删除的节点的 ID 由给定的节点序列决定。否则,节点池中具有最高可用 ID 的节点会被删除。
流程
在减少节点池中的节点数前重新分配分区。
在缩减节点池前,您可以使用 Cruise Control
remove-brokers
模式将分区副本移出要删除的代理。在重新分配过程完成后,删除的节点没有实时分区,从而减少节点池中的 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 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
(可选)要扩展和缩减操作 ,您可以指定要使用的节点 ID 范围。
如果您为操作分配了节点 ID,正在添加或删除的节点 ID 由给定的节点序列决定。否则,在添加节点时会使用集群中可用的最低节点 ID;并删除节点池中可用 ID 的节点。
流程
在目标节点池中创建新节点。
例如,节点池
pool-a
有三个副本。我们通过增加副本数量来添加节点:oc scale kafkanodepool pool-a --replicas=4
检查部署的状态,并等待节点池中的 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
。将分区从旧节点重新分配给新节点。
在缩减源节点池前,您可以使用 Cruise Control
remove-brokers
模式将分区副本移出要删除的代理。重新分配过程完成后,减少源节点池中的 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
资源中。使用节点池时会忽略配置。
流程
创建新的
KafkaNodePool
资源。-
将资源命名为
kafka
。 -
将
strimzi.io/cluster
标签指向现有的Kafka
资源。 - 设置副本数和存储配置以匹配您当前的 Kafka 集群。
-
将角色设置为
代理
。
迁移 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
-
将资源命名为
应用
KafkaNodePool
资源:oc apply -f <node_pool_configuration_file>
通过应用此资源,您可以将 Kafka 切换到使用节点池。
没有更改或滚动更新和资源与之前的资源相同。
更新 Cluster Operator 配置中的
STRIMZI_FEATURE_GATES
环境变量,使其包含+KafkaNodePools
。env: - name: STRIMZI_FEATURE_GATES value: +KafkaNodePools
使用
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
应用
Kafka
资源:oc apply -f <kafka_configuration_file>