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 を使用して OpenShift ではなく Kafka Pod を移動できます。Cluster Operator は、トピックの複製の数が最低数未満にならないようにします。Kafka はエビクションプロセス中も稼働状態を維持できます。Cluster Operator は、OpenShift ワーカーノードが連続してドレイン (解放) されるため、トピックが同期するのを待ちます。
受付 Webhook は、AMQ Streams Drain Cleaner に Kubernetes API への Pod エビクション要求を通知します。AMQ Streams Drain Cleaner は次に、ドレイン (解放) する Pod にローリング更新アノテーションを追加します。これにより、Cluster Operator に、エビクトされた Pod のローリング更新を実行するように指示します。
AMQ Streams Drain Cleaner を使用していない場合は、Pod アノテーションを追加して手動でローリング更新を実行 できます。
Webhook の設定
AMQ Streams Drain Cleaner デプロイメントファイルには、ValidatingWebhookConfiguration リソースファイルが含まれます。リソースでは、Kubernetes API で Webhook を登録する設定が可能です。
この設定は、Pod のエビクション要求の場合に使用する Kubernetes API の ルール を定義します。ルールは、pods/eviction サブリソースに関連する CREATE 操作だけがインターセプトされることを指定します。これらのルールが満たされている場合、API は通知を転送します。
clientConfig は、Webhook を公開する AMQ Streams Drain Cleaner サービスおよび /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 のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
Cluster Operator および Kafka クラスターが実行中の OpenShift クラスターに、AMQ Streams Drain Cleaner をデプロイします。
AMQ Streams は、特定の時点で 1 つの Kafka または ZooKeeper Pod のみが使用不能になることを許可するデフォルトの PodDisruptionBudget (PDB) を設定します。計画的なメンテナンスまたはアップグレードに Drain Cleaner を使用するには、PDB をゼロに設定する必要があります。これは、Pod の自発的な削除を防止し、Kafka または ZooKeeper クラスターが利用可能な状態を維持できるようにするためです。これを行うには、Kafka または ZooKeeper テンプレートで maxUnavailable 値をゼロに設定します。StrimziPodSet カスタムリソースは、maxUnavailable 値を直接使用できないカスタムコントローラーを使用して Kafka および ZooKeeper Pod を管理します。代わりに、maxUnavailable 値は minAvailable 値に変換されます。たとえば、ブローカー Pod が 3 つあり、maxUnavailable プロパティーが 0 (ゼロ) に設定されている場合、minAvailable 設定は 3 となり、3 つのブローカー Pod がすべて使用可能である必要があり、使用できない Pod が存在しないことが許可されます。
前提条件
- AMQ Streams Drain Cleaner デプロイメントファイルをダウンロード しておく。
- 更新する OpenShift ワーカーノードで実行している高可用性 Kafka クラスターデプロイメントがある。
トピックを複製して高可用性に対応する
少なくとも 3 つのレプリケーション係数と、レプリケーション係数よりも 1 つ少ない In-Sync レプリカの最小数を指定するトピック設定。
高可用性のためにレプリケートされた Kafka トピック
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Kafka または ZooKeeper の除外
Kafka または ZooKeeper Pod を Drain Cleaner 操作に含めない場合は、Drain Cleaner Deployment 設定ファイル内のデフォルトの環境変数を変更します。
-
KafkaPod を除外するには、
STRIMZI_DRAIN_KAFKAをfalseに設定します。 -
ZooKeeper Pod を除外するには、
STRIMZI_DRAIN_ZOOKEEPERをfalseに設定します。
ZooKeeper Pod を除外する設定例
手順
template設定を使用して、Kafkaリソースの Kafka セクションと ZooKeeper セクションでmaxUnavailableを0(ゼロ) に設定します。Pod の Disruption Budget の指定
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この設定により、計画的な中断が発生した場合に Pod が自動的に削除されなくなり、AMQ Streams Drain Cleaner と Cluster Operator が 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 の使用 リンクのコピーリンクがクリップボードにコピーされました!
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 --forceCopy to Clipboard Copied! Toggle word wrap Toggle overflow AMQ Streams Drain Cleaner ログのエビクションイベントを確認し、Pod が再起動のアノテーションが付けられていることを確認します。
Pod のアノテーションを示す AMQ Streams Drain Cleaner ログ
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cluster Operator ログで調整イベントを確認し、ローリング更新を確認します。
Cluster Operator log shows rolling updates (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 証明書を含むシークレットを監視します。Drain Cleaner は、証明書の更新などの変更を監視します。変更を検出すると、TLS 証明書の再ロードが再開されます。Drain Cleaner インストールファイルは、デフォルトでこの動作を有効にします。ただし、Drain Cleaner インストールファイルの Deployment 設定 (060-Deployment.yaml) で STRIMZI_CERTIFICATE_WATCH_ENABLED 環境変数を false に設定することで、証明書の監視を無効にすることができます。
STRIMZI_CERTIFICATE_WATCH_ENABLED を有効にすると、TLS 証明書の監視に次の環境変数を使用することもできます。
| 環境変数 | 説明 | デフォルト |
|---|---|---|
|
| 証明書監視を有効または無効にします。 |
|
|
| Drain Cleaner がデプロイされ、証明書シークレットが存在する namespace |
|
|
| Drain Cleaner の Pod 名 | - |
|
| TLS 証明書を含むシークレットの名前 |
|
|
| TLS 証明書を含むシークレット内のフィールドのリスト |
|
監視動作を制御するための環境変数設定の例
Downward API メカニズムを使用して、STRIMZI_CERTIFICATE_WATCH_NAMESPACE および STRIMZI_CERTIFICATE_WATCH_POD_NAME を設定します。