2.9. 配置 pod 调度
当两个应用调度到同一 OpenShift 节点时,两个应用都可能使用相同的资源,如磁盘 I/O 和影响性能。这可能导致性能下降。以避免与其他关键工作负载共享节点的方式调度 Kafka pod,使用正确的节点或只为 Kafka 专用节点集合才是避免此类问题的最佳方法。
2.9.1. 指定关联性、容限和拓扑分布限制
使用关联性、容限和拓扑分布约束,将 kafka 资源的 pod 调度到节点上。关联性、容限和拓扑分布约束通过以下资源中的 关联性
、容限
和 topologySpreadConstraint
属性进行配置:
-
Kafka.spec.kafka.template.pod
-
Kafka.spec.zookeeper.template.pod
-
Kafka.spec.entityOperator.template.pod
-
KafkaConnect.spec.template.pod
-
KafkaBridge.spec.template.pod
-
KafkaMirrorMaker.spec.template.pod
-
KafkaMirrorMaker2.spec.template.pod
关联性
、容限
和 topologySpreadConstraint
属性的格式遵循 OpenShift 规格。关联性配置可以包括不同类型的关联性:
- Pod 关联性和反关联性
- 节点关联性
在 OpenShift 1.16 和 1.17 上,默认禁用 topologySpreadConstraint
的支持。要使用 topologySpreadConstraint
,您必须在 Kubernetes API 服务器和调度程序中启用 EvenPodsSpread
功能门。
2.9.1.1. 使用 pod 反关联性来避免关键应用程序共享节点
使用 pod 反关联性来确保关键应用程序不会调度到同一磁盘上。在运行 Kafka 集群时,建议您使用 pod 反关联性来确保 Kafka 代理不与其他工作负载(如数据库)共享节点。
2.9.1.2. 使用节点关联性将工作负载调度到特定的节点上
OpenShift 集群通常包含许多不同的 worker 节点。有些是针对 CPU 重量工作负载(一些内存)进行了优化,另一些则针对存储(快速本地 SSD)或网络进行优化。使用其他节点有助于优化成本和性能。要实现最佳的性能,务必要调度 AMQ Streams 组件以使用正确的节点。
OpenShift 使用节点关联性将工作负载调度到特定的节点上。节点关联性允许您为要在其上调度 pod 的节点创建调度约束。约束被指定为标签选择器。您可以使用内置的节点标签(如 beta.kubernetes.io/instance-type
或自定义标签)来指定标签,以选择正确的节点。
2.9.1.3. 对专用节点使用节点关联性和容限
使用污点来创建专用节点,然后通过配置节点关联性和容限,在专用节点上调度 Kafka pod。
集群管理员可以将所选 OpenShift 节点标记为污点。污点的节点会排除在常规调度中,普通 pod 不会调度到它们上运行。只有可容许节点上设定的服务才可以调度到节点上。此类节点上运行的唯一其他服务将是日志收集器或定义的网络等系统服务。
在专用节点上运行 Kafka 及其组件会有很多优点。不会在同一节点上运行其他应用程序,这可能会导致距离或消耗 Kafka 所需的资源。这样就可以提高性能和稳定性。
2.9.2. 配置 pod 反关联性以在不同的 worker 节点上调度每个 Kafka 代理
许多 Kafka 代理或 ZooKeeper 节点可以在同一 OpenShift worker 节点上运行。如果 worker 节点失败,它们将同时不可用。要提高可靠性,您可以使用 podAntiAffinity
配置来在不同的 OpenShift worker 节点上调度每个 Kafka 代理或 ZooKeeper 节点。
先决条件
- OpenShift 集群
- 正在运行的 Cluster Operator
流程
编辑指定集群部署的资源中的
affinity
属性。要确定 Kafka 代理或 ZooKeeper 节点没有共享任何 worker 节点,请使用strimzi.io/name
标签。将topologyKey
设置为kubernetes.io/hostname
,以指定所选 pod 没有调度到具有相同主机名的节点。这仍然允许同一 worker 节点由单个 Kafka 代理和单个 ZooKeeper 节点共享。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-kafka topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-zookeeper topologyKey: "kubernetes.io/hostname" # ...
其中
CLUSTER-NAME
是 Kafka 自定义资源的名称。如果您甚至想确保 Kafka 代理和 ZooKeeper 节点没有共享相同的 worker 节点,请使用
strimzi.io/cluster
标签。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ...
其中
CLUSTER-NAME
是 Kafka 自定义资源的名称。创建或更新资源。
oc apply -f <kafka_configuration_file>
2.9.3. 在 Kafka 组件中配置 pod 反关联性
Pod 反关联性配置有助于获取 Kafka 代理的稳定性和性能。通过使用 podAntiAffinity
,OpenShift 不会将 Kafka 代理调度到与其他工作负载相同的节点上。通常,您需要避免 Kafka 与其他网络或存储密集型应用程序(如数据库、存储或其他消息传递平台)在同一 worker 节点上运行。
先决条件
- OpenShift 集群
- 正在运行的 Cluster Operator
流程
编辑指定集群部署的资源中的
affinity
属性。使用标签指定不应调度到同一节点上的 pod。topologyKey
应设置为kubernetes.io/hostname
,以指定所选 pod 不应该调度到具有相同主机名的节点。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ...
创建或更新资源。
这可以通过
oc apply
完成:oc apply -f <kafka_configuration_file>
2.9.4. 在 Kafka 组件中配置节点关联性
先决条件
- OpenShift 集群
- 正在运行的 Cluster Operator
流程
标记 AMQ Streams 组件应该调度的节点。
这可以通过
oc label
完成:oc label node NAME-OF-NODE node-type=fast-network
或者,一些现有的标签可能会被重复使用。
编辑指定集群部署的资源中的
affinity
属性。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - fast-network # ... zookeeper: # ...
创建或更新资源。
这可以通过
oc apply
完成:oc apply -f <kafka_configuration_file>
2.9.5. 设置专用节点并在其上调度 pod
先决条件
- OpenShift 集群
- 正在运行的 Cluster Operator
流程
- 选择应用作专用节点。
- 确保这些节点上没有调度任何工作负载。
在所选节点上设置污点:
这可以通过
oc adm taint
完成:oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule
另外,还要为所选节点添加标签。
这可以通过
oc label
完成:oc label node NAME-OF-NODE dedicated=Kafka
编辑指定集群部署的资源中的
关联性
和容限
属性。例如:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: tolerations: - key: "dedicated" operator: "Equal" value: "Kafka" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - Kafka # ... zookeeper: # ...
创建或更新资源。
这可以通过
oc apply
完成:oc apply -f <kafka_configuration_file>