# 最小イメージを使用したDynamic Engineのデプロイ

Dynamic Engineデプロイメントの攻撃対象領域とイメージサイズを削減するために、すべてのDynamic Engineサービスをdistrolessコンテナイメージに、Talend Management Consoleタスクイメージを極めて軽量なOSを採用した最小限のコンテナイメージに切り替えてください。

Helm valuesファイルでglobal.profile: minimalを設定すると、すべてのDynamic Engineサービスイメージがdistrolessバリアントに切り替わります。完了後、インフラストラクチャサービスイメージには-distrolessタグサフィックスが使用され、データ統合タスクおよびデータサービスまたはルートのイメージには-minimalタグサフィックスが使用されます。

Distrolessイメージにはシェルやパッケージマネージャーが含まれていないため、ファイルシステムのフットプリントが削減され、潜在的なエクスプロイトに対してさらされる攻撃対象領域が限定されます。

この構成は、Amazon EKS Auto ModeやGKE Autopilotを含む、マネージドKubernetesモードで推奨されます。

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

## このタスクについて

情報メモ重要:

マネージドKubernetesモード (Amazon EKS Auto ModeおよびGKE Autopilot) では、[PodDisruptionBudgetの設定](https://help.qlik.com/talend/ja-JP/dynamic-engine-configuration-guide/Cloud/configuring-pod-disruption-budget "インスタンスおよび環境のHelmチャートで、PodDisruptionBudgetの設定を有効化、無効化、調整します。")およびconfiguration.persistence.enabled=falseと組み合わせて、この設定を使用してください。

情報メモ重要:

ビッグデータジョブ(Spark BatchおよびSpark Streaming)は、最小イメージとは互換性がありません。

global.profile: minimalを使用する場合、各ビッグデータジョブの対応する実行プロファイルに次の処理引数を追加して、設定を上書きしてください。

```
-K8S:ImageProfile=standard
```

この実行プロファイルパラメーターは、個々のタスクレベルでglobal.profileを上書きします。そのため、ビッグデータジョブのコンテナは標準のフルベースイメージを使用し、他のタスクは最小イメージを使用することになります。実行プロファイルの作成および編集に関する情報については、[Dynamic Engine環境タスクの実行プロファイルを管理](https://help.qlik.com/talend/ja-JP/dynamic-engine-configuration-guide/Cloud/managing-dynamic-engine-run-profile "実行プロファイルには、タスクを実行するための設定(つまりリソース割り当てと詳細プロパティ)が含まれています。")を参照してください。

## 手順

1. global.profileをminimalに設定するカスタムHelm valuesファイルを作成します。
   ```
   cat <<EOF > custom-minimal-image-values.yaml
   ---
   global:
     profile: minimal
   EOF
   ```

   すべてのサービスがdistrolessイメージを使用するように、この単一のvaluesファイルがdynamic-engineおよびdynamic-engine-environmentの各チャートに適用されます。
2. カスタムvaluesファイルを両方のランタイムチャートに渡して、dynamic-engine-crd、dynamic-engine、dynamic-engine-environmentチャートをインストールまたはアップグレードします。
   ```
   DYNAMIC_ENGINE_VERSION=1.6.0
   DYNAMIC_ENGINE_ID=<engine_id>
   DYNAMIC_ENGINE_ENVIRONMENT_ID=<environment_id>

   helm upgrade --install dynamic-engine-crd \
     oci://ghcr.io/talend/helm/dynamic-engine-crd --version $DYNAMIC_ENGINE_VERSION

   helm upgrade --install dynamic-engine-$DYNAMIC_ENGINE_ID \
     oci://ghcr.io/talend/helm/dynamic-engine --version $DYNAMIC_ENGINE_VERSION \
     -f $DYNAMIC_ENGINE_ID-values.yaml \
     -f custom-minimal-image-values.yaml

   helm upgrade --install dynamic-engine-environment-$DYNAMIC_ENGINE_ENVIRONMENT_ID \
     oci://ghcr.io/talend/helm/dynamic-engine-environment --version $DYNAMIC_ENGINE_VERSION \
     -f $DYNAMIC_ENGINE_ENVIRONMENT_ID-values.yaml \
     -f custom-minimal-image-values.yaml
   ```

   &lt;engine\_id&gt;と&lt;environment\_id&gt;を、実際のエンジンおよび環境の識別子に置き換えます。

## タスクの結果

すべてのDynamic Engineサービスポッドが再起動し、distrolessイメージのバリアントをプルします。次のコマンドで、アクティブなプロファイルを確認できます。

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

どちらのコマンドも最小を返すはずです。

## 次のタスク

タスクにビッグデータジョブが含まれる場合は、対応する実行プロファイルを作成または更新し、-K8S:ImageProfile=standardを含めるようにします。[Dynamic Engine環境タスクの実行プロファイルを管理](https://help.qlik.com/talend/ja-JP/dynamic-engine-configuration-guide/Cloud/managing-dynamic-engine-run-profile "実行プロファイルには、タスクを実行するための設定(つまりリソース割り当てと詳細プロパティ)が含まれています。")をご覧ください。

## 最小イメージのデプロイに関するトラブルシューティング

distrolessコンテナイメージへの切り替え後に発生する一般的な問題を診断します。

### 手順

1. アップグレード後もサービスが標準イメージを使用し続けている場合は、カスタムvaluesファイルが両方のチャートに適用されたことを確認してください。

   カスタムvaluesファイルは、dynamic-engineおよびdynamic-engine-environmentの両方のhelm upgradeコマンドに渡す必要があります。1つのチャートのみが更新された場合は、もう一方のチャートに対して-f custom-minimal-image-values.yamlを付加してhelm upgradeを再実行します。
2. ポッドがImagePullBackOff状態になった場合は、デプロイされたチャートのバージョンに対応するdistrolessイメージのタグが存在するか確認します。

   -distrolessイメージタグはバージョン1.6.0から利用可能です。それより前のバージョンのチャートを使用している場合、distrolessバリアントは存在しない可能性があります。利用可能なタグを確認します。
   ```
   crane ls ghcr.io/talend/engine-config-manager | grep distroless
   ```

   タグが存在しない場合は、バージョン1.6.0以降にアップグレードするか、global.profile: standardに戻してください。
3. ポッド内でコマンドを実行できない場合は、kubectl execの代わりにデバッグコンテナを使用してください。

   distrolessイメージにはシェルが含まれていません。そのため、kubectl exec -it &lt;pod&gt; -- /bin/shは失敗します。デバッグコンテナの使用:
   ```
   kubectl debug -it <pod> --image=busybox --target=<container>
   ```