11.3. 使用 AMQ Streams Drain Cleaner 驱除 pod


Kafka 和 ZooKeeper pod 可能会在 OpenShift 升级、维护和 pod 重新调度过程中被驱除。如果您的 Kafka 代理和 ZooKeeper pod 由 AMQ Streams 部署,您可以使用 AMQ Streams Drain Cleaner 工具来处理 pod 驱除。由于 AMQ Streams Drain Cleaner 将处理驱除而不是 OpenShift,所以您需要将 Kafka 部署的 podDisruptionBudget 设置为 0 ( 零)。然后,OpenShift 将不再允许自动驱除 pod。

通过部署 AMQ Streams Drain Cleaner,您可以使用 Cluster Operator 移动 Kafka pod 而不是 OpenShift。Cluster Operator 确保主题永远不会被复制。Kafka 可在驱除过程中保持运行。Cluster Operator 会等待主题同步,因为 OpenShift worker 节点会持续排空。

准入 Webhook 通知 AMQ Streams Drain Cleaner 到 Kubernetes API 的 pod 驱除请求。然后,AMQ Streams Drain Cleaner 会向 pod 添加滚动更新注解,以便排空 pod。这会通知 Cluster Operator 执行被驱除的 pod 的滚动更新。

注意

如果不使用 AMQ Streams Drain Cleaner,您可以添加 pod 注解来手动执行滚动更新

Webhook 配置

AMQ Streams Drain Cleaner 部署文件包含一个 ValidatingWebhookConfiguration 资源文件。资源提供了将 webhook 注册到 Kubernetes API 的配置。

配置定义了 Kubernetes API 在发生 pod 驱除请求时遵循 的规则。规则指定,只有与 pod/eviction 子资源 相关的 CREATE 操作才会被拦截。如果满足这些规则,API 会转发通知。

clientConfig 指向 AMQ Streams Drain Cleaner 服务,以及公开 webhook 的 /drainer 端点。Webhook 使用安全 TLS 连接,需要身份验证。caBundle 属性指定验证 HTTPS 通信的证书链。证书以 Base64 编码。

pod 驱除通知的 Webhook 配置

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
# ...
webhooks:
  - name: strimzi-drain-cleaner.strimzi.io
    rules:
      - apiGroups:   [""]
        apiVersions: ["v1"]
        operations:  ["CREATE"]
        resources:   ["pods/eviction"]
        scope:       "Namespaced"
    clientConfig:
      service:
        namespace: "strimzi-drain-cleaner"
        name: "strimzi-drain-cleaner"
        path: /drainer
        port: 443
        caBundle: Cg==
    # ...
Copy to Clipboard Toggle word wrap

11.3.1. 先决条件

要部署和使用 AMQ Streams Drain Cleaner,您需要下载部署文件。

AMQ Streams Drain Cleaner 部署文件可从 AMQ Streams 软件下载页面

11.3.2. 部署 AMQ Streams Drain Cleaner

将 AMQ Streams Drain Cleaner 部署到运行 Cluster Operator 和 Kafka 集群的 OpenShift 集群。

先决条件

  • 您已 下载 AMQ Streams Drain Cleaner 部署文件
  • 您有一个高度可用的 Kafka 集群部署,它运行了您要更新的 OpenShift worker 节点。
  • 我们将复制主题以实现高可用性。

    主题配置指定至少 3 个复制因素,最小同步副本的数量为复制因素的数量减 1。

    Kafka 主题复制以实现高可用性

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaTopic
    metadata:
      name: my-topic
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      partitions: 1
      replicas: 3
      config:
        # ...
        min.insync.replicas: 2
        # ...
    Copy to Clipboard Toggle word wrap

排除 ZooKeeper

如果您不想包含 ZooKeeper,您可以从 AMQ Streams Drain Cleaner Deployment 配置文件中删除 --zookeeper 命令选项。

apiVersion: apps/v1
kind: Deployment
spec:
  # ...
  template:
    spec:
      serviceAccountName: strimzi-drain-cleaner
      containers:
        - name: strimzi-drain-cleaner
          # ...
          command:
            - "/application"
            - "-Dquarkus.http.host=0.0.0.0"
            - "--kafka"
            - "--zookeeper" 
1

          # ...
Copy to Clipboard Toggle word wrap
1
删除这个选项,以从 AMQ Streams Drain Cleaner 操作中排除 ZooKeeper。

流程

  1. 使用 Kafka 资源中的 模板 设置,为您的 Kafka 部署配置 pod 中断预算 0 ( 零)。

    指定 pod 中断预算

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        template:
          podDisruptionBudget:
            maxUnavailable: 0
    
      # ...
      zookeeper:
        template:
          podDisruptionBudget:
            maxUnavailable: 0
      # ...
    Copy to Clipboard Toggle word wrap

    将最大 pod 中断预算缩减为零可防止 OpenShift 在出现自愿中断时自动驱除 pod,从而使 AMQ Streams Drain Cleaner 和 AMQ Streams Cluster Operator 保留为 AMQ Streams Cluster Operator,以在不同的 worker 节点上部署 OpenShift 将调度的 pod。

    如果要使用 AMQ Streams Drain Cleaner 来排空 ZooKeeper 节点,为 ZooKeeper 添加相同的配置。

  2. 更新 Kafka 资源:

    oc apply -f <kafka_configuration_file>
    Copy to Clipboard Toggle word wrap
  3. 部署 AMQ Streams Drain Cleaner。

    oc apply -f ./install/drain-cleaner/openshift
    Copy to Clipboard Toggle word wrap

11.3.3. 使用 AMQ Streams Drain Cleaner

使用 AMQ Streams Drain Cleaner 与 Cluster Operator 结合使用,将 Kafka 代理或 ZooKeeper pod 从正在排空的节点移动。运行 AMQ Streams Drain Cleaner 时,它会使用滚动更新 pod 注解来注解 pod。Cluster Operator 根据注解执行滚动更新。

流程

  1. 排空托管 Kafka 代理或 ZooKeeper pod 的指定 OpenShift 节点。

    oc get nodes
    oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --force
    Copy to Clipboard Toggle word wrap
  2. 检查 AMQ Streams Drain Cleaner 日志中的驱除事件,以验证 pod 是否已注解重启。

    AMQ Streams Drain Cleaner 日志显示 pod 的注解

    INFO ... Received eviction webhook for Pod my-cluster-zookeeper-2 in namespace my-project
    INFO ... Pod my-cluster-zookeeper-2 in namespace my-project will be annotated for restart
    INFO ... Pod my-cluster-zookeeper-2 in namespace my-project found and annotated for restart
    
    INFO ... Received eviction webhook for Pod my-cluster-kafka-0 in namespace my-project
    INFO ... Pod my-cluster-kafka-0 in namespace my-project will be annotated for restart
    INFO ... Pod my-cluster-kafka-0 in namespace my-project found and annotated for restart
    Copy to Clipboard Toggle word wrap

  3. 检查 Cluster Operator 日志中的协调事件,以验证滚动更新。

    Cluster Operator 日志显示滚动更新

    INFO  PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-zookeeper-2
    INFO  PodOperator:68 - Reconciliation #13(timer) Kafka(my-project/my-cluster): Rolling Pod my-cluster-kafka-0
    INFO  AbstractOperator:500 - Reconciliation #13(timer) Kafka(my-project/my-cluster): reconciled
    Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat