# Dynamic Engineデプロイメント向けのPodDisruptionBudgetの設定

インスタンスおよび環境のHelmチャートで、PodDisruptionBudgetの設定を有効化、無効化、調整します。

Kubernetesにおいて、PodDisruptionBudgetオブジェクトは、同時に自発的に中断できるポッドの数を定義します。背景情報については、[ポッドの中断](https://kubernetes.io/docs/concepts/workloads/pods/disruptions)を参照してください。

PodDisruptionBudgetは、ノードのメンテナンスやクラスターのスケーリングといった計画的な中断の際、サービスの可用性を維持するのに役立ちます。この手順は、初期デプロイ時、または既存のリリースをアップグレードする際に適用してください。

KubernetesのPodDisruptionBudgetへのサポートは、[Dynamic Engine v1.6.0](https://help.qlik.com/talend/ja-JP/dynamic-engine-changelog/Cloud/dynamic-engine-v1-6-0-release-changelog)で導入されました。

## 始める前に

* dynamic-engine-crdカスタムリソース定義は、oci://ghcr.io/talend/helm/dynamic-engine-crd Helmチャートを使用してインストールされている必要があります。インストールされていない場合は、次のコマンドを実行してインストールしてください。
  1. 使用するチャートのバージョンを見つけます。

     * 次のHelmコマンドを実行します:
       ```
       helm show chart oci://ghcr.io/talend/helm/dynamic-engine-crd --version <engine_version>
       ```
     * Talend Management Consoleから直接バージョンを見るか、自分のDynamic Engineバージョンに含まれているチャートバージョンの[Dynamic Engine変更ログ](https://help.qlik.com/talend/en-US/dynamic-engine-changelog/Cloud)をチェックしてください。
     * [Dynamic Engineバージョンエンドポイント](https://talend.qlik.dev/apis/dynamic-engine/2021-03/#operation_return-all-supported-dynamic-engine-versions)へのAPIコールを使用します。

  2. 次のコマンドを実行し、目的のバージョンのHelmチャートをインストールします。

     ```
     helm install dynamic-engine-crd oci://ghcr.io/talend/helm/dynamic-engine-crd --version <helm_chart_version>
     ```

     &lt;helm\_chart\_version&gt;を、お使いのDynamic Engineバージョンでサポートされているチャートのバージョンに置換します。

     バージョンを指定しないと、利用可能な最新のdynamic-engine-crdチャートバージョンがインストールされます。
* お使いのKubernetesクラスターは、PodDisruptionBudgetリソースをサポートしています。
* [KubernetesのPodDisruptionBudget](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)に関する基本的な知識があります。

## このタスクについて

情報メモ重要:

EKS Auto ModeまたはGKE Autopilotを使用する予定の場合は、デプロイの前にまず PodDisruptionBudgetを設定することをお勧めします。global.profile: minimalおよびconfiguration.persistence.enabled=falseと組み合わせて使用してください。

データ統合ジョブはデフォルトでグローバルなPodDisruptionBudget設定を使用し、個別のタスクレベルの設定は公開していません。タスクレベルのカスタマイズは、データサービスタスクおよびルートタスクでのみ利用できます。

Pod Disruption Budget (PDB)は、通常、以下のような場合に役立ちます。

* クラスターのメンテナンス中に重要なサービスが退去させられるのを防ぐ
* 最小ポッド可用性クォータ(利用可能なポッドの最小数または利用不可能なポッドの最大数)の確保
* 可用性とクラスター運用の柔軟性のバランスをとる
* 連携したポッドの停止に伴う連鎖的な障害の回避

## 手順

1. デプロイのサンプル変数を設定します。
   ```
   DYNAMIC_ENGINE_VERSION=1.6.0
   DYNAMIC_ENGINE_ID=c-m-sjufu4qy
   DYNAMIC_ENGINE_ENVIRONMENT_ID=684c3baec6a6f88f61e9d59d
   ```

   例として示されている値を、ユーザーのデプロイメントの識別子に置き換えます。
2. PodDisruptionBudgetをグローバルに有効にするカスタムvaluesファイルを作成します。

   デフォルトでは、チャートはPodDisruptionBudgetリソースを作成しません。両方のチャートについてデフォルトのPDBリソースを作成するには、global.pdb.enabledをtrueに設定します。

   configuration.dataServiceRouteDeployment.podDisruptionBudgetをカスタマイズする前に、global.pdb.enabledをtrueに設定します。環境チャートは、グローバルフラグが有効になっている場合にのみ、それらの値を読み取ります。
   ```
   cat <<EOF > custom-pdb-values.yaml
   global:
     pdb:
       enabled: true
   EOF
   ```

   このファイルは、Dynamic Engineインスタンスとその環境のデフォルトPDBリソースを有効にします。このグローバル設定では、利用不可ポッドの最大数に関する制約が0に設定されています。これは、環境チャートのデータサービスおよびルートタスクのデフォルトのPDBルールでもあります。データ統合ジョブは、このグローバルPDBルールのみを使用します。
3. グローバルPDB valuesファイルを使用して、Dynamic Engineインスタンスおよび環境のチャートをインストールまたはアップグレードします。
   ```
   helm upgrade --install dynamic-engine-$DYNAMIC_ENGINE_ID \
    -f $DYNAMIC_ENGINE_ID-values.yaml  \
    -f custom-pdb-values.yaml \
    oci://ghcr.io/talend/helm/dynamic-engine \
    --version $DYNAMIC_ENGINE_VERSION

   helm upgrade --install dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
    -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-values.yaml  \
    -f custom-pdb-values.yaml \
    oci://ghcr.io/talend/helm/dynamic-engine-environment \
    --version $DYNAMIC_ENGINE_VERSION
   ```
4. 必要に応じて、データサービスおよびルートタスクのカスタム PodDisruptionBudget ルールを設定します。
   1. データサービスおよびルートPDBのルールを含むカスタムvaluesファイルを作成します。
      ```
      cat <<EOF > custom-pdb-data-services-routes-values.yaml
      global:
        pdb:
          enabled: true
      configuration:
        dataServiceRouteDeployment:
          podDisruptionBudget:
            maxUnavailable: 1
            minAvailable: ~
            unhealthyPodEvictionPolicy: AlwaysAllow # or IfHealthyBudget
      EOF
      ```
      * maxUnavailableプロパティとminAvailableプロパティは、相互に排他的です。maxUnavailableを設定する際、minAvailableを~に設定します。

        利用可能なポッドの数を最小限に保つ場合は、代わりに minAvailableを設定し、maxUnavailableは~のままにします。

      * unhealthyPodEvictionPolicyを使用して、Kubernetesが健全でないポッドをいつ退去させるかを制御します。指定可能な値は、AlwaysAllowまたはIfHealthyBudgetです。

        不健全なポッドの退去ポリシーの詳細については、Kubernetesドキュメントの[Unhealthy Pod Eviction Policy](https://kubernetes.io/docs/tasks/run-application/configure-pdb/#unhealthy-pod-eviction-policy)セクションを参照してください。
   2. カスタムのデータサービスおよびルートPDBルールを使用して、環境チャートをアップグレードします。
      ```
      helm upgrade --install dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
       -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-values.yaml  \
       -f custom-pdb-values.yaml \
       -f custom-pdb-data-services-routes-values.yaml \
       oci://ghcr.io/talend/helm/dynamic-engine-environment \
       --version $DYNAMIC_ENGINE_VERSION
      ```
5. 制限のないメンテナンスが必要な場合は、PodDisruptionBudgetを一時的に無効にします。

   他のリリース値を変更せずにPDBを無効にするには、次のコマンドを実行します。
   ```
   helm upgrade dynamic-engine-$DYNAMIC_ENGINE_ID \
   oci://ghcr.io/talend/helm/dynamic-engine --version $DYNAMIC_ENGINE_VERSION \
   --reuse-values --set global.pdb.enabled=false

   helm upgrade dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
   oci://ghcr.io/talend/helm/dynamic-engine-environment --version $DYNAMIC_ENGINE_VERSION \
   --reuse-values --set global.pdb.enabled=false
   ```

## タスクの結果

Dynamic Engineインスタンスとその環境は、選択されたPodDisruptionBudget設定を使用するようになりました。次のコマンドを使用して、アクティブなHelm値を確認します。

```
helm get values dynamic-engine-$DYNAMIC_ENGINE_ID --output json | jq -r '.global.pdb'
helm get values dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID --output json | jq -r '.global.pdb'
```

nullが返された場合、チャートはデフォルト値を使用しており、PodDisruptionBudgetリソースは作成されません。

トラブルシューティング:

ポッドの中断が拒否されるか、PDBエラーが表示される場合は、次を確認してください。

1. PDBリソースが正常に作成されたことを確認するには
   ```
   kubectl get pdb -A -l 'app.kubernetes.io/part-of=qlik-dynamic-engine'
   ```

   qlik-dynamic-engineおよび qlik-processing-env-&lt;env-id&gt;ネームスペースでPDBリソースを探します。
2. PDBリソースの状態を確認するには
   ```
   kubectl describe pdb <pdb-name> -n <namespace>
   ```

   Disruptions Allowed(許容される停止数)、Current Healthy(現在の正常数)、Desired Healthy(要求される正常数)の各フィールドを確認します。
3. ポッドの数がPDB制約を満たすのに十分であることを確認します
   ```
   kubectl get pods -n <namespace> -l app=<service-name>
   ```

   minAvailable: 1を設定していても、ポッドが1つしか存在しない場合、PDBは一切の停止を許可しません。PDBの制約を調整するか、レプリカ数を増やすことを検討してください。
4. 障害拒否に関連するイベントをレビューします
   ```
   kubectl get events -n <namespace> --sort-by=.lastTimestamp | grep -i disruption
   ```

## 次のタスク

メンテナンスのために一時的にすべての停止を許可する必要があり、かつ実行中のレプリカ数を減らしたくない場合は、次のコマンドを使用してPDBを無効にしてください。

```
# for dynamic engine
helm upgrade dynamic-engine-$DYNAMIC_ENGINE_ID \
oci://ghcr.io/talend/helm/dynamic-engine --version $DYNAMIC_ENGINE_VERSION \
--reuse-values --set global.pdb.enabled=false

# for dynamic engine environment
helm upgrade dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
oci://ghcr.io/talend/helm/dynamic-engine-environment --version $DYNAMIC_ENGINE_VERSION \
--reuse-values --set global.pdb.enabled=false
```

これらのコマンドは、既存のHelm値を変更することなく、PDBルールを無効にします。