

 **協助改進此頁面** 

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

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

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

# 比較 ACK 與自我管理 ACK 的 EKS 功能
<a name="ack-comparison"></a>

ACK 的 EKS 功能提供與自我管理 ACK 控制器相同的功能，但具有顯著的操作優勢。如需 EKS 功能與自我管理解決方案的一般比較，請參閱 [EKS 功能考量](capabilities-considerations.md)。本主題著重於 ACK 特定的差異。

## 與上游 ACK 的差異
<a name="_differences_from_upstream_ack"></a>

ACK 的 EKS 功能是以上游 ACK 控制器為基礎，但在 IAM 整合中有所不同。

 **IAM 功能角色**：此功能使用專用 IAM 角色搭配信任政策，允許`capabilities.eks.amazonaws.com`服務主體，而不是 IRSA （服務帳戶的 IAM 角色）。您可以直接將 IAM 政策連接至功能角色，而不需要建立或註釋 Kubernetes 服務帳戶或設定 OIDC 供應商。生產使用案例的最佳實務是使用 設定服務許可`IAMRoleSelector`。如需詳細資訊，請參閱[設定 ACK 許可](ack-permissions.md)。

 **工作階段標籤**： 受管功能會自動在所有 AWS API 請求上設定工作階段標籤，啟用精細存取控制和稽核。標籤包括 `eks:eks-capability-arn`、 `eks:kubernetes-namespace`和 `eks:kubernetes-api-group`。這與自我管理 ACK 不同，其預設不會設定這些標籤。如需在 [設定 ACK 許可](ack-permissions.md) IAM 政策中使用工作階段標籤的詳細資訊，請參閱 。

 **資源標籤**： 功能會將不同的預設標籤套用至 AWS 資源，而非自我管理的 ACK。此功能使用字`eks:`首標籤 （例如 `eks:kubernetes-namespace`、`eks:eks-capability-arn`)，而不是自我管理 ACK 使用的`services.k8s.aws/`標籤。如需預設資源標籤的完整清單，[EKS 的 ACK 考量事項](ack-considerations.md)請參閱 。

 **資源相容性**：ACK 自訂資源的運作方式與上游 ACK 相同，不會變更您的 ACK 資源 YAML 檔案。該功能使用相同的 Kubernetes APIs 和 CRDs，因此 等工具`kubectl`的運作方式相同。此功能僅支援上游 ACK 中一般可用的控制器和資源 (GA)。此功能不包含位於預覽上游的控制器。控制器的狀態可能會隨著時間從預覽變更為上游 GA，然後 功能可以開始自動管理它。如果您搭配 功能執行自我管理預覽控制器，請在遷移[預覽控制器和自動提升](#ack-preview-promotion)之前檢閱 。

如需完整的 ACK 文件和服務特定指南，請參閱 [ACK 網站上的 ACK 文件](https://aws-controllers-k8s.github.io/docs/)。

## 遷移路徑
<a name="_migration_path"></a>

您可以將自我管理的 ACK 遷移至受管功能，並將 AWS 資源的中斷降至最低。遷移依賴於 Kubernetes 領導者選擇：自我管理控制器和功能爭奪相同的租用，因此其中只有一個會隨時協調指定的資源。為此，兩者都必須在相同的命名空間中共用租用。此功能不會強制從執行中的自我管理控制器取得租用，因此您可以透過向下擴展自我管理的控制器來控制切換的發生時間。

**重要**  
開始之前，請授予 IAM 功能角色許可，該許可等同於您的自我管理控制器目前使用的許可。此功能會透過`capabilities.eks.amazonaws.com`服務主體，而不是透過您自我管理控制器目前使用的機制，例如 IRSA 或 EKS Pod Identity，以專用功能角色進行驗證 （請參閱 [設定 ACK 許可](ack-permissions.md))。如果功能角色缺少許可，該功能會採用您的 資源。然後，它無法協調它們並記錄`AccessDenied`錯誤。

完成下列步驟以進行遷移。這些步驟使用 S3 控制器 (`ack-s3-controller`) 做為範例。針對您要遷移至 功能的每個自我管理 ACK 控制器重複這些項目，並取代對應的控制器名稱和 Helm Chart。

**注意**  
搭配 功能執行自我管理的控制器旨在作為遷移期間的暫時狀態，而不是作為長期組態。當兩者都執行時，任一端的中斷 （例如功能部署或自我管理控制器的升級） 可以釋出租用，並讓另一端取得租用，導致對帳在它們之間意外切換。為每個控制器完成遷移，而不是無限期地隨 功能一起自行管理。

1. 在自我管理 ACK 控制器上啟用領導者選擇，並將其租用移至 `kube-system`：

   ```
   helm upgrade --install ack-s3-controller \
     oci://public.ecr.aws/aws-controllers-k8s/s3-chart \
     --namespace ack-system \
     --set leaderElection.enabled=true \
     --set leaderElection.namespace=kube-system
   ```

   您必須設定這兩個值。在 ACK Helm Chart 中，只有在 `leaderElection.enabled`為 時才會套用`--leader-election-namespace`旗標`true`，且領導者選擇預設為停用。`leaderElection.namespace` 單獨設定沒有效果。控制器會在沒有租用的情況下繼續執行，而且兩個控制器都會在建立功能後同時協調相同的資源。這適用於每個 ACK 服務控制器圖表，而不只是 S3。

   這會將控制器的租用移至 `kube-system`，允許受管功能與其協調。

1. 在叢集上建立 ACK 功能 （請參閱 [建立 ACK 功能](create-ack-capability.md))。此功能會啟動並爭奪租用，但自我管理的控制器仍會保留它。您的自我管理控制器會持續協調您的資源，而 功能會等待領導，而不是強制接管。

1. 當您準備好開始遷移時，請將自我管理控制器縮減至零個複本。這會釋出租用，讓 功能可以取得領導權並接管對帳：

   ```
   kubectl scale deployment ack-s3-controller \
     --namespace ack-system --replicas=0
   ```

   在您縮減自我管理控制器的規模後，此功能通常會在短時間內取得租用並開始對帳。擴展自我管理控制器備份不會傳回租用，因為 功能會繼續保留和續約租用。若要將對帳傳回自我管理控制器，請將其擴展到至少一個複本，然後刪除 ACK 功能。刪除功能後，自我管理控制器會重新取得租用並繼續對帳。

   採用時，此功能會套用自己的預設資源標籤 (`eks:` 字首） 取代自我管理 ACK 使用的`services.k8s.aws/`標籤 （請參閱 [EKS 的 ACK 考量事項](ack-considerations.md))。預期針對您採用的資源進行一次性標記 API 呼叫，並更新`services.k8s.aws/`標籤字首上索引鍵的任何成本分配或政策工具。

1. 確認功能運作狀態良好，並已接管資源的調校。確認 資源報告 `Synced`的條件，`True`且 功能未記錄`AccessDenied`錯誤。

1. 在您確認功能正確管理資源後，請移除自我管理控制器：

   ```
   helm uninstall ack-s3-controller --namespace ack-system
   ```

此方法可讓兩個控制器在遷移期間安全地共存。在您發佈租用後， 受管功能會採用先前由自我管理控制器管理的資源，以確保持續對帳而不會發生衝突。

## 預覽控制器和自動提升
<a name="ack-preview-promotion"></a>

此功能僅支援上游 ACK 中為 GA 的控制器。目前處於預覽狀態的控制器稍後可以提升為上游 GA。發生這種情況時， 功能會開始自動管理該控制器，而不需要採取任何動作。

如果您在叢集上執行也為其他控制器使用 功能的自我管理預覽控制器，這會產生風險。您可以將預覽控制器作為單一複本執行，並停用領導選擇，因為沒有其他控制器可與之協調。當該控制器提升為 GA 時， 功能會開始管理它。此時，兩個對帳程式會在沒有共用租用的相同資源上運作，以協調這些資源。結果是與遷移步驟旨在防止的相同雙重調校衝突。兩個對帳程式都會發出競爭的 AWS API 呼叫，並將衝突的更新寫入自訂資源狀態。

為了避免這種情況，在您執行自我管理預覽控制器以及 功能之前：
+ 在自我管理預覽控制器上啟用領導者選擇`kube-system`，並使用遷移步驟中顯示的相同 `leaderElection.enabled=true`和 `leaderElection.namespace=kube-system`設定，將其租用指向 。這可確保如果提升控制器且 功能接管，則兩個座標會透過共用租用而非平行調校。
+ 追蹤您依賴的任何預覽控制器的上游 GA 狀態，並計劃在升級時遵循遷移[路徑進行遷移](#ack-comparison)。您可以在 [ACK 網站上的 ACK 服務頁面上](https://aws-controllers-k8s.github.io/docs/services/)檢查每個控制器的目前狀態。

## 後續步驟
<a name="_next_steps"></a>
+  [建立 ACK 功能](create-ack-capability.md) - 建立 ACK 功能資源
+  [ACK 概念](ack-concepts.md) - 了解 ACK 概念和資源生命週期
+  [設定 ACK 許可](ack-permissions.md) - 設定 IAM 和許可