

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 回復 EKS Auto Mode 叢集
<a name="rollback-automode"></a>

當您在執行 EKS Auto Mode 的叢集上啟動版本轉返時，Amazon EKS 會在還原控制平面之前自動管理自動模式工作者節點的轉返。本頁說明自動模式節點復原的運作方式、加速方式，以及視需要取消的方式。

如需版本轉返的一般資訊，包括先決條件、洞見檢查和整體轉返程序，請參閱 [將叢集轉返至先前的 Kubernetes 版本](rollback-cluster.md)。

## 自動模式轉返的運作方式
<a name="_how_auto_mode_rollback_works"></a>

EKS Auto Mode 使用 Karpenter 型系統來管理工作者節點基礎設施，包括 Kubernetes 版本升級和轉返。當您`UpdateClusterVersion`在啟用自動模式的叢集上使用先前的 (N-1) 版本呼叫 時，EKS 會執行下列順序：

1. 驗證先決條件並重新整理回復整備洞察。

1. 使用 Karpenter 型系統將節點漂向所需的轉返版本，遵守設定的中斷控制。

1. 在所有節點都位於所需轉返版本的 Kubernetes 版本扭曲政策中之後，EKS 會重新檢查洞見並繼續控制平面轉返。

控制平面會保留在目前 （較新） 版本上，並在節點轉返時繼續正常提供流量。Kubernetes 版本扭曲政策允許節點執行比 kube-apiserver 最多三個較舊的次要版本，因此此中繼狀態有效。

**注意**  
您可以使用 中所述的相同 API 和程序來觸發轉返[將叢集轉返至先前的 Kubernetes 版本](rollback-cluster.md)。自動模式節點復原沒有單獨的 API。

**注意**  
節點復原階段 （步驟 2) 可能需要幾分鐘到 7 天，視您的中斷控制而定。如果節點復原未在設定的逾時內完成，則更新會標記為失敗。

**注意**  
當復原正在進行時，會封鎖其他客戶觸發的控制平面更新。若要執行不同的更新，請先使用 CancelUpdate API 取消轉返。

## 復原期間的叢集狀態
<a name="automode-rollback-cluster-status"></a>


| 階段 | 叢集狀態 | 發生了什麼事 | 
| --- | --- | --- | 
| 節點復原進行中 |  **ACTIVE**  | Karpenter 正在將節點取代為舊版 AMI。控制平面運作狀態良好，可為目前版本的流量提供服務。 | 
| 控制平面轉返 |  **UPDATING**  | API 伺服器和控制平面元件正在還原至先前的版本。 | 
| 復原完成 |  **ACTIVE**  | 叢集完全位於舊版上。 | 

叢集狀態會在節點復原階段`ACTIVE`保持。使用 `ListUpdates`或 `DescribeUpdate` 來判斷是否正在進行轉返。在 Amazon EKS 主控台中，導覽至您的叢集並開啟**更新歷史記錄**索引標籤，以檢視與復原相關聯的更新 ID 狀態。

若要在復原期間追蹤個別節點進度，請檢查自動模式節點的 Kubernetes 版本：

```
kubectl get nodes -l karpenter.sh/nodepool=<nodepool-name> -o wide
```



## 中斷控制
<a name="automode-disruption-controls"></a>

自動模式轉返會遵守所有現有的中斷控制。這些控制項會決定節點的取代速度，並可能大幅影響復原持續時間。

### NodePool 中斷預算
<a name="_nodepool_disruption_budgets"></a>

NodePool 中斷預算可控制可同時中斷的節點數量。在復原期間，Karpenter 在將節點漂移至先前版本時遵守這些預算。
+ 漂移區塊無限期轉返`nodes: 0`的預算。這會觸發 ERROR 洞見。
+ 限制性預算 （例如 `nodes: 1`) 會減慢轉返速度，但允許轉返進度。

具有中斷預算的範例 NodePool，允許一次取代 10% 的節點：

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    budgets:
      - nodes: "10%"
        reasons:
          - Drifted
```

如需設定 NodePool 中斷預算的詳細資訊，請參閱[為 EKS Auto Mode 建立節點集](https://docs.aws.amazon.com/eks/latest/userguide/create-node-pool.html)區和 [Karpenter 中斷預算](https://karpenter.sh/docs/concepts/disruption/#disruption-budgets)。

### PodDisruptionBudgets
<a name="_poddisruptionbudgets"></a>

Kubernetes PodDisruptionBudgets 會在節點取代期間接受。如果 PDB 防止 Pod 移出，節點中斷會延遲至 TerminationGracePeriod。
+ 具有`maxUnavailable: 0`延遲節點中斷PDBs。這會觸發警告洞察。
+ PDBs不會永久封鎖轉返，但可能會大幅降低轉返速度。

如需詳細資訊，請參閱[使用 PDB 保護關鍵工作負載](https://docs.aws.amazon.com/prescriptive-guidance/latest/ha-resiliency-amazon-eks-apps/pdb.html)和 [Kubernetes PDB 文件](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)。

### Do-not-disrupt註釋
<a name="_do_not_disrupt_annotations"></a>

`karpenter.sh/do-not-disrupt` 註釋可以在節點或 Pod 上設定：

 **在節點上：**無限期地封鎖節點中斷。這會觸發 ERROR 洞見，且必須先移除，才能在該節點上繼續轉返。

 **在 Pod 上：**將節點中斷延遲至 TerminationGracePeriod。這會觸發警告洞察，但不會永久封鎖轉返。

如需 Karpenter 中斷行為的詳細資訊，請參閱 [Karpenter 中斷文件](https://karpenter.sh/docs/concepts/disruption/)。



## 加速轉返
<a name="automode-speed-up-rollback"></a>

如果回復時間超過預期，您可以在回復進行時調整中斷控制。

### 增加 NodePool 中斷預算
<a name="_increase_nodepool_disruption_budgets"></a>

編輯 NodePool 資源以允許更多並行節點替換：

```
kubectl edit nodepool default
```

將預算變更為較高的值：

```
spec:
  disruption:
    budgets:
      - nodes: "50%"
        reasons:
          - Drifted
```

### 從節點移除do-not-disrupt註釋
<a name="_remove_do_not_disrupt_annotations_from_nodes"></a>

列出具有註釋的節點並將其移除：

```
# List nodes with the annotation
kubectl get nodes -o json | jq '.items[] | select(.metadata.annotations["karpenter.sh/do-not-disrupt"] == "true") | .metadata.name'

# Remove from a specific node
kubectl annotate node <node-name> karpenter.sh/do-not-disrupt-
```

### 調整 PodDisruptionBudgets
<a name="_adjust_poddisruptionbudgets"></a>

如果 PDBs 正在減緩 Pod 移出速度，請暫時調整它們：

```
kubectl edit pdb <pdb-name> -n <namespace>
```

**警告**  
調整中斷控制會影響您的應用程式可用性保證。在生產環境中進行變更之前，請務必了解影響。

如需管理中斷控制的詳細資訊，請參閱[在 Amazon EKS Auto 模式下防止 Pod 和節點中斷](https://repost.aws/articles/ARONpaMO8rQAqXM_BLmhyqWA/preventing-pod-and-node-disruption-in-amazon-eks-auto-mode)。



## 取消轉返
<a name="automode-cancel-rollback"></a>

只有在節點復原時，復原才會處於可取消狀態。您可以在此階段使用 CancelUpdate 來停止操作。

```
aws eks cancel-update \
  --name my-cluster \
  --update-id <update-id> \
  --region us-west-2
```

### 取消行為
<a name="_cancel_behavior"></a>


| 面向 | Behavior (行為) | 
| --- | --- | 
| 當 可取消時 | 只有在自動模式節點正在復原時 （在控制平面復原開始之前） | 
| 語意學 | 盡最大努力停止。停止節點復原操作。 | 
| 中斷中節點 | 如果節點在取消時間中斷中，則會完成其目前的操作。 | 
| 取消後狀態 | 更新從 `Cancelling`到 的轉換`Cancelled`。 | 
| 叢集狀態 | 會保留`ACTIVE`整個 。 | 

### 取消之後
<a name="_after_cancellation"></a>

成功取消後，節點會照常漂向目前的叢集版本。更新會從 轉換為 `Cancelling` `Cancelled`。

取消之後，您可以立即：
+ 重試轉返 （只要您仍在 7 天的資格時段內）。
+ 執行不同的叢集更新。
+ 將叢集維持在目前版本上。

### 當無法取消時
<a name="_when_cancel_is_not_possible"></a>

如果節點轉返已完成且控制平面轉返已開始，或者更新已完成，或者`Failed`狀態為 `Successful`或 ，則取消會失敗。

**注意**  
CloudFormation 和 Terraform 不支援 CancelUpdate API。如果您需要取消透過 IaC 啟動的轉返，您必須直接呼叫 API。



## 轉返逾時
<a name="automode-rollback-timeout"></a>

自動模式節點復原具有由 中的 `timeoutMinutes` 參數控制的可設定逾時`rollbackConfig`。預設逾時為 720 分鐘 (12 小時）。您可以設定介於 120 分鐘 (2 小時） 到 10080 分鐘 (7 天） 之間的值。逾時是最小限制屬性，表示它不會比您指定的時間更早發生，但會在之後不久發生。

```
aws eks update-cluster-version \
  --name my-cluster \
  --kubernetes-version 1.30 \
  --rollback-config timeoutMinutes=1440 \
  --region us-west-2
```

如果所有節點未在指定的逾時內完成轉返：

1. 轉返逾時。

1. 節點開始漂移回目前的叢集版本。

1. 控制平面會保留在目前版本 （從未復原）。

1. 更新狀態會轉換為 `Failed`。

在逾時之後，如果您仍在原始升級的 7 天復原資格時段內，您可以重試復原。實際上，如果節點在第 7 天轉返逾時，則轉返資格時段可能也已過期，因為兩者都是 7 天。

若要避免逾時，請在啟動轉返之前檢閱轉返整備洞察。這些洞察會警告可能會減慢節點復原程序的中斷預算或註釋。



## --force 旗標和 Auto 模式
<a name="automode-force-flag"></a>

上的 `--force`旗標`UpdateClusterVersion`只會略過叢集洞見檢查。它不會影響自動模式節點中斷行為。

即使使用 `--force`：
+ 仍會遵守 NodePool 中斷預算。
+ 仍會遵守 PodDisruptionBudgets。
+ 仍會遵守Do-not-disrupt註釋。
+ 7 天的節點復原逾時仍然適用。

加速節點復原的唯一方法是自行調整中斷控制。如需詳細資訊，請參閱 [加速轉返](#automode-speed-up-rollback)。



## IaC 逾時衝突
<a name="automode-iac-timeout"></a>

Infrastructure-as-Code工具有逾時限制，可能與自動模式轉返持續時間衝突。CloudFormation 每個資源最多允許 36 小時。如果操作逾時，CloudFormation 會將其視為無操作，這會讓叢集處於偏離狀態，其中範本不會反映實際的叢集版本。必須明確啟動版本轉返。Terraform Enterprise/Cloud 有大約 24 小時的逾時，但用戶端逾時可能會因憑證過期和其他因素而有所不同。

若要將轉返持續時間與您的 IaC 工具保持一致，請使用 中的 `timeoutMinutes` 參數`rollbackConfig`來設定適當的逾時。如果您的 IaC 工具逾時，請直接使用 CancelUpdate API 重新取得控制權。如果您有限制性的中斷預算，請考慮直接透過 CLI 或 API 而非 IaC 啟動轉返。



## 節點復原期間的系統更新
<a name="automode-system-updates"></a>

當自動模式節點轉返時，EKS 會繼續保持控制平面的安全和可用性。

節點復原進行中時，會封鎖客戶觸發的更新 （例如 UpdateClusterVersion 或 UpdateClusterConfig)。如果您需要執行高優先順序更新，請先使用 取消轉返`CancelUpdate`，然後執行更新，如果仍在資格時段內，則重新啟動轉返。



## 相關資源
<a name="automode-rollback-related-resources"></a>
+  [將叢集轉返至先前的 Kubernetes 版本](rollback-cluster.md) 
+  [EKS 自動模式概觀](https://docs.aws.amazon.com/eks/latest/userguide/automode.html) 
+  [為 EKS 自動模式建立節點集區](https://docs.aws.amazon.com/eks/latest/userguide/create-node-pool.html) 
+  [更新 EKS Auto Mode 叢集的 Kubernetes 版本](https://docs.aws.amazon.com/eks/latest/userguide/auto-upgrade.html) 
+  [在 Amazon EKS Auto 模式中防止 Pod 和節點中斷](https://repost.aws/articles/ARONpaMO8rQAqXM_BLmhyqWA/preventing-pod-and-node-disruption-in-amazon-eks-auto-mode) 
+  [EKS Auto 模式故障診斷](https://docs.aws.amazon.com/eks/latest/userguide/auto-troubleshoot.html) 
+  [Karpenter 中斷文件](https://karpenter.sh/docs/concepts/disruption/) 
+  [Kubernetes PodDisruptionBudgets](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 