27.6. 使用 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 通知到 Kubernetes API 的 pod 驱除请求的 AMQ Streams Drain Cleaner。然后,AMQ Streams Drain Cleaner 为 pod 添加滚动更新注解来排空。这会通知 Cluster Operator 对被驱除的 pod 执行滚动更新。

注意

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

Webhook 配置

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

配置定义了在 pod 驱除请求时要遵循的 Kubernetes API 规则。规则指定仅截获与 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

27.6.1. 下载 AMQ Streams Drain Cleaner 部署文件

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

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

27.6.2. 使用安装文件部署 AMQ Streams Drain Cleaner

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

AMQ Streams 设置默认 PodDisruptionBudget (PDB),它在任何给定时间只允许一个 Kafka 或 ZooKeeper pod 不可用。要使用 Drain Cleaner 进行计划维护或升级,您必须设置零的 PDB。这是为了防止自愿驱除 pod,并确保 Kafka 或 ZooKeeper 集群仍然可用。您可以通过在 KafkaZooKeeper 模板中将 maxUnavailable 值设置为零。StrimziPodSet 自定义资源使用无法直接使用 maxUnavailable 值的自定义控制器管理 Kafka 和 ZooKeeper pod。相反,maxUnavailable 值将转换为 minAvailable 值。例如,如果存在三个代理 pod,并且 maxUnavailable 属性被设置为 0 ( 零),minAvailable 设置为 3,则需要所有三个代理 pod 都可用,并允许零个 pod 不可用。

先决条件

  • 您已下载了 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

排除 Kafka 或 ZooKeeper

如果您不想在 Drain Cleaner 操作中包含 Kafka 或 ZooKeeper pod,请更改 Drain Cleaner Deployment 配置文件中的默认环境变量。

  • STRIMZI_DRAIN_KAFKA 设置为 false 以排除 Kafka pod
  • STRIMZI_DRAIN_ZOOKEEPER 设置为 false 以排除 ZooKeeper pod

排除 ZooKeeper pod 的配置示例

apiVersion: apps/v1
kind: Deployment
spec:
  # ...
  template:
    spec:
      serviceAccountName: strimzi-drain-cleaner
      containers:
        - name: strimzi-drain-cleaner
          # ...
          env:
            - name: STRIMZI_DRAIN_KAFKA
              value: "true"
            - name: STRIMZI_DRAIN_ZOOKEEPER
              value: "false"
          # ...
Copy to Clipboard Toggle word wrap

流程

  1. 使用 template 设置,在 Kafka 资源的 Kafka 和 ZooKeeper 部分中将maxUnavailable 设置为 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,留下 AMQ Streams Drain Cleaner 和 Cluster Operator 在不同的 worker 节点上滚动 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。

    • 要在 OpenShift 上运行 Drain Cleaner,请应用 /install/drain-cleaner/openshift 目录中的资源。

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

27.6.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

默认情况下,Drain Cleaner 部署会监视包含其用于身份验证的 TLS 证书的 secret。Drain Cleaner 监视是否有变化,如证书续订。如果检测到更改,它会重新启动以重新加载 TLS 证书。Drain Cleaner 安装文件默认启用此行为。但是,您可以通过在 Drain Cleaner 安装文件的部署配置 (060-Deployment.yaml) 中将 STRIMZI_CERTIFICATE_WATCH_ENABLED 环境变量设置为 false 来禁用对证书的监控。

在启用了 STRIMZI_CERTIFICATE_WATCH_ENABLED 时,您还可以使用以下环境变量来监视 TLS 证书。

Expand
表 27.3. 排空用于监视 TLS 证书的 Cleaner 环境变量
环境变量描述默认

STRIMZI_CERTIFICATE_WATCH_ENABLED

启用或禁用证书监视

false

STRIMZI_CERTIFICATE_WATCH_NAMESPACE

部署 Drain Cleaner 的命名空间,以及证书 secret 所在的命名空间

strimzi-drain-cleaner

STRIMZI_CERTIFICATE_WATCH_POD_NAME

Drain Cleaner pod 名称

-

STRIMZI_CERTIFICATE_WATCH_SECRET_NAME

包含 TLS 证书的 secret 名称

strimzi-drain-cleaner

STRIMZI_CERTIFICATE_WATCH_SECRET_KEYS

包含 TLS 证书的 secret 中的字段列表

tls.crt, tls.key

控制监视操作的环境变量配置示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: strimzi-drain-cleaner
  labels:
    app: strimzi-drain-cleaner
  namespace: strimzi-drain-cleaner
spec:
  # ...
    spec:
      serviceAccountName: strimzi-drain-cleaner
      containers:
        - name: strimzi-drain-cleaner
          # ...
          env:
            - name: STRIMZI_DRAIN_KAFKA
              value: "true"
            - name: STRIMZI_DRAIN_ZOOKEEPER
              value: "true"
            - name: STRIMZI_CERTIFICATE_WATCH_ENABLED
              value: "true"
            - name: STRIMZI_CERTIFICATE_WATCH_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: STRIMZI_CERTIFICATE_WATCH_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
              # ...
Copy to Clipboard Toggle word wrap

提示

使用 Downward API 机制配置 STRIMZI_CERTIFICATE_WATCH_NAMESPACESTRIMZI_CERTIFICATE_WATCH_POD_NAME

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat