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 (
零),minAvailable
设置为 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/openshift
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
27.6.3. 使用 AMQ Streams Drain Cleaner 复制链接链接已复制到粘贴板!
将 AMQ Streams Drain Cleaner 与 Cluster Operator 结合使用,将 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 --force
Copy 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): reconciled
Copy 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
。