

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# タスクガバナンスアドオンのアップグレード
<a name="sagemaker-hyperpod-eks-operate-console-ui-governance-upgrade"></a>

このセクションを使用して、バージョン間で HyperPod タスクガバナンス Amazon EKS アドオンをアップグレードします。各サブセクションには、既存の設定を保持しながらアドオンをアップグレードするためのバージョン固有の手順が記載されています。

**Topics**
+ [v1.3.x から v1.5 へのアップグレード](#hp-eks-task-governance-upgrade-v13-to-v15)

## v1.3.x から v1.5 へのアップグレード
<a name="hp-eks-task-governance-upgrade-v13-to-v15"></a>

v1.3.x から v1.5 にアップグレードする推奨方法は、Kueue CRDs を自動的に移行する SageMaker AI HyperPod コンソールのアップグレードオプションです。このセクションの手動手順は、 コンソールを使用できない場合にのみ使用します。

v1.3.x は `v1alpha1` API バージョンにいくつかの Kueue カスタムリソース定義 (CRDs) を保存するため、v1.3.x `aws eks update-addon`から v1.5 への直接 は失敗します。これにより、v1.5 は以下を削除します。

```
CustomResourceDefinition.apiextensions.k8s.io "cohorts.kueue.x-k8s.io" is invalid:
status.storedVersions[0]: Invalid value: "v1alpha1": missing from spec.versions
```

この手順では、Kueue オブジェクトをバックアップし、古いストアドバージョンをクリアします。次に、アドオンをアップグレードし、新しいスキーマでオブジェクトを復元します。

**データへの影響とタイミング**  
この手順では、Kueue カスタムリソースオブジェクト (ClusterQueues、LocalQueues、ResourceFlavors、トポロジ、および関連オブジェクト) を削除して再作成します。最初にバックアップして復元するため、設定が失われることはありません。名前空間は削除されず、CRD も削除されず、SageMaker AI ComputeQuota または ClusterSchedulerConfig レコードも変更されません。  
新しいワークロードを送信する必要がない場合は、これを実行します。実行中のポッドは通常中断されませんが、移行中はアクティブなワークロードに依存しないことをお勧めします。新しいワークロードは、手順が完了するまでスケジュールできません。一度に 1 つのクラスターに対して を実行します。

### 前提条件
<a name="hp-eks-task-governance-upgrade-v13-to-v15-prerequisites"></a>

作業を開始する前に、次の項目があることを確認します。
+ `kubectl` クラスター管理者アクセスを持つターゲット Amazon EKS クラスター用に設定された
+ クラスターのアカウントとリージョン用に AWS CLI 設定された
+ `jq` のインストール
+ アドオンは現在 v1.3.x で、ステータスは `ACTIVE`または です。 `DEGRADED`

全体で、{{region}} を自分のリージョンに置き換え、{{cluster-name}} を Amazon EKS クラスター名に置き換えます。

アドオンを v1.3.x から v1.5 にアップグレードするには、次の手順を実行します。

1. **現在のアドオンバージョンを確認し、作業ディレクトリを設定します。**

   ```
   aws eks describe-addon --region {{region}} --cluster-name {{cluster-name}} \
     --addon-name amazon-sagemaker-hyperpod-taskgovernance \
     --query 'addon.addonVersion' --output text
   ```

   出力が で始まることを確認します`v1.3.`。次に、書き込み可能なディレクトリの絶対パス`BACKUP_DIR`に設定し、作成します。後のステップでは、この変数に対して読み取りと書き込みを行うため、同じシェルセッションですべてのステップを実行します。

   ```
   export BACKUP_DIR={{/absolute/path/to/backup-dir}}
   mkdir -p "$BACKUP_DIR"
   ```

1. **すべての Kueue カスタムリソースをローカルファイルにバックアップします。**

   ```
   for crd in admissionchecks clusterqueues cohorts localqueues multikueueclusters \
              multikueueconfigs provisioningrequestconfigs resourceflavors topologies \
              workloadpriorityclasses workloads; do
     kubectl get "${crd}.kueue.x-k8s.io" --all-namespaces -o json \
       > "$BACKUP_DIR/${crd}.json" 2>/dev/null
     echo "${crd}: $(jq '.items | length' "$BACKUP_DIR/${crd}.json" 2>/dev/null || echo 0)"
   done
   ```
**続行する前にバックアップを確認する**  
バックアップディレクトリに前述のコマンドの各カスタムリソースの JSON ファイルが含まれ、コマンド出力のオブジェクト数がクラスターのものと一致していることを確認します。ファイルが見つからない場合や空の場合は、続行しないでください。

1. **バックアップされたオブジェクトを削除し、各 CRD から古い保存済みバージョンをクリアします。**

   これにより、 から `v1alpha1` (または `v1beta1`) エントリが削除され`status.storedVersions`、v1.5 CRDsをインストールできるようになります。オブジェクトはバックアップで安全であり、後のステップで復元されます。

   ```
   for crd in admissionchecks clusterqueues cohorts localqueues multikueueclusters \
              multikueueconfigs provisioningrequestconfigs resourceflavors topologies \
              workloadpriorityclasses workloads; do
     kubectl get crd "${crd}.kueue.x-k8s.io" >/dev/null 2>&1 || continue
     kubectl delete "${crd}.kueue.x-k8s.io" --all --all-namespaces \
       --ignore-not-found=true --wait=false --request-timeout=30s
     kubectl patch crd "${crd}.kueue.x-k8s.io" --subresource=status --type=merge \
       --request-timeout=30s -p '{"status":{"storedVersions":["v1beta2"]}}'
   done
   ```
**--all-namespaces と --wait=false について**  
`--all-namespaces` ここで、 は削除するすべての名前空間のカスタムリソースを選択します。名前空間は削除されません。 はファイナライザーのブロック`--wait=false`を回避します。次のステップのアドオン更新によって解決されます。

1. **アドオンを v1.5 に更新します。**

   ```
   aws eks update-addon --region {{region}} --cluster-name {{cluster-name}} \
     --addon-name amazon-sagemaker-hyperpod-taskgovernance \
     --addon-version v1.5.0-eksbuild.1 --resolve-conflicts OVERWRITE
   ```

   ステータスが になるまで待ちます`ACTIVE`。

   ```
   aws eks describe-addon --region {{region}} --cluster-name {{cluster-name}} \
     --addon-name amazon-sagemaker-hyperpod-taskgovernance \
     --query 'addon.status' --output text
   ```

1. **復元する前に、新しいインストールが確定するのを待ちます。**

   アドオンが を報告した直後に復元しないでください`ACTIVE`。コントローラー、そのウェブフック、インストール後のジョブの準備が完了するのを待ちます。そうしないと、次のステップの復元がハングする可能性があります。

   ```
   kubectl rollout status deploy/kueue-controller-manager -n kueue-system --timeout=300s
   ```

   ```
   until [ -n "$(kubectl get endpoints -n kueue-system kueue-webhook-service \
                 -o jsonpath='{.subsets[*].addresses[*].ip}' 2>/dev/null)" ]; do
     echo "waiting for kueue webhook endpoint..."; sleep 5
   done
   ```

   ```
   kubectl wait --for=condition=complete job -l app.kubernetes.io/name=kueue \
     -n kueue-system --timeout=180s || true
   ```

1. **新しいスキーマでオブジェクトを復元します。**

   これにより、バックアップされた各オブジェクトが v1.5 (`v1beta2`) スキーマに変換され、再適用されます。

   ```
   transform() {
     jq '
       .apiVersion = "kueue.x-k8s.io/v1beta2"
       | del(.status)
       | del(.metadata.resourceVersion, .metadata.uid, .metadata.creationTimestamp,
             .metadata.generation, .metadata.managedFields, .metadata.selfLink)
       | del(.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration")
       | if .kind == "Cohort" and (.spec.parent != null)
           then .spec.parentName = (.spec.parentName // .spec.parent) | del(.spec.parent) else . end
       | if .kind == "ClusterQueue" and (.spec.cohort != null)
           then .spec.cohortName = (.spec.cohortName // .spec.cohort) | del(.spec.cohort) else . end
       | if .kind == "ClusterQueue" then del(.spec.admissionChecks) else . end
       | if .kind == "AdmissionCheck" then del(.spec.retryDelayMinutes) else . end
     '
   }
   
   for crd in resourceflavors topologies workloadpriorityclasses admissionchecks cohorts \
              provisioningrequestconfigs multikueueclusters multikueueconfigs \
              clusterqueues localqueues workloads; do
     f="$BACKUP_DIR/${crd}.json"
     [ -s "$f" ] || continue
     count=$(jq '.items | length' "$f")
     for (( i=0; i<count; i++ )); do
       obj=$(jq -c ".items[$i]" "$f" | transform)
       name=$(printf '%s' "$obj" | jq -r '.kind + "/" + .metadata.name')
       if printf '%s' "$obj" | kubectl apply --request-timeout=30s -f - >/dev/null 2>&1; then
         echo "applied $name"
       else
         echo "check $name (may already be recreated by the add-on)"
       fi
     done
   done
   ```

1. **結果を確認します。**

   ```
   aws eks describe-addon --region {{region}} --cluster-name {{cluster-name}} \
     --addon-name amazon-sagemaker-hyperpod-taskgovernance \
     --query 'addon.{version:addonVersion,status:status}'
   ```

   出力例は次のとおりです。

   ```
   {
       "version": "v1.5.0-eksbuild.1",
       "status": "ACTIVE"
   }
   ```

   オブジェクトが存在し、CRD がまだ をリストしていないことを確認します`v1alpha1`。

   ```
   kubectl get clusterqueues
   kubectl get localqueues --all-namespaces
   kubectl get crd clusterqueues.kueue.x-k8s.io -o jsonpath='{.status.storedVersions}'
   ```

   `storedVersions` 出力には `v1beta2` (または `v1beta1`と `v1beta2`) のみを含める必要があり、 を含めることはできません`v1alpha1`。復元されたオブジェクトと のファイルを比較`$BACKUP_DIR`して、設定値が変更されていないことを確認します。