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 关联性和反关联性
  • 节点关联性

使用 pod 反关联性来确保关键应用程序不会调度到同一磁盘上。在运行 Kafka 集群时,建议您使用 pod 反关联性来确保 Kafka 代理不与其他工作负载(如数据库)共享节点。

OpenShift 集群通常包含许多不同的 worker 节点。有些是针对 CPU 重量工作负载(一些内存)进行了优化,另一些则针对存储(快速本地 SSD)或网络进行优化。使用其他节点有助于优化成本和性能。要实现最佳的性能,务必要调度 AMQ Streams 组件以使用正确的节点。

OpenShift 使用节点关联性将工作负载调度到特定的节点上。节点关联性允许您为要在其上调度 pod 的节点创建调度约束。约束被指定为标签选择器。您可以使用内置的节点标签(如 beta.kubernetes.io/instance-type 或自定义标签)来指定标签,以选择正确的节点。

2.9.1.3. 对专用节点使用节点关联性和容限

使用污点来创建专用节点,然后通过配置节点关联性和容限,在专用节点上调度 Kafka pod。

集群管理员可以将所选 OpenShift 节点标记为污点。污点的节点会排除在常规调度中,普通 pod 不会调度到它们上运行。只有可容许节点上设定的服务才可以调度到节点上。此类节点上运行的唯一其他服务将是日志收集器或定义的网络等系统服务。

在专用节点上运行 Kafka 及其组件会有很多优点。不会在同一节点上运行其他应用程序,这可能会导致距离或消耗 Kafka 所需的资源。这样就可以提高性能和稳定性。

许多 Kafka 代理或 ZooKeeper 节点可以在同一 OpenShift worker 节点上运行。如果 worker 节点失败,它们将同时不可用。要提高可靠性,您可以使用 podAntiAffinity 配置来在不同的 OpenShift worker 节点上调度每个 Kafka 代理或 ZooKeeper 节点。

先决条件

  • 一个 OpenShift 集群
  • 正在运行的 Cluster Operator

流程

  1. 编辑指定集群部署的资源中的 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"
        # ...
    Copy to Clipboard Toggle word wrap

    其中 CLUSTER-NAME 是 Kafka 自定义资源的名称。

  2. 如果您甚至想确保 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"
        # ...
    Copy to Clipboard Toggle word wrap

    其中 CLUSTER-NAME 是 Kafka 自定义资源的名称。

  3. 创建或更新资源。

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

2.9.3. 在 Kafka 组件中配置 pod 反关联性

Pod 反关联性配置有助于获取 Kafka 代理的稳定性和性能。通过使用 podAntiAffinity,OpenShift 不会将 Kafka 代理调度到与其他工作负载相同的节点上。通常,您需要避免 Kafka 与其他网络或存储密集型应用程序(如数据库、存储或其他消息传递平台)在同一 worker 节点上运行。

先决条件

  • 一个 OpenShift 集群
  • 正在运行的 Cluster Operator

流程

  1. 编辑指定集群部署的资源中的 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:
        # ...
    Copy to Clipboard Toggle word wrap
  2. 创建或更新资源。

    这可以通过 oc apply 完成:

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

2.9.4. 在 Kafka 组件中配置节点关联性

先决条件

  • 一个 OpenShift 集群
  • 正在运行的 Cluster Operator

流程

  1. 标记 AMQ Streams 组件应该调度的节点。

    这可以通过 oc label 完成:

    oc label node NAME-OF-NODE node-type=fast-network
    Copy to Clipboard Toggle word wrap

    或者,一些现有的标签可能会被重复使用。

  2. 编辑指定集群部署的资源中的 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:
        # ...
    Copy to Clipboard Toggle word wrap
  3. 创建或更新资源。

    这可以通过 oc apply 完成:

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

2.9.5. 设置专用节点并在其上调度 pod

先决条件

  • 一个 OpenShift 集群
  • 正在运行的 Cluster Operator

流程

  1. 选择应用作专用节点。
  2. 确保这些节点上没有调度任何工作负载。
  3. 在所选节点上设置污点:

    这可以通过 oc adm taint 完成:

    oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule
    Copy to Clipboard Toggle word wrap
  4. 另外,还要为所选节点添加标签。

    这可以通过 oc label 完成:

    oc label node NAME-OF-NODE dedicated=Kafka
    Copy to Clipboard Toggle word wrap
  5. 编辑指定集群部署的资源中的 关联性容限 属性。

    例如:

    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:
        # ...
    Copy to Clipboard Toggle word wrap
  6. 创建或更新资源。

    这可以通过 oc apply 完成:

    oc apply -f <kafka_configuration_file>
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat