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 配置
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 集群仍然可用。您可以通过在 Kafka 或 ZooKeeper 模板中将 maxUnavailable 值设置为零。StrimziPodSet 自定义资源使用无法使用 maxUnavailable 值的自定义控制器来管理 Kafka 和 ZooKeeper pod。相反,maxUnavailable 值转换为 minAvailable 值。例如,如果有三个代理 pod,并且 maxUnavailable 属性设置为 0 ( 零),min Available 设置为 3,则需要所有三个代理 pod 可用,并允许零个 pod 不可用。
先决条件
- 您已下载了 AMQ Streams Drain Cleaner 部署文件。
- 您有一个高度可用的 Kafka 集群部署,它运行了您要更新的 OpenShift worker 节点。
复制主题以实现高可用性。
主题配置指定至少 3 个复制因素,最小同步副本的数量为复制因素的数量减 1。
为高可用性复制 Kafka 主题
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
排除 Kafka 或 ZooKeeper
如果您不想在 Drain Cleaner 操作中包含 Kafka 或 ZooKeeper pod,请更改 Drain Cleaner Deployment 配置文件中的默认环境变量。
-
将
STRIMZI_DRAIN_KAFKA设置为false以排除 Kafka pod -
将
STRIMZI_DRAIN_ZOOKEEPER设置为false以排除 ZooKeeper pod
排除 ZooKeeper pod 的配置示例
流程
使用
template设置,在Kafka资源的 Kafka 和 ZooKeeper 部分中将maxUnavailable设置为0(零)。指定 pod 中断预算
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此设置可防止在计划中断时自动驱除 pod,导致 AMQ Streams Drain Cleaner 和 Cluster Operator 在不同的 worker 节点上滚动 pod。
如果要使用 AMQ Streams Drain Cleaner 来排空 ZooKeeper 节点,为 ZooKeeper 添加相同的配置。
更新
Kafka资源:oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 部署 AMQ Streams Drain Cleaner。
要在 OpenShift 上运行 Drain Cleaner,请应用
/install/drain-cleaner/openshift目录中的资源。oc apply -f ./install/drain-cleaner/openshift
oc apply -f ./install/drain-cleaner/openshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow
27.6.3. 使用 AMQ Streams Drain Cleaner 复制链接链接已复制到粘贴板!
与 Cluster Operator 结合使用 AMQ Streams Drain Cleaner,从正在排空的节点移动 Kafka 代理或 ZooKeeper pod。运行 AMQ Streams Drain Cleaner 时,它会使用滚动更新 pod 注解来注解 pod。Cluster Operator 根据注解执行滚动更新。
流程
排空托管 Kafka 代理或 ZooKeeper pod 的指定 OpenShift 节点。
oc get nodes oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --force
oc get nodes oc drain <name-of-node> --delete-emptydir-data --ignore-daemonsets --timeout=6000s --forceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 检查 AMQ Streams Drain Cleaner 日志中的驱除事件,以验证 pod 是否已注解以重启。
AMQ Streams Drain Cleaner 日志显示 pod 的注解
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查 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
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): reconciledCopy to Clipboard Copied! Toggle word wrap Toggle overflow
27.6.4. 观察 AMQ Streams Drain Cleaner 使用的 TLS 证书 复制链接链接已复制到粘贴板!
默认情况下,Drain Cleaner 部署会监视包含其用于身份验证的 TLS 证书的 secret。Drain Cleaner 监视是否有变化,如证书续订。如果检测到更改,它会重启以重新加载 TLS 证书。Drain Cleaner 安装文件默认启用此行为。但是,您可以通过在 Drain Cleaner 安装文件的部署配置 (060-Deployment.yaml) 中将 STRIMZI_CERTIFICATE_WATCH_ENABLED 环境变量设置为 false 来禁用对证书的监控。
启用 STRIMZI_CERTIFICATE_WATCH_ENABLED 后,您还可以使用以下环境变量来监视 TLS 证书。
| 环境变量 | 描述 | 默认 |
|---|---|---|
|
| 启用或禁用证书监视 |
|
|
| 部署 Drain Cleaner 的命名空间以及证书 secret 存在的位置 |
|
|
| Drain Cleaner pod 名称 | - |
|
| 包含 TLS 证书的 secret 名称 |
|
|
| 包含 TLS 证书的 secret 中的字段列表 |
|
控制监视操作的环境变量配置示例
使用 Downward API 机制配置 STRIMZI_CERTIFICATE_WATCH_NAMESPACE 和 STRIMZI_CERTIFICATE_WATCH_POD_NAME。