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 デプロイメントの podDisruptionBudget0 (ゼロ) に設定する必要があります。その後、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 設定

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 のデプロイ

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 トピック

    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 の除外

Kafka または ZooKeeper Pod を Drain Cleaner 操作に含めない場合は、Drain Cleaner Deployment 設定ファイル内のデフォルトの環境変数を変更します。

  • KafkaPod を除外するには、STRIMZI_DRAIN_KAFKAfalse に設定します。
  • ZooKeeper Pod を除外するには、STRIMZI_DRAIN_ZOOKEEPERfalse に設定します。

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 セクションで maxUnavailable0 (ゼロ) に設定します。

    Pod の Disruption Budget の指定

    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 が 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 が再起動のアノテーションが付けられていることを確認します。

    Pod のアノテーションを示す AMQ Streams Drain Cleaner ログ

    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 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
    Copy to Clipboard Toggle word wrap

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 証明書の監視に次の環境変数を使用することもできます。

Expand
表27.3 TLS 証明書を監視するための Drain Cleaner 環境変数
環境変数説明デフォルト

STRIMZI_CERTIFICATE_WATCH_ENABLED

証明書監視を有効または無効にします。

false

STRIMZI_CERTIFICATE_WATCH_NAMESPACE

Drain Cleaner がデプロイされ、証明書シークレットが存在する namespace

strimzi-drain-cleaner

STRIMZI_CERTIFICATE_WATCH_POD_NAME

Drain Cleaner の Pod 名

-

STRIMZI_CERTIFICATE_WATCH_SECRET_NAME

TLS 証明書を含むシークレットの名前

strimzi-drain-cleaner

STRIMZI_CERTIFICATE_WATCH_SECRET_KEYS

TLS 証明書を含むシークレット内のフィールドのリスト

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_NAMESPACE および STRIMZI_CERTIFICATE_WATCH_POD_NAME を設定します。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat