

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 작업 거버넌스 추가 기능 업그레이드
<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는 v1.5가 제거하는 `v1alpha1` API 버전 아래에 일부 Kueue 사용자 지정 리소스 정의(CRDs)를 저장하기 때문에 v1.3.x`aws eks update-addon`에서 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 레코드를 변경하지 않습니다.  
새 워크로드를 제출할 필요가 없는 경우이 작업을 실행합니다. 포드 실행은 일반적으로 중단되지 않지만 마이그레이션 중에 활성 워크로드에 의존하지 않는 것이 좋습니다. 절차가 완료될 때까지 새 워크로드를 예약할 수 없습니다. 한 번에 하나의 클러스터에 대해를 실행합니다.

### 사전 조건
<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에서 이전 저장 버전을 지웁니다.**

   이렇게 하면 v1.5 CRDs 수 `status.storedVersions` 있도록에서 `v1alpha1` (또는 `v1beta1`) 항목이 제거됩니다. 객체는 백업에서 안전하며 이후 단계에서 복원됩니다.

   ```
   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` 확인합니다.