

 **協助改進此頁面** 

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

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

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

# 使用節點管理運算資源
<a name="eks-compute"></a>

Kubernetes 節點是執行容器化應用程式的機器。每個節點皆具有下列元件：
+  **[容器執行時期](https://kubernetes.io/docs/setup/production-environment/container-runtimes/)**：負責執行容器的軟體。
+  **[kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)**：確保容器運作狀態良好並在其關聯的 Pod 中執行。
+  **[kube-proxy](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/)**：維護允許與 Pod 通訊的網路規則。

如需詳細資訊，請參閱 Kubernetes 文件中的[節點](https://kubernetes.io/docs/concepts/architecture/nodes/)。

您的 Amazon EKS 叢集可在 [EKS 自動模式受管理節點](automode.md)、[自助管理節點](worker.md)、[Amazon EKS 受管理節點群組](managed-node-groups.md)、[AWS Fargate](fargate.md)與[Amazon EKS 混合節點](hybrid-nodes-overview.md)的任意組合上排程 Pod。若要進一步了解在叢集中部署的節點，請參閱 [在 中檢視 Kubernetes 資源 AWS 管理主控台](view-kubernetes-resources.md)。

**注意**  
排除混合節點，節點必須與您在建立叢集時選取的子網路位於同一 VPC 中。不過，節點不需要位於相同的子網路中。

## 對比運算選項
<a name="_compare_compute_options"></a>

下表提供了幾個準則，以便在決定哪些選項最符合您的要求時進行評估。自助管理節點是另一種選項，支援下表列出的所有標準，但需要更多手動維護工作。如需詳細資訊，請參閱[藉助自我管理節點來自行維護節點](worker.md)。

**注意**  
Bottlerocket 與此表格中的一般資訊有一些特定的差異。如需詳細資訊，請參閱 GitHub 上的 Bottlerocket [文件](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md)。


| 條件 | EKS 受管節點群組 | EKS 自動模式 | Amazon EKS 混合節點 | 
| --- | --- | --- | --- | 
|  可以部署到 [AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html)   |  否  |  否  |  否  | 
|  可以部署到 [AWS Local Zone](local-zones.md)   |  是  |  否  |  否  | 
|  可以執行需要 Windows 的容器  |  是  |  否  |  否  | 
|  可以執行需要 Linux 的容器  |  是  |  是  |  是  | 
|  可以執行需要 Inferentia 晶片的工作負載  |   [是](inferentia-support.md)：僅限 Amazon Linux 節點  |  是  |  否  | 
|  可以執行需要 GPU 的工作負載  |   [是](eks-optimized-ami.md#gpu-ami)：僅限 Amazon Linux 節點  |  是  |  是  | 
|  可以執行需要 Arm 處理器的工作負載  |   [是](eks-optimized-ami.md#arm-ami)   |  是  |  是  | 
|  可以執行 AWS [Bottlerocket](https://aws.amazon.com/bottlerocket/)   |  是  |  是  |  否  | 
|  Pod 會與其他 Pod 共享 CPU、記憶體、儲存體和網路資源。  |  是  |  是  |  是  | 
|  必須部署和管理 Amazon EC2 執行個體  |  是  |  否 - 了解 [EC2 受管執行個體](automode-learn-instances.md)   |  是 – 內部部署實體或虛擬機器由您選擇的工具管理。  | 
|  必須保護、維護和修補 Amazon EC2 執行個體的作業系統  |  是  |  否  |  是 – 在實體或虛擬機器上執行的作業系統由您選擇的工具管理。  | 
|  可以在部署節點時提供引導引數，例如額外的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引數。  |  是 – 以自訂 AMI 使用 `eksctl` 或[啟動範本](launch-templates.md)。  |  否 - [使用 `NodeClass` 設定節點](create-node-class.md)   |  是 - 您可使用 nodeadm 自訂引導引數。請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。  | 
|  可以將 IP 位址指派給來自不同於將 IP 位址指派給節點之 CIDR 區塊的 Pod。  |  是：以自訂 AMI 使用啟動範本。如需詳細資訊，請參閱[使用啟動範本自訂受管節點](launch-templates.md)。  |  否  |  是，請參閱 [設定混合節點的 CNI](hybrid-nodes-cni.md)。  | 
|  可以對節點執行 SSH  |  是  |  否 - [了解如何對節點進行疑難排解](auto-troubleshoot.md)   |  是  | 
|  可以將自己的自訂 AMI 部署至節點  |  是：使用[啟動範本](launch-templates.md)   |  否  |  是  | 
|  可以將您自己的自訂 CNI 部署至節點  |  是：以自訂 AMI 使用[啟動範本](launch-templates.md)  |  否  |  是  | 
|  必須自行更新節點 AMI  |   [是](update-managed-node-group.md)：如果已部署 Amazon EKS 最佳化 AMI，Amazon EKS 主控台會在有可用更新時通知您。您只要在主控台中按一下即可執行更新。如果已部署自訂 AMI，Amazon EKS 主控台不會在有更新可用時通知您。您必須自行執行更新。  |  否  |  是 – 在實體或虛擬機器上執行的作業系統由您選擇的工具管理。請參閱 [準備混合節點的作業系統](hybrid-nodes-os.md)。  | 
|  必須自行更新節點 Kubernetes 版本  |   [是](update-managed-node-group.md)：如果已部署 Amazon EKS 最佳化 AMI，Amazon EKS 主控台會在有可用更新時通知您。您只要在主控台中按一下即可執行更新。如果已部署自訂 AMI，Amazon EKS 主控台不會在有更新可用時通知您。您必須自行執行更新。  |  否  |  是 - 您可以使用自選工具或 `nodeadm` 來管理混合節點的升級。請參閱 [升級叢集的混合節點](hybrid-nodes-upgrade.md)。  | 
|  可以透過 Pod 使用 Amazon EBS 儲存體  |   [是](ebs-csi.md)   |  是，作為整合能力。了解如何[建立儲存類別。](create-storage-class.md)  |  否  | 
|  可以透過 Pod 使用 Amazon EFS 儲存體  |   [是](efs-csi.md)   |  是  |  否  | 
|  可以搭配 Pod 使用 Amazon S3 檔案儲存  |   [是](s3files-csi.md)   |  是  |  否  | 
|  可以透過 Pod 使用 Amazon FSx for Lustre 儲存體  |   [是](fsx-csi.md)   |  是  |  否  | 
|  可以針對服務使用 Network Load Balancer  |   [是](network-load-balancing.md)   |  是  |  是 - 必須使用目標類型 `ip`。  | 
|  Pod 可以在公有子網路中執行  |  是  |  是  |  否 - 在內部部署環境中執行的 Pod。  | 
|  可以將不同的 VPC 安全群組指派給個別 Pod  |   [是](security-groups-for-pods.md) – 僅限 Linux 節點  |  否  |  否  | 
|  可以執行 Kubernetes DaemonSets  |  是  |  是  |  是  | 
|  支援 Pod 資訊清單中的 `HostPort` 和 `HostNetwork`  |  是  |  是  |  是  | 
|   AWS 區域可用性  |   [所有 Amazon EKS 支援的區域](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |   [所有 Amazon EKS 支援的區域](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |   [所有 Amazon EKS 支援的區域](https://docs.aws.amazon.com/general/latest/gr/eks.html)， AWS GovCloud (US) 區域和中國區域除外。  | 
|  可以在 Amazon EC2 專用主機上執行容器  |  是  |  否  |  否  | 
|  定價  |  執行多個 Pod 的 Amazon EC2 執行個體的成本。如需詳細資訊，請參閱 [Amazon EC2 定價](https://aws.amazon.com/ec2/pricing/)。  |  在叢集中啟用 EKS 自動模式時，除了標準 EC2 執行個體費用之外，您還需要為使用自動模式運算功能啟動的執行個體支付個別費用。數量會隨啟動的執行個體類型和叢集所在的 AWS 區域而有所不同。如需詳細資訊，請參閱 [Amazon EKS 定價](https://aws.amazon.com/eks/pricing/)。  |  每小時混合節點 vCPU 的成本。如需詳細資訊，請參閱 [Amazon EKS 定價](https://aws.amazon.com/eks/pricing/)。  | 

# 透過受管節點群組來簡化節點生命週期
<a name="managed-node-groups"></a>

Amazon EKS 受管節點群組會自動化 Amazon EKS Kubernetes 叢集節點 (Amazon EC2 執行個體) 的佈建和生命週期管理。

使用 Amazon EKS 受管節點群組時，不需要個別佈建或註冊提供運算容量的 Amazon EC2 執行個體，來執行 Kubernetes 應用程式。您可以透過單一操作來建立、自動更新或終止叢集的節點。節點更新和終止會自動耗盡節點，以確保您的應用程式保持可用。

每個受管節點均會佈建為 Amazon EKS 為您管理的 Amazon EC2 Auto Scaling 群組的一部分。包括執行個體和 Auto Scaling 群組在內的每個資源都會在您的 AWS 帳戶中執行。每個節點群組都可以跨您定義的多個可用區域執行。

受管節點群組還可以選擇性地利用節點自動修復，進而持續監控節點的運作狀態。它會自動對偵測到的問題進行回應，並盡可能取代節點。此功能有助於提高叢集的整體可用性，並且盡可能減少手動介入。如需詳細資訊，請參閱[偵測節點運作狀態問題並啟用自動節點修復](node-health.md)。

您可以使用 Amazon EKS 主控台、`eksctl`、 AWS CLI、 AWS API 或基礎設施做為程式碼工具，包括 AWS CloudFormation，將受管節點群組新增至新的或現有的叢集。以受管節點群組身分啟動的節點，會自動標記以供 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) 自動探索。您可以使用節點群組將 Kubernetes 標籤套用至節點，並隨時加以更新。

使用 Amazon EKS 受管節點群組無需額外費用，您只需為佈建 AWS 的資源付費。其中包括 Amazon EC2 執行個體、Amazon EBS 磁碟區、Amazon EKS 叢集時數，以及任何其他 AWS 基礎設施。沒有最低費用，也沒有前期承諾。

若要開始使用新的 Amazon EKS 叢集和受管節點群組，請參閱 [開始使用 Amazon EKS – AWS 管理主控台 和 AWS CLI](getting-started-console.md)。

若要將受管理的節點群組新增至現有叢集，請參閱 [建立叢集的受管節點群組](create-managed-node-group.md)。

## 受管節點群組概念
<a name="managed-node-group-concepts"></a>
+ Amazon EKS 受管節點群組會為您建立和管理 Amazon EC2 執行個體。
+ 每個受管節點均會佈建為 Amazon EKS 為您管理的 Amazon EC2 Auto Scaling 群組的一部分。此外，包括 Amazon EC2 執行個體和 Auto Scaling 群組在內的每個資源都會在您的 AWS 帳戶中執行。
+ Amazon EKS 會定期同步受管節點群組的擴展組態，以符合實際的 Auto Scaling 群組值。如果 Cluster Autoscaler 等外部演員修改 Auto Scaling 群組的大小， 最終`DescribeNodegroup`會反映這些變更。當您啟動節點群組更新或升級而不明確修改擴展組態時，工作流程會使用目前的 Auto Scaling 群組值，而不是節點群組的預存擴展組態。儲存的擴展組態只有在您明確地將其包含在`UpdateNodegroupConfig`請求中時才會優先。
+ 受管節點群組的 Auto Scaling 群組會跨越您在建立群組時指定的每個子網路。
+ Amazon EKS 會標記受管節點群組資源，以便將其設定為使用 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)。
**重要**  
如果您跨越多個由 Amazon EBS 磁碟區提供的可用區域執行狀態應用程式，並且使用 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，您應該設定多個節點群組，每個群組的範圍皆為單一可用區域。另外，您應該啟用 `--balance-similar-node-groups` 功能。
+ 部署受管節點時，您可以使用自訂啟動範本來獲得更高層級的靈活性和自訂能力。例如，可指定額外的 `kubelet` 引數並使用自訂 AMI。如需詳細資訊，請參閱[使用啟動範本自訂受管節點](launch-templates.md)。如果在第一次建立受管節點群組時未使用自訂啟動範本，會有一個自動產生的啟動範本。請勿手動修改此自動產生的範本，否則會發生錯誤。
+ Amazon EKS 會遵循受管節點群組上 CVE 和安全修補程式的共同責任模型。受管節點執行 Amazon EKS 最佳化 AMI 時，Amazon EKS 負責在報告錯誤或問題時建置 AMI 的修補版本。我們可以發佈修正程式。不過，您必須負責將這些修補的 AMI 版本部署至受管節點群組。當受管節點執行自訂 AMI 時，您必須負責在報告錯誤或問題時建置 AMI 的修補版本，然後部署 AMI。如需詳細資訊，請參閱[更新叢集的受管節點群組](update-managed-node-group.md)。
+ Amazon EKS 受管節點群組可以在公有和私有子網路中啟動。如果在 2020 年 4 月 22 日或之後啟動公有子網路中的受管節點群組，則子網路必須將 `MapPublicIpOnLaunch` 設定為「true」，執行個體才能成功加入叢集。如果公有子網路是在 2020 年 3 月 26 日或之後使用 `eksctl`或 [Amazon EKS vended AWS CloudFormation 範本](creating-a-vpc.md)建立，則此設定已設為 true。如果公有子網路是在 2020 年 3 月 26 日之前所建立，則必須手動變更設定。如需詳細資訊，請參閱[修改子網的公有 IPv4 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。
+ 在私有子網路中部署受管節點群組時，您必須確保該群組可存取 Amazon ECR 以提取容器映像。您可以透過將 NAT 閘道連接至子網路的路由表，或新增以下 [AWS PrivateLink VPC 端點](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-vpc-create)來執行此操作：
  + Amazon ECR API 端點界面 – `com.amazonaws.region-code.ecr.api` 
  + Amazon ECR Docker 登錄檔 API 端點界面 – `com.amazonaws.region-code.ecr.dkr` 
  + Amazon S3 閘道端點 – `com.amazonaws.region-code.s3` 

  如需了解其他常用的服務和端點，請參閱 [部署網際網路存取受到限制的私有叢集](private-clusters.md)。
+ 受管節點群組無法部署在 [AWS Outposts](eks-outposts.md) 上或 [AWS Wavelength](https://docs.aws.amazon.com/wavelength/) 中。受管節點群組可建立在 [AWS Local Zones](https://aws.amazon.com/about-aws/global-infrastructure/localzones/) 上。如需詳細資訊，請參閱[使用 AWS Local Zones 啟動低延遲 EKS 叢集](local-zones.md)。
+ 您可以在單一叢集內建立多個受管節點群組。例如，您可以針對某些工作負載建立具有標準 Amazon EKS 最佳化 Amazon Linux AMI 的節點群組，而針對需要 GPU 支援的工作負載使用 GPU 變體建立另一個節點群組。
+ 如果受管節點群組遇到 [Amazon EC2 執行個體狀態檢查](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)故障問題，Amazon EKS 會傳回錯誤代碼，以協助您診斷問題。如需詳細資訊，請參閱[受管節點群組錯誤代碼](troubleshooting.md#troubleshoot-managed-node-groups)。
+ Amazon EKS 會將 Kubernetes 標籤新增至受管節點群組執行個體。這些 Amazon EKS 提供的標籤前面會加上 `eks.amazonaws.com`。
+ 在終止或更新期間，Amazon EKS 會使用 Kubernetes API 自動耗盡節點。
+ 使用 `AZRebalance` 終止節點或減少所需的節點計數時，不會遵守 Pod 中斷預算。這些動作會嘗試在該節點上移出 Pod。但如果需要超過 15 分鐘，則無論節點上的所有 Pod 是否終止，都會終止節點。若要延長期間直到節點終止，請將 lifecycle hook 新增至 Auto Scaling 群組。如需詳細資訊，請參閱 *Amazon EC2 Auto Scaling 使用者指南*中的[新增 lifecycle hook](https://docs.aws.amazon.com/autoscaling/ec2/userguide/adding-lifecycle-hooks.html)。
+ 若要在收到 Spot 中斷通知或容量重新平衡通知後正確執行耗盡程序，必須將 `CapacityRebalance` 設定為 `true`。
+ 更新受管節點群組會遵守您為 Pod 設定的 Pod 中斷預算。如需詳細資訊，請參閱 [了解節點更新的每個階段](managed-node-update-behavior.md)。
+ 使用 Amazon EKS 受管節點群組不會產生額外成本。您只需為佈建 AWS 的資源付費。
+ 如果要為節點加密 Amazon EBS 磁碟區，則可以使用啟動範本部署節點。若要在不使用啟動範本的情況下部署具有加密 Amazon EBS 磁碟區的受管節點，請加密帳戶中建立的所有新 Amazon EBS 磁碟區。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[預設加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default)。

## 受管節點群組容量類型
<a name="managed-node-group-capacity-types"></a>

建立受管節點群組時，您可以選擇隨需或 Spot 容量類型。Amazon EKS 部署具有 Amazon EC2 Auto Scaling 群組的受管節點群組，該群組僅包含隨需執行個體或僅包含 Amazon EC2 Spot 執行個體。您可以將具有容錯能力之應用程式的 Pod 排程到 Spot 受管節點群組，以及將具有容錯能力之應用程式的 Pod 排程到單一 Kubernetes 叢集中的隨需節點群組。依預設，受管節點群組會部署隨需 Amazon EC2 執行個體。

### On-Demand
<a name="managed-node-group-capacity-types-on-demand"></a>

透過隨需執行個體，您只需要按秒數支付運算容量開銷，無需簽訂長期合約。

預設情況下，如果未指定**容量類型**，則會使用隨需執行個體佈建受管節點群組。受管節點群組會代表您設定 Amazon EC2 Auto Scaling 群組，並套用下列設定：
+ 佈建隨需容量的配置策略設定為 `prioritized`。在滿足隨需容量時，受管節點群組會 API 中傳遞執行個體類型的順序，決定先使用哪一種執行個體類型。例如，您可以按照下列順序指定三種執行個體類型：`c5.large`、`c4.large`，以及 `c3.large`。當您的隨需執行個體啟動時，受管節點群組會從 `c5.large` 開始，然後是 `c4.large`，再來是 `c3.large`，以滿足隨需容量。如需詳細資訊，請參閱《Amazon EC2 Auto Scaling 使用者指南》**中的 [Amazon EC2 Auto Scaling 群組](https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-purchase-options.html#asg-allocation-strategies)。
+ Amazon EKS 會將下列 Kubernetes 標籤新增至指定容量類型之受管節點群組中的所有節點：`eks.amazonaws.com/capacityType: ON_DEMAND`。您可以使用此標籤，在隨需節點上排程可設定狀態或可容錯的應用程式。

### Spot
<a name="managed-node-group-capacity-types-spot"></a>

Amazon EC2 Spot 執行個體是備用的 Amazon EC2 容量，可提供隨需價格的極低折扣。EC2 需要取回容量時，就可能會以兩分鐘中斷通知的方式中斷 Amazon EC2 Spot 執行個體。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[Spot 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)。您可以使用 Amazon EC2 Spot 執行個體設定受管節點群組，以最佳化 Amazon EKS 叢集中執行之運算節點的成本。

若要在受管節點群組內使用 Spot 執行個體，請將容量類型設定為`spot`，以建立受管節點群組。受管節點群組代表您設定 Amazon EC2 Auto Scaling 群組，並套用下列 Spot 最佳實務：
+ 為確保您的 Spot 節點已在最佳 Spot 容量集區中佈建，配置策略會設定為下列之一：
  +  `price-capacity-optimized` (PCO)：在具有 Kubernetes 版本 `1.28` 或更新版本的叢集中建立新節點群組時，配置策略會設定為 `price-capacity-optimized`。但是，在 Amazon EKS 受管節點群組開始支援 PCO 之前，系統不會變更已使用 `capacity-optimized` 建立的節點群組的配置策略。
  +  `capacity-optimized` (CO)：在具有 Kubernetes 版本 `1.27` 或更低版本的叢集中建立新節點群組時，配置策略會設定為 `capacity-optimized`。

  若要增加可用於配置容量的 Spot 容量集區數量，請將受管節點群組設定為使用多個執行個體類型。
+ 已啟用 Amazon EC2 Spot 容量重新平衡功能，以便 Amazon EKS 可以正常地消耗和重新平衡 Spot 節點，在 Spot 節點中斷風險提高時，將應用程式中斷情況降至最低。如需詳細資訊，請參閱《Amazon EC2 Auto Scaling 使用者指南》中的 [Amazon EC2 Auto Scaling 容量重新平衡](https://docs.aws.amazon.com/autoscaling/ec2/userguide/capacity-rebalance.html)。
  + Spot 節點收到重新平衡建議時，Amazon EKS 會自動嘗試啟動新的替代 Spot 節點。
  + 如果 Spot 兩分鐘中斷通知在取代 Spot 節點處於 `Ready` 狀態前到達，則 Amazon EKS 會開始消耗收到重新平衡建議的 Spot 節點。Amazon EKS 將竭盡全力耗盡節點。因此，無法保證 Amazon EKS 會在耗盡現有節點之前等待替代節點加入叢集。
  + 啟動取代 Spot 節點，並且在 Kubernetes 處於 `Ready` 狀態時，Amazon EKS 會包圍隔離並消耗收到重新平衡建議的 Spot 節點。包圍隔離 Spot 節點可確保服務控制器不會將任何新的請求傳送到此 Spot 節點。它也會從狀況良好、作用中的 Spot 節點清單中移除。耗盡 Spot 節點可確保正在執行的 Pod 可以正常地移出。
+ Amazon EKS 會將下列 Kubernetes 標籤新增至指定容量類型之受管節點群組中的所有節點：`eks.amazonaws.com/capacityType: SPOT`。您可以使用此標籤在 Spot 節點上排程可容錯的應用程式。
**重要**  
EC2 會在終止 [Spot 執行個體的兩分鐘前發出 Spot 中斷通知](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html)。不過，Spot 節點上的 Pod 可能不會收到正常關閉的完整 2 分鐘時段。當 EC2 發出通知時，Amazon EKS 開始移出 Pod 之前會有延遲。移除會依序發生以保護 Kubernetes API 伺服器，因此在多個同時 Spot 回收期間，某些 Pod 可能會收到延遲的移出通知。Pod 可能會在不接收終止訊號的情況下強制終止，特別是在具有高 Pod 密度的節點上、在並行回收期間或使用長終止寬限期時。對於 Spot 工作負載，我們建議您使用 30 秒或更短的終止寬限期來設計應用程式，避免長時間執行preStop 掛鉤，並監控 Pod 移出指標，以了解叢集中的實際寬限期。對於需要保證正常終止的工作負載，我們建議您改用隨需容量。

決定是否要部署具有隨需或 Spot 容量的節點群組時，應考慮下列條件：
+ Spot 執行個體適用於無狀態、容錯、靈活的應用程式。其中包括批次和機器學習訓練工作負載、大數據 ETL (例如 Apache Spark)、佇列處理應用程式，以及無狀態 API 端點。由於 Spot 是可能隨時間變更的備用 Amazon EC2 容量，因此建議您將 Spot 容量用於可接受中斷的工作負載。更具體地說，Spot 容量適用於容錯期間無法使用所需容量的工作負載。
+ 我們建議您將隨需模式用於不容錯的應用程式。這包括叢集管理工具 (例如監控和操作工具)、需要 `StatefulSets` 的部署，以及狀態應用程式 (例如資料庫)。
+ 為了在使用 Spot 執行個體時最大化應用程式的可用性，建議您將 Spot 受管節點群組設定為使用多個執行個體類型。建議您在使用多個執行個體類型時，套用下列規則：
  + 在受管節點群組中，如果您使用 [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，則建議使用具有相同數量 vCPU 和記憶體資源的彈性執行個體類型集。這是為了確保叢集中的節點如預期般擴展。例如，如果您需要四個 vCPU 和八個 GiB 記憶體，請使用 `c3.xlarge`、`c4.xlarge`、`c5.xlarge`、`c5d.xlarge`、`c5a.xlarge`、`c5n.xlarge` 或其他類似的執行個體類型。
  + 若要增強應用程式可用性，建議部署多個 Spot 受管節點群組。為此，每個群組應該使用具有相同 vCPU 和記憶體資源的彈性執行個體類型集。例如，如果您需要 4 個 vCPU 和 8 個 GiB 記憶體，建議您使用 `c3.xlarge`、`c4.xlarge`、`c5.xlarge`、`c5d.xlarge`、`c5a.xlarge`、`c5n.xlarge` 或其他類似的執行個體類型建立一個受管節點群組，以及使用 `m3.xlarge`、`m4.xlarge`、`m5.xlarge`、`m5d.xlarge`、`m5a.xlarge`、`m5n.xlarge` 或其他類似的執行個體類型建立另一個受管節點。
  + 透過使用自訂啟動範本的 Spot 容量類型部署節點群組時，請使用 API 傳遞多個執行個體類型。請勿透過啟動範本傳遞單一執行個體類型。如需使用啟動範本部署節點群組的詳細資訊，請參閱 [使用啟動範本自訂受管節點](launch-templates.md)。

# 建立叢集的受管節點群組
<a name="create-managed-node-group"></a>

本主題會描述如何啟動已向 Amazon EKS 叢集註冊的節點的 Amazon EKS 受管節點群組。節點加入叢集後，您就可以將 Kubernetes 應用程式部署至其中。

如果這是您第一次啟動 Amazon EKS 受管節點群組，建議您改為按照其中一個 [開始使用 Amazon EKS](getting-started.md) 指南的步驟進行。這些指南提供建立具有節點的 Amazon EKS 叢集的演練。

**重要**  
Amazon EKS 節點是標準的 Amazon EC2 執行個體。我們會根據正常 Amazon EC2 價格向您收費。如需詳細資訊，請參閱 [Amazon EC2 定價](https://aws.amazon.com/ec2/pricing/)。
您無法在已啟用 AWS Outposts 或 Wavelength AWS 的 AWS 區域中建立受管節點。您可改為建立自我管理的節點。如需詳細資訊，請參閱[建立自我管理的 Amazon Linux 節點](launch-workers.md)、[建立自我管理的 Microsoft Windows 節點](launch-windows-workers.md)及[建立自我管理的 Bottlerocket 節點](launch-node-bottlerocket.md)。您也可以在 Outpost 上建立自我管理的 Amazon Linux 節點群組。如需詳細資訊，請參閱[在 AWS Outpost 上建立 Amazon Linux 節點](eks-outposts-self-managed-nodes.md)。
如果您沒有為 Amazon EKS 最佳化 Linux 或 Bottlerocket 隨附的 `bootstrap.sh` 檔案[指定 AMI ID](launch-templates.md#launch-template-custom-ami)，則受管節點群組會對 `maxPods` 的值強制執行數量上限。對於少於 30 個 vCPU 的執行個體，數量上限為 `110`。對於具有 30 個以上 vCPU 的執行個體，數量上限會跳至 `250`。此強制執行會覆寫其他`maxPods`組態，包括 `maxPodsExpression`。如需如何`maxPods`確定以及如何自訂它的詳細資訊，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。
+ 現有 Amazon EKS 叢集。若要部署叢集，請參閱 [建立 Amazon EKS 叢集](create-cluster.md)。
+ 供節點使用的現有 IAM 角色。若要建立服務角色，請參閱[Amazon EKS 節點 IAM 角色](create-node-role.md)。如果此角色沒有任何 VPC CNI 的政策，則 VPC CNI Pod 需要以下個別角色。
+ (選用，但建議) Kubernetes 專用 Amazon VPC CNI 外掛程式的附加元件設定有自己的 IAM 角色，該角色已連接必要的 IAM 政策。如需詳細資訊，請參閱[設定 Amazon VPC CNI 外掛程式以使用 IRSA](cni-iam-role.md)。
+ 熟悉[選擇最佳 Amazon EC2 節點執行個體類型](choosing-instance-type.md)中所列的考量事項。取決於您選擇的執行個體類型，您的叢集和 VPC 可能還有其他先決條件。
+ 若要新增 Windows 受管節點群組，您必須先啟用叢集的 Windows 支援。如需詳細資訊，請參閱[在 EKS 叢集上部署 Windows 節點](windows-support.md)。

您可以透過以下任一項來建立受管節點群組：
+  [`eksctl`](#eksctl_create_managed_nodegroup) 
+  [AWS 管理主控台](#console_create_managed_nodegroup) 

## `eksctl`
<a name="eksctl_create_managed_nodegroup"></a>

 **使用 eksctl 建立受管節點群組** 

此程序需要 `eksctl` 版本 `0.215.0` 或更新版本。您可使用以下命令檢查您的版本：

```
eksctl version
```

如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的 [Installation](https://eksctl.io/installation) 一節。

1. (選用) 如果 **AmazonEKS\$1CNI\$1Policy** 受管 IAM 政策已連接至您的 [Amazon EKS 節點 IAM 角色](create-node-role.md)，建議您改為將其指派給您與 Kubernetes `aws-node` 服務帳戶相關聯的 IAM 角色。如需詳細資訊，請參閱[設定 Amazon VPC CNI 外掛程式以使用 IRSA](cni-iam-role.md)。

1. 使用或不使用自訂啟動範本來建立受管節點群組。手動指定啟動範本可讓您更靈活地自訂節點群組。例如，此方式可以允許部署自訂 AMI，或對 Amazon EKS 最佳化 AMI 中的 `boostrap.sh` 指令碼提供引數。如需每個可用選項和預設值的完整清單，請輸入以下命令。

   ```
   eksctl create nodegroup --help
   ```

   在以下命令中，將 *my-cluster* 取代為您的叢集名稱，並將 *my-mng* 取代為您的節點群組名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。
**重要**  
如果在第一次建立受管的節點群組時未使用自訂啟動範本，請勿在之後針對節點群組使用自訂啟動範本。如果沒有指定自訂啟動範本，系統會自動產生啟動範本 (不建議手動修改該範本)。手動修改此自動產生的啟動範本可能會導致錯誤。

 **沒有啟動範本** 

 `eksctl` 會在您的帳戶中建立預設 Amazon EC2 啟動範本，並使用根據您指定之選項建立的啟動範本來部署節點群組。指定 `--node-type` 的值之前，請參閱 [選擇最佳的 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。

使用允許的關鍵字取代 *ami-family*。如需詳細資訊，請參閱 `eksctl` 文件中的 [Setting the node AMI Family](https://eksctl.io/usage/custom-ami-support/#setting-the-node-ami-family) (設定節點 AMI 系列)。使用 Amazon EC2 金鑰對或公有金鑰的名稱取代 *my-key*。此金鑰會在節點啟動後用於將 SSH 套用至節點。

**注意**  
對於 Windows，此命令不會啟用 SSH。而是將 Amazon EC2 金鑰對與執行個體建立關聯，讓您可以 RDP 至該執行個體中。

如果您還沒有 Amazon EC2 金鑰對，可以在 AWS 管理主控台中建立一個。如需 Linux 資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 使用者指南](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。如需 Windows 資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 金鑰對和 Windows 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)。

如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
+ 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
+ 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

如果要封鎖 Pod 對 IMDS 的存取，請將 `--disable-pod-imds` 選項新增至下列命令。

```
eksctl create nodegroup \
  --cluster my-cluster \
  --region region-code \
  --name my-mng \
  --node-ami-family ami-family \
  --node-type m5.large \
  --nodes 3 \
  --nodes-min 2 \
  --nodes-max 4 \
  --ssh-access \
  --ssh-public-key my-key
```

您的執行個體可以選擇性地為 Pod 指派更多的 IP 位址、將 IP 位址指派給不同於執行個體之 CIDR 區塊的 Pod，以及在沒有網際網路存取的情況下部署到叢集。如需詳細資訊，請參閱 [將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)、[使用自訂聯網在替代子網路中部署 Pod](cni-custom-network.md) 和 [部署網際網路存取受到限制的私有叢集](private-clusters.md) 以取得要新增至之前命令的其他選項。

受管節點群組會根據執行個體類型，計算並套用可在節點群組的每個節點上執行的 Pod 數量上限的單一數值。如果建立建具有不同執行個體類型的節點群組，則在所有執行個體類型中計算的最小值，會應用為可以在節點群組中的每種執行個體類型上執行的 Pod 數量上限。如需如何計算此值的詳細資訊，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。

 **使用啟動範本** 

啟動範本必須已經存在，且必須符合[啟動範本組態基礎知識](launch-templates.md#launch-template-basics)中指定的要求。如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
+ 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
+ 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

如果您要封鎖 Pod 對 IMDS 的存取，則請在啟動範本中指定必要的設定。

1. 將以下內容複製到您的裝置。取代範例值，然後執行修改後的命令來建立 `eks-nodegroup.yaml` 檔案。在不使用啟動範本的情況下部署時指定的數個設定會移至啟動範本。如果您未指定 `version`，即使用範本的預設版本。

   ```
   cat >eks-nodegroup.yaml <<EOF
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   metadata:
     name: my-cluster
     region: region-code
   managedNodeGroups:
   - name: my-mng
     launchTemplate:
       id: lt-id
       version: "1"
   EOF
   ```

   如需 `eksctl` 組態檔案設定的完整清單，請參閱 `eksctl` 文件中的[組態檔案結構描述](https://eksctl.io/usage/schema/)。您的執行個體可以選擇性地為 Pod 指派更多的 IP 位址、將 IP 位址指派給不同於執行個體之 CIDR 區塊的 Pod，以及在沒有傳出網際網路存取的情況下部署到叢集。如需詳細資訊，請參閱適用於新增至組態檔案之其他選項的 [將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)、[使用自訂聯網在替代子網路中部署 Pod](cni-custom-network.md) 和 [部署網際網路存取受到限制的私有叢集](private-clusters.md)。

   如果未在啟動範本中指定 AMI ID，受管節點群組會根據執行個體類型，計算並套用可在節點群組的每個節點上執行的 Pod 數量上限的單一數值。如果建立建具有不同執行個體類型的節點群組，則在所有執行個體類型中計算的最小值，會應用為可以在節點群組中的每種執行個體類型上執行的 Pod 數量上限。如需如何計算此值的詳細資訊，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。

   如果在啟動範本中指定了 AMI ID，而且正使用[自訂聯網](cni-custom-network.md)或想[增加指派給執行個體的 IP 位址數量](cni-increase-ip-addresses.md)，請指定可在節點群組的每個節點上執行的 Pod 數量上限。如需詳細資訊，請參閱[maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。

1. 使用下列命令部署節點群組。

   ```
   eksctl create nodegroup --config-file eks-nodegroup.yaml
   ```

## AWS 管理主控台
<a name="console_create_managed_nodegroup"></a>

 **使用 AWS 管理主控台 建立受管節點群組** 

1. 等待您的叢集狀態顯示為 `ACTIVE`。您無法針對尚未進入 `ACTIVE` 狀態的叢集建立受管節點群組。

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要在其中建立受管節點群組的叢集名稱。

1. 選取 **Compute** (運算) 標籤。

1. 選擇 **Add node group** (新增節點群組)。

1. 在 **Configure node group (配置節點群組)** 頁面上，相應地填寫參數，然後選擇 **Next (下一步)**。
   +  **Name** (名稱) – 輸入受管節點群組的唯一名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。
   +  **Node IAM role** (節點 IAM 角色)：選擇要與節點群組搭配使用的節點執行個體角色。如需詳細資訊，請參閱[Amazon EKS 節點 IAM 角色](create-node-role.md)。
**重要**  
您無法使用用於建立任何叢集的相同角色。
建議使用尚未被任何自我管理節點群組使用的角色。否則，您要計劃與新的自我管理節點組一起使用。如需詳細資訊，請參閱[從您的叢集刪除受管節點群組](delete-managed-node-group.md)。
   +  **Use launch template** (使用啟動範本)：(選用) 選擇是否要使用現有的啟動範本。選取**啟動範本名稱**。然後，選取 **Launch template version** (啟動範本版本)。如果您沒有選取版本，則 Amazon EKS 會使用範本的預設版本。啟動範本允許對節點群組進行更多自訂，如允許您部署自訂 AMI、為 Pod 指派更多的 IP 位址、將 IP 位址指派給不同於執行個體之 CIDR 區塊的 Pod，以及將節點部署至沒有出站網際網路存取的叢集。如需詳細資訊，請參閱[將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)、[使用自訂聯網在替代子網路中部署 Pod](cni-custom-network.md)及[部署網際網路存取受到限制的私有叢集](private-clusters.md)。

     啟動範本必須滿足[透過啟動範本來自訂受管節點](launch-templates.md)中的要求。如果您不使用自己的啟動範本，Amazon EKS API 會在您的帳戶中建立預設的 Amazon EC2 啟動範本，並使用預設啟動範本部署節點群組。

     如果您[為服務帳戶實作 IAM 角色](iam-roles-for-service-accounts.md)，請直接將必要的許可指派給需要存取 AWS 服務的每個 Pod，而且叢集中沒有任何 Pod 需要存取 IMDS，例如擷取目前 AWS 區域，則您也可以停用在啟動範本中未使用主機聯網之 Pod 的 IMDS 存取權。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。
   +  **Kubernetes labels** (Kubernetes 標籤) – (選用) 您可以選擇將 Kubernetes 標籤套用至受管節點群組中的節點。
   +  **Kubernetes 污點** – (選用) 您可以選擇將 Kubernetes 污點套用至受管節點群組中的節點。**Effect** (效果) 功能表中的可用選項是 ` NoSchedule `、` NoExecute ` 及 ` PreferNoSchedule `。如需詳細資訊，請參閱[配方：阻止在特定節點上排程 Pod](node-taints-managed-node-groups.md)。
   +  **Tags** (標籤) – (選用) 您可以選擇標記 Amazon EKS 受管節點群組。這些標籤不會傳播到節點群組中的其他資源，例如 Auto Scaling 群組或執行個體。如需詳細資訊，請參閱[使用標籤組織 Amazon EKS 資源](eks-using-tags.md)。

1. 在 **Set compute and scaling configuration** (設定運算和擴展組態) 頁面上，相應地填寫參數，然後選擇 **Next** (下一步)。
   +  **AMI 類型**：選取 AMI 類型。如果您在部署 Arm 執行個體，請務必在部署前檢閱 [Amazon EKS 最佳化 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami) 中的考量事項。

     如果您在上一頁中已指定啟動範本，並在啟動範本中指定了 AMI，則無法選取值。系統會顯示範本中的值。範本中指定的 AMI 必須符合[指定 AMI](launch-templates.md#launch-template-custom-ami) 中的要求。
   +  **Capacity type** (容量類型) – 選取容量類型。如需選擇容量類型的詳細資訊，請參閱 [受管節點群組容量類型](managed-node-groups.md#managed-node-group-capacity-types)。您無法在同一節點群組中混合使用不同的容量類型。如果要同時使用這兩種容量類型，請建立個別的節點群組，每個群組都有自己的容量和執行個體類型。有關佈建和擴展 GPU 加速工作節點的資訊，請參閱[為受管節點群組保留 GPU](https://docs.aws.amazon.com/eks/latest/userguide/capacity-blocks-mng.html)。
   +  **Instance types** (執行個體類型)：依預設會指定一或多個執行個體類型。若要移除預設執行個體類型，請選取執行個體類型的右側的 `X`。選擇要在受管節點群組中使用的執行個體類型。如需詳細資訊，請參閱[選擇最佳的 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。

     主控台會顯示一組常用的執行個體類型。如果您需要使用未顯示的執行個體類型建立受管節點群組，請使用 `eksctl`、 CLI、 AWS CloudFormation AWS 或 SDK 來建立節點群組。如果您在上一頁指定了啟動範本，則無法選取值，因為必須在啟動範本中指定執行個體類型。系統會顯示啟動範本中的值。如果為 **Capacity type** (容量類型) 選取了 **Spot**，則建議您指定多個執行個體類型以增強可用性。
   +  **Disk size** (磁碟大小) – 輸入要用於節點根磁碟區的磁碟大小 (以 GiB 為單位)。

     如果您在上一頁指定了啟動範本，則無法選取值，因為必須在啟動範本中指定該值。
   +  **Desired size** (所需大小) – 指定受管節點群組目前在啟動時應該維護的節點數量。
**注意**  
Amazon EKS 不會自動擴展或縮減您的節點群組。不過，您可以設定 Kubernetes Cluster Autoscaler 為您執行這項操作。如需詳細資訊，請參閱 [Cluster Autoscaler on AWS](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)。
   +  **Minimum size** (大小下限) – 指定受管節點群組可縮減至的節點數量下限。
   +  **Maximum size** (大小上限)：指定受管節點群組可擴增至的節點數量上限。
   +  **Node group update configuration** (節點群組更新組態) – (選用) 您可以選取要平行更新的節點數量或百分比。這些節點在更新期間將無法使用。對於 **Maximum unavailable** (無法使用的上限)，選取下列其中一個選項，然後指定 **Value** (值)：
     +  **Number** (數量)：選取並指定可平行更新節點群組的節點數量。
     +  **Percentage** (百分比)：選取並指定可平行更新節點群組的節點百分比。如果您的節點群組中有大量節點，這會很有用。
   +  **節點自動修復組態** - (選用) 如果您啟用**啟用節點自動修復**核取方塊，Amazon EKS 將在偵測到問題發生時自動取代節點。如需詳細資訊，請參閱[偵測節點運作狀態問題並啟用自動節點修復](node-health.md)。
   +  **暖集區組態** – （選用） 如果您啟用**啟用暖集區組態**核取方塊，Amazon EKS 將在 ASG 上建立暖集區。如需詳細資訊，請參閱[使用具有受管節點群組的暖集區，減少開機時間較長之應用程式的延遲](warm-pools-managed-node-groups.md)。

1. 在 **Specify networking** (指定聯網) 頁面上，據此填寫參數，然後選擇 **Next** (下一步)。
   +  **Subnets** (子網路)：選擇要將受管節點啟動至其中的子網路。
**重要**  
如果您跨越多個由 Amazon EBS 磁碟區提供的可用區域執行狀態應用程式，並且使用 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，您應該設定多個節點群組，每個群組的範圍皆為單一可用區域。另外，您應該啟用 `--balance-similar-node-groups` 功能。
**重要**  
如果選擇公有子網路，而且您的叢集只啟用了公有 API 伺服器端點，則子網路的必須將 `MapPublicIPOnLaunch` 設定為 `true`，讓執行個體成功加入叢集。如果子網路是在 2020 年 3 月 26 日或之後使用 `eksctl`或 [Amazon EKS vended AWS CloudFormation 範本](creating-a-vpc.md)建立，則此設定已設定為 `true`。如果在 2020 年 3 月 26 日之前使用 `eksctl`或 AWS CloudFormation 範本建立子網路，則需要手動變更設定。如需詳細資訊，請參閱[修改子網的公有 IPv4 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。
如果使用啟動範本並指定多個網路介面，Amazon EC2 便不會自動指派公有 `IPv4` 位址，即使 `MapPublicIpOnLaunch` 已設定為 `true`。對於在此案例中加入叢集的節點，您必須啟用叢集的私有 API 伺服器端點，或使用透過其他方法 (例如 NAT Gateway) 提供的出站網際網存取，啟動私有子網路中的節點。如需詳細資訊，請參閱*《Amazon EC2 使用者指南》*中的 [Amazon EC2 執行個體 IP 定址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing.html)。
   +  **設定 SSH 存取節點** (選用)。啟用 SSH 可讓您連接到執行個體，並在發生問題時收集診斷資訊。強烈建議您在建立節點群組時啟用遠端存取。您無法在建立節點群組之後啟用遠端存取。

     如果您選擇使用啟動範本，則不會顯示此選項。若要啟用節點的遠端存取，請在啟動範本中指定金鑰對，並確定您在啟動範本中指定之安全群組中的節點已開啟適當的連接埠。如需詳細資訊，請參閱[使用自訂安全群組](launch-templates.md#launch-template-security-groups)。
**注意**  
對於 Windows，此命令不會啟用 SSH。而是將 Amazon EC2 金鑰對與執行個體建立關聯，讓您可以 RDP 至該執行個體中。
   + 對於 **SSH key pair** (SSH 金鑰對) (選用)，選擇要使用的 Amazon EC2 SSH 金鑰。如需 Linux 資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 使用者指南](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。如需 Windows 資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 金鑰對和 Windows 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)。如果您選擇使用啟動範本，則無法選取範本。當使用 Bottlerocket AMI 為節點群組提供 Amazon EC2 SSH 金鑰時，也會啟用管理容器。如需詳細資訊，請參閱 GitHub 上的[管理容器](https://github.com/bottlerocket-os/bottlerocket#admin-container)。
   + 對於 **Allow SSH remote access from** (允許 SSH 遠端存取來自)，如果要限制對特定執行個體的存取，請選取與這些執行個體相關聯的安全群組。如果沒有選取特定的安全群組，則允許從網際網路 (`0.0.0.0/0`) 上的任何地方存取 SSH。

1. 在 **Review and create (檢閱並建立)** 頁面上，檢閱您的受管節點群組組態，然後選擇 **Create (建立)**。

   如果節點無法加入叢集，請參閱「故障診斷」章節中的 [節點無法加入叢集](troubleshooting.md#worker-node-fail)。

1. 查看節點的狀態，並等待他們到達 `Ready` 狀態。

   ```
   kubectl get nodes --watch
   ```

1. (僅限 GPU 節點) 若您選擇了 GPU 執行個體類型和 Amazon EKS 最佳化加速 AMI，然後必須套用 [Kubernetes 專用 NVIDIA 裝置外掛程式](https://github.com/NVIDIA/k8s-device-plugin)作為叢集上的 DaemonSet。請先以您想要的 [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) 版本來取代 *vX.X.X*，然後再執行下列命令。

   ```
   kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml
   ```

## 安裝 Kubernetes 附加元件
<a name="_install_kubernetes_add_ons"></a>

現在您已具備含節點之可正常運作的 Amazon EKS 叢集，您即可開始安裝 Kubernetes 附加元件並將應用程式部署到叢集。以下文件主題可協助您擴展叢集的功能。
+ 建立叢集的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)是唯一可以使用 `kubectl` 或 AWS 管理主控台對 Kubernetes API 伺服器進行呼叫的主體。如果要其他 IAM 主體能夠存取叢集，則需新增這些主體。如需詳細資訊，請參閱[授予 IAM 使用者和角色對 Kubernetes APIs存取權](grant-k8s-access.md)及[所需的許可](view-kubernetes-resources.md#view-kubernetes-resources-permissions)。
+ 如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
  + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
  + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

  如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。
+ 設定 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，以自動調整節點群組中的節點數目。
+ 將[範例應用程式](sample-deployment.md)部署至叢集。
+  使用管理叢集所需的重要工具來[組織和監控叢集資源](eks-managing.md)。

# 使用具有受管節點群組的暖集區，減少開機時間較長之應用程式的延遲
<a name="warm-pools-managed-node-groups"></a>

當您的應用程式有很長的初始化或開機時間時，向外擴展事件可能會導致延遲 - 新的節點必須完全開機並加入叢集，才能排程 Pod。此延遲可能會影響流量尖峰或快速擴展事件期間的應用程式可用性。暖集區透過維護已完成開機程序的預先初始化 EC2 執行個體集區來解決此問題。在橫向擴展事件期間，執行個體會直接從暖集區移至叢集，略過耗時的初始化步驟，並大幅減少新容量變成可用所需的時間。如需詳細資訊，請參閱[《Amazon EC2 Auto Scaling 使用者指南》中的使用暖集區縮短開機時間的應用程式延遲](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html)。 *Amazon EC2 Auto Scaling *

Amazon EKS 受管節點群組支援 Amazon EC2 Auto Scaling 暖集區。暖集區會與 Auto Scaling 群組一起維護預先初始化的 EC2 執行個體，以便在橫向擴展事件期間快速加入叢集。暖集區中的執行個體已完成開機初始化程序，並且可以保持在 `Stopped`、 `Running`或 `Hibernated` 狀態。

Amazon EKS 使用`AWSServiceRoleForAmazonEKSNodegroup`服務連結角色在整個節點群組生命週期中管理暖集區，以建立、更新和刪除暖集區資源。

## 運作方式
<a name="warm-pools-how-it-works"></a>

當您設定暖集區時，Amazon EKS 會建立連接到節點群組 Auto Scaling 群組的 EC2 Auto Scaling 暖集區。執行個體會在暖集區中啟動、完成開機初始化程序，並保持設定狀態 (`Running`、 `Stopped`或 `Hibernated`)，直到需要為止。在橫向擴展事件期間，執行個體會從暖集區移至 Auto Scaling 群組，完成 Amazon EKS 初始化程序以加入叢集，並可用於 Pod 排程。啟用執行個體重複使用時，執行個體可以在縮減事件期間返回暖集區。

**重要**  
一律使用 `create-nodegroup`或 透過 Amazon EKS API 設定暖集區`update-nodegroup-config`。請勿使用 EC2 Auto Scaling API 手動修改暖集區設定，因為這可能會導致與 資源的 Amazon EKS 管理發生衝突。

## 考量事項
<a name="warm-pools-considerations"></a>

**重要**  
在設定暖集區之前，請參閱《[Amazon EC2 Auto Scaling 使用者指南》中的 Amazon EC2 Auto Scaling 暖集區](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html)中的先決條件和限制。 *Amazon EC2 Auto Scaling * 並非所有執行個體類型、AMIs或組態都受到支援。
+  **IAM 許可** – `AWSServiceRoleForAmazonEKSNodegroup`服務連結角色 （使用第一個受管節點群組自動建立） 包含必要的暖集區管理許可。
+  **AMI 限制** – 暖集區不支援自訂 AMIs。您必須使用 Amazon EKS 最佳化 AMIs。
+  **Bottlerocket 限制** – 如果使用 Bottlerocket AMIs，則不支援`Hibernated`集區狀態。僅限使用 `Stopped`或`Running`集區狀態。此外， Bottlerocket AMIs 不支援`reuseOnScaleIn`此功能。
+  **休眠支援** – 集`Hibernated`區狀態僅支援特定執行個體類型。如需支援的執行個體類型，請參閱《*Amazon EC2 使用者指南*》中的[休眠先決條件](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html)。
+  **成本影響** – 在不需要時建立暖集區可能會導致不必要的成本。
+  **容量規劃** – 根據擴展模式調整暖集區大小，以平衡成本和可用性。從 10-20% 的預期尖峰容量開始。
+  **VPC 聯網** – 確保 Auto Scaling 群組和暖集區執行個體都有足夠的 IP 地址。

## 設定暖集區
<a name="warm-pools-configuration"></a>

您可以在建立新的受管節點群組時設定暖集區，或更新現有的受管節點群組以新增暖集區支援。

### 組態參數
<a name="warm-pools-parameters"></a>
+  **enabled** – （布林值） 表示您將暖集區連接至受管節點群組的意圖。啟用暖集區支援時需要。
+  **maxGroupPreparedCapacity** – （整數） 跨暖集區和 Auto Scaling 群組合併的執行個體總數上限。
+  **minSize** – （整數） 在暖集區中維護的執行個體數目下限。預設：`0`。
+  **poolState** – （字串） 暖集區執行個體的狀態。預設：`Stopped`。
+  **reuseOnScaleIn** – （布林值） 執行個體是否在縮減事件期間返回暖集區，而不是終止它們。預設：`false`。Bottlerocket AMIs不支援。

### 使用 AWS CLI
<a name="warm-pools-create-cli"></a>

您可以在建立受管節點群組時設定暖集區，或將暖集區新增至現有的節點群組。

 **使用暖集區建立節點群組** 

```
aws eks create-nodegroup \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --node-role arn:aws:iam::111122223333:role/AmazonEKSNodeRole \
  --subnets subnet-12345678 subnet-87654321 \
  --region us-east-1 \
  --scaling-config minSize=2,maxSize=10,desiredSize=3 \
  --warm-pool-config enabled=true,maxGroupPreparedCapacity=8,minSize=2,poolState=Stopped,reuseOnScaleIn=true
```

 **將暖集區新增至現有的節點群組** 

```
aws eks update-nodegroup-config \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --region us-east-1 \
  --warm-pool-config enabled=true,maxGroupPreparedCapacity=8,minSize=2,poolState=Stopped,reuseOnScaleIn=true
```

## 更新組態
<a name="warm-pools-update"></a>

隨時使用 更新暖集區設定`update-nodegroup-config`。現有的暖集區執行個體不會立即受到影響；新設定適用於更新後進入暖集區的執行個體。

```
aws eks update-nodegroup-config \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --region us-east-1 \
  --warm-pool-config enabled=true,maxGroupPreparedCapacity=10,minSize=3,poolState=Running,reuseOnScaleIn=true
```

若要停用連接到節點群組的暖集區，請設定 `enabled=false`：

```
aws eks update-nodegroup-config \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --region us-east-1 \
  --warm-pool-config enabled=false
```

## 其他資源
<a name="warm-pools-additional-resources"></a>
+  《[Amazon EC2 Auto Scaling 使用者指南》中的 Amazon EC2 Auto Scaling 的暖集區](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-warm-pools.html) *Amazon EC2 Auto Scaling * 
+  [使用受管節點群組簡化節點生命週期](managed-node-groups.md) 

# 更新叢集的受管節點群組
<a name="update-managed-node-group"></a>

啟動受管節點群組更新後，Amazon EKS 會自動為您更新節點，完成[了解節點更新的每個階段](managed-node-update-behavior.md)中列出的步驟。如果使用的是 Amazon EKS 最佳化 AMI，則 Amazon EKS 會自動將最新的安全修補程式和作業系統更新套用至您的節點，作為最新 AMI 發行版本的一部分。

有數個案例可用於更新 Amazon EKS 受管節點群組的版本或組態：
+ 您已更新 Amazon EKS 叢集的 Kubernetes 版本，並且想要更新您的節點，以使用相同的 Kubernetes 版本。
+ 新的 AMI 發行版本可供受管節點群組使用。如需 AMI 版本的詳細資訊，請參閱下列各節：
  +  [擷取 Amazon Linux AMI 版本資訊](eks-linux-ami-versions.md) 
  +  [使用最佳化的 Bottlerocket AMI 建立節點](eks-optimized-ami-bottlerocket.md) 
  +  [擷取 Windows AMI 版本資訊](eks-ami-versions-windows.md) 
+ 您想要調整受管節點群組中執行個體的下限、上限或所需計數。
+ 您想要從受管節點群組中的執行個體新增或移除 Kubernetes 標籤。
+ 您想要從受管節點群組新增或移除 AWS 標籤。
+ 您需要部署具有組態變更的新版啟動範本，例如更新的自訂 AMI。
+ 您已部署 版本 `1.9.0`或更新版本的 Amazon VPC CNI 附加元件、啟用用於字首委派的附加元件，並希望節點群組中的新 AWS Nitro System 執行個體支援大幅增加的 Pod 數量。如需詳細資訊，請參閱[將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)。
+ 您已為 Windows 節點啟用 IP 字首委派，並希望節點群組中的新 AWS Nitro System 執行個體支援大幅增加的 Pod 數量。如需詳細資訊，請參閱[將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)。

如果有較新的受管節點群組之 Kubernetes 版本的 AMI 發行版本，則可以更新節點群組的版本，以使用較新的 AMI 版本。同樣地，如果叢集執行的 Kubernetes 版本比節點群組新，則可以更新節點群組，以使用符合叢集 Kubernetes 版本的最新 AMI 發行版本。

當受管節點群組中的節點由於擴展操作或更新而終止時，該節點中的 Pod 叢集會先耗盡。如需詳細資訊，請參閱[了解節點更新的每個階段](managed-node-update-behavior.md)。

## 更新節點群組版本
<a name="mng-update"></a>

您可以透過以下任一項來更新節點群組版本：
+  [`eksctl`](#eksctl_update_managed_nodegroup) 
+  [AWS 管理主控台](#console_update_managed_nodegroup) 

您更新的版本不能比控制平面的版本還新。

## `eksctl`
<a name="eksctl_update_managed_nodegroup"></a>

 **使用 `eksctl` 來更新受管節點群組** 

使用下列命令，將受管節點群組更新至目前節點上所部署相同 Kubernetes 版本的最新 AMI 版本。使用您自己的值取代每一個*範例值*。

```
eksctl upgrade nodegroup \
  --name=node-group-name \
  --cluster=my-cluster \
  --region=region-code
```

**注意**  
如果要將使用啟動範本部署的節點群組升級至新的啟動範本版本，則請將 `--launch-template-version version-number ` 新增至上述命令。啟動範本必須滿足[透過啟動範本來自訂受管節點](launch-templates.md)中所述的要求。如果啟動範本包含自訂 AMI，則 AMI 必須滿足[指定 AMI](launch-templates.md#launch-template-custom-ami) 中的要求。當您將節點群組升級至較新版本的啟動範本時，每個節點都會回收，以符合指定之啟動範本版本的新組態。

您無法直接將未部署啟動範本的節點群組升級至新的啟動範本版本。相反地，您必須使用啟動範本部署新的節點群組，才能將節點群組更新為新的啟動範本版本。

您可以將節點群組升級至與控制平面的 Kubernetes 版本相同的版本。例如，當您有一個正在執行 Kubernetes `1.35` 的叢集時，您可以使用下列命令，將目前執行 Kubernetes `1.34` 的節點升級到 `1.35` 版。

```
eksctl upgrade nodegroup \
  --name=node-group-name \
  --cluster=my-cluster \
  --region=region-code \
  --kubernetes-version=1.35
```

## AWS 管理主控台
<a name="console_update_managed_nodegroup"></a>

 **使用 AWS 管理主控台 來更新受管節點群組** 

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇包含要更新之節點群組的叢集。

1. 如果至少有一個節點群組有可用的更新，則頁面頂部會出現一個方塊，通知您可用的更新。如果選取**運算**索引標籤，您會看到針對有可用更新之節點群組的**節點群組**資料表中 **AMI 發行版本**欄位中的**立即更新**。若要更新節點群組，請選擇 **Update now** (立即更新)。

   您不會看到使用自訂 AMI 部署之節點群組的通知。如果節點是使用自訂 AMI 進行部署，則請完成以下步驟來部署新的已更新自訂 AMI。

   1. 建立 AMI 的新版本。

   1. 使用新的 AMI ID 建立新的啟動範本版本。

   1. 將節點升級至啟動範本的新版本。

1. 在 **Update node group version** (更新節點群組版本) 對話方塊中，啟用或停用以下選項：
   +  **Update node group version** (更新節點群組版本)：如果您部署了自訂 AMI，或經 Amazon EKS 優化的 AMI 目前是叢集的最新版本，則無法使用此選項。
   +  **Change launch template version** (變更啟動範本版本)：如果節點群組是在沒有自訂啟動範本的情況下進行部署，則無法使用此選項。您只能更新已使用自訂啟動範本部署之節點群組的啟動範本版本。選取節點群組要更新至的 **Launch template version** (啟動範本版本)。如果節點群組設定了自訂 AMI，則您選取的版本也必須指定 AMI。當您升級至較新版本的啟動範本時，每個節點都會回收，以符合指定之啟動範本版本的新組態。

1. 對於 **Update strategy** (更新策略)，選取下列其中一個選項：
   +  **Rolling update** (滾動更新) – 此選項會遵循叢集的 Pod 中斷預算。如果發生 Pod 中斷預算問題，導致 Amazon EKS 無法正常地消耗正在此節點群組上執行的 Pod，則更新會失敗。
   +  **強制更新** – 此選項不會遵循 Pod 中斷預算。無論 Pod 中斷預算問題如何，都會強制節點重新啟動，進行更新。

1. 選擇 **Update** (更新)。

## 編輯節點群組組態
<a name="mng-edit"></a>

您可以修改受管節點群組中的部分組態。

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇包含要編輯之節點群組的叢集。

1. 選取 **Compute** (運算) 標籤。

1. 選取要編輯的節點群組，然後選擇 **Edit** (編輯)。

1. (選用) 在 **Edit node group** (編輯節點群組) 頁面上，執行以下作業：

   1. 編輯 **Node group scaling configuration** (節點群組擴展組態)。
      +  **Desired size** (所需大小) – 指定受管節點群組目前應該維護的工作者節點數量。
      +  **Minimum size** (大小下限) – 指定受管節點群組可縮減至的節點數量下限。
      +  **Maximum size** (大小上限)：指定受管節點群組可擴增至的節點數量上限。如需節點群組中支援的節點數量上限，請參閱 [檢視與管理 Amazon EKS 和 Fargate 服務配額](service-quotas.md)。

   1. (選用) 將 **Kubernetes 標籤**新增至節點群組中的節點或從中移除這些標籤。這裡顯示的標籤只是您使用 Amazon EKS 所套用的標籤。其他標籤可能存在於這裡未顯示的節點上。

   1. (選用) 將 **Kubernetes 污點**新增至節點群組中的節點或從中移除這些標籤。已新增的污點可能會有 ` NoSchedule `、` NoExecute ` 或 ` PreferNoSchedule ` 效果。如需詳細資訊，請參閱[配方：阻止在特定節點上排程 Pod](node-taints-managed-node-groups.md)。

   1. (選用) 將 **Tags** (標籤) 新增至節點群組或從中移除標籤。這些標籤僅適用於 Amazon EKS 節點群組。標籤不會傳播到其他資源，例如節點群組中的子網路或 Amazon EC2 執行個體。

   1. (選用) 編輯 **Node Group update configuration** (節點群組更新組態)。選取任何一個 **Number** (數字) 或 **Percentage** (百分比)。
      +  **Number** (數量)：選取並指定可平行更新節點群組的節點數量。這些節點在更新期間將無法使用。
      +  **Percentage** (百分比)：選取並指定可平行更新節點群組的節點百分比。這些節點在更新期間將無法使用。如果您的節點群組中有許多節點，這會很有用。

   1. 完成編輯後，請選擇**儲存變更**。

**重要**  
更新節點群組組態後，修改 [https://docs.aws.amazon.com/eks/latest/APIReference/API_NodegroupScalingConfig.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_NodegroupScalingConfig.html) 與 Pod 中斷預算 (PDB) 不相符。與[更新節點群組](managed-node-update-behavior.md)程序 (這會在升級階段期間消耗節點且與 PDB 相符) 不同的是，若更新擴展組態，會導致節點透過 Auto Scaling 群組 (ASG) 縮減呼叫立即終止。發生此情況不會考慮 PDB，無論您在縮減的目標大小為何。這意味著，若您減少 Amazon EKS 受管節點群組的 `desiredSize`，Pod 會在節點終止後立即移出，而不與任何 PDB 相符。

# 了解節點更新的每個階段
<a name="managed-node-update-behavior"></a>

Amazon EKS 受管工作節點升級策略有四個不同的階段，如下節所述。

## 設定階段
<a name="managed-node-update-set-up"></a>

設定階段具有下列步驟：

1. 它為與節點群組相關聯的 Auto Scaling 群組建立新的 Amazon EC2 啟動範本版本。新的啟動範本版本使用目標 AMI 或自訂啟動範本版本進行更新。

1. 它會更新 Auto Scaling 群組，以使用最新的啟動範本。

1. 它使用節點群組的 `updateConfig` 屬性決定要平行升級的節點數量上限。不可用節點上限配額為 100。預設值為一個節點。如需詳細資訊，請參閱《*Amazon EKS API 參考*》中的 [updateConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateNodegroupConfig.html#API_UpdateNodegroupConfig_RequestSyntax) 屬性。

## 擴充規模階段
<a name="managed-node-update-scale-up"></a>

升級受管節點群組中的節點時，已升級的節點會在與正在升級的節點相同的可用區域中啟動。為了保證這種置放，我們使用 Amazon EC2 的可用區域重新平衡。如需詳細資訊，請參閱《[Amazon EC2 Auto Scaling 使用者指南](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage)》中的*可用區域容量重新平衡*。為了滿足這項需求，我們可在受管節點群組中每個可用區域啟動最多兩個執行個體。

擴充規模階段具有下列步驟：

1. 它按下面的任一大小 (以較大者為准) 增加 Auto Scaling 群組的最大大小和所需大小：
   + Auto Scaling 群組部署的可用區域數量的兩倍。
   + 升級無法使用的上限。

     例如，如果節點群組有五個可用區域，而 `maxUnavailable` 為一個，則升級程序最多能啟動 10 個節點。但是，當 `maxUnavailable` 為 20 (或任何大於 10 的數字)，該程序會啟動 20 個新節點。

1. 擴展 Auto Scaling 群組後，會檢查使用最新配置的節點是否存在於節點群組之中。只有在符合下列條件時，此步驟才會成功：
   + 在節點所在的每個可用區域中，至少會啟動一個新節點。
   + 每個新節點都應該處於 `Ready` 狀態。
   + 新節點應該有 Amazon EKS 套用標籤。

     以下是一般節點群組中工作節點上的 Amazon EKS 套用標籤：
     +  `eks.amazonaws.com/nodegroup-image=$amiName` 
     +  `eks.amazonaws.com/nodegroup=$nodeGroupName` 

     以下是自訂啟動範本或 AMI 節點群組中工作節點上的 Amazon EKS 套用標籤：
     +  `eks.amazonaws.com/nodegroup-image=$amiName` 
     +  `eks.amazonaws.com/nodegroup=$nodeGroupName` 
     +  `eks.amazonaws.com/sourceLaunchTemplateId=$launchTemplateId` 
     +  `eks.amazonaws.com/sourceLaunchTemplateVersion=$launchTemplateVersion` 
**注意**  
在未變更擴展組態的情況下啟動更新或升級時，工作流程會使用即時 Auto Scaling 群組值作為起點，而不是節點群組的儲存擴展組態。如需詳細資訊，請參閱[受管節點群組概念](managed-node-groups.md#managed-node-group-concepts)。

1. 它將節點標記為不可排程，以避免排程新的 Pod。它還使用 `node.kubernetes.io/exclude-from-external-load-balancers=true` 標記節點，以便在終止節點之前從負載平衡器中移除舊節點。

以下是在這個階段中會導致 `NodeCreationFailure` 錯誤的已知原因：

 **可用區域中的容量不足**   
可用區域可能沒有所請求執行個體類型的容量。建議在建立受管節點群組時設定多個執行個體類型。

 **您帳戶中的 EC2 執行個體限制**   
您可能需要增加帳戶可以使用 Service Quotas 同時執行的 Amazon EC2 執行個體的數量。如需詳細資訊，請參閱《[Amazon Elastic Compute Cloud Linux 執行個體使用者指南](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html)》中的 *EC2 Service Quotas*。

 **自訂使用者資料**   
自訂使用者資料有時會中斷引導程序。這種情況可能會導致 `kubelet` 未在節點上啟動或節點上未取得預期的 Amazon EKS 標籤。如需詳細資訊，請參閱[指定 AMI](launch-templates.md#launch-template-custom-ami)。

 **讓節點運作狀態不佳或未就緒的任何變更**   
節點磁碟壓力、記憶體壓力和類似情況，可能導致節點無法進入 `Ready` 狀態。

 **每個節點在 15 分鐘內必須完成引導**   
如果任何節點需要超過 15 分鐘才能完成引導並加入叢集，則會導致升級逾時。這是從需要新節點到新階段加入叢集時，測量的引導新節點的總執行時期。升級受管節點群組時，時間計數器會在 Auto Scaling 群組大小增加時立即啟動。

## 升級階段
<a name="managed-node-update-upgrade"></a>

升級階段有有兩種不同的行為方式，具體視*更新策略*而定。更新策略有兩種：**預設**和**最低**。

大多數情況下，我們建議使用預設策略。它會在終止舊節點之前建立新節點，以便在升級階段維持可用容量。在資源或成本受限制的情況下 (例如使用 GPU 等硬體加速器)，這種最低策略非常有用。它會在建立新節點之前終止舊節點，以便總容量永遠不會超過您設定的數量。

*預設*更新策略包含下列步驟：

1. 它會增加 Auto Scaling 群組中的節點數量 (所需計數)，進而導致節點群組建立額外的節點。

1. 它隨機選取需要升級的節點，最大不超過為節點群組設定的無法使用上限。

1. 其會耗盡節點中的 Pod。如果 Pod 沒有在 15 分鐘內離開節點，並且沒有強制旗標，則升級階段將失敗，並會出現 `PodEvictionFailure` 錯誤。在這種情況下，您可以應用強制旗標，同時使用 `update-nodegroup-version` 請求刪除 Pod。

1. 在每個 Pod 被移出並等待 60 秒後，其會包圍隔離節點。這樣做是為了讓服務控制器不會將任何新的請求傳送到此節點，並將此節點從其作用中的節點清單中移除。

1. 它將終止請求傳送之包圍隔離節點的 Auto Scaling 群組。

1. 它重複步驟先前的升級步驟，直到節點群組中沒有使用舊版啟動範本部署的節點為止。

*最低*更新策略包含下列步驟：

1. 它會在開頭包圍隔離節點群組的所有節點，以便服務控制器不會將任何新請求傳送至這些節點。

1. 它隨機選取需要升級的節點，最大不超過為節點群組設定的無法使用上限。

1. 它會從選取的節點中耗盡 Pod。如果 Pod 沒有在 15 分鐘內離開節點，並且沒有強制旗標，則升級階段將失敗，並會出現 `PodEvictionFailure` 錯誤。在這種情況下，您可以應用強制旗標，同時使用 `update-nodegroup-version` 請求刪除 Pod。

1. 在每個 Pod 被移出並等待 60 秒後，其會向選取的節點的 Auto Scaling 群組傳送終止請求。Auto Scaling 群組會建立新的節點 (與選取的節點的數量相同)，以取代缺少的容量。

1. 它重複步驟先前的升級步驟，直到節點群組中沒有使用舊版啟動範本部署的節點為止。

### 升級階段期間的 `PodEvictionFailure` 錯誤
<a name="_podevictionfailure_errors_during_the_upgrade_phase"></a>

以下是在這個階段中會導致 `PodEvictionFailure` 錯誤的已知原因：

 **積極 PDB**   
在 Pod 上定義積極的 PDB，或有多個 PDB 指向同一個 Pod。

 **可容忍所有污點的部署**   
一旦移出每個 Pod，節點預期為空，因為節點在先前的步驟中會受到[污染](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)。但是，如果部署容忍每一個污點，則節點更有可能是非空白，導致 Pod 移出失敗。

## 縮減規模階段
<a name="managed-node-update-scale-down"></a>

縮減規模階段會將 Auto Scaling 群組的大小上限和所需大小遞減一，以便回到更新開始之前的值。

如果升級工作流程判斷 Cluster Autoscaler 在工作流程的縮減規模階段期間擴充節點群組，它會立即結束，而不會將節點群組恢復至原始大小。

**注意**  

```
If your node group has a warm pool enabled, warm pool instances are drained before the scale-up operation begins. This is because warm pool instances have not been updated to the new launch template configuration — during the scale-up phase, they would be pulled into the Auto Scaling Group instead of launching new instances with the updated configuration, which would break the upgrade process. Draining the warm pool ensures that only new instances with the updated configuration are launched. Once the scale-down operation completes, the warm pool is restored, and the new instances in the warm pool are launched with the updated launch template configuration.
```
如需有關暖集區的詳細資訊，請參閱 [使用具有受管節點群組的暖集區，減少開機時間較長之應用程式的延遲](warm-pools-managed-node-groups.md)。

# 使用啟動範本自訂受管節點
<a name="launch-templates"></a>

對於最高層級的自訂，您可以根據此頁面上的步驟，使用自己的啟動範本部署受管節點。使用啟動範本可讓 等功能在部署節點期間提供引導引數 （例如，額外的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引數）、從與指派給節點的 IP 地址不同的 CIDR 區塊將 IP 地址指派給 Pod、將您自己的自訂 AMI 部署至節點，或將您自己的自訂 CNI 部署至節點。

如果您在第一次建立受管節點群組期間提供自己的啟動範本，稍後也會得到更出色的靈活性。只要使用自己的啟動範本部署受管節點群組，您就可以使用不同版本的相同啟動範本來反覆更新。將節點群組更新為不同版本的啟動範本時，群組中的所有節點都會回收，以符合指定啟動範本版本的新組態。

一律使用 Amazon EC2 Auto Scaling 群組所使用的啟動範本部署受管節點群組。如果未提供啟動範本，Amazon EKS API 會使用帳戶中的預設值自動建立此啟動範本。然而，我們不建議您修改自動產生的啟動範本。此外，未使用自訂啟動範本的現有節點群組無法直接更新。相反，您必須建立具有自訂啟動範本的新節點群組，才能執行此動作。

## 啟動範本組態基礎知識
<a name="launch-template-basics"></a>

您可以使用 、 AWS 管理主控台 AWS CLI 或 AWS SDK 建立 Amazon EC2 Auto Scaling 啟動範本。如需詳細資訊，請參閱*《Amazon EC2 Auto Scaling 使用者指南》*中的[建立 Auto Scaling 群組的啟動範本](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html)。啟動範本中的某些設定與用於受管理節點組態的設定類似。使用啟動範本部署或更新節點群組時，必須在節點群組組態或啟動範本其中一個位置中指定某些設定。請勿同時在兩個位置指定設定。如果設定存在於不應該的地方，則建立或更新節點群組之類的動作會失敗。

下表會列出啟動範本中禁止的設定。該表也會列出受管節點群組組態中需要的類似設定 (如果有)。列出的設定是顯示在主控台中的設定。它們在 CLI 和 SDK AWS 中可能有類似但不同的名稱。


| 啟動範本：禁止 | Amazon EKS 節點群組組態 | 
| --- | --- | 
|   **Network interfaces** (網路介面) (**Add network interface** (新增網路介面)) 下的 **Subnet** (子網)  |   **Specify networking** (指定聯網) 頁面上 **Node Group network configuration** (節點群組網路組態) 下的 **Subnets** (子網)  | 
|   **Advanced details** (進階詳細資訊) 下的 **IAM instance profile** (IAM 執行個體描述檔)   |   **Configure Node Group** (設定節點群組) 頁面上 **Node Group configuration** (節點群組組態) 下的 **Node IAM Role** (節點 IAM 角色)  | 
|   **Advanced details** (進階詳細資訊) 下的 **Shutdown behavior** (關機行為) 和 **Stop - Hibernate behavior** (停用 – 休眠行為)。為兩種設定在啟動範本中保留預設**請勿包含在啟動範本設定中**。  |  無同等。Amazon EKS 必須控制執行個體生命週期，而非 Auto Scaling 群組。  | 

下表會列出受管節點群組組態中禁止的設定。該表也會列出類似的設定 (如果有)，這些設定在啟動範本中是必要設定。列出的設定是顯示在主控台中的設定。它們在 CLI 和 SDK AWS 中可能會有類似的名稱。


| Amazon EKS 節點群組組態設定：禁止 | 啟動範本 | 
| --- | --- | 
|  (僅當您在啟動模板中指定了自訂 AMI 時) 在 **Set compute and scaling configuration** (設定運算和擴展組態) 頁面上 **Node Group compute configuration** (節點群組運算組態) 下的 **AMI type** (AMI 類型) – 主控台顯示 **Specified in launch template** (在啟動範本中指定) 以及指定的 AMI ID。 如果未在啟動範本中指定**應用程式和作業系統映像 (Amazon Machine Image)**，您可在節點群組組態中選取 AMI。  |   **Launch template contents** (啟動範本內容) 下的 **Application and OS Images (Amazon Machine Image)** (應用程式和作業系統映像 (Amazon Machine Image))：如果您有下列任一要求，則必須指定 ID： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/launch-templates.html)  | 
|   **Set compute and scaling configuration** (設定運算和擴展組態) 頁面上 **Node Group compute configuration** (節點群組運算組態) 下的 **Disk size** (磁碟大小)：主控台顯示 **Specified in launch template** (在啟動範本中指定)。  |   **Storage (Volumes)** (儲存 (磁碟區)) (**Add new volume** (新增磁碟區)) 下的 **Size** (大小)。您必須在啟動範本中指定此選項。  | 
|   **Specify Networking** (指定聯網) 頁面上 **Node Group configuration** (節點群組組態) 下的 **SSH key pair** (SSH 金鑰對) – 主控台會顯示在啟動範本中指定的金鑰，或顯示 **Not specified in launch template** (未在啟動範本中指定)。  |   **Key pair (login)** (金鑰對 (登入)) 下的 **Key pair name** (金鑰對名稱)。  | 
|  使用啟動範本時，您無法指定允許遠端存取的來源安全群組。  |   針對執行個體的 **Network settings** (網路設定) 下的 **Security groups** (安全群組) 或 **Network interfaces** (網路介面) 下的 **Security groups** (安全群組) (**Add network interface** (新增網路介面))，但不能兩者同時選擇。如需詳細資訊，請參閱[使用自訂安全群組](#launch-template-security-groups)。  | 

**注意**  
如果使用啟動範本部署節點群組，請在啟動範本的 **Launch template contents** (啟動範本內容) 中指定零或一個 **Instance type** (執行個體類型)。您也可以在主控台上的 **Set compute and scaling configuration** (設定運算和擴展組態) 頁面中，為 **Instance types** (執行個體類型) 指定 0 到 20 個執行個體類型。您還可以使用其他使用 Amazon EKS API 的工具來執行這項操作。如果在啟動範本中指定執行個體類型，並使用該啟動範本來部署節點群組，則無法在主控台中指定任何執行個體類型，或使用其他使用 Amazon EKS API 的工具。如果未在啟動範本、主控台中或使用其他使用 Amazon EKS API 的工具指定執行個體類型，請使用 `t3.medium` 執行個體類型。如果您的節點群組正在使用 Spot 容量類型，則建議使用主控台指定多個執行個體類型。如需詳細資訊，請參閱[受管節點群組容量類型](managed-node-groups.md#managed-node-group-capacity-types)。
如果您部署到節點群組的任何容器使用執行個體中繼資料服務版本 2，請確定在啟動範本中將 **Metadata response hop limit** (中繼資料回應躍點限制) 設定為 `2`。如需詳細資訊，請參閱《Amazon EC2 使用者指南》**中的[執行個體中繼資料與使用者資料](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。
啟動範本不支援允許靈活的執行個體類型選取的 `InstanceRequirements` 功能。

## 標記 Amazon EC2 執行個體
<a name="launch-template-tagging"></a>

您可以使用啟動範本的 `TagSpecification` 參數，以指定要將哪些標籤套用至節點群組中的 Amazon EC2 執行個體。IAM 實體呼叫 `CreateNodegroup` 或 `UpdateNodegroupVersion` API 必須擁有 `ec2:RunInstances` 和 `ec2:CreateTags` 許可，而且標籤必須新增至啟動範本。

## 使用自訂安全群組
<a name="launch-template-security-groups"></a>

您可以使用啟動範本來指定自訂 Amazon EC2 [安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)以套用至節點群組中的執行個體。這可以是在執行個體層級安全群組參數中，也可以是網路介面組態參數的一部分。不過，您無法建立同時指定執行個體層級和網路介面安全群組的啟動範本。請考慮下列適用於搭配受管節點群組使用之自訂安全群組的條件：
+ 使用 時 AWS 管理主控台，Amazon EKS 僅允許具有單一網路介面規格的啟動範本。
+ 預設情況下，Amazon EKS 將[叢集安全群組](sec-group-reqs.md)套用至節點群組中的執行個體，以促進節點與控制平面之間的通訊。如果使用先前提到的任一選項在啟動範本中指定自訂安全群組，則 Amazon EKS 不會新增叢集安全群組。因此，您必須確保安全群組的傳入和傳出規則可啟用與叢集端點的通訊。如果安全群組規則不正確，工作節點便無法加入叢集。如需安全群組規則的詳細資訊，請參閱 [檢視叢集的 Amazon EKS 安全群組要求](sec-group-reqs.md)。
+ 如需 SSH 存取節點群組中的執行個體，請包含允許該存取的安全群組。

## Amazon EC2 使用者資料
<a name="launch-template-user-data"></a>

啟動範本包含自訂使用者資料的區段。您可以在此區段中指定節點群組的組態設定，無需手動建立個別自訂 AMI。如需有關 Bottlerocket 可用設定的詳細資訊，請參閱 GitHub 上的[使用使用者資料](https://github.com/bottlerocket-os/bottlerocket#using-user-data)。

您可以在啟動執行個體時使用 `cloud-init` 提供啟動範本中的 Amazon EC2 使用者資料。如需詳細資訊，請參閱 [cloud-init 文件](https://cloudinit.readthedocs.io/en/latest/index.html)。您的使用者資料可用來執行一般組態操作。這包含下列操作：
+  [包括使用者或群組](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#including-users-and-groups) 
+  [安裝套件 ](https://cloudinit.readthedocs.io/en/latest/topics/examples.html#install-arbitrary-packages) 

與受管節點群組搭配使用的啟動範本中的 Amazon EC2 使用者資料，必須為 Amazon Linux AMI 的 [MIME 分段封存](https://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive)格式和 Bottlerocket AMI 的 TOML 格式。這是因為您的使用者資料與節點加入叢集所需的 Amazon EKS 使用者資料合併。請勿在啟動或修改 `kubelet` 的使用者資料中指定任何命令。這會作為 Amazon EKS 合併使用者資料的一部分執行。某些 `kubelet` 參數 (例如在節點上設定標籤) 可以透過受管節點群組 API 直接設定。

**注意**  
如果有關進階 `kubelet` 自訂 (包括手動啟動或傳入自訂組態參數) 的詳細資訊，請參閱 [指定 AMI](#launch-template-custom-ami)。如果在啟動範本中指定自訂 AMI ID，Amazon EKS 不會合併使用者資料。

下列詳細資訊提供有關使用者資料區段的詳細資訊。

 **Amazon Linux 2 使用者資料**   
您可以將多個使用者資料區塊組合在一起成為單一 MIME 分段檔案。例如，您可以將設定 Docker 常駐程式的雲端 Boothook 與安裝自訂套件的使用者資料 Shell 指令碼合併。MIME 分段檔案包含下列元件：  
+ 內容類型和部分邊界宣告：`Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="`
+ MIME 版本宣告：`MIME-Version: 1.0`
+ 包含以下元件的一或多個使用者資料區塊：
  + 開啟邊界，表示使用者資料區塊的開始 – `--==MYBOUNDARY==` 
  + 區塊的內容類型宣告：`Content-Type: text/cloud-config; charset="us-ascii"`。如需內容類型的詳細資訊，請參閱 [cloud-init](https://cloudinit.readthedocs.io/en/latest/topics/format.html) 文件。
  + 使用者資料的內容 (例如，Shell 命令或 `cloud-init` 指令的清單)。
  + 結束邊界，表示 MIME 分段檔案的結束：`--==MYBOUNDARY==--`

  以下是您可以用來建立自己的 MIME 分段檔案的範例。

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
echo "Running custom user data script"

--==MYBOUNDARY==--
```

 **Amazon Linux 2023 使用者資料**   
Amazon Linux 2023 (AL2023) 推出了新的節點初始化程序 `nodeadm`，該程序會使用 YAML 組態結構描述。如果您使用自我管理節點群組或具有啟動範本的 AMI，則在建立新節點群組時，需要明確提供額外的叢集中繼資料。以下連結展示了一個包含最低必要參數的[範例](https://awslabs.github.io/amazon-eks-ami/nodeadm/)，其中 `apiServerEndpoint`、`certificateAuthority` 和服務 `cidr` 現在是必需的：  

```
---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
```
您通常會在使用者資料中設定此組態，可以依原狀設定，也可以內嵌在 MIME 分段文件中：  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig spec: [...]

--BOUNDARY--
```
在 AL2 中，這些參數的中繼資料是透過 Amazon EKS `DescribeCluster` API 呼叫自動發現的。在 AL2023 中，此行為已改變，因為額外的 API 呼叫在大規模節點擴展時有被限流的風險。如果您使用沒有啟動範本的受管節點群組，或使用 Karpenter，則此變更不會對您造成影響。如需有關 `certificateAuthority` 和服務 `cidr` 的更多資訊，請參閱《*Amazon EKS API 參考*》中的 [https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)。  
以下是 AL2023 使用者資料的完整範例，其中結合用於自訂節點的 Shell 指令碼 (例如安裝套件或預先快取容器映像) 與所需的 `nodeadm` 組態。此範例顯示常見的自訂，包括：\$1 安裝其他系統套件 \$1 預先快取容器映像，以改善 Pod 啟動時間 \$1 設定 HTTP 代理組態 \$1 設定節點標籤的 `kubelet` 旗標  

```
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="BOUNDARY"

--BOUNDARY
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset

# Install additional packages
yum install -y htop jq iptables-services

# Pre-cache commonly used container images
nohup docker pull public.ecr.aws/eks-distro/kubernetes/pause:3.2 &

# Configure HTTP proxy if needed
cat > /etc/profile.d/http-proxy.sh << 'EOF'
export HTTP_PROXY="http://proxy.example.com:3128"
export HTTPS_PROXY="http://proxy.example.com:3128"
export NO_PROXY="localhost,127.0.0.1,169.254.169.254,.internal"
EOF

--BOUNDARY
Content-Type: application/node.eks.aws

apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name: my-cluster
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
  kubelet:
    config:
      clusterDNS:
      - 10.100.0.10
    flags:
    - --node-labels=app=my-app,environment=production

--BOUNDARY--
```

 **Bottlerocket 使用者資料**   
Bottlerocket 會以 TOML 格式建構使用者資料。您可以提供要與 Amazon EKS 提供的使用者資料合併的使用者資料。例如，您可以提供額外的 `kubelet` 設定。  

```
[settings.kubernetes.system-reserved]
cpu = "10m"
memory = "100Mi"
ephemeral-storage= "1Gi"
```
如需有關受支援設定的詳細資訊，請參閱 [Bottlerocket 文件](https://github.com/bottlerocket-os/bottlerocket)。您可以在使用者資料中設定節點標籤和[污點](node-taints-managed-node-groups.md)。不過，建議您改為在節點群組內設定。在執行這項操作時，Amazon EKS 會套用這些組態。  
合併使用者資料時，不會保留格式設定，但內容保持不變。您在使用者資料中提供的組態會覆寫 Amazon EKS 所設定的任何設定。所以，如果您設定 `settings.kubernetes.max-pods` 或 `settings.kubernetes.cluster-dns-ip`，則使用者資料中的值會套用至節點。  
Amazon EKS 不支援所有有效的 TOML。以下是已知不支援格式的清單：  
+ 引號鍵內的引號：`'quoted "value"' = "value"`
+ 值中的溢出引號：`str = "I’m a string. \"You can quote me\""`
+ 混合浮點數和正整數：`numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]`
+ 陣列中的混合類型：`contributors = ["[foo@example.com](mailto:foo@example.com)", { name = "Baz", email = "[baz@example.com](mailto:baz@example.com)" }]`
+ 帶引號鍵的括號標題：`[foo."bar.baz"]`

 **Windows 使用者資料**   
Windows 使用者資料會使用 PowerShell 命令。建立受管節點群組時，您的自訂使用者資料會與 Amazon EKS 受管使用者資料結合。您的 PowerShell 命令為優先，然後是受管的使用者資料命令，所有這些命令都在一個 `<powershell></powershell>` 標籤中。  
建立 Windows 節點群組時，Amazon EKS 會更新 `aws-auth` `ConfigMap`，以允許 Linux 型節點加入叢集。服務不會自動設定 Windows AMI 的許可。如果您使用的是 Windows 節點，您將需要透過存取項目 API 或直接更新 `aws-auth` `ConfigMap` 來管理存取。如需詳細資訊，請參閱[在 EKS 叢集上部署 Windows 節點](windows-support.md)。
如果啟動範本中未指定任何 AMI ID，請勿在使用者資料中使用 Windows Amazon EKS 引導指令碼來設定 Amazon EKS。
範例使用者資料如下。  

```
<powershell>
Write-Host "Running custom user data script"
</powershell>
```

## 指定 AMI
<a name="launch-template-custom-ami"></a>

如果有下列其中一項要求，請在啟動範本 `ImageId` 欄位中指定 AMI ID。選取您對其他資訊的要求。

### 提供使用者資料將引數傳遞給 `bootstrap.sh` 檔案，其中包含 Amazon EKS 最佳化 Linux/Bottlerocket AMI
<a name="mng-specify-eks-ami"></a>

引導是一個術語，用於描述新增在執行個體啟動時可以執行的命令。例如，引導允許使用額外的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引數。您可以使用 `eksctl` 將引數傳遞給 `bootstrap.sh` 而不指定啟動範本。您也可以在啟動範本的使用者資料區段中指定資訊來執行此動作。

 **eksctl，無需指定啟動範本**   
使用下列內容，建立名為 *my-nodegroup.yaml* 的檔案。使用您自己的值取代每一個*範例值*。`--apiserver-endpoint`、`--b64-cluster-ca`，和 `--dns-cluster-ip` 引數為選用。但是，定義引述會允許 `bootstrap.sh` 指令碼避免進行 `describeCluster` 呼叫。這在經常縮減和擴增節點的私有叢集設定或叢集中非常有用。如需 `bootstrap.sh` 指令碼的詳細資訊，請參閱 GitHub 上的 [bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh) 檔案。  
+ 唯一需要的引數是叢集名稱 (*my-cluster*)。
+ 若要擷取 `ami-1234567890abcdef0 ` 的最佳化 AMI ID，您請參閱下列章節：
  +  [擷取建議的 Amazon Linux AMI ID](retrieve-ami-id.md) 
  +  [擷取建議的 Bottlerocket AMI ID](retrieve-ami-id-bottlerocket.md) 
  +  [擷取建議的 Microsoft Windows AMI ID](retrieve-windows-ami-id.md) 
+ 若要擷取您的叢集的 *certificate-authority*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 若要擷取您的叢集的 *api-server-endpoint*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip` 的值是結尾處為 `.10` 的服務 CIDR。若要擷取您的叢集的 *service-cidr*，請執行下列命令。例如，如果傳回的值是 `ipv4 10.100.0.0/16`，則您的值是 *10.100.0.10*。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 此範例使用其中包含 Amazon EKS 最佳化 AMI 的 `bootstrap.sh` 指令碼提供 `kubelet` 引數來設定自訂 `max-pods` 值。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。如需選取 *my-max-pods-value* 的說明，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。如需使用受管節點群組時如何`maxPods`決定 的詳細資訊，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。

  ```
  ---
  apiVersion: eksctl.io/v1alpha5
  kind: ClusterConfig
  
  metadata:
    name: my-cluster
    region: region-code
  
  managedNodeGroups:
    - name: my-nodegroup
      ami: ami-1234567890abcdef0
      instanceType: m5.large
      privateNetworking: true
      disableIMDSv1: true
      labels: { x86-al2-specified-mng }
      overrideBootstrapCommand: |
        #!/bin/bash
        /etc/eks/bootstrap.sh my-cluster \
          --b64-cluster-ca certificate-authority \
          --apiserver-endpoint api-server-endpoint \
          --dns-cluster-ip service-cidr.10 \
          --kubelet-extra-args '--max-pods=my-max-pods-value' \
          --use-max-pods false
  ```

  針對每一個可用的 `eksctl` `config` 檔案選項，請參閱 `eksctl` 文件中的 [Config file schema](https://eksctl.io/usage/schema/) (組態檔案結構描述)。此 `eksctl` 公用程式仍會為您建立啟動範本，並使用在 `config` 檔案提供的資料來填入其使用者資料。

  使用下列命令來建立節點群組。

  ```
  eksctl create nodegroup --config-file=my-nodegroup.yaml
  ```

 **啟動範本中的使用者資料**   
在啟動範本的使用者資料區段中指定下列資訊。使用您自己的值取代每一個*範例值*。`--apiserver-endpoint`、`--b64-cluster-ca`，和 `--dns-cluster-ip` 引數為選用。但是，定義引述會允許 `bootstrap.sh` 指令碼避免進行 `describeCluster` 呼叫。這在經常縮減和擴增節點的私有叢集設定或叢集中非常有用。如需 `bootstrap.sh` 指令碼的詳細資訊，請參閱 GitHub 上的 [bootstrap.sh](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh) 檔案。  
+ 唯一需要的引數是叢集名稱 (*my-cluster*)。
+ 若要擷取您的叢集的 *certificate-authority*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 若要擷取您的叢集的 *api-server-endpoint*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip` 的值是結尾處為 `.10` 的服務 CIDR。若要擷取您的叢集的 *service-cidr*，請執行下列命令。例如，如果傳回的值是 `ipv4 10.100.0.0/16`，則您的值是 *10.100.0.10*。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 此範例使用其中包含 Amazon EKS 最佳化 AMI 的 `bootstrap.sh` 指令碼提供 `kubelet` 引數來設定自訂 `max-pods` 值。如需選取 *my-max-pods-value* 的說明，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。如需使用受管節點群組時如何`maxPods`決定 的詳細資訊，請參閱 [maxPods的判斷方式](choosing-instance-type.md#max-pods-precedence)。

  ```
  MIME-Version: 1.0
  Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
  
  --==MYBOUNDARY==
  Content-Type: text/x-shellscript; charset="us-ascii"
  
  #!/bin/bash
  set -ex
  /etc/eks/bootstrap.sh my-cluster \
    --b64-cluster-ca certificate-authority \
    --apiserver-endpoint api-server-endpoint \
    --dns-cluster-ip service-cidr.10 \
    --kubelet-extra-args '--max-pods=my-max-pods-value' \
    --use-max-pods false
  
  --==MYBOUNDARY==--
  ```

### 提供使用者資料將引數傳遞給 `Start-EKSBootstrap.ps1` 檔案，其中包含 Amazon EKS 最佳化 Windows AMI
<a name="mng-specify-eks-ami-windows"></a>

引導是一個術語，用於描述新增在執行個體啟動時可以執行的命令。您可以使用 `eksctl` 將引數傳遞給 `Start-EKSBootstrap.ps1` 而不指定啟動範本。您也可以在啟動範本的使用者資料區段中指定資訊來執行此動作。

如果您想指定自訂 Windows AMI ID，請注意下列考量事項：
+ 您必須使用啟動範本，並在使用者資料區段中提供所需引導命令。若要擷取所需的 Windows ID，您可以使用[使用最佳化的 Windows AMI 建立節點](eks-optimized-windows-ami.md)中的資料表。
+ 您需滿足幾個限制和條件。例如，您必須將 `eks:kube-proxy-windows`新增至 IAM Authenticator AWS 組態映射。如需詳細資訊，請參閱[指定 AMI ID 時的限制和條件](#mng-ami-id-conditions)。

在啟動範本的使用者資料區段中指定下列資訊。使用您自己的值取代每一個*範例值*。`-APIServerEndpoint`、`-Base64ClusterCA`，和 `-DNSClusterIP` 引數為選用。但是，定義引述會允許 `Start-EKSBootstrap.ps1` 指令碼避免進行 `describeCluster` 呼叫。
+ 唯一需要的引數是叢集名稱 (*my-cluster*)。
+ 若要擷取您的叢集的 *certificate-authority*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.certificateAuthority.data" --output text --name my-cluster --region region-code
  ```
+ 若要擷取您的叢集的 *api-server-endpoint*，請執行下列命令。

  ```
  aws eks describe-cluster --query "cluster.endpoint" --output text --name my-cluster --region region-code
  ```
+ `--dns-cluster-ip` 的值是結尾處為 `.10` 的服務 CIDR。若要擷取您的叢集的 *service-cidr*，請執行下列命令。例如，如果傳回的值是 `ipv4 10.100.0.0/16`，則您的值是 *10.100.0.10*。

  ```
  aws eks describe-cluster --query "cluster.kubernetesNetworkConfig.serviceIpv4Cidr" --output text --name my-cluster --region region-code
  ```
+ 如需其他引數，請參閱 [引導指令碼組態參數](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)。
**注意**  
如果您使用的是自訂服務 CIDR，則需要使用 `-ServiceCIDR` 參數來對其進行指定。否則，叢集中 Pod 的 DNS 解析將會失敗。

```
<powershell>
[string]$EKSBootstrapScriptFile = "$env:ProgramFiles\Amazon\EKS\Start-EKSBootstrap.ps1"
& $EKSBootstrapScriptFile -EKSClusterName my-cluster `
	 -Base64ClusterCA certificate-authority `
	 -APIServerEndpoint api-server-endpoint `
	 -DNSClusterIP service-cidr.10
</powershell>
```

### 由於特定安全、合規或內部政策要求，執行自訂 AMI
<a name="mng-specify-custom-ami"></a>

如需詳細資訊，請參閱*《Amazon EC2 使用者指南》*中的 [Amazon Machine Images (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)。Amazon EKS AMI 建置規範包含用於建置基於 Amazon Linux 的自訂 Amazon EKS AMI 的資源和組態指令碼。如需詳細資訊，請參閱 GitHub 上的 [Amazon EKS AMI 建置規範](https://github.com/awslabs/amazon-eks-ami/)。若要建置使用其他作業系統安裝的自訂 AMI，則請參閱 GitHub 上的 [Amazon EKS 樣本自訂 AMI](https://github.com/aws-samples/amazon-eks-custom-amis)。

在與受管節點群組搭配使用的啟動範本中，您無法使用 AMI ID 的動態參數參考。

**重要**  
指定 AMI 時，Amazon EKS 不會針對叢集的控制平面版本驗證 AMI 中內嵌的 Kubernetes 版本。您有責任確保自訂 AMI 的 Kubernetes 版本符合 [Kubernetes 版本扭曲政策](https://kubernetes.io/releases/version-skew-policy)：  
節點上的`kubelet`版本不得比叢集版本更新
節點上的`kubelet`版本必須等於或最多 3 個次要版本 （適用於 Kubernetes 版本 `1.28`或更高版本），或最多 2 個次要版本 （適用於 Kubernetes 版本 `1.27`或更低版本）  
建立具有版本扭曲違規的受管節點群組可能會導致：
節點無法加入叢集
未定義的行為或 API 不相容
叢集不穩定或工作負載失敗
指定 AMI 時，Amazon EKS 不會合併任何使用者資料。相反，您必須負責提供所需的 `bootstrap` 命令，讓節點加入叢集。如果節點無法加入叢集，則 Amazon EKS `CreateNodegroup` 和 `UpdateNodegroupVersion` 動作也會失敗。

## 指定 AMI ID 時的限制和條件
<a name="mng-ami-id-conditions"></a>

以下是使用受管節點群組指定 AMI ID 所涉及的限制和條件：
+ 您必須建立新的節點群組，才能在指定啟動範本的 AMI ID 與不指定 AMI ID 之間切換。
+ 有較新的 AMI 版本可用時，您不會在主控台中收到通知。若要將節點群組更新為較新的 AMI 版本，您需要使用更新的 AMI ID 來建立新版本的啟動範本。然後，您需要使用新的啟動範本版本更新節點群組。
+ 如果指定 AMI ID，則無法在 API 中設定下列欄位：
  +  `amiType` 
  +  `releaseVersion` 
  +  `version` 
+ 如果您指定 AMI ID，則 API 的任何 `taints` 集合都會以非同步方式套用。若要在節點加入叢集之前套用污點，您必須使用 `--register-with-taints` 命令列旗標將污點傳遞給使用者資料的 `kubelet`。如需詳細資訊，請參閱 Kubernetes 文件中的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)。
+ 為 Windows 受管節點群組指定自訂 AMI ID 時，請將 `eks:kube-proxy-windows`新增至您的 AWS IAM Authenticator 組態映射。必須要有這項，DNS 才能正常運作。

  1. 開啟 AWS IAM Authenticator 組態映射以進行編輯。

     ```
     kubectl edit -n kube-system cm aws-auth
     ```

  1. 將此項目新增至與 Windows 節點關聯的每個 `rolearn` 下的 `groups` 清單中。您的組態映射看起來應該類似於 [aws-auth-cm-windows.yaml](https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml)。

     ```
     - eks:kube-proxy-windows
     ```

  1. 儲存檔案並結束您的文字編輯器。
+ 對於任何使用自訂啟動範本的 AMI，受管節點群組的預設 `HttpPutResponseHopLimit` 已設定為 `2`。

# 從您的叢集刪除受管節點群組
<a name="delete-managed-node-group"></a>

本主題會描述可以如何刪除 Amazon EKS 受管節點群組。刪除受管節點群組時，Amazon EKS 會先將 Auto Scaling 群組的最小、最大和所需大小設定為零。這就會讓節點群組縮減規模。

在每個執行個體終止之前，Amazon EKS 會傳送訊號以耗盡該節點。在耗盡過程中，Kubernetes 會對節點上的每個 Pod 執行下列動作： 執行任何設定的`preStop`生命週期掛鉤、將`SIGTERM`訊號傳送至容器，然後等待 `terminationGracePeriodSeconds`正常關閉。如果節點在 5 分鐘後尚未耗盡，Amazon EKS 可讓 Auto Scaling 繼續強制終止執行個體。終止所有執行個體後，會刪除 Auto Scaling 群組。

**重要**  
如果刪除使用節點 IAM 角色的受管節點群組，且角色未被叢集中任何其他受管節點群組使用，則此角色會從 `aws-auth` `ConfigMap` 移除。如果叢集中有任何自我管理節點群組使用相同的節點 IAM 角色，則自我管理節點會轉為 `NotReady` 狀態。此外，叢集操作也會中斷。若要僅針對自我管理節點群組新增您正在使用之角色的映射，請參閱 [建立存取項目](creating-access-entries.md)，前提是您的叢集的平台版本不低於[使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)部分中列出的最低版本。如果您的平台版本早於存取項目所需的最低版本，您可以將項目新增回 `aws-auth` `ConfigMap`。如需詳細資訊，請在您的終端機中輸入 `eksctl create iamidentitymapping --help`。

您可以透過以下方式刪除受管節點群組：
+  [`eksctl`](#eksctl-delete-managed-nodegroup) 
+  [AWS 管理主控台](#console-delete-managed-nodegroup) 
+  [AWS CLI](#awscli-delete-managed-nodegroup) 

## `eksctl`
<a name="eksctl-delete-managed-nodegroup"></a>

 **使用 `eksctl` 刪除受管節點群組** 

輸入以下命令。使用您自己的值取代每一個 `<example value>`。

```
eksctl delete nodegroup \
  --cluster <my-cluster> \
  --name <my-mng> \
  --region <region-code>
```

如需更多選項，請參閱 `eksctl` 文件中的[刪除和耗盡節點群組](https://eksctl.io/usage/nodegroups/#deleting-and-draining-nodegroups)。

## AWS 管理主控台
<a name="console-delete-managed-nodegroup"></a>

 **使用 AWS 管理主控台 刪除受管節點群組** 

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在**叢集**頁面上，選擇包含要刪除之節點群組的叢集。

1. 在所選叢集頁面上，選擇**運算**索引標籤。

1. 在 **Node Groups** (節點群組) 區段中，選擇要刪除的節點群組。然後選擇**刪除**。

1. 在**刪除節點群組**確認對話方塊中，輸入節點群組的名稱。然後選擇**刪除**。

## AWS CLI
<a name="awscli-delete-managed-nodegroup"></a>

 **使用 CLI AWS 刪除受管節點群組** 

1. 輸入以下命令。使用您自己的值取代每一個 `<example value>`。

   ```
   aws eks delete-nodegroup \
     --cluster-name <my-cluster> \
     --nodegroup-name <my-mng> \
     --region <region-code>
   ```

1. 如果在 CLI 組態中`cli_pager=`設定 ，請使用鍵盤上的方向鍵來捲動回應輸出。完成後按下 `q` 鍵。

   如需更多選項，請參閱 CLI ` [delete-nodegroup](https://docs.aws.amazon.com/cli/latest/reference/eks/delete-nodegroup.html) `命令參考中的 命令。 * AWS *

# 藉助自我管理節點來自行維護節點
<a name="worker"></a>

叢集包含排程 Pod 的一或多個 Amazon EC2 節點。Amazon EKS 節點會在您的 AWS 帳戶中執行並透過叢集 API 伺服器端點連接至您叢集的控制平面。會根據 Amazon EC2 價格收費。如需詳細資訊，請參閱 [Amazon EC2 定價](https://aws.amazon.com/ec2/pricing/)。

一個叢集可以包含數個節點群組。每個節點群組包含一個或多個部署在 [Amazon EC2 Auto Scaling 群組](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroup.html)的節點。群組節點的執行個體類型可能會有所不同，例如透過 [Karpenter](https://karpenter.sh/) 使用[以屬性為基礎的執行個體類型選項](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html)時。節點群組的所有執行個體都必須使用 [Amazon EKS 節點 IAM 角色](create-node-role.md)。

Amazon EKS 提供專門的Amazon 機器映像 (AMI)，稱為Amazon EKS 最佳化 AMI。AMI 已設定為搭配 Amazon EKS 一起使用。它們的元件包括 `containerd`、`kubelet` 和 AWS IAM 驗證器。AMI 還包含特殊化[啟動程序指令碼](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)，使其可自動探索並連接至您叢集的控制平面。

如果使用 CIDR 區塊限制對叢集公有端點的存取，則建議您也啟用私有端點存取。這樣可以讓節點與叢集通訊。若不啟用私有端點，您指定用於公有存取的 CIDR 區塊必須包含來自 VPC 的輸出來源。如需詳細資訊，請參閱 [叢集 API 伺服器端點](cluster-endpoint.md)。

若要將自我管理節點新增至 Amazon EKS 叢集，請參閱以下主題。如果手動啟動自我管理節點，請將以下標籤新增至每個節點，同時確保 `<cluster-name>` 與您的叢集相符。如需詳細資訊，請參閱[新增和刪除個別資源的標籤](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#adding-or-deleting-tags)。如果遵循以下指南中的步驟，系統會為您自動新增必要的標籤至節點。


| 金鑰 | 值 | 
| --- | --- | 
|   `kubernetes.io/cluster/<cluster-name>`   |   `owned`   | 

**重要**  
Amazon EC2 執行個體中繼資料服務 (IMDS) 中的標籤與 EKS 節點不相容。啟用執行個體中繼資料標籤後，不能在標籤值中使用正斜線 ('/')。此限制可能會導致無法啟動執行個體，使用 Karpenter 或叢集自動擴展期等節點管理工具時尤其如此，因為這些服務依賴於包含正斜線的標籤來提供適當的功能。

如需 Kubernetes 對節點普遍觀點的詳細資訊，請參閱 Kubernetes 文件中的[節點](https://kubernetes.io/docs/concepts/architecture/nodes/)。

**Topics**
+ [建立自我管理的 Amazon Linux 節點](launch-workers.md)
+ [建立自我管理的 Bottlerocket 節點](launch-node-bottlerocket.md)
+ [建立自我管理的 Microsoft Windows 節點](launch-windows-workers.md)
+ [建立自我管理的 Ubuntu Linux 節點](launch-node-ubuntu.md)
+ [更新您的叢集的自我管理節點](update-workers.md)

# 建立自我管理的 Amazon Linux 節點
<a name="launch-workers"></a>

本主題會說明如何啟動已向 Amazon EKS 叢集註冊的 Linux 節點的 Auto Scaling 群組。節點加入叢集後，您就可以將 Kubernetes 應用程式部署至其中。您也可以使用 `eksctl`或 啟動自我管理的 Amazon Linux 節點 AWS 管理主控台。如果您需要在 AWS Outposts 上啟動節點，請參閱 [在 AWS Outpost 上建立 Amazon Linux 節點](eks-outposts-self-managed-nodes.md)。
+ 現有 Amazon EKS 叢集。若要部署叢集，請參閱 [建立 Amazon EKS 叢集](create-cluster.md)。如果您在已啟用 AWS Outposts、 AWS Wavelength 或 AWS Local Zones AWS 的區域中有子網路，則這些子網路不得在您建立叢集時傳入。
+ 供節點使用的現有 IAM 角色。若要建立服務角色，請參閱[Amazon EKS 節點 IAM 角色](create-node-role.md)。如果此角色沒有任何 VPC CNI 的政策，則 VPC CNI Pod 需要以下個別角色。
+ (選用，但建議) Kubernetes 專用 Amazon VPC CNI 外掛程式的附加元件設定有自己的 IAM 角色，該角色已連接必要的 IAM 政策。如需詳細資訊，請參閱[設定 Amazon VPC CNI 外掛程式以使用 IRSA](cni-iam-role.md)。
+ 熟悉[選擇最佳 Amazon EC2 節點執行個體類型](choosing-instance-type.md)中所列的考量事項。取決於您選擇的執行個體類型，您的叢集和 VPC 可能還有其他先決條件。

您可以使用下列任意一項啟動自我管理的 Linux 節點：
+  [`eksctl`](#eksctl_create_managed_amazon_linux) 
+  [AWS 管理主控台](#console_create_managed_amazon_linux) 

## `eksctl`
<a name="eksctl_create_managed_amazon_linux"></a>

 **使用 `eksctl` 啟動自我管理的 Linux 節點** 

1. 在您的裝置或 AWS CloudShell 上安裝版本 `0.215.0`或更新版本的`eksctl`命令列工具。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。

1. (選用) 如果 **AmazonEKS\$1CNI\$1Policy** 受管 IAM 政策已連接至您的 [Amazon EKS 節點 IAM 角色](create-node-role.md)，建議您改為將其指派給您與 Kubernetes `aws-node` 服務帳戶相關聯的 IAM 角色。如需詳細資訊，請參閱[設定 Amazon VPC CNI 外掛程式以使用 IRSA](cni-iam-role.md)。

1. 以下命令會在現有的叢集建立節點群組。將 *al-nodes* 取代為您的節點群組名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。使用您叢集的名稱取代 *my-cluster*。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭，且長度不可超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。使用您自己的值取代其餘*範例值*。依預設，系統會使用與控制平面相同的 Kubernetes 版本來建立節點。

   選擇 `--node-type` 的值之前，請檢閱[選擇最佳 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。

   使用 Amazon EC2 金鑰對或公有金鑰的名稱取代 *my-key*。此金鑰會在節點啟動後用於將 SSH 套用至節點。如果您還沒有 Amazon EC2 金鑰對，可以在 AWS 管理主控台中建立一個。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。

   使用下列命令來建立您的節點群組。
**重要**  
如果您想要將節點群組部署至 AWS Outposts、Wavelength 或 Local Zone 子網路，還有其他考量：  
在建立叢集時，不得傳入子網路。
您必須使用指定子網路和 ` [volumeType](https://eksctl.io/usage/schema/#nodeGroups-volumeType): gp2` 的組態檔案來建立節點群組。如需詳細資訊，請參閱 `eksctl` 文件中的[從組態檔案建立節點群組](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)和[組態檔案結構描述](https://eksctl.io/usage/schema/)。

   ```
   eksctl create nodegroup \
     --cluster my-cluster \
     --name al-nodes \
     --node-type t3.medium \
     --nodes 3 \
     --nodes-min 1 \
     --nodes-max 4 \
     --ssh-access \
     --managed=false \
     --ssh-public-key my-key
   ```

   若要部署節點群組：
   + 其可以將比預設組態更大量的 IP 位址指派給 Pod，請參閱 [將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)。
   + 其可以從與執行個體不同的 CIDR 區塊將 `IPv4` 地址指派給 Pod，請參閱 [使用自訂聯網在替代子網路中部署 Pod](cni-custom-network.md)。
   + 其可以將 `IPv6` 地址指派給 Pod 和服務，請參閱 [了解叢集、Pod 與服務的 IPv6 位址](cni-ipv6.md)。
   + 沒有傳入網際網路存取，請參閱 [部署網際網路存取受到限制的私有叢集](private-clusters.md)。

     如需所有可用選項和預設值的完整清單，請輸入以下命令。

     ```
     eksctl create nodegroup --help
     ```

     如果節點無法加入叢集，請參閱「故障診斷」章節中的 [節點無法加入叢集](troubleshooting.md#worker-node-fail)。

     範例輸出如下。建立節點時，會有數行輸出。輸出的最後幾行之一類似於以下的範例行。

     ```
     [✔]  created 1 nodegroup(s) in cluster "my-cluster"
     ```

1. (選用) 部署[範例應用程式](sample-deployment.md)以測試您的叢集和 Linux 節點。

1. 如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
   + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
   + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

   如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

## AWS 管理主控台
<a name="console_create_managed_amazon_linux"></a>

 **步驟 1：使用 AWS 管理主控台 啟動自我管理的 Linux 節點** 

1. 下載最新版本的 AWS CloudFormation 範本。

   ```
   curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2025-11-26/amazon-eks-nodegroup.yaml
   ```

1. 等待您的叢集狀態顯示為 `ACTIVE`。如果在叢集處於作用中狀態之前啟動節點，則節點向叢集註冊將會失敗，導致必須再次啟動。

1. 開啟 [AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)。

1. 選擇 **Create stack** (建立堆疊)，然後選取 **With new resources (standard)** (使用新資源 (標準))。

1. 針對 **Specify template** (指定範本)，選取 **Upload a template file** (上傳範本檔案)，然後選取 **Choose file** (選擇檔案)。

1. 選取您下載的 `amazon-eks-nodegroup.yaml` 檔案。

1. 選取**下一步**。

1. 在 **Specify stack details** (指定堆疊詳細資訊) 頁面上，據此填寫下列參數，然後選擇 **Next** (下一步)：
   +  **堆疊名稱**：為您的 AWS CloudFormation 堆疊選擇堆疊名稱。例如，您可以稱它為 *my-cluster-nodes*。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭，且長度不可超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。
   +  **ClusterName**：輸入建立 Amazon EKS 叢集時使用的名稱。此名稱必須與叢集名稱相同，否則節點無法加入叢集。
   +  **ClusterControlPlaneSecurityGroup**：從您在建立 [VPC](creating-a-vpc.md) 時產生的 AWS CloudFormation 輸出中選擇 **SecurityGroups** 值。

     下列步驟顯示擷取適用群組的一種操作。

     1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

     1. 選擇叢集的名稱。

     1. 選擇 **Networking (網路)** 索引標籤。

     1. 從 **ClusterControlPlaneSecurityGroup** 下拉式清單中選取時，請使用 **Additional Security Group** (其他安全群組) 值作為參考。
   +  **ApiServerEndpoint**：輸入 EKS 叢集的 API 伺服器端點。這可在 EKS 叢集主控台的詳細資訊區段中找到
   +  **CertificateAuthorityData**：輸入 base64 編碼的憑證授權機構資料，也可以在 EKS 叢集主控台的詳細資訊區段中找到。
   +  **ServiceCidr**：輸入用於將 IP 地址配置到叢集內 Kubernetes 服務的 CIDR 範圍。這可在 EKS 叢集主控台的聯網索引標籤中找到。
   +  **AuthenticationMode**：透過檢閱 EKS 叢集主控台中的存取索引標籤，選取 EKS 叢集中使用的身分驗證模式。
   +  **NodeGroupName**：輸入節點群組的名稱。此名稱稍後可用於識別為您節點建立的 Auto Scaling 節點群組。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。
   +  **NodeAutoScalingGroupMinSize**：輸入節點 Auto Scaling 群組可以縮減的最低節點數。
   +  **NodeAutoScalingGroupDesiredCapacity**：堆疊建立時，輸入欲擴展的所需節點數量。
   +  **NodeAutoScalingGroupMaxSize**：輸入節點 Auto Scaling 群組可以擴增的最大節點數。
   +  **NodeInstanceType**：選擇節點的執行個體類型。如需詳細資訊，請參閱[選擇最佳的 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。
   +  **NodeImageIdSSMParam**：為變數 Kubernetes 版本預先填入最近 Amazon EKS 最佳化 Amazon Linux 2023 AMI 的 Amazon EC2 Systems Manager 參數。若要使用 Amazon EKS 支援不同的 Kubernetes 次要版本，請將 *1.XX* 取代為不同的[支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。建議指定與叢集相同的 Kubernetes 版本。

     您也可以將 *amazon-linux-2023* 取代為不同的 AMI 類型。如需詳細資訊，請參閱[擷取建議的 Amazon Linux AMI ID](retrieve-ami-id.md)。
**注意**  
Amazon EKS 節點 AMI 以 Amazon Linux 為基礎。您可以在 Amazon Linux 安全[中心追蹤 Amazon Linux](https://alas.aws.amazon.com/alas2023.html) 2023 的安全或隱私權事件，或訂閱相關聯的 [RSS 摘要](https://alas.aws.amazon.com/AL2023/alas.rss)。安全與隱私權事件包含問題的概觀、哪些套件受到影響，以及如何更新您的執行個體以修正問題。
   +  **NodeImageId**：（選用） 如果您使用自己的自訂 AMI （而非 Amazon EKS 最佳化 AMI)，請輸入您 AWS 區域的節點 AMI ID。如果您在此指定值，則會覆寫 **NodeImageIdSSMParam** 欄位中的任何值。
   +  **NodeVolumeSize**：為您的節點指定根磁碟區大小 (以 GiB 為單位)。
   +  **NodeVolumeType**：為您的節點指定根磁碟區類型。
   +  **KeyName**：輸入 Amazon EC2 SSH 金鑰對的名稱，您可以在節點啟動後使用該金鑰對來透過 SSH 連接至節點。如果您還沒有 Amazon EC2 金鑰對，可以在 AWS 管理主控台中建立一個。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。
   +  **VpcId**：輸入您建立的 [VPC](creating-a-vpc.md) ID。
   +  **子網路**：選擇您為 VPC 建立的子網路。如果您已依照[為您的 Amazon EKS 叢集建立 Amazon VPC](creating-a-vpc.md) 中所述的步驟建立 VPC，則只需指定要啟動節點的 VPC 中的私有子網路。您可以看到哪些子網是私有子網，方法是從叢集的 **Networking** (聯網) 標籤打開每一個子網連結。
**重要**  
如有任何子網路是公有子網路，則必須啟用自動公有 IP 地址指派設定。如果未針對公有子網路啟用 設定，則您部署至該公有子網路的任何節點都不會指派公有 IP 地址，也無法與叢集或其他 AWS 服務通訊。如果子網路是在 2020 年 3 月 26 日之前使用任一 [Amazon EKS AWS CloudFormation VPC 範本](creating-a-vpc.md)或使用 部署，`eksctl`則會停用公有子網路的自動公有 IP 地址指派。如需如何啟用子網路的公有 IP 地址指派的相關資訊，請參閱[修改您子網路的公有 IPv4 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。如果節點部署到私有子網路，則可以透過 NAT 閘道與叢集和其他 AWS 服務通訊。
如果子網路無法存取網際網路，請確保您已知悉[部署網際網路存取受到限制的私有叢集](private-clusters.md)中的考量事項和額外步驟。
如果您選取 AWS Outpost、Wavelength 或 Local Zone 子網路，則建立叢集時不得傳入子網路。

1. 請在 **Configure stack options** (設定堆疊選項) 頁面上選取所需的選項，然後選擇 **Next** (下一頁)。

1. 選取**我確認 AWS CloudFormation 可能會建立 IAM 資源**的左側核取方塊，然後選擇**建立堆疊**。

1. 當當堆疊已完成建立時，從主控台將其選取，然後選擇 **Outputs (輸出)**。如果您使用 `EKS API`或 `EKS API and ConfigMap` 身分驗證模式，這是最後一個步驟。

1. 如果您使用`ConfigMap`身分驗證模式，請記錄已建立節點群組的 **NodeInstanceRole**。

 **步驟 2：讓節點加入叢集** 

**注意**  
只有在 EKS 叢集中使用 Configmap 身分驗證模式時，才需要下列兩個步驟。此外，如果您在沒有傳出網際網路存取的情況下在私有 VPC 內啟動節點，請務必讓節點從 VPC 內加入您的叢集。

1. 檢查以瞭解是否有 `aws-auth` `ConfigMap`。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. 如果您看到 `aws-auth` `ConfigMap`，請視需要更新之。

   1. 開啟 `ConfigMap` 進行編輯。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 視需要新增 `mapRoles` 個項目。將 `rolearn` 值設定為您在先前程序中記錄的 **NodeInstanceRole** 值。

      ```
      [...]
      data:
        mapRoles: |
          - rolearn: <ARN of instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
      [...]
      ```

   1. 儲存檔案並結束您的文字編輯器。

1. 如果您收到錯誤，指出「`Error from server (NotFound): configmaps "aws-auth" not found`，請套用堆疊 `ConfigMap`。

   1. 下載組態對應。

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
      ```

   1. 在 `aws-auth-cm.yaml` 檔案中，將 `rolearn` 值設定為您在先前程序中紀錄的 **NodeInstanceRole** 值。您可以使用文字編輯器來完成此操作，或者透過取代 *my-node-instance-role* 並執行下列命令：

      ```
      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml
      ```

   1. 套用組態。此命令可能需要幾分鐘的時間來完成。

      ```
      kubectl apply -f aws-auth-cm.yaml
      ```

1. 查看節點的狀態，並等待他們到達 `Ready` 狀態。

   ```
   kubectl get nodes --watch
   ```

   輸入 `Ctrl`\$1`C` 傳回 Shell 提示。
**注意**  
如果您收到任何授權或資源類型錯誤，請參閱故障診斷主題中的[未經授權或存取遭拒 (`kubectl`)](troubleshooting.md#unauthorized)。

   如果節點無法加入叢集，請參閱「故障診斷」章節中的 [節點無法加入叢集](troubleshooting.md#worker-node-fail)。

1. (僅限 GPU 節點) 若您選擇了 GPU 執行個體類型和 Amazon EKS 最佳化加速 AMI，則必須套用 [Kubernetes 專用 NVIDIA 裝置外掛程式](https://github.com/NVIDIA/k8s-device-plugin)作為叢集上的 DaemonSet。請先以您想要的 [NVIDIA/k8s-device-plugin](https://github.com/NVIDIA/k8s-device-plugin/releases) 版本來取代 *vX.X.X*，然後再執行下列命令。

   ```
   kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml
   ```

 **步驟 3：其他動作** 

1. (選用) 部署[範例應用程式](sample-deployment.md)以測試您的叢集和 Linux 節點。

1. (選用) 如果 **AmazonEKS\$1CNI\$1Policy** 受管 IAM 政策 (如果您有 `IPv4` 叢集) 或 *AmazonEKS\$1CNI\$1IPv6\$1Policy* (您[自我建立的政策](cni-iam-role.md#cni-iam-role-create-ipv6-policy)，前提是如果您有 `IPv6` 叢集) 連接至 [Amazon EKS 節點 IAM 角色](create-node-role.md)，建議改為將其指派給您與 Kubernetes `aws-node` 服務帳戶相關聯的 IAM 角色。如需詳細資訊，請參閱[設定 Amazon VPC CNI 外掛程式以使用 IRSA](cni-iam-role.md)。

1. 如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
   + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
   + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

   如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

# 建立自我管理的 Bottlerocket 節點
<a name="launch-node-bottlerocket"></a>

**注意**  
受管節點群組可能會為您的使用案例提供一些優勢。如需詳細資訊，請參閱[透過受管節點群組來簡化節點生命週期](managed-node-groups.md)。

本主題會說明如何啟動向 Amazon EKS 叢集註冊的 [Bottlerocket](https://aws.amazon.com/bottlerocket/) 節點的 Auto Scaling 群組。Bottlerocket 是以 Linux 為基礎的開放原始碼作業系統 AWS ，可用於在虛擬機器或裸機主機上執行容器。節點加入叢集後，您就可以將 Kubernetes 應用程式部署至其中。如需 Bottlerocket 的詳細資訊，請參閱 GitHub 上的[搭配 Amazon EKS 使用 Bottlerocket AMI](https://github.com/bottlerocket-os/bottlerocket/blob/develop/QUICKSTART-EKS.md) 和 `eksctl` 文件上的[自訂 AMI 支援](https://eksctl.io/usage/custom-ami-support/)。

如需就地升級的資訊，請參閱 GitHub 上的 [Bottlerocket 更新運算子](https://github.com/bottlerocket-os/bottlerocket-update-operator)。

**重要**  
Amazon EKS 節點為標準 Amazon EC2 執行個體，會根據一般 Amazon EC2 執行個體價格向您收取這些節點的費用。如需詳細資訊，請參閱 [Amazon EC2 定價](https://aws.amazon.com/ec2/pricing/)。
您可以在 AWS Outposts 上的 Amazon EKS 擴充叢集中啟動 Bottlerocket 節點，但無法在 AWS Outposts 的本機叢集中啟動它們。如需詳細資訊，請參閱[使用 AWS Outposts 在內部部署 Amazon EKS](eks-outposts.md)。
您可以使用 `x86` 或 Arm 處理器部署至 Amazon EC2 執行個體。不過，您無法部署至具有 Inferentia 晶片的執行個體。
Bottlerocket 與 AWS CloudFormation 相容。但是，沒有可複製的官方 CloudFormation 範本來部署 Amazon EKS 的 Bottlerocket 節點。
Bottlerocket 映像不會隨附 SSH 伺服器或 Shell。您可以使用頻外存取方法來允許 SSH 啟用管理員容器，並傳遞一些引導組態步驟與使用者資料。如需詳細資訊，請參閱 GitHub 上 [bottlerocket README.md](https://github.com/bottlerocket-os/bottlerocket) 中的這些部分：  
 [探勘](https://github.com/bottlerocket-os/bottlerocket#exploration) 
 [管理員容器](https://github.com/bottlerocket-os/bottlerocket#admin-container) 
 [Kubernetes 設定](https://github.com/bottlerocket-os/bottlerocket#kubernetes-settings) 

此程序需要 `eksctl` 版本 `0.215.0` 或更新版本。您可使用以下命令檢查您的版本：

```
eksctl version
```

如需如何安裝或升級 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)。注意：此程序僅適用於使用 `eksctl` 建立的叢集。

1. 將以下內容複製到您的裝置。使用您叢集的名稱取代 *my-cluster*。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭，且長度不可超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。使用您的節點群組名稱取代 *ng-bottlerocket*。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。若要在 Arm 執行個體上部署，請使用 Arm 執行個體類型取代 *m5.large*。使用 Amazon EC2 SSH 金鑰對名稱取代 *my-ec2-keypair-name*，您可以在節點啟動後使用該金鑰對來透過 SSH 連接至節點。如果您還沒有 Amazon EC2 金鑰對，可以在 AWS 管理主控台中建立一個。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。使用您自己的值取代其餘所有範例值。完成取代後，請執行修改後的命令以建立 `bottlerocket.yaml` 檔案。

   如果指定 Arm Amazon EC2 執行個體類型，則請在部署前檢閱 [Amazon EKS 最佳化 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami) 的考量事項。如需了解如何使用自訂 AMI 部署，請參閱 GitHub 上的[建置 Bottlerocket](https://github.com/bottlerocket-os/bottlerocket/blob/develop/BUILDING.md) 和 `eksctl` 文件中的[自訂 AMI 支援](https://eksctl.io/usage/custom-ami-support/)。若要部署受管節點群組，請使用啟動範本部署自訂 AMI。如需詳細資訊，請參閱[使用啟動範本自訂受管節點](launch-templates.md)。
**重要**  
若要將節點群組部署至 AWS Outposts、 AWS Wavelength 或 AWS Local Zone 子網路，請勿在建立叢集時傳遞 AWS Outposts、 AWS Wavelength 或 AWS Local Zone 子網路。您必須在下列範例中指定子網路。如需詳細資訊，請參閱 `eksctl` 文件中的[從組態檔案建立節點群組](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)和[組態檔案結構描述](https://eksctl.io/usage/schema/)。將 *region-code* 取代為您的叢集所在的 AWS 區域。

   ```
   cat >bottlerocket.yaml <<EOF
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: region-code
     version: '1.35'
   
   iam:
     withOIDC: true
   
   nodeGroups:
     - name: ng-bottlerocket
       instanceType: m5.large
       desiredCapacity: 3
       amiFamily: Bottlerocket
       ami: auto-ssm
       iam:
          attachPolicyARNs:
             - arn:aws: iam::aws:policy/AmazonEKSWorkerNodePolicy
             - arn:aws: iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
             - arn:aws: iam::aws:policy/AmazonSSMManagedInstanceCore
             - arn:aws: iam::aws:policy/AmazonEKS_CNI_Policy
       ssh:
           allow: true
           publicKeyName: my-ec2-keypair-name
   EOF
   ```

1. 使用下列命令部署節點。

   ```
   eksctl create nodegroup --config-file=bottlerocket.yaml
   ```

   範例輸出如下。

   建立節點時，會有數行輸出。輸出的最後幾行之一類似於以下的範例行。

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (選用) 使用 [Amazon EBS CSI 外掛程式](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)在 Bottlerocket 節點上建立 Kubernetes [持續性磁碟區](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)。預設 Amazon EBS 驅動程式依賴於未包含 Bottlerocket 的檔案系統工具。如需使用驅動程式建立儲存類別的詳細資訊，請參閱 [透過 Amazon EBS 使用 Kubernetes 磁碟區儲存](ebs-csi.md)。

1. (選用) 依預設 `kube-proxy` 會將 `nf_conntrack_max` 核心參數設定為預設值，此值可能與開機時 Bottlerocket 原先設定的不同。若要保留 Bottlerocket 的[預設設定](https://github.com/bottlerocket-os/bottlerocket-core-kit/blob/develop/packages/release/release-sysctl.conf)，請使用以下命令編輯 `kube-proxy` 組態。

   ```
   kubectl edit -n kube-system daemonset kube-proxy
   ```

   新增 `--conntrack-max-per-core` 和 `--conntrack-min` 到 `kube-proxy` 引數，這些引數位於以下範例中。`0` 設定意味著沒有改變。

   ```
         containers:
         - command:
           - kube-proxy
           - --v=2
           - --config=/var/lib/kube-proxy-config/config
           - --conntrack-max-per-core=0
           - --conntrack-min=0
   ```

1. (選用) 部署[範例應用程式](sample-deployment.md)來測試您的 Bottlerocket 節點。

1. 如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
   + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
   + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

   如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

# 建立自我管理的 Microsoft Windows 節點
<a name="launch-windows-workers"></a>

本主題說明如何啟動已向 Amazon EKS 叢集註冊的 Windows 節點的 Auto Scaling 群組。節點加入叢集後，您就可以將 Kubernetes 應用程式部署至其中。

**重要**  
Amazon EKS 節點為標準 Amazon EC2 執行個體，會根據一般 Amazon EC2 執行個體價格向您收取這些節點的費用。如需詳細資訊，請參閱 [Amazon EC2 定價](https://aws.amazon.com/ec2/pricing/)。
您可以在 AWS Outposts 上的 Amazon EKS 延伸叢集中啟動 Windows 節點，但無法在 AWS Outposts 的本機叢集中啟動它們。如需詳細資訊，請參閱[使用 AWS Outposts 在內部部署 Amazon EKS](eks-outposts.md)。

為您的叢集啟用 Windows 支援。我們建議您在啟動 Windows 節點群組之前，先檢閱重要的考量。如需詳細資訊，請參閱[啟用 Windows 支援](windows-support.md#enable-windows-support)。

您可以使用下列任意一項啟動自我管理的 Windows 節點：
+  [`eksctl`](#eksctl_create_windows_nodes) 
+  [AWS 管理主控台](#console_create_windows_nodes) 

## `eksctl`
<a name="eksctl_create_windows_nodes"></a>

 **使用 `eksctl` 啟動自我管理的 Windows 節點** 

此程序需要您已安裝 `eksctl`，且您的 `eksctl` 版本至少是 `0.215.0`。您可使用以下命令檢查您的版本。

```
eksctl version
```

如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的 [Installation](https://eksctl.io/installation) 一節。

**注意**  
此程序只適用於使用 `eksctl` 所建立的叢集。

1. (選用) 如果 **AmazonEKS\$1CNI\$1Policy** 受管 IAM 政策 (如果您有 `IPv4` 叢集) 或 *AmazonEKS\$1CNI\$1IPv6\$1Policy* (您[自我建立的政策](cni-iam-role.md#cni-iam-role-create-ipv6-policy)，前提是如果您有 `IPv6` 叢集) 連接至 [Amazon EKS 節點 IAM 角色](create-node-role.md)，建議改為將其指派給您與 Kubernetes `aws-node` 服務帳戶相關聯的 IAM 角色。如需詳細資訊，請參閱[設定 Amazon VPC CNI 外掛程式以使用 IRSA](cni-iam-role.md)。

1. 此程序假設您有現有的叢集。如果您尚未擁有可新增 Windows 節點群組的 Amazon EKS 叢集和 Amazon Linux 節點群組，我們建議您遵循 [Amazon EKS 入門 – `eksctl`](getting-started-eksctl.md)。該指南提供了建立具有 Amazon Linux 節點的 Amazon EKS 叢集的完整演練。

   使用下列命令來建立您的節點群組。將 *region-code* 取代為您的叢集所在的 AWS 區域。使用您的叢集名稱取代 *my-cluster*。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭，且長度不可超過 100 個字元。在您建立叢集 AWS 的區域和 AWS 帳戶中，名稱必須是唯一的。使用您的節點群組名稱取代 *ng-windows*。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。您可以使用 取代 *2019* `2022` 以使用 Windows Server 2022 或使用 `2025` Windows Server 2025。使用您自己的值取代範例值的其餘部分。
**重要**  
若要將節點群組部署至 AWS Outposts、 AWS Wavelength 或 AWS Local Zone 子網路，請勿在建立叢集時傳遞 AWS Outposts、Wavelength 或 Local Zone 子網路。使用組態檔案建立節點群組，指定 AWS Outposts、Wavelength 或 Local Zone 子網路。如需詳細資訊，請參閱 `eksctl` 文件中的[從組態檔案建立節點群組](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)和[組態檔案結構描述](https://eksctl.io/usage/schema/)。

   ```
   eksctl create nodegroup \
       --region region-code \
       --cluster my-cluster \
       --name ng-windows \
       --node-type t2.large \
       --nodes 3 \
       --nodes-min 1 \
       --nodes-max 4 \
       --managed=false \
       --node-ami-family WindowsServer2019FullContainer
   ```
**注意**  
如果節點無法加入叢集，請參閱故障診斷指南中的 [節點無法加入叢集](troubleshooting.md#worker-node-fail)。
若要查看 `eksctl` 命令可用的選項，請輸入下列命令。  

     ```
     eksctl command -help
     ```

   範例輸出如下。建立節點時，會有數行輸出。輸出的最後幾行之一類似於以下的範例行。

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (選用) 部署[範例應用程式](sample-deployment.md)以測試您的叢集和 Windows 節點。

1. 如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
   + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
   + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

   如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

## AWS 管理主控台
<a name="console_create_windows_nodes"></a>

 **先決條件** 
+ 現有 Amazon EKS 叢集和 Linux 節點群組。如果您沒有這些資源，我們建議您遵循我們 [開始使用 Amazon EKS](getting-started.md) 中的其中一個指南來建立這些資源。這些指南說明如何建立具有 Linux 節點的 Amazon EKS 叢集。
+ 符合 Amazon EKS 叢集要求的現有 VPC 和安全群組。如需詳細資訊，請參閱[檢視 VPC 和子網路的 Amazon EKS 聯網需求](network-reqs.md)及[檢視叢集的 Amazon EKS 安全群組要求](sec-group-reqs.md)。[開始使用 Amazon EKS](getting-started.md) 中的指南會建立符合要求的 VPC。或者，您也可以遵循[為您的 Amazon EKS 叢集建立 Amazon VPC](creating-a-vpc.md) 手動建立一個。
+ 現有的 Amazon EKS 叢集，其使用符合 Amazon EKS 叢集要求的 VPC 和安全群組。如需詳細資訊，請參閱[建立 Amazon EKS 叢集](create-cluster.md)。如果您在已啟用 AWS AWS Outposts、 AWS Wavelength 或 AWS Local Zones 的區域中有子網路，則這些子網路不得在您建立叢集時傳入。

 **步驟 1：使用 AWS 管理主控台 啟動自我管理的 Windows 節點** 

1. 等待您的叢集狀態顯示為 `ACTIVE`。如果在叢集處於作用中狀態之前啟動節點，則節點向叢集註冊將會失敗，導致您必須再次啟動。

1. 開啟 [AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/) 

1. 選擇**建立堆疊**。

1. 對於 **Specify template** (指定範本)，選取 **Amazon S3 URL**。

1. 複製以下 URL 並將其貼到 **Amazon S3 URL** 中。

   ```
   https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2023-02-09/amazon-eks-windows-nodegroup.yaml
   ```

1. 選取 **Next** (下一步) 兩次。

1. 在 **Quick create stack** (快速建立堆疊) 頁面上，視需要輸入下列參數：
   +  **堆疊名稱**：為您的 AWS CloudFormation 堆疊選擇堆疊名稱。例如，您可以稱它為 `my-cluster-nodes`。
   +  **ClusterName**：輸入建立 Amazon EKS 叢集時使用的名稱。
**重要**  
此名稱必須與您在[步驟 1：建立 Amazon EKS 叢集](getting-started-console.md#eks-create-cluster)中使用的名稱完全相符。否則，您的節點無法加入叢集。
   +  **ClusterControlPlaneSecurityGroup**：從您在建立 [VPC](creating-a-vpc.md) 時產生的 AWS CloudFormation 輸出中選擇安全群組。下列步驟顯示擷取適用群組的一種方法。

     1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

     1. 選擇叢集的名稱。

     1. 選擇 **Networking (網路)** 索引標籤。

     1. 從 **ClusterControlPlaneSecurityGroup** 下拉式清單中選取時，請使用 **Additional Security Group** (其他安全群組) 值作為參考。
   +  **NodeGroupName**：輸入節點群組的名稱。此名稱稍後可用於識別為您節點建立的 Auto Scaling 節點群組。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。
   +  **NodeAutoScalingGroupMinSize**：輸入節點 Auto Scaling 群組可以縮減的最低節點數。
   +  **NodeAutoScalingGroupDesiredCapacity**：堆疊建立時，輸入欲擴展的所需節點數量。
   +  **NodeAutoScalingGroupMaxSize**：輸入節點 Auto Scaling 群組可以擴增的最大節點數。
   +  **NodeInstanceType**：選擇節點的執行個體類型。如需詳細資訊，請參閱[選擇最佳的 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。
**注意**  
最新版本的 [Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)支援的執行個體類型會在 GitHub 上的 [vpc\$1ip\$1resource\$1limit.go](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go) 中列出。您可能需要更新 CNI 版本，才能使用最新支援的執行個體類型。如需詳細資訊，請參閱[使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。
   +  **NodeImageIdSSMParam**：預先填入目前所建議 Amazon EKS 最佳化 Windows Core AMI ID 的 Amazon EC2 Systems Manager 參數。若要使用完整版本的 Windows，請使用 `Full` 取代 *Core*。
   +  **NodeImageId**：（選用） 如果您使用自己的自訂 AMI （而非 Amazon EKS 最佳化 AMI)，請輸入您 AWS 區域的節點 AMI ID。如果您在此欄位指定值，則會覆寫 **NodeImageIdSSMParam** 欄位中的任何值。
   +  **NodeVolumeSize**：為您的節點指定根磁碟區大小 (以 GiB 為單位)。
   +  **KeyName**：輸入 Amazon EC2 SSH 金鑰對的名稱，您可以在節點啟動後使用該金鑰對來透過 SSH 連接至節點。如果您還沒有 Amazon EC2 金鑰對，可以在 AWS 管理主控台中建立一個。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html)。
**注意**  
如果您未在此處提供金鑰對，則無法建立 AWS CloudFormation 堆疊。
   +  **BootstrapArguments**：指定要傳遞至節點引導指令碼的任何選用引數，例如使用 `-KubeletExtraArgs` 的額外 `kubelet` 引數。
   +  **DisableIMDSv1**：預設情況下，每個節點都支援執行個體中繼資料服務版本 1 (IMDSv1) 和 IMDSv2。您可以停用 IMDSv1。若要防止節點群組中的未來節點和 Pod 使用 MDSv1，請將 **DisableIMDSv1** 設定為 **true**。如需 IMDS 的詳細資訊，請參閱[設定執行個體中繼資料服務](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。
   +  **VpcId**：選取您建立的 [VPC](creating-a-vpc.md) ID。
   +  **NodeSecurityGroups**：選取在建立 [VPC](creating-a-vpc.md) 時為您的 Linux 節點群組建立的安全群組。如果 Linux 節點連接了一個以上的安全群組，請指定所有的群組。例如，如果 Linux 節點群組是使用 `eksctl` 建立。
   +  **Subnets** (子網路)：選擇您建立的子網路。如果您已依照[為您的 Amazon EKS 叢集建立 Amazon VPC](creating-a-vpc.md) 中的步驟建立 VPC，則只需指定要啟動節點的 VPC 中的私有子網路。
**重要**  
如有任何子網路是公有子網路，則必須啟用自動公有 IP 地址指派設定。如果未針對公有子網路啟用 設定，則您部署至該公有子網路的任何節點都不會指派公有 IP 地址，也無法與叢集或其他 AWS 服務通訊。如果子網路是在 2020 年 3 月 26 日之前使用任一 [Amazon EKS AWS CloudFormation VPC 範本](creating-a-vpc.md)或使用 部署，`eksctl`則會停用公有子網路的自動公有 IP 地址指派。如需如何啟用子網路的公有 IP 地址指派的相關資訊，請參閱[修改您子網路的公有 IPv4 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。如果節點部署到私有子網路，則可以透過 NAT 閘道與叢集和其他 AWS 服務通訊。
如果子網路無法存取網際網路，則請確保您已知悉[部署網際網路存取受到限制的私有叢集](private-clusters.md)中的考量事項和額外步驟。
如果您選取 AWS Outpost、Wavelength 或 Local Zone 子網路，則建立叢集時不得傳入子網路。

1. 確認堆疊可建立 IAM 資源，然後選擇 **Create stack** (建立堆疊)。

1. 當當堆疊已完成建立時，從主控台將其選取，然後選擇 **Outputs (輸出)**。

1. 為已建立的節點群組記錄 **NodeInstanceRole**。當您設定 Amazon EKS Windows 節點時會需要此值。

 **步驟 2：讓節點加入叢集** 

1. 檢查以瞭解是否有 `aws-auth` `ConfigMap`。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. 如果您看到 `aws-auth` `ConfigMap`，請視需要更新之。

   1. 開啟 `ConfigMap` 進行編輯。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 視需要新增 `mapRoles` 個項目。將 `rolearn` 值設定為您在先前程序中記錄的 **NodeInstanceRole** 值。

      ```
      [...]
      data:
        mapRoles: |
      - rolearn: <ARN of linux instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
          - rolearn: <ARN of windows instance role (not instance profile)>
            username: system:node:{{EC2PrivateDNSName}}
            groups:
              - system:bootstrappers
              - system:nodes
              - eks:kube-proxy-windows
      [...]
      ```

   1. 儲存檔案並結束您的文字編輯器。

1. 如果您收到一個錯誤，說明 "`Error from server (NotFound): configmaps "aws-auth" not found`，那麼請套用股票 `ConfigMap`。

   1. 下載組態對應。

      ```
      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml
      ```

   1. 在 `aws-auth-cm-windows.yaml` 檔案中，將 `rolearn` 值設定為您在先前程序中記錄的適用 **NodeInstanceRole** 值。您可以使用文字編輯器來完成此操作，或者透過取代範例值並執行下列命令：

      ```
      sed -i.bak -e 's|<ARN of linux instance role (not instance profile)>|my-node-linux-instance-role|' \
          -e 's|<ARN of windows instance role (not instance profile)>|my-node-windows-instance-role|' aws-auth-cm-windows.yaml
      ```
**重要**  
請勿修改此檔案中的任何其他行。
請勿為 Windows 節點和 Linux 節點使用相同的 IAM 角色。

   1. 套用組態。此命令可能需要幾分鐘的時間來完成。

      ```
      kubectl apply -f aws-auth-cm-windows.yaml
      ```

1. 查看節點的狀態，並等待他們到達 `Ready` 狀態。

   ```
   kubectl get nodes --watch
   ```

   輸入 `Ctrl`\$1`C` 傳回 Shell 提示。
**注意**  
如果您收到任何授權或資源類型錯誤，請參閱故障診斷主題中的[未經授權或存取遭拒 (`kubectl`)](troubleshooting.md#unauthorized)。

   如果節點無法加入叢集，請參閱「故障診斷」章節中的 [節點無法加入叢集](troubleshooting.md#worker-node-fail)。

 **步驟 3：其他動作** 

1. (選用) 部署[範例應用程式](sample-deployment.md)以測試您的叢集和 Windows 節點。

1. (選用) 如果 **AmazonEKS\$1CNI\$1Policy** 受管 IAM 政策 (如果您有 `IPv4` 叢集) 或 *AmazonEKS\$1CNI\$1IPv6\$1Policy* (您[自我建立的政策](cni-iam-role.md#cni-iam-role-create-ipv6-policy)，前提是如果您有 `IPv6` 叢集) 連接至 [Amazon EKS 節點 IAM 角色](create-node-role.md)，建議改為將其指派給您與 Kubernetes `aws-node` 服務帳戶相關聯的 IAM 角色。如需詳細資訊，請參閱[設定 Amazon VPC CNI 外掛程式以使用 IRSA](cni-iam-role.md)。

1. 如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
   + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
   + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

   如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

# 建立自我管理的 Ubuntu Linux 節點
<a name="launch-node-ubuntu"></a>

**注意**  
受管節點群組可能會為您的使用案例提供一些優勢。如需詳細資訊，請參閱[透過受管節點群組來簡化節點生命週期](managed-node-groups.md)。

本主題會說明如何啟動向 Amazon EKS 叢集註冊的 [Amazon Elastic Kubernetes Service (EKS) 上的 Ubuntu](https://cloud-images.ubuntu.com/aws-eks/) 或 [Amazon Elastic Kubernetes Service (EKS) 上的 Ubuntu Pro](https://ubuntu.com/blog/ubuntu-pro-for-eks-is-now-generally-available) 節點的 Auto Scaling 群組。Ubuntu 和 Ubuntu Pro for EKS 是以官方 Ubuntu Minimal LTS 為基礎，包括與 共同開發的自訂 AWS 核心 AWS，並專門為 EKS 建置。Ubuntu Pro 透過支援 EKS 延長支援期間、核心 livepatch、FIPS 合規以及執行無限 Pro 容器的能力來新增額外的安全涵蓋範圍。

節點加入叢集後，您就可以將容器化應用程式部署至其中。如需詳細資訊，請參閱 `eksctl` 文件中的 [AWS上的 Ubuntu](https://documentation.ubuntu.com/aws/en/latest/) 和[自訂 AMI 支援](https://eksctl.io/usage/custom-ami-support/)。

**重要**  
Amazon EKS 節點為標準 Amazon EC2 執行個體，會根據一般 Amazon EC2 執行個體價格向您收取這些節點的費用。如需詳細資訊，請參閱 [Amazon EC2 定價](https://aws.amazon.com/ec2/pricing/)。
您可以在 AWS Outposts 上的 Amazon EKS 擴充叢集中啟動 Ubuntu 節點，但無法在 AWS Outposts 的本機叢集中啟動它們。如需詳細資訊，請參閱[使用 AWS Outposts 在內部部署 Amazon EKS](eks-outposts.md)。
您可以使用 `x86` 或 Arm 處理器部署至 Amazon EC2 執行個體。不過，具有 Inferentia 晶片的執行個體可能需要先安裝 [Neuron SDK](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/)。

此程序需要 `eksctl` 版本 `0.215.0` 或更新版本。您可使用以下命令檢查您的版本：

```
eksctl version
```

如需如何安裝或升級 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)。注意：此程序僅適用於使用 `eksctl` 建立的叢集。

1. 將以下內容複製到您的裝置。使用您叢集的名稱取代 `my-cluster`。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以字母字元開頭，且長度不可超過 100 個字元。將 `ng-ubuntu` 取代為您的節點群組名稱。節點群組名稱不可超過 63 個字元。它必須以字母或數字開頭，但剩餘字元也可以包含連字符和底線。若要在 Arm 執行個體上部署，請以 Arm 執行個體類型取代 `m5.large`。使用 Amazon EC2 SSH 金鑰對名稱取代 `my-ec2-keypair-name`，您可以在節點啟動後使用該金鑰對來透過 SSH 連接至節點。如果您還沒有 Amazon EC2 金鑰對，可以在 AWS 管理主控台中建立一個。如需詳細資訊，請參閱《Amazon EC2 使用者指南》中的 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。使用您自己的值取代其餘所有範例值。完成取代後，請執行修改後的命令以建立 `ubuntu.yaml` 檔案。
**重要**  
若要將節點群組部署至 AWS Outposts、 AWS Wavelength 或 AWS Local Zone 子網路，請勿在建立叢集時傳遞 AWS Outposts、 AWS Wavelength 或 AWS Local Zone 子網路。您必須在下列範例中指定子網路。如需詳細資訊，請參閱 `eksctl` 文件中的[從組態檔案建立節點群組](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)和[組態檔案結構描述](https://eksctl.io/usage/schema/)。將 *region-code* 取代為您的叢集所在的 AWS 區域。

   ```
   cat >ubuntu.yaml <<EOF
   ---
   apiVersion: eksctl.io/v1alpha5
   kind: ClusterConfig
   
   metadata:
     name: my-cluster
     region: region-code
     version: '1.35'
   
   iam:
     withOIDC: true
   
   nodeGroups:
     - name: ng-ubuntu
       instanceType: m5.large
       desiredCapacity: 3
       amiFamily: Ubuntu2204
       iam:
          attachPolicyARNs:
             - arn:aws: iam::aws:policy/AmazonEKSWorkerNodePolicy
             - arn:aws: iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
             - arn:aws: iam::aws:policy/AmazonSSMManagedInstanceCore
             - arn:aws: iam::aws:policy/AmazonEKS_CNI_Policy
       ssh:
           allow: true
           publicKeyName: my-ec2-keypair-name
   EOF
   ```

   若要建立 Ubuntu Pro 節點群組，只需將 `amiFamily` 值變更為 `UbuntuPro2204` 即可。

1. 使用下列命令部署節點。

   ```
   eksctl create nodegroup --config-file=ubuntu.yaml
   ```

   範例輸出如下。

   建立節點時，會有數行輸出。輸出的最後幾行之一類似於以下的範例行。

   ```
   [✔]  created 1 nodegroup(s) in cluster "my-cluster"
   ```

1. (選用) 部署[範例應用程式](sample-deployment.md)來測試您的 Ubuntu 節點。

1. 如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
   + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
   + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

   如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

# 更新您的叢集的自我管理節點
<a name="update-workers"></a>

全新 Amazon EKS 最佳化 AMI 發行時，請考量以新 AMI 取代自我管理節點群組中的節點。同樣地，如果更新 Amazon EKS 叢集的 Kubernetes 版本，請更新節點以使用具相同 Kubernetes 版本的節點。

**重要**  
本主題涵蓋自我管理節點的節點更新。若使用[受管節點群組](managed-node-groups.md)，則請參閱 [更新叢集的受管節點群組](update-managed-node-group.md)。

有兩種基本方法可以將叢集中的自我管理節點群組更新成使用新的 AMI：

 **[將應用程式移轉至新的節點群組](migrate-stack.md)**   
建立新的節點群組，並將 Pod 移轉至該群組。移轉至新節點群組比在現有 AWS CloudFormation 堆疊中更新 AMI ID 更順利。這是因為移轉過程會將舊節點群組[汙染](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)為 `NoSchedule`，並在新堆疊準備好接受現有的 Pod 工作負載之後耗盡節點。

 **[更新 AWS CloudFormation 節點堆疊](update-stack.md)**   
更新現有節點群組的 AWS CloudFormation 堆疊，以使用新的 AMI。不支援對使用 `eksctl` 建立的節點群組使用這個方法。

# 將應用程式移轉至新的節點群組
<a name="migrate-stack"></a>

此主題會說明如何建立新的節點群組，將現有的應用程式從容遷移至新群組，接著從叢集移除舊的節點群組。您可以使用 `eksctl` 或 AWS 管理主控台遷移至新的節點群組。
+  [`eksctl`](#eksctl_migrate_apps) 
+  [AWS 管理主控台 和 AWS CLI](#console_migrate_apps) 

## `eksctl`
<a name="eksctl_migrate_apps"></a>

 **使用 `eksctl` 將應用程式移轉至新的節點群組** 

如需有關將 eksctl 用於移轉的詳細資訊，請參閱 `eksctl` 文件中的[未受管的節點群組](https://eksctl.io/usage/nodegroup-unmanaged/)。

此程序需要 `eksctl` 版本 `0.215.0` 或更新版本。您可使用以下命令檢查您的版本：

```
eksctl version
```

如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的 [Installation](https://eksctl.io/installation) 一節。

**注意**  
此程序只適用於使用 `eksctl` 所建立的叢集和節點群組。

1. 擷取現有節點群組的名稱，使用叢集名稱取代 *my-cluster*。

   ```
   eksctl get nodegroups --cluster=my-cluster
   ```

   範例輸出如下。

   ```
   CLUSTER      NODEGROUP          CREATED               MIN SIZE      MAX SIZE     DESIRED CAPACITY     INSTANCE TYPE     IMAGE ID
   default      standard-nodes   2019-05-01T22:26:58Z  1             4            3                    t3.medium         ami-05a71d034119ffc12
   ```

1. 使用以下命令啟動具備 `eksctl` 的新節點群組。在命令中，使用您自己的值取代每一個*範例值*。版本編號不能晚於控制平面的 Kubernetes 版本。也不能比控制平面的 Kubernetes 版本早兩個以上的次要版本。建議使用與控制平面相同的版本。

   如果下列條件為真，我們建議封鎖 Pod 對 IMDS 的存取：
   + 您計劃將 IAM 角色指派給您的所有 Kubernetes 服務帳戶，以便 Pod 僅具有所需的最低許可。
   + 叢集中沒有任何 Pod 因其他原因需要存取 Amazon EC2 執行個體中繼資料服務 (IMDS)，例如擷取目前 AWS 區域。

     如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

     若要封鎖 Pod 對 IMDS 的存取，請將 `--disable-pod-imds` 選項新增至下列命令。
**注意**  
如需更多可用旗標及其描述的資訊，請參閱 https://eksctl.io/。

   ```
   eksctl create nodegroup \
     --cluster my-cluster \
     --version 1.35 \
     --name standard-nodes-new \
     --node-type t3.medium \
     --nodes 3 \
     --nodes-min 1 \
     --nodes-max 4 \
     --managed=false
   ```

1. 之前的命令完成時，使用下列命令來確認所有節點已達到 `Ready` 狀態：

   ```
   kubectl get nodes
   ```

1. 使用下列命令來刪除原始的節點群組。在命令中，使用您的叢集和節點群組名稱取代每一個*範例值*：

   ```
   eksctl delete nodegroup --cluster my-cluster --name standard-nodes-old
   ```

## AWS 管理主控台 和 AWS CLI
<a name="console_migrate_apps"></a>

 **使用 AWS 管理主控台 和 AWS CLI 將應用程式遷移至新的節點群組** 

1. 依照[建立自我管理的 Amazon Linux 節點](launch-workers.md)中概述的步驟啟動新的節點群組。

1. 當當堆疊已完成建立時，從主控台將其選取，然後選擇 **Outputs (輸出)**。

1.  為已建立的節點群組記錄 **NodeInstanceRole**。您需要這樣才能新增 Amazon EKS 節點至叢集。
**注意**  
如果已將任何額外的 IAM 政策連接至舊節點群組 IAM 角色，則請將相同政策連接至新節點群組 IAM 角色，以便在新群組維持該功能。例如，如果為 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) 新增許可，則適用此操作。

1. 更新兩個節點群組的安全群組，使其能夠互相通訊。如需詳細資訊，請參閱[檢視叢集的 Amazon EKS 安全群組要求](sec-group-reqs.md)。

   1. 記錄兩個節點群組的安全群組 ID。這在 AWS CloudFormation 堆疊輸出中顯示為 **NodeSecurityGroup** 值。

      您可以使用下列 AWS CLI 命令，從堆疊名稱取得安全群組 IDs。在這些命令中， `oldNodes`是舊版節點堆疊的 AWS CloudFormation 堆疊名稱，而 `newNodes`是您要遷移至的堆疊名稱。使用您自己的值取代每一個*範例值*。

      ```
      oldNodes="old_node_CFN_stack_name"
      newNodes="new_node_CFN_stack_name"
      
      oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      ```

   1. 新增輸入規則至每個節點安全群組，使其接受彼此的流量。

      下列 AWS CLI 命令會將傳入規則新增至每個安全群組，以允許來自其他安全群組的所有通訊協定上的所有流量。此組態可讓每個節點群組中的 Pod 在您將工作負載移轉至新群組時互相通訊。

      ```
      aws ec2 authorize-security-group-ingress --group-id $oldSecGroup \
      --source-group $newSecGroup --protocol -1
      aws ec2 authorize-security-group-ingress --group-id $newSecGroup \
      --source-group $oldSecGroup --protocol -1
      ```

1. 編輯 `aws-auth` configmap 以在 RBAC 中對應新的節點執行個體角色。

   ```
   kubectl edit configmap -n kube-system aws-auth
   ```

   為新節點群組新增 `mapRoles` 項目。

   ```
   apiVersion: v1
   data:
     mapRoles: |
       - rolearn: ARN of instance role (not instance profile)
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes>
       - rolearn: arn:aws: iam::111122223333:role/nodes-1-16-NodeInstanceRole-U11V27W93CX5
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes
   ```

   使用您在[上一個步驟](#node-instance-role-step)中記錄的 **NodeInstanceRole** 值來取代*執行個體角色 ARN (非執行個體設定檔)* 程式碼片段。接著，儲存並關閉檔案以套用更新的 configmap。

1. 注意節點狀態並等待新的節點加入叢集和達到 `Ready` 狀態。

   ```
   kubectl get nodes --watch
   ```

1. (選用) 如果您使用的是 [Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)，請將部署縮減為零 (0) 個複本以避免衝突的擴展動作。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
   ```

1. 使用以下命令污染每個您想要用 `NoSchedule` 移除的節點。這樣就不會在您要取代的節點上排程或重新排程新的 Pod。如需詳細資訊，請參閱 Kubernetes 文件中的[污點和容差](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)。

   ```
   kubectl taint nodes node_name key=value:NoSchedule
   ```

   如果要將節點升級至新的 Kubernetes 版本，您可以使用以下程式碼片段識別並標示特定 Kubernetes 版本 (在此情況下為 `1.33`) 的所有節點。版本編號不能晚於控制平面的 Kubernetes 版本。也不能比控制平面的 Kubernetes 版本早兩個以上的次要版本。建議使用與控制平面相同的版本。

   ```
   K8S_VERSION=1.33
   nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}")
   for node in ${nodes[@]}
   do
       echo "Tainting $node"
       kubectl taint nodes $node key=value:NoSchedule
   done
   ```

1.  判斷叢集的 DNS 提供商。

   ```
   kubectl get deployments -l k8s-app=kube-dns -n kube-system
   ```

   範例輸出如下。此叢集針對 DNS 解析度使用 CoreDNS，但您的叢集可能會傳回 `kube-dns`：

   ```
   NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   coredns   1         1         1            1           31m
   ```

1. 如果您目前的部署執行少於 2 個複本，請將部署擴增為 2 個複本。如果您先前的命令輸出傳回該項目，請以 `kubedns` 取代 *coredns*。

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. 使用以下命令清空您想要從叢集移除的每個節點：

   ```
   kubectl drain node_name --ignore-daemonsets --delete-local-data
   ```

   如果您要將節點升級至新的 Kubernetes 版本，請使用下列程式碼片段識別並耗盡特定 Kubernetes 版本 （在本例中為 *1.33*) 的所有節點。

   ```
   K8S_VERSION=1.33
   nodes=$(kubectl get nodes -o jsonpath="{.items[?(@.status.nodeInfo.kubeletVersion==\"v$K8S_VERSION\")].metadata.name}")
   for node in ${nodes[@]}
   do
       echo "Draining $node"
       kubectl drain $node --ignore-daemonsets --delete-local-data
   done
   ```

1. 在舊的節點完成消耗後，請撤銷您先前授權的安全群組傳入規則。然後，刪除 AWS CloudFormation 堆疊以終止執行個體。
**注意**  
如果您將任何其他 IAM 政策連接至舊節點群組 IAM 角色，例如新增 [Kubernetes Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) 的許可，請先從角色分離這些其他政策，然後才能刪除 AWS CloudFormation 堆疊。

   1. 撤銷您先前為節點安全群組建立的傳入規則。在這些命令中， `oldNodes`是舊版節點堆疊的 AWS CloudFormation 堆疊名稱，而 `newNodes`是您要遷移至的堆疊名稱。

      ```
      oldNodes="old_node_CFN_stack_name"
      newNodes="new_node_CFN_stack_name"
      
      oldSecGroup=$(aws cloudformation describe-stack-resources --stack-name $oldNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      newSecGroup=$(aws cloudformation describe-stack-resources --stack-name $newNodes \
      --query 'StackResources[?ResourceType==`AWS::EC2::SecurityGroup`].PhysicalResourceId' \
      --output text)
      aws ec2 revoke-security-group-ingress --group-id $oldSecGroup \
      --source-group $newSecGroup --protocol -1
      aws ec2 revoke-security-group-ingress --group-id $newSecGroup \
      --source-group $oldSecGroup --protocol -1
      ```

   1. 開啟 [AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)。

   1. 選取舊的節點堆疊。

   1. 選擇 **刪除**。

   1. 在 **Delete stack** (刪除堆疊) 確認對話方塊中，選擇 **Delete stack** (刪除堆疊)。

1. 編輯 `aws-auth` configmap 以從 RBAC 移除舊的節點執行個體角色。

   ```
   kubectl edit configmap -n kube-system aws-auth
   ```

   刪除舊節點群組的 `mapRoles` 項目。

   ```
   apiVersion: v1
   data:
     mapRoles: |
       - rolearn: arn:aws: iam::111122223333:role/nodes-1-16-NodeInstanceRole-W70725MZQFF8
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes
       - rolearn: arn:aws: iam::111122223333:role/nodes-1-15-NodeInstanceRole-U11V27W93CX5
         username: system:node:{{EC2PrivateDNSName}}
         groups:
           - system:bootstrappers
           - system:nodes>
   ```

   儲存並關閉檔案以套用更新的 configmap。

1. (選用) 如果您使用的是 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)，請將部署縮減回 1 個複本。
**注意**  
您也必須適當標記新的 Auto Scaling 群組 (例如 `k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/my-cluster`)，並更新 Cluster Autoscaler 部署的命令，以指向新標記的 Auto Scaling 群組。如需詳細資訊，請參閱 [Cluster Autoscaler on AWS](https://github.com/kubernetes/autoscaler/tree/cluster-autoscaler-release-1.3/cluster-autoscaler/cloudprovider/aws)。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
   ```

1. (選用) 確認您使用的是最新版本的 [Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)。您可能需要更新 CNI 版本，才能使用最新支援的執行個體類型。如需詳細資訊，請參閱[使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。

1. 如果您的叢集針對 DNS 解析度使用 `kube-dns` (請參閱 [[migrate-determine-dns-step]](#migrate-determine-dns-step))，請將 `kube-dns` 部署縮減至一個複本。

   ```
   kubectl scale deployments/kube-dns --replicas=1 -n kube-system
   ```

# 更新 an AWS CloudFormation 節點堆疊
<a name="update-stack"></a>

本主題說明如何使用新的 AMI 更新現有的 AWS CloudFormation 自我管理節點堆疊。您可以使用此程序在叢集更新後將節點更新至新版本的 Kubernetes。否則，您可以針對現有 Kubernetes 版本更新至最新的 Amazon EKS 最佳化 AMI。

**重要**  
本主題涵蓋自我管理節點的節點更新。若要了解[透過受管節點群組來簡化節點生命週期](managed-node-groups.md)的相關詳細資訊，請參閱 [更新叢集的受管節點群組](update-managed-node-group.md)。

最新的預設 Amazon EKS node AWS CloudFormation 範本已設定為在移除舊執行個體之前，在叢集中啟動具有新 AMI 的執行個體，一次一個。此組態可確保您在滾動更新期間，都能掌握叢集中 Auto Scaling 群組所需的作用中執行個體計數。

**注意**  
不支援對使用 `eksctl` 建立的節點群組使用這個方法。如果透過 `eksctl` 建立叢集或節點群組，則請參閱 [將應用程式移轉至新的節點群組](migrate-stack.md)。

1. 判斷叢集的 DNS 供應商。

   ```
   kubectl get deployments -l k8s-app=kube-dns -n kube-system
   ```

   範例輸出如下。此叢集針對 DNS 解析度使用 CoreDNS，但您的叢集可能會傳回 `kube-dns`。根據您使用的 `kubectl` 版本，輸出可能會有所不同。

   ```
   NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
   coredns   1         1         1            1           31m
   ```

1. 如果您目前的部署執行少於 2 個複本，請將部署擴增為 2 個複本。如果您先前的命令輸出傳回該項目，請以 `kube-dns` 取代 *coredns*。

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. (選用) 如果您使用的是 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，請將部署縮減為零 (0) 個複本以避免衝突的擴展動作。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
   ```

1.  確定目前節點群組的執行個體類型和所需執行個體計數。您稍後更新群組的 AWS CloudFormation 範本時，會輸入這些值。

   1. 前往 https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

   1. 在左側導覽窗格中，選擇 **Launch Configurations** (啟動組態)，並記下現有節點啟動組態的執行個體類型。

   1. 在左側導覽窗格中，選擇 **Auto Scaling Groups** (Auto Scaling 群組)，並注意現有節點 Auto Scaling 群組的 **Desired** (所需) 執行個體計數。

1. 開啟 [AWS CloudFormation 主控台](https://console.aws.amazon.com/cloudformation/)。

1. 選取您的節點群組堆疊，然後選擇 **Update** (更新)。

1. 選取 **Replace current template (取代目前的範本)**，然後選取 **Amazon S3 URL**。

1. 對於 **Amazon S3 URL**，請將下列 URL 貼到文字區域，以確保您使用的是最新版本的 node AWS CloudFormation 範本。然後選擇 **Next** (下一步)：

   ```
   https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
   ```

1. 在 **Specify stack details (指定堆疊詳細資訊)** 頁面上，填寫下列參數，然後選擇 **Next (下一步)**：
   +  **NodeAutoScalingGroupDesiredCapacity**：輸入在[先前步驟](#existing-worker-settings-step)中記錄的所需執行個體計數。或者，在堆疊更新時，輸入欲擴展的所需節點數量。
   +  **NodeAutoScalingGroupMaxSize**：輸入節點 Auto Scaling 群組可以擴增的最大節點數。此值必須至少超過所需容量一個節點。這樣才能夠在更新期間執行節點滾動更新，而不必減少節點計數。
   +  **NodeInstanceType**：選擇在[先前步驟](#existing-worker-settings-step)中記錄的執行個體類型。或者，為節點選擇不同的執行個體類型。選擇不同的執行個體類型之前，請檢閱[選擇最佳 Amazon EC2 節點執行個體類型](choosing-instance-type.md)。每個 Amazon EC2 執行個體類型都支援最大數量的彈性網路介面 (網路介面)，且每個網路介面支援最大數量的 IP 地址。由於為每個工作節點和 Pod 指派了自己的 IP 位址，因此請務必選擇支援要在每個 Amazon EC2 節點上執行之最大 Pod 數量的執行個體類型。如需執行個體類型支援的網路介面和 IP 地址數量清單，請參閱[每種執行個體類型每個網路介面的 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)。例如，`m5.large` 執行個體類型最多支援工作節點和 Pod 的 30 個 IP 位址。
**注意**  
最新版本的 [Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)支援的執行個體類型會顯示在 GitHub 上的 [vpc\$1ip\$1resource\$1limit.go](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)。您可能需要更新適用於 Kubernetes 的 Amazon VPC CNI 版本，才能使用最新支援的執行個體類型。如需詳細資訊，請參閱[使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。
**重要**  
有些執行個體類型可能無法在所有 AWS 區域中使用。
   +  **NodeImageIdSSMParam** – 您要更新的 AMI ID 的 Amazon EC2 Systems Manager 參數。以下值對 Kubernetes `1.35` 版使用最新的 Amazon EKS 最佳化 AMI。

     ```
     /aws/service/eks/optimized-ami/1.35/amazon-linux-2/recommended/image_id
     ```

     您可以使用相同的[平台版本](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)取代 *1.35*。或者比控制平面上執行的 Kubernetes 版本早一個版本號的版本。建議您將節點保持在與控制平面相同的版本。您亦可使用不同的 AMI 類型來取代 *amazon-linux-2*。如需詳細資訊，請參閱[擷取建議的 Amazon Linux AMI ID](retrieve-ami-id.md)。
**注意**  
使用 Amazon EC2 Systems Manager 參數可讓您在未來更新節點，而無需查詢和指定 AMI ID。如果您的 AWS CloudFormation 堆疊使用此值，任何堆疊更新一律會針對您指定的 Kubernetes 版本啟動最新的建議 Amazon EKS 最佳化 AMI。即使沒有變更範本中的任何值，情況也會如此。
   +  **NodeImageId**：若要使用您自己的自訂 AMI，請輸入要使用的 AMI 的 ID。
**重要**  
此值會覆寫 **NodeImageIdSSMParam** 指定的任何值。如果您想要使用 **NodeImageIdSSMParam** 值，請確定 **NodeImageId** 的值為空白。
   +  **DisableIMDSv1**：在預設情況下，每個節點都支援執行個體中繼資料服務版本 1 (IMDSv1) 和 IMDSv2。不過，您可以停用 IMDSv1。如果不想要任何節點，或節點群組中排定的任何 Pod 使用 IMDSv1，則請選取 **true** (是)。如需 IMDS 的詳細資訊，請參閱[設定執行個體中繼資料服務](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。如果您已為服務帳戶實作 IAM 角色，請直接將必要的許可指派給需要存取 AWS 服務的所有 Pod。如此一來，叢集中沒有任何 Pod 因為其他原因需要存取 IMDS，例如擷取目前的 AWS 區域。然後，您也可以針對不使用主機聯網的 Pod 停用對 IMDSv2 的存取。如需詳細資訊，請參閱[‬限制存取指派給工作節點的執行個體設定檔‭](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。

1. (選用) 在 **Options (選項)** 頁面上，為堆疊資源加上標籤。選擇**下一步**。

1. 在 **Review** (檢閱) 頁面上檢閱您的資訊，確認該堆疊可建立 IAM 資源，然後選擇 **Update stack** (更新堆疊)。
**注意**  
叢集中每個節點的更新，都需要幾分鐘的時間。請等待所有節點更新完成再執行後續步驟。

1. 如果您叢集的 DNS 供應商為 `kube-dns`，請將 `kube-dns` 部署縮減至 1 個複本。

   ```
   kubectl scale deployments/kube-dns --replicas=1 -n kube-system
   ```

1. (選用) 如果您使用的是 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，請將部署縮減回您想要的複本數量。

   ```
   kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
   ```

1. (選用) 確認您使用的是最新版本的 [Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)。您可能需要更新適用於 Kubernetes 的 Amazon VPC CNI 版本，才能使用最新支援的執行個體類型。如需詳細資訊，請參閱[使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。

# 使用 AWS Fargate 簡化運算管理
<a name="fargate"></a>

本主題討論如何使用 Amazon EKS 在 AWS Fargate 上執行 Kubernetes Pod。Fargate 是一種為[容器](https://aws.amazon.com/what-are-containers)提供隨需、適當大小運算容量的科技。有了 Fargate，就不再需要自行佈建、設定或擴展虛擬機器的群組來執行容器。您也無需選擇伺服器類型、決定何時擴展節點群組，或最佳化叢集壓縮。

您可以控制哪些 Pod 要在 Fargate 上啟動，以及其如何搭配 [Fargate 設定檔](fargate-profile.md)執行。Fargate 描述檔會定義為 Amazon EKS 叢集的一部分。Amazon EKS 使用控制器將 Kubernetes 與 Fargate 整合，而控制器則是透過 AWS 使用 Kubernetes 提供的上游、可擴充模型建立。這些控制器作為 Amazon EKS 受管 Kubernetes 控制平面的一部分執行，且負責將原生 Kubernetes Pod 排程至 Fargate。Fargate 控制器包括新的排程器，除了數個變換與驗證許可控制器之外，也會隨著預設 Kubernetes 排程器執行。當您啟動符合在 Fargate 上執行的條件的 Pod 時，在叢集中執行的 Fargate 控制器便會辨識、更新 Pod 並將 Pod 排程至 Fargate。

本主題會說明在 Fargate 上執行的不同 Pod 元件，並注意搭配使用 Fargate 與 Amazon EKS 的特殊考量。

## AWS Fargate 考慮因素
<a name="fargate-considerations"></a>

以下是在 Amazon EKS 上使用 Fargate 的考慮因素。
+ 在 Fargate 上執行的每個 Pod 都有自己的運算界限。這些 Pod 不會與其他 Pod 共用基礎核心、CPU 資源、記憶體資源或彈性網路介面。
+ Network Load Balancer 和 Application Load Balancer (ALB) 可以僅與具有 IP 目標的 Fargate 搭配使用。如需詳細資訊，請參閱[建立 Network Load Balancer](network-load-balancing.md#network-load-balancer)及[透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md)。
+ Fargate 的公開服務僅能在目標類型 IP 模式下執行，不能在節點 IP 模式下執行。若要檢查在受管節點上和在 Fargate 上執行的服務的連線狀態，建議透過服務名稱來連線。
+ Pod 必須與其排程時的 Fargate 設定檔相符，以在 Fargate 上執行。與 Fargate 設定檔不相符的 Pod 可能會卡在 `Pending` 狀態。如果存在相符的 Fargate 設定檔，您可以刪除已建立的待定 Pod，以將其重新排程至 Fargate。
+ Fargate 不支援 Daemonsets。如果您的應用程式需要常駐程式，請重新設定該常駐程式，以作為您 Pod 中的附屬容器執行。
+ Fargate 不支援具有特殊權限的容器。
+ 在 Fargate 上執行的 Pod 不能指定 Pod 資訊清單中的 `HostPort` 或 `HostNetwork`。
+ 預設 `nofile` 和 `nproc` 軟性限制為 1024，而 Fargate Pod 的硬性限制為 65535。
+ GPU 目前無法在 Fargate 上使用。
+ 只有私有子網路支援在 Fargate 上執行的 Pod (具有對 AWS 服務的 NAT 閘道存取，但沒有網際網路閘道的直接路由)，因此您叢集的 VPC 必須具有可用的私有子網路。如需沒有傳出網際網路存取權的叢集，請參閱 [部署網際網路存取受到限制的私有叢集](private-clusters.md)。
+ 您可以使用[透過 Vertical Pod Autoscaler 來調整 Pod 資源](vertical-pod-autoscaler.md)為 Fargate Pod 設定 CPU 和記憶體的初始正確大小，然後使用[使用 Horizontal Pod Autoscaler 擴展 Pod 部署](horizontal-pod-autoscaler.md)來擴展這些 Pod。如果要 Vertical Pod Autoscaler 自動將 Pod 重新部署到具有較大 CPU 和記憶體組合的 Fargate，請將 Vertical Pod Autoscaler 的模式設定為 `Auto` 或 `Recreate` 以確保正確的功能。如需詳細資訊，請參閱 GitHub 上的 [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#quick-start) 文件。
+ 您的 VPC 必須啟用 DNS 解析和 DNS 主機名稱。如需詳細資訊，請參閱[檢視與更新 VPC 的 DNS 支援](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)。
+ Amazon EKS Fargate 透過在虛擬機器 (VM) 中隔離每個 Pod，為 Kubernetes 應用程式增加深度防禦功能。此 VM 界限可防止在容器逸出時存取其他 Pod 使用的主機型資源，這是攻擊容器化應用程式並存取容器外資源的常用方法。

  使用 Amazon EKS 並不會變更您在[共同責任模式](security.md)下所需承擔的責任。您應該審慎考慮叢集安全性和控管控制項的組態。隔離應用程式最安全的方法是永遠在個別的叢集中執行。
+ Fargate 描述檔支援從 VPC 次要 CIDR 區塊指定子網路。您可能想要指定次要 CIDR 區塊。這是因為子網路僅提供數量有限的 IP 位址。因此，叢集中可建立的 Pod 數量也有限。如果為 Pod 使用不同的子網路，您可增加可用 IP 位址的數量。如需詳細資訊，請參閱[為 VPC 新增 IPv4 CIDR 區塊。](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-resize)
+ 部署到 Fargate 節點的 Pod 不提供 Amazon EC2 執行個體中繼資料服務 (IMDS)。如果有部署到 Fargate 且需要 IAM 憑證的 Pod，則請使用[服務帳戶的 IAM 角色](iam-roles-for-service-accounts.md)將其指派給 Pod。如果您的 Pod 需要存取 IMDS 提供的其他資訊，則必須將此資訊硬式編碼至 Pod 規格中。這包括部署 Pod 的 AWS 區域或可用區域。
+ 您無法將 Fargate Pod 部署到 AWS Outposts、AWS Wavelength 或 AWS Local Zones。
+ Amazon EKS 必須定期修補 Fargate Pod 來確保其安全。我們嘗試以減少影響的方式進行更新，但有時，如果沒有成功移出 Pod，則必須將其刪除。您可採取一些措施以盡可能地減少中斷。如需詳細資訊，請參閱 [設定 AWS Fargate OS 修補事件的動作](fargate-pod-patching.md)。
+ [適用於 Amazon EKS 的 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-plugins)會安裝在 Fargate 叢集上。您無法將[適用於 Amazon EKS 叢集的替代 CNI 外掛程式](alternate-cni-plugins.md)與 Fargate 節點搭配使用。
+ 在 Fargate 上執行的 Pod 會自動掛載 Amazon EFS 檔案系統，而無需執行手動驅動程式安裝步驟。您不能將動態持久性磁碟區佈建與 Fargate 節點搭配使用，但可以使用靜態佈建。
+ Amazon EKS 不支援 Fargate Spot。
+ 您無法將 Amazon EBS 磁碟區掛載到 Fargate Pod。
+ 您可以在 Fargate 節點上執行 Amazon EBS CSI 控制器，但是 Amazon EBS CSI 節點 DaemonSet 僅能在 Amazon EC2 執行個體上執行。
+ 在 [Kubernetes 任務](https://kubernetes.io/docs/concepts/workloads/controllers/job/)標記為 `Completed` 或 `Failed` 之後，任務建立的 Pod 通常會繼續存在。此行為允許您檢視日誌和結果，但使用 Fargate，如果您之後不清理任務，將產生費用。

  若要在任務完成或失敗後自動刪除相關的 Pod，您可以使用存留時間 (TTL) 控制器來指定時間間隔。下列範例顯示在您的任務資訊清單中指定 `.spec.ttlSecondsAfterFinished`。

  ```
  apiVersion: batch/v1
  kind: Job
  metadata:
    name: busybox
  spec:
    template:
      spec:
        containers:
        - name: busybox
          image: busybox
          command: ["/bin/sh", "-c", "sleep 10"]
        restartPolicy: Never
    ttlSecondsAfterFinished: 60 # <-- TTL controller
  ```

## Fargate 比較表
<a name="_fargate_comparison_table"></a>


| 條件 |  AWS Fargate | 
| --- | --- | 
|  可以部署到 [AWS Outposts](https://docs.aws.amazon.com/outposts/latest/userguide/what-is-outposts.html)   |  否  | 
|  可以部署到 [AWS Local Zone](local-zones.md)   |  否  | 
|  可以執行需要 Windows 的容器  |  否  | 
|  可以執行需要 Linux 的容器  |  是  | 
|  可以執行需要 Inferentia 晶片的工作負載  |  否  | 
|  可以執行需要 GPU 的工作負載  |  否  | 
|  可以執行需要 Arm 處理器的工作負載  |  否  | 
|  可以執行 AWS [Bottlerocket](https://aws.amazon.com/bottlerocket/)   |  否  | 
|  Pod 與其他 Pod 共享核心執行時期環境  |  否：每個 Pod 都有專用核心  | 
|  Pod 會與其他 Pod 共享 CPU、記憶體、儲存體和網路資源。  |  否：每個 Pod 都有專用資源，可以獨立調整大小，以最大化資源使用率。  | 
|  Pod 可以使用的硬體和記憶體比 Pod 規格要求的更多  |  否：Pod 可以使用較大的 vCPU 和記憶體組態重新部署。  | 
|  必須部署和管理 Amazon EC2 執行個體  |  否  | 
|  必須保護、維護和修補 Amazon EC2 執行個體的作業系統  |  否  | 
|  可以在部署節點時提供引導引數，例如額外的 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 引數。  |  否  | 
|  可以將 IP 位址指派給來自不同於將 IP 位址指派給節點之 CIDR 區塊的 Pod。  |  否  | 
|  可以對節點執行 SSH  |  否：沒有節點主機作業系統可供 SSH 使用。  | 
|  可以將自己的自訂 AMI 部署至節點  |  否  | 
|  可以將您自己的自訂 CNI 部署至節點  |  否  | 
|  必須自行更新節點 AMI  |  否  | 
|  必須自行更新節點 Kubernetes 版本  |  否：您未管理節點。  | 
|  可以透過 Pod 使用 Amazon EBS 儲存體  |  否  | 
|  可以透過 Pod 使用 Amazon EFS 儲存體  |   [是](efs-csi.md)   | 
|  可以透過 Pod 使用 Amazon FSx for Lustre 儲存體  |  否  | 
|  可以針對服務使用 Network Load Balancer  |  是，使用[建立 Network Load Balancer](network-load-balancing.md#network-load-balancer) 時   | 
|  Pod 可以在公有子網路中執行  |  否  | 
|  可以將不同的 VPC 安全群組指派給個別 Pod  |  是  | 
|  可以執行 Kubernetes DaemonSets  |  否  | 
|  支援 Pod 資訊清單中的 `HostPort` 和 `HostNetwork`  |  否  | 
|   AWS 區域可用性  |   [部分 Amazon EKS 支援的區域](https://docs.aws.amazon.com/general/latest/gr/eks.html)   | 
|  可以在 Amazon EC2 專用主機上執行容器  |  否  | 
|  定價  |  獨立 Fargate 記憶體和 CPU 組態的成本。每個 Pod 都有自己的成本。如需詳細資訊，請參閱 [AWS Fargate 定價](https://aws.amazon.com/fargate/pricing/)。  | 

# 為您的叢集開始使用 AWS Fargate
<a name="fargate-getting-started"></a>

本主題說明如何開始使用 Amazon EKS 叢集在 AWS Fargate 上執行 Pod。

如果使用 CIDR 區塊限制對叢集公有端點的存取，則建議您也啟用私有端點存取。這樣一來，Fargate Pod 即可與叢集通訊。若不啟用私有端點，您指定用於公有存取的 CIDR 區塊必須包含來自 VPC 的傳出來源。如需詳細資訊，請參閱[叢集 API 伺服器端點](cluster-endpoint.md)。

**先決條件**  
現有的叢集。如果還沒有 Amazon EKS 叢集，請參閱 [開始使用 Amazon EKS](getting-started.md)。

## 步驟 1：確認現有節點可以與 Fargate Pod 進行通訊
<a name="fargate-gs-check-compatibility"></a>

如果正在使用無節點的新叢集，或叢集只有受管節點群組 (請參閱 [透過受管節點群組來簡化節點生命週期](managed-node-groups.md))，您可以跳至 [步驟 2：建立 Fargate Pod 執行角色](#fargate-sg-pod-execution-role)。

假設您正在使用的現有叢集已經具有與其相關聯的節點。請確保在這些節點上的 Pod 可以自由地與在 Fargate 上執行的 Pod 進行通訊。在 Fargate 上執行的 Pod 會自動設定為使用其相關聯之叢集的叢集安全群組。請務必確認叢集中的任何現有節點可以傳送與接收叢集安全群組的流量。受管節點群組也會自動設定為使用叢集安全群組，因此您不需要為此相容性修改或檢查它們 (請參閱 [透過受管節點群組來簡化節點生命週期](managed-node-groups.md))。

對於使用 `eksctl`或 Amazon EKS Managed AWS CloudFormation 範本建立的現有節點群組，您可以將叢集安全群組手動新增至節點。您還可以修改節點群組的 Auto Scaling 群組啟動範本，從而將叢集安全群組連接至執行個體。如需詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的[變更執行個體的安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#SG_Changing_Group_Membership)。

您可以在叢集**的網路**區段 AWS 管理主控台 下的 中，檢查叢集的安全群組。或者，您可以使用下列 CLI AWS 命令來執行此操作。使用此命令時，請以您叢集的名稱取代 `<my-cluster>`。

```
aws eks describe-cluster --name <my-cluster> --query cluster.resourcesVpcConfig.clusterSecurityGroupId
```

## 步驟 2：建立 Fargate Pod 執行角色
<a name="fargate-sg-pod-execution-role"></a>

當您的叢集在 AWS Fargate 上建立 Pod 時，在 Fargate 基礎設施上執行的元件必須代表您呼叫 AWS APIs。Amazon EKS Pod 執行角色提供進行此類工作的 IAM 許可。若要建立 AWS Fargate Pod 執行角色，請參閱 [Amazon EKS Pod 執行 IAM 角色](pod-execution-role.md)。

**注意**  
如果您使用 `--fargate` 選項以 `eksctl` 建立叢集，則您的叢集已擁有 Pod 執行角色，您可以在 IAM 主控台中使用模式 `eksctl-my-cluster-FargatePodExecutionRole-ABCDEFGHIJKL` 找到該角色。同樣地，如果您使用 `eksctl` 建立 Fargate 設定檔，`eksctl` 將建立 Pod 執行角色 (如果該角色尚未建立)。

## 步驟 3：為您的叢集建立 Fargate 設定檔
<a name="fargate-gs-create-profile"></a>

您必須定義 Fargate 設定檔，指定哪些 Pod 在啟動時使用 Fargate，然後才能排程在叢集 Fargate 上執行的 Pod。如需詳細資訊，請參閱[定義哪些 Pod 在啟動時會使用 AWS Fargate](fargate-profile.md)。

**注意**  
若您使用 `--fargate` 選項以 `eksctl` 建立叢集，則您叢集的 Fargate 設定檔已建立完成，並包含在 `kube-system` 和 `default` 命名空間中所有 Pod 的選取器。使用下列程序來為您想要搭配 Fargate 使用的任何其他命名空間建立 Fargate 描述檔。

您可以使用下列任一工具建立 Fargate 設定檔：
+  [`eksctl`](#eksctl_fargate_profile_create) 
+  [AWS 管理主控台](#console_fargate_profile_create) 

### `eksctl`
<a name="eksctl_fargate_profile_create"></a>

此程序需要 `eksctl` 版本 `0.215.0` 或更新版本。您可使用以下命令檢查您的版本：

```
eksctl version
```

如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的 [Installation](https://eksctl.io/installation) 一節。

 **若要使用 `eksctl` 建立 Fargate 設定檔** 

使用以下 `eksctl` 命令建立您的 Fargate 設定檔，並以您自己的值取代每一個 `<example value>`。您必須指定一個命名空間。不過，`--labels` 選項並非必要項目。

```
eksctl create fargateprofile \
    --cluster <my-cluster> \
    --name <my-fargate-profile> \
    --namespace <my-kubernetes-namespace> \
    --labels <key=value>
```

對於 `<my-kubernetes-namespace>` 和 `<key=value>` 標籤可以使用某些萬用字元。如需詳細資訊，請參閱[Fargate 設定檔萬用字元](fargate-profile.md#fargate-profile-wildcards)。

### AWS 管理主控台
<a name="console_fargate_profile_create"></a>

 **若要使用 AWS 管理主控台 建立 Fargate 設定檔** 

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要為其建立 Fargate 設定檔的叢集。

1. 選擇 **Compute** (運算) 索引標籤。

1. 在 **Fargate profiles** (Fargate 設定檔) 下，選擇 **Add Fargate profile** (新增 Fargate 設定檔)。

1. 在 **Configure Fargate profile** (設定 Fargate 設定檔) 頁面上，執行以下操作：

   1. 對於 **Name** (名稱)，輸入您 Fargate 描述檔的名稱。名稱必須是唯一的。

   1. 對於 **Pod 執行角色**，請選擇要搭配您的 Fargate 設定檔使用的 Pod 執行角色。只會顯示具有 `eks-fargate-pods.amazonaws.com` 服務委託人的 IAM 角色。如果未列出任何角色，您必須建立一個。如需詳細資訊，請參閱[Amazon EKS Pod 執行 IAM 角色](pod-execution-role.md)。

   1. 視需要修改選取的**子網路**。
**注意**  
只有私有子網路支援在 Fargate 上執行的 Pod。

   1. 對於 **Tags** (標籤)，您可以選擇標記 Fargate 設定檔。這些標籤不會傳播至與設定檔相關聯的其他資源，例如 Pod。

   1. 選擇**下一步**。

1. 在**設定 Pod 選擇**頁面上，執行以下作業：

   1. 針對**命名空間**，輸入與 Pod 相符的命名空間。
      + 您可以使用特定的命名空間進行比對，例如 `kube-system` 或 `default`。
      + 您可以使用某些萬用字元 (例如 `prod-*`) 來比對多個命名空間 (例如 `prod-deployment` 和 `prod-test`)。如需詳細資訊，請參閱[Fargate 設定檔萬用字元](fargate-profile.md#fargate-profile-wildcards)。

   1. (選用) 將 Kubernetes 標籤新增至選取器。將其特別新增至需與特定命名空間中的 Pod 相符的選取器。
      + 您可以將標籤 `infrastructure: fargate` 新增至選取器，因此只有在也有 `infrastructure: fargate` Kubernetes 標籤之指定命名空間中的 Pod 與選取器相符。
      + 您可以使用某些萬用字元 (例如 `key?: value?`) 來比對多個命名空間 (例如 `keya: valuea` 和 `keyb: valueb`)。如需詳細資訊，請參閱[Fargate 設定檔萬用字元](fargate-profile.md#fargate-profile-wildcards)。

   1. 選擇**下一步**。

1. 在 **Review and create** (檢閱和建立) 頁面，檢閱您 Fargate 設定檔的資訊並選擇 **Create** (建立)。

## 步驟 4：更新 CoreDNS
<a name="fargate-gs-coredns"></a>

CoreDNS 預設為在 Amazon EKS 叢集上的 Amazon EC2 基礎設施上執行。若您希望*僅*在叢集的 Fargate 上執行 Pod，請完成以下步驟。

**注意**  
如果透過 `--fargate` 選項使用 `eksctl` 建立叢集，您可以直接跳至 [後續步驟](#fargate-gs-next-steps)。

1. 使用下列命令來刪除 CoreDNS 的 Fargate 設定檔。使用您的叢集名稱取代 `<my-cluster>`、使用您的帳戶 ID 取代 `<111122223333>`、使用您的 Pod 執行角色名稱取代 `<AmazonEKSFargatePodExecutionRole>`，並使用私有子網路的 ID 取代 `<000000000000000a>`、`<000000000000000b>` 和 `<000000000000000c>`。若沒有 Pod 執行角色，則必須先建立一個 (請參閱 [步驟 2：建立 Fargate Pod 執行角色](#fargate-sg-pod-execution-role))。
**重要**  
角色 ARN 不能包含 `/` 之外的[路徑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names)。例如，如果您的角色名稱是 `development/apps/AmazonEKSFargatePodExecutionRole`，則您必須在指定角色的 ARN 時將其變更為 `AmazonEKSFargatePodExecutionRole`。角色 ARN 的格式必須是 ` arn:aws: iam::<111122223333>:role/<AmazonEKSFargatePodExecutionRole>`。

   ```
   aws eks create-fargate-profile \
       --fargate-profile-name coredns \
       --cluster-name <my-cluster> \
       --pod-execution-role-arn arn:aws: iam::<111122223333>:role/<AmazonEKSFargatePodExecutionRole> \
       --selectors namespace=kube-system,labels={k8s-app=kube-dns} \
       --subnets subnet-<000000000000000a> subnet-<000000000000000b> subnet-<000000000000000c>
   ```

1. 觸發 `coredns` 部署的推展。

   ```
   kubectl rollout restart -n kube-system deployment coredns
   ```

## 後續步驟
<a name="fargate-gs-next-steps"></a>
+ 您可以透過以下工作流程開始遷移現有的應用程式，以在 Fargate 上執行。

  1.  [建立 Fargate 設定檔](fargate-profile.md#create-fargate-profile)，與您的應用程式的 Kubernetes 命名空間和 Kubernetes 標籤相符。

  1. 刪除並重建新立任何現有 Pod，以便在 Fargate 上對其進行排程。修改 `<namespace>` 和 `<deployment-type>`，以更新您的特定 Pod。

     ```
     kubectl rollout restart -n <namespace> deployment <deployment-type>
     ```
+ 部署 [透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md) 來允許您在 Fargate 執行的 Pod 輸入物件。
+ 您可以使用 [透過垂直 Pod 自動擴展器來調整 Pod 資源](vertical-pod-autoscaler.md) 為 Fargate Pod 設定 CPU 和記憶體的初始正確大小，然後使用 [使用 Horizontal Pod Autoscaler 擴展 Pod 部署](horizontal-pod-autoscaler.md) 來擴展這些 Pod。若要讓 Vertical Pod Autoscaler 自動將 Pod 重新部署到具有較高 CPU 和記憶體組合的 Fargate，請將 Vertical Pod Autoscaler 的模式設定為 `Auto` 或 `Recreate`。這是為了確認功能可以運作正確。如需詳細資訊，請參閱 GitHub 上的 [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#quick-start) 文件。
+ 請遵循[以下說明](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-EKS-otel.html)設定 [AWS Distro for OpenTelemetry](https://aws.amazon.com/otel) (ADOT) 收集器，以便監控應用程式。

# 定義哪些 Pod 在啟動時會使用 AWS Fargate
<a name="fargate-profile"></a>

您必須定義至少一個 Fargate 設定檔，指定哪些 Pod 在啟動時使用 Fargate，才能排程您叢集中 Fargate 上的 Pod。

管理員可以使用 Fargate 設定檔宣告哪些 Pod 要在 Fargate 上執行。您可以透過設定檔的選取器來執行此操作。您最多可以將五個選取器新增至每個設定檔。每個選取器必須包含一個命名空間。選取器還可以包括標籤。標籤欄位由多個選用鍵/值對組成。與選取器相符的 Pod 會排程在 Fargate 上執行。比對 Pod 時，會使用命名空間和在選取器中指定的標籤。如果命名空間選取器未以標籤定義，Amazon EKS 會嘗試使用設定檔，將以該命名空間執行的所有 Pod 排程至 Fargate。如果要排程的 Pod 符合 Fargate 設定檔中的任一選取器，則該 Pod 會在 Fargate 上排程。

如果 Pod 與多個 Fargate 設定檔相符，您可以將下列 Kubernetes 標籤新增至 Pod 規格，以指定 Pod 使用哪個設定檔：`eks.amazonaws.com/fargate-profile: my-fargate-profile`。Pod 必須與該設定檔中的選取器相符，才能排程至 Fargate。Kubernetes 親和性/反親和性規則不適用，並且對 Amazon EKS Fargate Pod 而言也非必要。

建立 Fargate 設定檔時，您必須指定 Pod 執行角色。此執行角色適用於使用設定檔在 Fargate 基礎設施上執行的 Amazon EKS 元件。其會新增至叢集的 Kubernetes [角色型存取控制](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) (RBAC)，以進行身分授權。這樣一來，在 Fargate 基礎設施上執行的 `kubelet` 就可以註冊到您的 Amazon EKS 叢集，並作為節點出現在您的叢集中。Pod 執行角色也為 Fargate 基礎結構提供 IAM 許可，以允許對 Amazon ECR 映像儲存庫的讀取存取權。如需詳細資訊，請參閱 [Amazon EKS Pod 執行 IAM 角色](pod-execution-role.md)。

Fargate 設定檔無法變更。不過，您可以建立新的已更新設定檔來取代現有設定檔，然後刪除原始的設定檔。

**注意**  
刪除設定檔時，使用 Fargate 設定檔執行的任何 Pod 將停止並進入待定狀態。

如果在叢集中的任何 Fargate 設定檔處於 `DELETING` 狀態，您必須等候該 Fargate 設定檔刪除後，才能在該叢集建立任何其他設定檔。

**注意**  
Fargate 目前不支援 Kubernetes [topologySpreadConstraints](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/)。

Amazon EKS 和 Fargate 會嘗試在 Fargate 設定檔所定義的每個子網路中散佈 Pod。不過，最終可能會產生不均勻的散佈結果。如果必須產生均勻的散佈結果，請使用兩個 Fargate 設定檔。在您想要部署兩個複本且不希望任何停機時間的情況下，均勻的散佈結果相當重要。我們建議每個設定檔只定義一個子網路。

## Fargate 描述檔元件
<a name="fargate-profile-components"></a>

下列元件包含在 Fargate 描述檔中。

 **Pod 執行角色**   
當您的叢集在 AWS Fargate 上建立 Pod 時，在 Fargate 基礎結構上執行的 `kubelet` 必須代表您呼叫 AWS API。例如，它必須透過呼叫從 Amazon ECR 提取容器映像。Amazon EKS Pod 執行角色提供進行此類工作的 IAM 許可。  
建立 Fargate 設定檔時，您必須指定要搭配 Pod 使用的 Pod 執行角色。此角色會新增至叢集的 Kubernetes [角色型存取控制](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) (RBAC)，以進行身分授權。這是為了讓在 Fargate 基礎結構上執行的 `kubelet` 可以註冊到您的 Amazon EKS 叢集並作為節點出現在您的叢集中。如需詳細資訊，請參閱 [Amazon EKS Pod 執行 IAM 角色](pod-execution-role.md)。

 **子網路**   
要在其中啟動 Pod 並使用該設定檔的子網路 ID。目前不會對在 Fargate 上執行的 Pod 指派公有 IP 位址。因此，此參數僅接受私有子網路 (不具網際網路閘道的直接路由)。

 **選取器**   
要與 Pod 相符的選取器，以使用此 Fargate 設定檔。您最多可在一個 Fargate 設定檔中指定五個選取器。選取器具有下列元件：  
+  **命名空間**：您必須指定選取器的命名空間。選取器僅與在此命名空間中建立的 Pod 相符。不過，您可以建立多個選取器來定義多個命名空間。
+  **標籤**：您可以選擇指定符合選取器的 Kubernetes 標籤。選取器僅與擁有在選取器中指定之所有標籤的 Pod 相符。

## Fargate 設定檔萬用字元
<a name="fargate-profile-wildcards"></a>

除了 Kubernetes 允許的字元之外，您還可以在命名空間、標籤索引鍵和標籤值的選取器條件中使用 `*` 和 `?`：
+  `*` 代表無、一個或多個字元。例如，`prod*` 可以代表 `prod` 和 `prod-metrics`。
+  `?` 代表單一字元 (例如，`value?` 可以代表 `valuea`)。不過，它不能代表 `value` 和 `value-a`，因為 `?` 只能代表確切一個字元。

這些萬用字元適用於任何位置和組合 (例如，`prod*`、`*dev`，以及 `frontend*?`)。其他萬用字元和模式比對形式 (例如規則運算式) 則不支援。

如果 Pod 規格中的命名空間和標籤有多個相符的設定檔，Fargate 會根據設定檔名稱的英數字元排序選擇設定檔。例如，如果設定檔 A (名稱為 `beta-workload`) 和設定檔 B (名稱為 `prod-workload`) 都具有要啟動的 Pod 的相符選取器，則 Fargate 將為 Pod 選擇設定檔 A (`beta-workload`)。Pod 在 Pod 上具有含設定檔 A 的標籤 (例如，`eks.amazonaws.com/fargate-profile=beta-workload`)。

如果您想要將現有的 Fargate Pod 移轉至使用萬用字元的新設定檔，有兩種方法：
+ 使用相符的選取器建立新的設定檔，然後刪除舊設定檔。標有舊設定檔的 Pod 會重新排程為新的相符設定檔。
+ 如果您想要移轉工作負載，但不確定每個 Fargate Pod 上有哪些 Fargate 標籤，則可使用以下方法。建立新的設定檔，其名稱在同一叢集上的設定檔中按英數字元順序排列在第一位。然後，回收需要移轉到新設定檔的 Fargate Pod。

## 建立 Fargate 設定檔
<a name="create-fargate-profile"></a>

本節說明如何建立 Fargate 設定檔。您還必須建立用於 Fargate 設定檔的 Pod 執行角色。如需詳細資訊，請參閱 [Amazon EKS Pod 執行 IAM 角色](pod-execution-role.md)。只有私有子網路支援在 Fargate 上執行的 Pod (具有對 AWS 服務的 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)存取，但沒有網際網路閘道的直接路由)。因此，您叢集的 VPC 必須具有可用的私有子網路。

您可以執行下列操作來建立設定檔：
+  [`eksctl`](#eksctl_create_a_fargate_profile) 
+  [AWS 管理主控台](#console_create_a_fargate_profile) 

## `eksctl`
<a name="eksctl_create_a_fargate_profile"></a>

 **若要使用 `eksctl` 建立 Fargate 設定檔** 

使用下列 `eksctl` 命令建立您的 Fargate 設定檔，並以您自己的值取代每一個範例值。您必須指定一個命名空間。不過，`--labels` 選項並非必要項目。

```
eksctl create fargateprofile \
    --cluster my-cluster \
    --name my-fargate-profile \
    --namespace my-kubernetes-namespace \
    --labels key=value
```

對於 `my-kubernetes-namespace` 和 `key=value` 標籤可以使用某些萬用字元。如需詳細資訊，請參閱 [Fargate 設定檔萬用字元](#fargate-profile-wildcards)。

## AWS 管理主控台
<a name="console_create_a_fargate_profile"></a>

 **若要使用 AWS 管理主控台 建立 Fargate 設定檔** 

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 選擇要為其建立 Fargate 設定檔的叢集。

1. 選擇 **Compute** (運算) 索引標籤。

1. 在 **Fargate profiles** (Fargate 設定檔) 下，選擇 **Add Fargate profile** (新增 Fargate 設定檔)。

1. 在 **Configure Fargate profile** (設定 Fargate 設定檔) 頁面上，執行以下作業：

   1. 對於 **Name** (名稱)，輸入 Fargate 設定檔的唯一名稱，例如 `my-profile`。

   1. 對於 **Pod 執行角色**，請選擇要搭配您的 Fargate 設定檔使用的 Pod 執行角色。只會顯示具有 `eks-fargate-pods.amazonaws.com` 服務委託人的 IAM 角色。如果未列出任何角色，您必須建立一個。如需詳細資訊，請參閱 [Amazon EKS Pod 執行 IAM 角色](pod-execution-role.md)。

   1. 視需要修改選取的**子網路**。
**注意**  
只有私有子網路支援在 Fargate 上執行的 Pod。

   1. 對於 **Tags** (標籤)，您可以選擇標記 Fargate 設定檔。這些標籤不會傳播至與設定檔相關聯的其他資源，例如 Pod。

   1. 選擇**下一步**。

1. 在**設定 Pod 選擇**頁面上，執行以下作業：

   1. 針對**命名空間**，輸入與 Pod 相符的命名空間。
      + 您可以使用特定的命名空間進行比對，例如 `kube-system` 或 `default`。
      + 您可以使用某些萬用字元 (例如 `prod-*`) 來比對多個命名空間 (例如 `prod-deployment` 和 `prod-test`)。如需詳細資訊，請參閱 [Fargate 設定檔萬用字元](#fargate-profile-wildcards)。

   1. (選用) 將 Kubernetes 標籤新增至選取器。將其特別新增至需與特定命名空間中的 Pod 相符的選取器。
      + 您可以將標籤 `infrastructure: fargate` 新增至選取器，因此只有在也有 `infrastructure: fargate` Kubernetes 標籤之指定命名空間中的 Pod 與選取器相符。
      + 您可以使用某些萬用字元 (例如 `key?: value?`) 來比對多個命名空間 (例如 `keya: valuea` 和 `keyb: valueb`)。如需詳細資訊，請參閱 [Fargate 設定檔萬用字元](#fargate-profile-wildcards)。

   1. 選擇**下一步**。

1. 在 **Review and create** (檢閱和建立) 頁面，檢閱您 Fargate 設定檔的資訊並選擇 **Create** (建立)。

# 刪除 Fargate 描述檔
<a name="delete-fargate-profile"></a>

本主題說明如何刪除 Fargate 設定檔。當您刪除 Fargate 描述檔時，使用描述檔排程至 Fargate 的任何 Pod 都會遭到刪除。若這些 Pod 符合其他 Fargate 設定檔，其便會使用該設定檔在 Fargate 上排程。如果其不再符合任何 Fargate 設定檔，則不會排程至 Fargate，且可能仍為待定狀態。

一個叢集中一次只能有一個 Fargate 描述檔可以處於 `DELETING` 狀態。請等候 Fargate 描述檔完成刪除動作，才可以刪除該叢集中的任何其他描述檔。

您可以使用以下任何工具刪除設定檔：
+  [`eksctl`](#eksctl_delete_a_fargate_profile) 
+  [AWS 管理主控台](#console_delete_a_fargate_profile) 
+  [AWS CLI](#awscli_delete_a_fargate_profile) 

## `eksctl`
<a name="eksctl_delete_a_fargate_profile"></a>

 **使用 `eksctl` 刪除 Fargate 設定檔** 

使用下列命令從叢集刪除設定檔。使用您自己的值取代每一個*範例值*。

```
eksctl delete fargateprofile  --name my-profile --cluster my-cluster
```

## AWS 管理主控台
<a name="console_delete_a_fargate_profile"></a>

 **使用 AWS 管理主控台 刪除 Fargate 設定檔** 

1. 開啟 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中選擇**叢集**。在叢集清單中，選擇您要從中刪除 Fargate 設定檔的叢集。

1. 選擇 **Compute** (運算) 索引標籤。

1. 選擇要刪除的 Fargate 設定檔，然後選擇 **Delete** (刪除)。

1. 在 **Delete Fargate profile** (刪除 Fargate 設定檔) 頁面上，輸入設定檔名稱，然後選擇 **Delete** (刪除)。

## AWS CLI
<a name="awscli_delete_a_fargate_profile"></a>

 **使用 AWS CLI 刪除 Fargate 設定檔** 

使用下列命令從叢集刪除設定檔。使用您自己的值取代每一個*範例值*。

```
aws eks delete-fargate-profile --fargate-profile-name my-profile --cluster-name my-cluster
```

# 了解 Fargate Pod 組態詳細資訊
<a name="fargate-pod-configuration"></a>

本節會描述部分適用於在 AWS Fargate 上執行 Kubernetes Pod 的專用 Pod 組態詳細資訊。

## Pod CPU 和記憶體
<a name="fargate-cpu-and-memory"></a>

透過 Kubernetes，您可定義請求、最低 vCPU 數量，以及配置給 Pod 中每個容器的記憶體資源。Pod 是由 Kubernetes 排程，以確保至少每個 Pod 的請求資源可在運算資源上使用。如需詳細資訊，請參閱 Kubernetes 文件中的[管理容器的運算資源](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)。

**注意**  
由於 Amazon EKS Fargate 的每個節點僅會執行一個 Pod，因此不會發生在資源較少的情況下將 Pod 移出的情況。所有 Amazon EKS Fargate Pod 都是以保證優先順序的方式執行，因此請求的 CPU 和記憶體必須等同於所有容器的限制。如需詳細資訊，請參閱《Kubernetes 說明文件》中的[設定 Pod 的服務品質](https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/)。

當 Pod 在 Fargate 上排程時，在 Pod 規格內的 vCPU 與記憶體保留決定了多少 CPU 和記憶體會佈建給 Pod。
+ 任何 Init 容器的最大請求用於判斷 Init 請求 vCPU 和記憶體需求。
+ 所有長期執行容器的請求會加總，以判斷長期執行請求 vCPU 和記憶體需求。
+ 先前兩個值中較大的值會選擇作為用於您 Pod 的 vCPU 和記憶體請求。
+ Fargate 會將 256 MB 新增至所需 Kubernetes 元件之每個 Pod 的記憶體保留 (`kubelet`、`kube-proxy` 和 `containerd`)。

Fargate 會四捨五入至以下最接近 vCPU 和記憶體請求總和的運算組態，以確保 Pod 隨時擁有其執行所需的資源。

若您未指定 vCPU 和記憶體的組合，則會使用最小可用的組合 (0.25 個 vCPU 和 0.5 GB 記憶體)。

下表顯示可用於在 Fargate 上執行之 Pod 的 vCPU 和記憶體組合。


| vCPU 數值 | 記憶體數值 | 
| --- | --- | 
|  .25 vCPU  |  0.5 GB、1 GB、2 GB  | 
|  .5 vCPU  |  1 GB、2 GB、3 GB、4 GB  | 
|  1 vCPU  |  2 GB、3 GB、4 GB、5 GB、6 GB、7 GB、8 GB  | 
|  2 vCPU  |  介於 4 GB 與 16 GB 之間，以 1 GB 為單位遞增  | 
|  4 vCPU  |  介於 8 GB 與 30 GB 之間，以 1 GB 為單位遞增  | 
|  8 vCPU  |  介於 16 GB 與 60 GB 之間，以 4 GB 為單位遞增  | 
|  16 vCPU  |  介於 32 GB 與 120 GB 之間，以 8 GB 為單位遞增  | 

為 Kubernetes 元件預訂的額外記憶體，可能會導致 Fargate 任務佈建了超出原先請求數量的 vCPU。例如，對 1 個 vCPU 和 8 GB 記憶體的請求將會新增 256 MB 至其記憶體請求，並且會佈建具有 2 個 vCPU 和 9 GB 記憶體的 Fargate 任務，因為沒有任何具有 1 個 vCPU 和 9 GB 記憶體的可用任務。

在 Fargate 上執行的 Pod 大小與 Kubernetes 使用 `kubectl get nodes` 報告的節點大小之間沒有相關性。報告的節點大小通常大於 Pod 的容量。您可以使用下列命令確認 Pod 容量。以您 Pod 的命名空間來取代*預設*，並以您 Pod 的名稱來取代 *pod-name*。

```
kubectl describe pod --namespace default pod-name
```

範例輸出如下。

```
[...]
annotations:
    CapacityProvisioned: 0.25vCPU 0.5GB
[...]
```

`CapacityProvisioned` 註釋代表強制執行的 Pod 容量，並決定在 Fargate 上執行 Pod 的成本。如需運算組態的定價資訊，請參閱 [AWS Fargate 定價](https://aws.amazon.com/fargate/pricing/)。

## Fargate 儲存
<a name="fargate-storage"></a>

在 Fargate 上執行的 Pod 會自動掛載 Amazon EFS 檔案系統，而無需執行手動驅動程式安裝步驟。您不能將動態持久性磁碟區佈建與 Fargate 節點搭配使用，但可以使用靜態佈建。如需詳細資訊，請參閱 GitHub 上的 [Amazon EFS CSI 驅動程式](https://github.com/kubernetes-sigs/aws-efs-csi-driver/blob/master/docs/README.md)。

佈建時，在 Fargate 上執行的每個 Pod 均會收到預設 20 GiB 的暫時性儲存。此類型的儲存會在 Pod 停止後刪除。在 Fargate 上啟動的新 Pod，預設皆會啟用暫時性儲存磁碟區的加密。暫時性 Pod 儲存會以使用 AWS Fargate 受管金鑰的 AES-256 加密演算法來加密。

**注意**  
在 Fargate 上執行的 Amazon EKS Pod 預設可用儲存空間少於 20 GiB。這是因為部分空間由 Pod 內部載入的 `kubelet` 和其他 Kubernetes 模組使用。

您可以增加暫時性儲存的總量，最多可達 175 GiB。若要使用 Kubernetes 設定大小，請將 `ephemeral-storage` 資源的請求指定到 Pod 中的每個容器。當 Kubernetes 排程了 Pod，它可以確保每個 Pod 的資源請求總計少於 Fargate 任務的容量。如需詳細資訊，請參閱 Kubernetes 文件中的 [Pod 和容器的資源管理](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/)。

Amazon EKS Fargate 佈建的暫時性儲存空間比系統使用目的之要求更多。例如，100 GiB 的請求將佈建具有 115 GiB 暫時性儲存的 Fargate 任務。

# 設定 AWS Fargate OS 修補事件的動作
<a name="fargate-pod-patching"></a>

Amazon EKS 會定期修補 AWS Fargate 節點的 OS 來確保節點的安全。作為修補程序的一部分，我們會回收節點以安裝作業系統修補程式。以對您的服務產生最小影響的方式嘗試更新。但是，如果未成功移出 Pod，有時必須將其刪除。您可以採取以下措施，以最大限度地減少潛在的中斷：
+ 設定適當的 Pod 中斷預算 (PDB)，以控制同時關閉的 Pod 數量。
+ 建立 Amazon EventBridge 規則，以便在刪除 Pod 之前處理失敗的移出事件。
+ 在您收到的通知中發布的移出日期之前，手動重新啟動受影響的 Pod。
+ 在 AWS 使用者通知中建立通知組態。

Amazon EKS 與 Kubernetes 社群密切合作，以盡快提供錯誤修復和安全修補程式。所有 Fargate Pod 均從最新的 Kubernetes 修補程式版本開始，該修補程式版本可從 Amazon EKS 取得，用於您叢集的 Kubernetes 版本。若您的 Pod 具有較舊的修補程式版本，Amazon EKS 可能會予以回收，以將其更新到最新版本。這可確保您的 Pod 配備了最新的安全更新。這樣，如果有一個關鍵 [Common Vulnerabilities and Exposures](https://cve.mitre.org/) (CVE) 問題，您將隨時了解最新資訊，以降低安全風險。

更新 AWS Fargate OS 時，Amazon EKS 會傳送通知給您，其中包括受影響的資源和即將移出 Pod 的日期。如果提供的移出日期不方便，您可以選擇在通知中發布的移出日期之前，手動重新啟動受影響的 Pod。在您收到通知之前建立的任何 Pod 都會被移出。如需如何手動重新啟動 Pod 的進一步指示，請參閱 [Kubernetes 文件](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_rollout/kubectl_rollout_restart)。

若要限制在回收 Pod 時同時關閉的 Pod 數量，您可以設定 Pod 中斷預算 (PDB)。您可以使用 PDB 根據每個應用程式的要求定義最低可用性，同時仍允許進行更新。PDB 的最低可用性必須小於 100%。如需詳細資訊，請參閱 Kubernetes 文件中的[為應用程式指定中斷預算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/)。

Amazon EKS 使用[移出 API](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/#eviction-api) 以安全地消耗 Pod，同時尊重您為應用程式設定的 PDB。可用區域將 Pod 移出，以最大限度地減少影響。如果移出成功，新 Pod 將會取得最新的修補程式，且無須採取進一步的動作。

當 Pod 的移出失敗時，Amazon EKS 會向您的帳戶傳送一個事件，其中包含有關移出失敗的 Pod 的詳細資訊。您可以在計劃終止時間之前對訊息執行操作。具體時間根據修補程式的緊迫性而有所不同。到了該時間時，Amazon EKS 會再次嘗試移出 pod。但是，這次如果移出失敗，則不會傳送新事件。如果移出再次失敗，則會定期刪除現有的 Pod，以便新 Pod 具有最新的修補程式。

以下是當 Pod 移出失敗時收到的範例事件。其中包含有關叢集、Pod 名稱、Pod 命名空間、Fargate 設定檔和計劃終止時間的詳細資訊。

```
{
    "version": "0",
    "id": "12345678-90ab-cdef-0123-4567890abcde",
    "detail-type": "EKS Fargate Pod Scheduled Termination",
    "source": "aws.eks",
    "account": "111122223333",
    "time": "2021-06-27T12:52:44Z",
    "region": "region-code",
    "resources": [
        "default/my-database-deployment"
    ],
    "detail": {
        "clusterName": "my-cluster",
        "fargateProfileName": "my-fargate-profile",
        "podName": "my-pod-name",
        "podNamespace": "default",
        "evictErrorMessage": "Cannot evict pod as it would violate the pod's disruption budget",
        "scheduledTerminationTime": "2021-06-30T12:52:44.832Z[UTC]"
    }
}
```

此外，將多個 PDB 與 Pod 關聯可能會導致移出失敗事件。此事件傳回以下錯誤訊息。

```
"evictErrorMessage": "This pod has multiple PodDisruptionBudget, which the eviction subresource does not support",
```

您可以根據此事件建立所需的動作。例如，您可以調整 Pod 中斷預算 (PDB)，以控制如何移出 Pod。更具體地說，假設您從指定可用 Pod 的目標百分比的 PDB 開始。在升級期間強制終止 Pod 之前，您可以將 PDB 調整為不同百分比的 Pod。若要接收此事件，您必須在叢集所屬的 AWS 帳戶和 AWS 區域中建立 Amazon EventBridge 規則。規則必須使用以下**自訂模式**。如需詳細資訊，請參閱*《Amazon EventBridge 使用者指南》*中的[建立對事件做出反應的 Amazon EventBridge 規則](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-rule.html)。

```
{
  "source": ["aws.eks"],
  "detail-type": ["EKS Fargate Pod Scheduled Termination"]
}
```

可以為事件設定合適的目標以進行擷取。如需可用目標的完整清單，請參閱*《Amazon EventBridge 使用者指南》*中的 [Amazon EventBridge 目標](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html)。您也可以在 AWS 使用者通知中建立通知組態。使用 AWS 管理主控台 建立通知時，請在**事件規則**下，選擇 **Elastic Kubernetes Service (EKS)** 作為 **AWS 服務名稱**，並選擇 **EKS Fargate Pod 排程終止** 作為**事件類型**。如需詳細資訊，請參閱《AWS 使用者通知使用者指南》中的 [AWS 使用者通知入門](https://docs.aws.amazon.com/notifications/latest/userguide/getting-started.html)。

如需有關 EKS Pod 移出的常見問答集，請參閱 * AWS re:Post* 中的[常見問答集：Fargate Pod 移出通知](https://repost.aws/knowledge-center/fargate-pod-eviction-notice)。

# 收集 AWS Fargate 應用程式和用量指標
<a name="monitoring-fargate-usage"></a>

您可以收集 AWS Fargate 的系統指標和 CloudWatch 用量指標。

## 應用程式指標
<a name="fargate-application-metrics"></a>

對於在 Amazon EKS 和 AWS Fargate 上執行的應用程式，您可以使用 AWS Distro for OpenTelemetry (ADOT)。ADOT 允許您收集系統指標並將其傳送到 CloudWatch Container Insights 儀表板。若要在 Fargate 上執行的應用程式開始使用 ADOT，請參閱 ADOT 文件中的[使用 CloudWatch Container Insights 搭配 AWS Distro for OpenTelemetry](https://aws-otel.github.io/docs/getting-started/container-insights)。

## 用量指標
<a name="fargate-usage-metrics"></a>

您可以使用 CloudWatch 用量指標來了解您帳戶的資源用量。使用這些指標，以 CloudWatch 圖表和儀表板視覺化目前的服務使用狀況。

 AWS Fargate 用量指標對應至 AWS 服務配額。您可以設定警示，在您的用量接近服務配額時發出警示。如需 Fargate 的服務配額詳細資訊，請參閱 [檢視與管理 Amazon EKS 和 Fargate 服務配額](service-quotas.md)。

 AWS Fargate 會在 ` AWS/Usage` 命名空間中發佈下列指標。


| 指標 | Description | 
| --- | --- | 
|   `ResourceCount`   |  您的帳戶中正在執行的特定資源總數。資源由與指標相關聯的維度定義。  | 

下列維度用於精簡 AWS Fargate 發佈的用量指標。


| 維度 | Description | 
| --- | --- | 
|   `Service`   |  包含資源 AWS 的服務名稱。對於 AWS Fargate 用量指標，此維度的值為 `Fargate`。  | 
|   `Type`   |  正在報告的實體類型。目前， AWS Fargate 用量指標的唯一有效值為 `Resource`。  | 
|   `Resource`   |  正在執行的資源類型。 目前， AWS Fargate 會傳回 Fargate 隨需用量的相關資訊。Fargate 隨需用量的資源值為 `OnDemand`。 [注意] ==== Fargate 隨需用量結合了使用 Fargate 的 Amazon EKS Pod、使用 Fargate 啟動類型的 Amazon EKS 任務，以及使用 `FARGATE` 容量提供者的 Amazon ECS 任務。 ====  | 
|   `Class`   |  正在追蹤的資源類別。目前， AWS Fargate 不使用類別維度。  | 

### 建立 CloudWatch 警示來監控 Fargate 資源用量指標
<a name="service-quota-alarm"></a>

 AWS Fargate 提供對應至 Fargate 隨需資源用量 AWS 服務配額的 CloudWatch 用量指標。在 Service Quotas 主控台中，您可以在圖表上一目了然地查看使用情況。您也可以設定警示，在您的用量接近服務配額時發出警示。如需詳細資訊，請參閱[收集 AWS Fargate 應用程式和用量指標](#monitoring-fargate-usage)。

使用下列步驟，根據其中一個 Fargate 資源用量指標來建立 CloudWatch 警示。

1. 開啟 Service Quotas 主控台，網址為 https://console.aws.amazon.com/servicequotas/。

1. 在左側導覽窗格中，選擇 ** AWS 服務**。

1. 從** AWS 服務**清單中，搜尋並選取 ** AWS Fargate**。

1. 在 **Service quotas** (服務配額) 清單中，選擇您要為其建立警示的 Fargate 用量配額。

1. 在 Amazon CloudWatch alarms (Amazon CloudWatch 警示) 區段中，選擇 **Create** (建立)。

1. 針對 **Alarm threshold (警示閾值)**，選擇您想要多少百分比的套用配額值設為警示值。

1. 針對 **Alarm name (警示名稱)**，輸入警示的名稱，然後選擇 **Create (建立)**。

# 為您的叢集啟動 AWS Fargate 記錄
<a name="fargate-logging"></a>

Amazon EKS on Fargate 提供了基於 Fluent Bit 的內建日誌路由器。這表示您沒有明確地執行 Fluent Bit 容器以作為附屬，但 Amazon 會為您執行。您只需設定日誌路由器即可。組態會透過必須符合以下條件的專用 `ConfigMap` 生效：
+ 名稱 `aws-logging` 
+ 在名為 `aws-observability` 的專用命名空間中建立 
+ 不可超過 5300 個字元。

一旦建立了 `ConfigMap`，Amazon EKS on Fargate 會使用其自動偵測並設定日誌路由器。Fargate 使用 Fluent Bit 的 AWS 版本，是由 AWS 管理的 Fluent Bit 上游合規發行版本。如需詳細資訊，請參閱 GitHub 上的[適用於 Fluent Bit 的 AWS](https://github.com/aws/aws-for-fluent-bit)。

日誌路由器可讓您使用 AWS 服務廣度進行日誌分析和儲存。您可以直接將日誌從 Fargate 串流至 Amazon CloudWatch 和 Amazon OpenSearch Service。您也可以透過 [Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/) 將日誌串流至 [Amazon S3](https://aws.amazon.com/s3/)、[Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/) 與合作夥伴工具等目的地。
+ 指定您部署 Fargate Pod 的現有 Kubernetes 命名空間的現有 Fargate 設定檔。如需詳細資訊，請參閱 [步驟 3：為您的叢集建立 Fargate 設定檔](fargate-getting-started.md#fargate-gs-create-profile)。
+ 現有 Fargate Pod 執行角色。如需詳細資訊，請參閱 [步驟 2：建立 Fargate Pod 執行角色](fargate-getting-started.md#fargate-sg-pod-execution-role)。

## 日誌路由器組態
<a name="fargate-logging-log-router-configuration"></a>

**重要**  
若要成功發布日誌，您叢集所在的 VPC 必須具有對日誌目的地的網路存取權。這主要涉及使用者為其 VPC 自訂輸出規則。如需使用 CloudWatch 的範例，請參閱《*Amazon CloudWatch Logs 使用者指南*》中的[搭配介面 VPC 端點使用 CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)。

在下列步驟中，使用您自己的值取代每一個*範例值*。

1. 建立名為 `aws-observability` 的專用 Kubernetes 命名空間。

   1. 將下列內容儲存到電腦上名為 `aws-observability-namespace.yaml` 的檔案中。`name` 的值必須為 `aws-observability`，且需要 `aws-observability: enabled` 標籤。

      ```
      kind: Namespace
      apiVersion: v1
      metadata:
        name: aws-observability
        labels:
          aws-observability: enabled
      ```

   1. 建立命名空間。

      ```
      kubectl apply -f aws-observability-namespace.yaml
      ```

1. 建立具有 `Fluent Conf` 資料值的 `ConfigMap`，將容器日誌寄送至目的地。Fluent Conf 就是 Fluent Bit，這是一種快速且輕量的日誌處理器組態語言，可用於將容器日誌路由至您選擇的日誌目的地。如需詳細資訊，請參閱 Fluent Bit 文件中的[組態檔案](https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/configuration-file)。
**重要**  
一般 `Fluent Conf` 中包含的主要區段是 `Service`、`Input`、`Filter` 和 `Output`。然而，Fargate 日誌路由器僅接受：  
`Filter` 和 `Output` 區段。
`Parser` 區段。
如果您提供任何其他區段，則這些區段將被拒絕。

   Fargate 日誌路由器管理 `Service` 和 `Input` 區段。其具有下列 `Input` 區段，無法修改，也不需要在您的 `ConfigMap` 中。但是，您可以從中取得洞察，例如記憶體緩衝區限制和套用於日誌的標籤。

   ```
   [INPUT]
       Name tail
       Buffer_Max_Size 66KB
       DB /var/log/flb_kube.db
       Mem_Buf_Limit 45MB
       Path /var/log/containers/*.log
       Read_From_Head On
       Refresh_Interval 10
       Rotate_Wait 30
       Skip_Long_Lines On
       Tag kube.*
   ```

   建立 `ConfigMap` 時，請考慮下列 Fargate 用來驗證欄位的規則：
   +  應該在每個相應的索引鍵下指定 `[FILTER]`、`[OUTPUT]` 和 `[PARSER]`。例如，`[FILTER]` 必須位於 `filters.conf` 之下。您可以在 `filters.conf` 下有一或多個 `[FILTER]`。`[OUTPUT]` 和 `[PARSER]` 區段也應該位於其相應的索引鍵之下。透過指定多個 `[OUTPUT]` 區段中，您可以同時將日誌路由到不同的目的地。
   + Fargate 驗證每個區段所需的索引鍵。`Name` 和 `match` 對於每個 `[FILTER]` 和 `[OUTPUT]` 都是必要項目。`Name` 和 `format` 對於每個 `[PARSER]` 都是必要項目。索引鍵不區分大小寫。
   + `ConfigMap` 中不允許環境變數 (例如 `${ENV_VAR}`)。
   + 在每個 `filters.conf`、`output.conf` 和 `parsers.conf` 中每個指令或鍵值對的縮排必須是相同的。鍵值對必須比指令縮排更多。
   + Fargate 會根據以下支援的篩選條件進行驗證：`grep`、`parser`、`record_modifier`、`rewrite_tag`、`throttle`、`nest`、`modify` 和 `kubernetes`。
   + Fargate 會根據以下支援的輸出進行驗證：`es`、`firehose`、`kinesis_firehose`、`cloudwatch`、`cloudwatch_logs` 和 `kinesis`。
   + 必須在 `ConfigMap` 中提供至少一個支援的 `Output` 外掛程式來啟用記錄。啟用記錄時不需要 `Filter` 和 `Parser`。

     您也可以使用所需的組態在 Amazon EC2 上執行 Fluent Bit，以對因驗證而產生的任何問題進行故障診斷。使用下列範例之一建立您的 `ConfigMap`。
**重要**  
Amazon EKS Fargate 記錄不支援 `ConfigMap` 的動態組態。`ConfigMap` 的任何變更僅適用於新的 Pod。變更不會套用至現有 Pod。

     使用您所需的日誌目的地範例建立 `ConfigMap`。
**注意**  
您也可以將 Amazon Kinesis Data Streams 用於您的日誌目的地。如果您使用 Kinesis Data Streams，請確定 Pod 執行角色已獲 `kinesis:PutRecords` 許可。如需詳細資訊，請參閱《*Fluent Bit：官方手冊*》中的 Amazon Kinesis Data Streams [許可](https://docs.fluentbit.io/manual/pipeline/outputs/kinesis#permissions)。  
**Example**  

------
#### [ CloudWatch ]

   使用 CloudWatch 時，您有兩個輸出選項：
   +  [用 C 編寫的輸出外掛程式](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/cloudwatch) 
   +  [用 Golang 編寫的輸出外掛程式](https://github.com/aws/amazon-cloudwatch-logs-for-fluent-bit) 

   以下範例顯示如何使用 `cloudwatch_logs` 外掛程式將日誌傳送至 CloudWatch。

   1. 將下列內容儲存到名為 `aws-logging-cloudwatch-configmap.yaml` 的檔案中。使用叢集所在的 AWS 區域取代 *region-code*。`[OUTPUT]` 下的參數為必要項目。

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        flb_log_cw: "false"  # Set to true to ship Fluent Bit process logs to CloudWatch.
        filters.conf: |
          [FILTER]
              Name parser
              Match *
              Key_name log
              Parser crio
          [FILTER]
              Name kubernetes
              Match kube.*
              Merge_Log On
              Keep_Log Off
              Buffer_Size 0
              Kube_Meta_Cache_TTL 300s
        output.conf: |
          [OUTPUT]
              Name cloudwatch_logs
              Match   kube.*
              region region-code
              log_group_name my-logs
              log_stream_prefix from-fluent-bit-
              log_retention_days 60
              auto_create_group true
        parsers.conf: |
          [PARSER]
              Name crio
              Format Regex
              Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
              Time_Key    time
              Time_Format %Y-%m-%dT%H:%M:%S.%L%z
      ```

   1. 將清單檔案套用至叢集。

      ```
      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
      ```

------
#### [ Amazon OpenSearch Service ]

   如果您想要將日誌傳送到 Amazon OpenSearch Service，您可以使用 [es](https://docs.fluentbit.io/manual/v/1.5/pipeline/outputs/elasticsearch) 輸出，這是用 C 語言編寫的外掛程式。下列範例說明如何使用該外掛程式將日誌傳送到 OpenSearch。

   1. 將下列內容儲存到名為 `aws-logging-opensearch-configmap.yaml` 的檔案中。使用您自己的值取代每一個*範例值*。

      ```
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: aws-logging
        namespace: aws-observability
      data:
        output.conf: |
          [OUTPUT]
            Name  es
            Match *
            Host  search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com
            Port  443
            Index example
            Type  example_type
            AWS_Auth On
            AWS_Region region-code
            tls   On
      ```

   1. 將清單檔案套用至叢集。

      ```
      kubectl apply -f aws-logging-opensearch-configmap.yaml
      ```

------
#### [ Firehose ]

   將日誌傳送到 Firehose 時，您有兩個輸出選項：
   +  [kinesis\$1firehose](https://docs.fluentbit.io/manual/pipeline/outputs/firehose)：用 C 語言編寫的輸出外掛程式。
   +  [firehose](https://github.com/aws/amazon-kinesis-firehose-for-fluent-bit)：用 Golang 編寫的輸出外掛程式。

     以下範例顯示如何使用 `kinesis_firehose` 外掛程式將日誌傳送到 Firehose。

     1. 將下列內容儲存到名為 `aws-logging-firehose-configmap.yaml` 的檔案中。使用叢集所在的 AWS 區域取代 *region-code*。

        ```
        kind: ConfigMap
        apiVersion: v1
        metadata:
          name: aws-logging
          namespace: aws-observability
        data:
          output.conf: |
            [OUTPUT]
             Name  kinesis_firehose
             Match *
             region region-code
             delivery_stream my-stream-firehose
        ```

     1. 將清單檔案套用至叢集。

        ```
        kubectl apply -f aws-logging-firehose-configmap.yaml
        ```

------

1. 為 Fargate Pod 執行角色設定許可，以將日誌傳送至目的地。

   1. 將您目的地的 IAM 政策下載到您的電腦。  
**Example**  

------
#### [ CloudWatch ]

      將 CloudWatch IAM 政策下載到您的電腦。您也可以在 GitHub 上[檢視政策](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json)。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
      ```

------
#### [ Amazon OpenSearch Service ]

      將 OpenSearch IAM 政策下載到您的電腦。您也可以在 GitHub 上[檢視政策](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json)。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json
      ```

      確認 OpenSearch Dashboards 的存取控制設定正確。OpenSearch 儀表板中的 `all_access role` 需要具有 Fargate Pod 執行角色和 IAM 角色映射。必須為 `security_manager` 角色進行相同的映射。您可以新增先前的映射，方法是選取 `Menu`、`Security`、`Roles`，然後選取個別的角色。如需詳細資訊，請參閱[如何對 CloudWatch Logs 進行故障診斷，以便將其串流至我的 Amazon ES 網域？](https://aws.amazon.com/tr/premiumsupport/knowledge-center/es-troubleshoot-cloudwatch-logs/)。

------
#### [ Firehose ]

      將 Firehose IAM 政策下載到您的電腦。您也可以在 GitHub 上[檢視政策](https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json)。

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
      ```

------

   1. 從您下載的政策檔案建立 IAM 政策。

      ```
      aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
      ```

   1. 使用下列命令，將 IAM 政策連接至為 Fargate 設定檔指定的 Pod 執行角色。使用您的帳戶 ID 取代 *111122223333*。使用您的 Pod 執行角色取代 *AmazonEKSFargatePodExecutionRole* (如需詳細資訊，請參閱 [步驟 2：建立 Fargate Pod 執行角色](fargate-getting-started.md#fargate-sg-pod-execution-role))。

      ```
      aws iam attach-role-policy \
        --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
        --role-name AmazonEKSFargatePodExecutionRole
      ```

### Kubernetes 篩選條件支援
<a name="fargate-logging-kubernetes-filter"></a>

Fluent Bit Kubernetes 篩選條件可讓您將 Kubernetes 中繼資料新增至您的日誌檔案。如需有關篩選條件的相關資訊，請參閱 Fluent Bit 說明文件中的 [Kubernetes](https://docs.fluentbit.io/manual/pipeline/filters/kubernetes)。您可以使用 API 伺服器端點來套用篩選條件。

```
filters.conf: |
    [FILTER]
        Name             kubernetes
        Match            kube.*
        Merge_Log           On
        Buffer_Size         0
        Kube_Meta_Cache_TTL 300s
```

**重要**  
 `Kube_URL`、`Kube_CA_File`、`Kube_Token_Command` 和 `Kube_Token_File` 是服務擁有的組態參數，您無法指定這些參數。Amazon EKS Fargate 會將這些值填入。
 `Kube_Meta_Cache_TTL` 是 Fluent Bit 等待直到其可以與 API 伺服器通訊，以取得最新中繼資料所需的時間。若並未指定 `Kube_Meta_Cache_TTL`，則 Amazon EKS Fargate 會附加預設值 30 分鐘，以減少 API 伺服器上的負載。

### 將 Fluent Bit 程序日誌傳送至帳戶
<a name="ship-fluent-bit-process-logs"></a>

您可以選擇性地使用以下 `ConfigMap` 將 Fluent Bit 程序日誌傳送至 Amazon CloudWatch。將 Fluent Bit 處理日誌傳送至 CloudWatch 需要額外的記錄擷取和儲存費用。使用叢集所在的 AWS 區域取代 *region-code*。

```
kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
  labels:
data:
  # Configuration files: server, input, filters and output
  # ======================================================
  flb_log_cw: "true"  # Ships Fluent Bit process logs to CloudWatch.

  output.conf: |
    [OUTPUT]
        Name cloudwatch
        Match kube.*
        region region-code
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
```

日誌位於與叢集相同的 AWS 區域的 CloudWatch 中。日誌群組的名稱是 ` my-cluster-fluent-bit-logs`，而 Fluent Bit logstream 的名稱是 `fluent-bit-podname-pod-namespace `。

**注意**  
只有當 Fluent Bit 程序成功啟動時，才會傳送程序日誌。若在啟動 Fluent Bit 時失敗，程序日誌就會遺失。您只能將程序日誌傳送至 CloudWatch。
若要對傳送程序日誌至您的帳戶除錯，您可以套用先前的 `ConfigMap` 來取得程序日誌。Fluent Bit 無法啟動通常是由於您的 `ConfigMap` 開始時無法被 Fluent Bit 剖析或接受。

### 若要停止傳送 Fluent Bit 程序日誌
<a name="stop-fluent-bit-process-logs"></a>

將 Fluent Bit 處理日誌傳送至 CloudWatch 需要額外的記錄擷取和儲存費用。若要排除現有 `ConfigMap` 設定中的處理日誌，請執行下列步驟。

1. 在啟用 Fargate 記錄後，找出為 Amazon EKS 叢集的 Fluent Bit 程序日誌自動建立的 CloudWatch 日誌群組。它遵循格式 ` my-cluster-fluent-bit-logs`。

1. 刪除針對 CloudWatch 日誌群組中每個 Pod 程序日誌所建立的現有 CloudWatch 日誌串流。

1. 編輯 `ConfigMap` 和設定 `flb_log_cw: "false"`。

1. 重新啟動叢集中的任何現有 Pod。

## 測試應用程式
<a name="fargate-logging-test-application"></a>

1. 部署範例 Pod。

   1. 將下列內容儲存到電腦上名為 `sample-app.yaml` 的檔案中。

      ```
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        namespace: same-namespace-as-your-fargate-profile
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
              - name: nginx
                image: nginx:latest
                ports:
                  - name: http
                    containerPort: 80
      ```

   1. 將清單檔案套用至叢集。

      ```
      kubectl apply -f sample-app.yaml
      ```

1. 使用您在 `ConfigMap` 中設定的目的地檢視 NGINX 日誌。

## 大小考量因素
<a name="fargate-logging-size-considerations"></a>

建議您為日誌路由器規劃最多 50 MB 的記憶體。如果您希望應用程式以非常高的輸送量產生日誌，則應該規劃最多 100 MB。

## 故障診斷
<a name="fargate-logging-troubleshooting"></a>

若要確認記錄功能是因某些原因 (例如無效的 `ConfigMap` 以及無效的原因) 啟用或停用，請使用 `kubectl describe pod pod-name ` 檢查您的 Pod 事件。輸出可能包含可釐清是否已啟用記錄的 Pod 事件，例如下列範例輸出。

```
[...]
Annotations:          CapacityProvisioned: 0.25vCPU 0.5GB
                      Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND
[...]
Events:
  Type     Reason           Age        From                                                           Message
  ----     ------           ----       ----                                                           -------
  Warning  LoggingDisabled  <unknown>  fargate-scheduler                                              Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found
```

Pod 事件是暫時性的，具體取決於設定的時段。您也可以使用 `kubectl describe pod pod-name ` 來檢視 Pod 註釋。在 Pod 註釋中，可參閱是否已啟用或停用記錄功能及其原因的相關資訊。

# 選擇最佳的 Amazon EC2 節點執行個體類型
<a name="choosing-instance-type"></a>

Amazon EC2 為工作節點提供多種執行個體類型選擇。每個執行個體類型皆提供不同的運算、記憶體、儲存與網路功能。每個執行個體也會依照這些功能分組為執行個體系列。有關清單，請參閱《*Amazon EC2 使用者指南*》中的[可用的執行個體類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#AvailableInstanceTypes)。Amazon EKS 發佈了多種 Amazon EC2 AMI 變體以啟用支援。若要確保您選取的執行個體類型與 Amazon EKS 相容，請考慮以下條件。
+ 所有 Amazon EKS AMI 目前不支援 `mac` 系列。
+ Arm 和非加速的 Amazon EKS AMI 不支援 `g3`、`g4`、`inf` 及 `p` 系列。
+ 加速的 Amazon EKS AMI 不支援 `a`、`c`、`hpc`、`m` 及 `t` 系列。
+ 對於 ARM 型執行個體，Amazon Linux 2023 (AL2023) 僅支援使用 Graviton2 或更新版本處理器的執行個體類型。AL2023 不支援 `A1` 執行個體。

在 Amazon EKS 支援的執行個體類型之間進行選擇時，請考慮每種類型的以下功能。

 **節點群組中的執行個體數量**   
一般來說，較少、較大的執行個體更好，特別是在有很多 Daemonsets. 的情況下。每個執行個體都需要對 API 伺服器進行 API 呼叫，因此擁有的執行個體越多，API 伺服器上的負載就越大。

 **作業系統**   
檢閱 [Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)、[Windows](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html) 以及 [Bottlerocket](https://aws.amazon.com/bottlerocket/faqs/) 支援的執行個體類型。建立 Windows 執行個體前，請檢閱在 [EKS 叢集上部署 Windows 節點](windows-support.md)。

 **硬體架構**   
您需要 x86 還是 Arm？ 部署 Arm 執行個體前，請檢閱 [Amazon EKS 最佳化 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami)。您是否需要建置在 Nitro 系統 ([Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) 或 [Windows](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html#ec2-nitro-instances)) 上的執行個體，或具有[加速](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/accelerated-computing-instances.html)功能的執行個體？ 如果您需要加速功能，則只能將 Linux 與 Amazon EKS 搭配使用。

 **Pod 數目上限**   
由於每個 Pod 都指派了自己的 IP 位址，因此執行個體類型支援的 IP 位址數量是決定可在執行個體上執行之 Pod 數量的因素。若要了解如何決定執行個體類型的 Pod 數量上限，請參閱 [maxPods的判斷方式](#max-pods-precedence)。  
 [AWS Nitro 系統](https://aws.amazon.com/ec2/nitro/)執行個體類型可選擇性地支援比非 Nitro 系統執行個體類型更多的 IP 地址。然而，並非為執行個體指派的所有 IP 位址都可用於 Pod。要為您的執行個體指派大量的 IP 地址，您必須在叢集中安裝並適當設定 Amazon VPC CNI 附加元件 `1.9.0` 或更新版本。如需詳細資訊，請參閱[將更多 IP 位址指派給具有字首的 Amazon EKS 節點](cni-increase-ip-addresses.md)。要將最大數量的 IP 地址指派給執行個體，您必須在叢集中安裝版本 `1.10.1` 或更新版本的 Amazon VPC CNI 附加元件，並使用 `IPv6` 系列部署叢集。

 **IP 系列**   
在將 `IPv4` 系列用於叢集時，您可以使用任何受支援的執行個體類型，這允許您的叢集將私有 `IPv4` 位址指派給您的 Pod 和服務。但是，如果您想在叢集中使用 `IPv6` 系列，則必須使用 [AWS Nitro 系統](https://aws.amazon.com/ec2/nitro/)執行個體類型或裸機類型。Windows 執行個體僅支援 `IPv4`。您的叢集必須是執行版本 `1.10.1` 或更新版本 Amazon VPC CNI 附加元件的叢集。如需有關使用 `IPv6` 的詳細資訊，請參閱 [了解叢集、Pod 與服務的 IPv6 位址](cni-ipv6.md)。

 **您正在執行的 Amazon VPC CNI 附加元件版本**   
最新版的 [Kubernetes 專用 Amazon VPC CNI 外掛程式](https://github.com/aws/amazon-vpc-cni-k8s)支援[這些執行個體類型](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)。您可能需要更新 Amazon VPC CNI 附加元件版本，才能利用最新支援的執行個體類型。如需詳細資訊，請參閱[使用 Amazon VPC CNI 將 IP 指派給 Pod](managing-vpc-cni.md)。最新版本支援與 Amazon EKS 搭配使用的最新功能。舊版不支援所有功能。您可以在 GitHub 上的[變更日誌](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/CHANGELOG.md)檢視不同版本支援的功能。

 **您正在其中建立節點的 AWS 區域**   
並非所有 AWS 區域都提供所有執行個體類型。

 **您是否使用 Pod 的安全群組**   
如果您正在使用 Pod 的安全群組，則僅支援特定的執行個體類型。如需詳細資訊，請參閱[將安全群組指派至個別 Pod](security-groups-for-pods.md)。

## maxPods的判斷方式
<a name="max-pods-precedence"></a>

套用至節點的最終`maxPods`值取決於以特定優先順序互動的數個元件。了解此順序有助於您在自訂 時避免意外行為`maxPods`。

 **優先順序 （從高到低）：**

1.  **受管節點群組強制執行** – 當您使用沒有[自訂 AMI](launch-templates.md#launch-template-custom-ami) 的受管節點群組時，Amazon EKS 會在節點的使用者資料`maxPods`中強制執行 上的上限。對於少於 30 個 vCPUs執行個體，上限為 `110`。對於 vCPUs執行個體，上限為 `250`。此值優先於任何其他`maxPods`組態，包括 `maxPodsExpression`。

1.  **kubelet `maxPods`組態** – 如果您`maxPods`直接在 kubelet 組態中設定 （例如，透過具有自訂 AMI 的啟動範本），則此值優先於 `maxPodsExpression`。

1.  **nodeadm `maxPodsExpression` ** – 如果您在 [https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression)中使用 `NodeConfig`， nodeadm 會評估表達式來計算 `maxPods`。這只有在較高優先順序的來源尚未設定值時才會有效。

1.  **預設 ENI 型計算** – 如果未設定其他值，AMI `maxPods`會根據執行個體類型支援的彈性網路介面和 IP 地址數目來計算。這相當於公式 `(number of ENIs × (IPs per ENI − 1)) + 2`。每個節點`kube-proxy`上執行的 Amazon VPC CNI `+ 2`帳戶，不會使用 Pod IP 地址。

**重要**  
如果您使用受管節點群組並在 `maxPodsExpression`中設定 `NodeConfig`，受管節點群組的強制執行會覆寫您的表達式。若要搭配受管節點群組使用自訂`maxPods`值，您必須在啟動範本中指定自訂 AMI 並`maxPods`直接設定。如需詳細資訊，請參閱[使用啟動範本自訂受管節點](launch-templates.md)。

 **受管節點群組與自我管理節點** 

使用受管節點群組 （沒有自訂 AMI)，Amazon EKS 會將`maxPods`值注入節點的引導使用者資料。這表示：
+ `maxPods` 值一律為上限`110`或`250`取決於執行個體大小。
+ `maxPodsExpression` 您設定的任何 都會被此注入值覆寫。
+ 若要使用不同的`maxPods`值，請在啟動範本中指定自訂 AMI，然後與 `--use-max-pods false`一起傳遞`--kubelet-extra-args '--max-pods=my-value'`至`bootstrap.sh`指令碼。如需範例，請參閱 [使用啟動範本自訂受管節點](launch-templates.md)。

透過自我管理節點，您可以完全控制引導程序。您可以在 `maxPodsExpression`中使用 `NodeConfig`或`--max-pods`直接傳遞至 `bootstrap.sh`。

## EKS 自動模式的考量事項
<a name="_considerations_for_eks_auto_mode"></a>

EKS 自動模式會將節點上的 Pod 數量限制為以下兩者中較低的值：
+ 110 個 Pod 的硬性上限
+ 上述 Pod 最大數量計算的結果。

# 使用預先建置的最佳化映像建立節點
<a name="eks-optimized-amis"></a>

當您使用受管節點群組或自我管理節點時，您可以使用預先建置的 Amazon EKS 最佳化 [Amazon Machine Image](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) (AMI) 或您的自訂 AMI 來部署節點。若您正在執行混合節點，請參閱 [準備混合節點的作業系統](hybrid-nodes-os.md)。如需有關各種 Amazon EKS 最佳化 AMI 類型的詳細資訊，請參閱下列其中一個主題。如需如何建立自己的自訂 AMI 的詳細資訊，請參閱 [建置自訂 EKS 最佳化的 Amazon Linux AMI](eks-ami-build-scripts.md)。

使用 Amazon EKS 自動模式時，EKS 會管理 EC2 執行個體，包括選取和更新 AMI。

**Topics**
+ [EKS AL2 和 AL2 加速 AMI 移轉功能指南](eks-ami-deprecation-faqs.md)
+ [使用最佳化的 Amazon Linux AMI 建立節點](eks-optimized-ami.md)
+ [使用最佳化的 Bottlerocket AMI 建立節點](eks-optimized-ami-bottlerocket.md)
+ [使用最佳化的 Ubuntu Linux AMI 建立節點](eks-partner-amis.md)
+ [使用最佳化的 Windows AMI 建立節點](eks-optimized-windows-ami.md)

# EKS AL2 和 AL2 加速 AMI 移轉功能指南
<a name="eks-ami-deprecation-faqs"></a>

**警告**  
Amazon EKS 已於 2025 年 11 月 26 日停止發佈 EKS 最佳化的 Amazon Linux 2 (AL2) AMIs。適用於 Amazon EKS 的 AL2023 和 Bottlerocket 型 AMIs 適用於所有支援的 Kubernetes 版本，包括 1.33 和更新版本。

 AWS 將於 20AL2-optimized和 AL2-accelerated AMIs 的支援。雖然您可以在終止支援 (EOS) 日期 (2025 年 11 月 26 日) 之後繼續使用 EKS AL2 AMI，但 EKS 將不再發布任何新的 Kubernetes 版本或對 AL2 AMI 的更新，包括此日期之後的次要版本、修補程式和錯誤修正。我們建議升級至 Amazon Linux 2023 (AL2023) 或 Bottlerocket AMI：
+ AL2023 採用預設安全的方式，具備預配置的安全政策、處於容許模式的 SELinux、預設啟用的僅 IMDSv2 模式、最佳化的開機時間以及增強的套件管理功能，可提升安全性與效能，適用於需要大量自訂 (如直接存取作業系統層或大量節點變更) 的基礎架構。若要進一步了解，請參閱 [AL2023 FAQs](https://aws.amazon.com/linux/amazon-linux-2023/faqs/)或檢視詳細的遷移指南，網址為 [從 Amazon Linux 2 升級到 Amazon Linux 2023](al2023.md)。
+ Bottlerocket 憑藉其專為容器最佳化的設計，實現了增強的安全性、更快的啟動時間和更小的受攻擊面，以提高效率，非常適合具有最少節點自訂的容器原生方法。若要進一步了解，請參閱 [Bottlerocket FAQs](https://aws.amazon.com/bottlerocket/faqs/)或檢視詳細的遷移指南，網址為 [使用最佳化的 Bottlerocket AMI 建立節點](eks-optimized-ami-bottlerocket.md)。

或者，您可以在 EOS 日期[建置自訂 EKS 最佳化的 Amazon Linux AMI](eks-ami-build-scripts.md)之前 (2025 年 11 月 26 日）。此外，您可以使用 Amazon Linux 2 基本執行個體建置自訂 AMI，直到 Amazon Linux 2 EOS 日期 (2026 年 6 月 30 日）。

## 移轉和支援常見問題
<a name="_migration_and_support_faqs"></a>

### 如何從 AL2 移轉至 AL2023 AMI？
<a name="_how_do_i_migrate_from_my_al2_to_an_al2023_ami"></a>

我們建議制定並實施一個移轉計劃，該計劃包括全面的應用程式工作負載測試和文件化的復原程序，然後按照 EKS 官方文件中[從 Amazon Linux 2 升級到 Amazon Linux 2023](https://docs.aws.amazon.com/eks/latest/userguide/al2023.html) 的逐步說明進行操作。

### 我是否可以在 EKS 最佳化 AL2 AMI 的 EKS 終止支援日期 (EOS) 之後建置自訂 AL2 AMI？
<a name="_can_i_build_a_custom_al2_ami_past_the_eks_end_of_support_eos_date_for_eks_optimized_al2_amis"></a>

雖然我們建議改用官方支援且已發布的 EKS 最佳化 AMI (適用於 AL2023 或 Bottlerocket)，但在 AL2 AMI EOS 日期 (2025 年 11 月 26 日) 之前，您仍可建置自訂 EKS AL2 最佳化與 AL2 加速型 AMI。或者，您可在 Amazon Linux 2 EOS 日期 (2026 年 6 月 30 日) 之前，以 Amazon Linux 2 基礎執行個體建置自訂 AMI。如需建置自訂 EKS AL2 最佳化與 AL2 加速型 AMI 的逐步指示，請參閱 EKS 官方文件中的[建置自訂 Amazon Linux AMI](https://docs.aws.amazon.com/eks/latest/userguide/eks-ami-build-scripts.html)。

### EKS Kubernetes 版本支援政策是否適用於 Amazon Linux 發行版本？
<a name="_does_the_eks_kubernetes_version_support_policy_apply_to_amazon_linux_distributions"></a>

不適用。EKS AL2 最佳化和 AL2 加速 AMI 的 EOS 日期獨立於 EKS 對 Kubernetes 版本的標準和延伸支援時間表。即使您使用 EKS 延伸支援，也需要移轉至 AL2023 或 Bottlerocket。

### 從 cgroupv1 轉向 cgroupv2 對我的移轉有何影響？
<a name="_how_does_the_shift_from_cgroupv1_to_cgroupv2_affect_my_migration"></a>

[Kubernetes 社群](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/4569-cgroup-v1-maintenance-mode/README.md)已將 `cgroupv1` 支援 (AL2 使用) 置於維護模式，這意味著不會新增新功能，並且僅提供關鍵安全性和重大錯誤修正。要在 Kubernetes 中採用 `cgroupv2`，您需要確保作業系統、核心、容器執行時期和 Kubernetes 元件之間的相容性。這需要預設啟用 `cgroupv2` 的 Linux 發行版本，例如 AL2023、Bottlerocket、Red Hat Enterprise Linux (RHEL) 9\$1、Ubuntu 22.04\$1 或 Debian 11\$1。這些發行版隨附的核心版本大於等於 5.8，這是 Kubernetes 中 `cgroupv2` 支援的最低要求。要進一步了解，請參閱[關於 cgroup v2](https://kubernetes.io/docs/concepts/architecture/cgroups/)。

### 如果我在自訂 AL2 AMI 中需要 Neuron，該怎麼辦？
<a name="_what_do_i_do_if_i_need_neuron_in_my_custom_al2_ami"></a>

您無法在基於 AL2 的 AMI 上原生執行完整的 Neuron 驅動應用程式。若要在 AL2 AMI 上利用 AWS Neuron，您必須使用 Neuron 支援的容器與non-AL2 Linux 發行版本 （例如 Ubuntu 22.04、Amazon Linux 2023 等） 來容器化應用程式，然後在已安裝 Neuron 驅動程式 (`aws-neuronx-dkms`) 的 AL2-based AMI 上部署這些容器。

### 在 EKS AL2 AMI EOS 日期 (2025 年 11 月 26 日) 之後，是否應切換至裸機 Amazon Linux 2 基礎執行個體？
<a name="_should_i_switch_to_a_bare_amazon_linux_2_base_instance_after_the_eks_al2_ami_eos_date_november_26_2025"></a>

切換到裸機 Amazon Linux 2 基礎執行個體缺乏官方 EKS AL2 最佳化和 AL2 加速 AMI 提供的特定最佳化、容器執行時期組態和自訂。相反，如果您必須繼續使用基於 AL2 的解決方案，我們建議使用位於 [建置自訂 EKS 最佳化的 Amazon Linux AMI](eks-ami-build-scripts.md) 或 [Amazon EKS AMI 建置規格](https://github.com/awslabs/amazon-eks-ami)的 EKS AMI 配方，建置自訂 AMI。這確保了與現有工作負載的相容性，並包括 AL2 核心更新，直到 Amazon Linux 2 EOS 日期 (2026 年 6 月 30 日)。

### 在 EKS AL2 AMI EOS 日期 (2025 年 11 月 26 日) 後，使用 EKS AMI GitHub 儲存庫建置自訂 AL2 AMI 時，哪些支援來自 amzn2-core 和 amzn2extra-docker 等儲存庫的套件？
<a name="_when_building_a_custom_al2_ami_using_the_eks_ami_github_repository_after_the_eks_al2_ami_eos_date_november_26_2025_what_support_is_available_for_packages_from_repositories_like_amzn2_core_and_amzn2extra_docker"></a>

[Amazon EKS AMI 建置規格](https://github.com/awslabs/amazon-eks-ami)的 EKS AMI 配方會透過 YUM 從標準 Amazon Linux 2 軟體提取套件，例如 [amzn2-core](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html) 和 [amzn2extra-docker](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)。在 EKS AL2 AMI EOS 日期 (2025 年 11 月 26 日) 之後，這些軟體仍會持續受到支援，直至 Amazon Linux 2 整體 EOS 日期 (2026 年 6 月 30 日)。請注意，此期間的支援僅限於核心更新，這意味著您需手動管理並套用其他套件更新、安全性修補程式與非核心相依項目，以維持安全性與相容性。

### 為何在 Amazon EKS 搭配 AL2023 時，使用舊版 JDK8 的 Java 應用程式可能發生記憶體不足 (OOM) 例外與 Pod 重啟？該如何解決？
<a name="_why_might_java_applications_using_older_versions_of_jdk8_on_amazon_eks_with_al2023_experience_out_of_memory_oom_exceptions_and_pod_restarts_and_how_can_this_be_resolved"></a>

在搭載 AL2023 的 Amazon EKS 節點上執行時，依賴低於 `jdk8u372` 版本 JDK 8 的 Java 應用程式，可能因 JVM 與 `cgroupv2` 不相容而發生 OOM 例外狀況與 Pod 重啟。此問題的核心原因是，JVM 無法透過 Amazon Linux 2023 預設的 `cgroupv2` 偵測容器記憶體限制。因此，其會依據節點總記憶體而非 Pod 定義的限制來配置堆積記憶體。這是因為 `cgroupv2` 變更了記憶體限制資料的儲存位置，導致舊版 Java 誤讀可用記憶體，並預設使用節點層級資源。可行的解決方案如下：
+  **升級 JDK 版本**：升級至 `jdk8u372` 或更新版本，或升級至完全 `cgroupv2` 支援的新版 JDK，可解決此問題。如需完全支援 `cgroupv2` 的相容 Java 版本清單，請參閱[關於 cgroup v2](https://kubernetes.io/docs/concepts/architecture/cgroups/)。
+  **建置自訂 AMI**：若必須繼續使用基於 AL2 的解決方案，可在 2025 年 11 月 26 日前，透過 [建置自訂 EKS 最佳化的 Amazon Linux AMI](eks-ami-build-scripts.md) 或 [Amazon EKS AMI 建置規格](https://github.com/awslabs/amazon-eks-ami)建置自訂 AL2 基底 AMI。例如，可在 2025 年 11 月 26 日前建置基於 AL2 的 v1.33 AMI。Amazon EKS 會在 EKS AL2 EOS 日期 (2025 年 11 月 26 日) 前持續提供基於 AL2 的 AMI。在 EOS 日期 (2025 年 11 月 26 日) 之後，您將需要建置自己的 AMI。
+  **啟用 cgroupv1**：如果您必須繼續使用 `cgroupv1`，可在 EKS AL2023 AMI `cgroupv1` 上啟用。若要啟用，請執行 `sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"` 並重新啟動系統 (例如執行 Amazon Linux 2023 的 EC2 執行個體或節點)。此操作會修改系統開機參數 (例如，在 GRUB 組態中新增核心參數 'systemd.unified\$1cgroup\$1hierarchy=0'，指示 systemd 使用舊版 `cgroupv1` 階層)，進而啟用 `cgroupv1`。請注意，當您執行此 grubby 命令時，核心會重新配置為啟用 `cgroupv1` 並停用 `cgroupv2`。節點上的作用中資源管理僅會使用其中一個 cgroup 版本。這與執行 `cgroupv2` 並對 `cgroupv1` API 提供回溯相容性並非同一概念。

**警告**  
不建議繼續使用 `cgroupv1`。相反地，建議移轉至 `cgroupv2`。Kubernetes 社群已將 `cgroupv1` 支援 (AL2 使用) 置於維護模式，這意味著不會新增新功能或更新，並且僅提供關鍵安全性和重大錯誤修正。預期未來版本會完全移除 `cgroupv1` 支援，但目前尚未公佈具體移除日期。如果您遇到 的問題`cgroupv1`， AWS 將無法提供支援，並建議您升級至 `cgroupv2`。

## 相容性和版本
<a name="_compatibility_and_versions"></a>

### AL2 AMI 支援的 Kubernetes 版本
<a name="_supported_kubernetes_versions_for_al2_amis"></a>

Kubernetes 1.32 版是 Amazon EKS 將發行 AL2 (Amazon Linux 2) AMI 的最後一個版本。對於[支援的](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)、最高達 1.32 的 Kubernetes 版本，EKS 會在 2025 年 11 月 26 日前持續發布 AL2 AMI (AL2\$1ARM\$164、AL2\$1x86\$164) 與 AL2 加速 AMI (AL2\$1x86\$164\$1GPU)。在此日期後，EKS 將停止為所有 Kubernetes 版本發布 AL2 最佳化與 AL2 加速型 AMI。請注意，EKS AL2 最佳化和 AL2 加速 AMI 的 EOS 日期獨立於 EKS 對 Kubernetes 版本的標準和延伸支援時間表。

### AL2、AL2023 與 Bottlerocket AMI 的支援驅動程式與 Linux 核心版本比較
<a name="_supported_drivers_and_linux_kernel_versions_comparison_for_al2_al2023_and_bottlerocket_amis"></a>


| 元件 | EKS AL2 AMI | EKS AL2023 AMI | EKS Bottlerocket AMI | 
| --- | --- | --- | --- | 
|  基本作業系統相容性  |  RHEL7/CentOS 7  |  Fedora/CentOS 9  |  N/A  | 
|   [CUDA 使用者模式驅動程式](https://docs.nvidia.com/deploy/cuda-compatibility/why-cuda-compatibility.html#why-cuda-compatibility)   |  12.x  |  12.x、13.x  |  12.x、13.x  | 
|  NVIDIA GPU 驅動程式  |  R570  |  R580  |  R570, R580  | 
|   AWS Neuron 驅動程式  |  2.20\$1  |  2.20\$1  |  2.20\$1  | 
|  Linux 核心  |  5.10  |  6.1、6.12  |  6.1、6.12  | 

如需 NVIDIA 驅動程式和 CUDA 相容性的詳細資訊，請參閱 [NVIDIA 文件](https://docs.nvidia.com/datacenter/tesla/drivers/index.html#supported-drivers-and-cuda-toolkit-versions)。

### AWS Neuron 與 AL2 AMIs相容性
<a name="shared_aws_neuron_compatibility_with_al2_amis"></a>

從 [AWS Neuron 2.20 版](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/release-notes/prev/rn.html#neuron-2-20-0-whatsnew)開始，EKS 基於 AL 的 AMI 使用的 Neuron 執行時期 (`aws-neuronx-runtime-lib`) 不再支援 Amazon Linux 2 (AL2)。Neuron 驅動程式 (`aws-neuronx-dkms`) 現在是唯一支援 Amazon Linux 2 的 AWS Neuron 套件。這意味著您無法在基於 AL2 AMI 上原生執行 Neuron 驅動型應用程式。若要在 AL2023 AMI 上設定 Neuron，請參閱 [AWS Neuron 設定](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/general/setup/index.html#setup-guide-index)指南。

### Kubernetes 與 AL2 AMI 的相容性
<a name="_kubernetes_compatibility_with_al2_amis"></a>

Kubernetes 社群已將 `cgroupv1` 支援 (AL2 所使用) 移至維護模式。這意味著不會新增任何功能，僅提供重大安全性與主要錯誤修復。任何依賴 cgroupv2 的 Kubernetes 功能 (如 MemoryQoS 與增強型資源隔離) 均無法在 AL2 上使用。此外，Amazon EKS Kubernetes 1.32 版本是最後一個支援 AL2 AMI 的版本。為了維持與最新 Kubernetes 版本的相容性，建議移轉至 AL2023 或 Bottlerocket，這兩者均預設啟用 `cgroupv2`。

### AL2 AMI 與 Linux 版本的相容性
<a name="_linux_version_compatibility_with_al2_amis"></a>

在 2026 年 6 月 30 日end-of-support(EOS) 日期之前， 都支援 Amazon Linux 2 (AL2)。 AWS 但隨著 AL2 逐步老化，廣大 Linux 社群對新應用程式與功能的支援已逐漸受限。AL2 AMI 基於 [Linux 核心 5.10](https://docs.aws.amazon.com/linux/al2/ug/kernel.html)，而 AL2023 則使用 [Linux 核心 6.1。](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2-kernel.html)不同於 AL2023，AL2 獲得的廣大 Linux 社群支援有限。這意味著許多上游 Linux 套件與工具需經過回溯移植才能在 AL2 的舊版核心上運作；部分現代 Linux 功能與安全性改進因核心版本過舊而無法使用；許多開源專案已終止或限制對 5.10 等舊版核心的支援。

### AL2023 中未包含的已棄用套件
<a name="_deprecated_packages_not_included_in_al2023"></a>

AL2023 中未包含或已變更的常見套件包括：
+ [Amazon Linux 2 中的部分來源二進制套件](https://docs.aws.amazon.com/linux/al2023/release-notes/removed-AL2023.6-AL2.html)在 Amazon Linux 2023 中不再提供
+ Amazon Linux 在 AL2023 中支援不同套件版本的方式發生變更 (例如 [amazon-linux-extras 系統](https://repost.aws/questions/QUWGU3VFJMRSGf6MDPWn4tLg/how-to-resolve-amazon-linux-extras-in-al2023))
+  AL2023 不支援 [Extra Packages for Enterprise Linux (EPEL)](https://docs.aws.amazon.com/linux/al2023/ug/epel.html)
+  AL2023 中不支援 [32 位元應用程式](https://docs.aws.amazon.com/linux/al2023/ug/deprecated-al2.html#deprecated-32bit-rpms)

要進一步了解，請參閱[比較 AL2 與 AL2023](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)。

### 跨 AL2、AL2023 和 Bottlerocket 的 FIPS 驗證比較
<a name="_fips_validation_comparison_across_al2_al2023_and_bottlerocket"></a>

Amazon Linux 2 (AL2)、Amazon Linux 2023 (AL2023) 與 Bottlerocket 均支援聯邦資訊處理標準 (FIPS) 合規性。
+ AL2 已通過 FIPS 140-2 認證，AL2023 已通過 FIPS 140-3 認證。若要在 AL2023 上啟用 FIPS 模式，需在 Amazon EC2 執行個體上安裝必要套件，並遵循[在 AL2023 上啟用 FIPS 模式](https://docs.aws.amazon.com/linux/al2023/ug/fips-mode.html)中的指示執行組態步驟。要進一步了解，請參閱 [AL2023 常見問答集](https://aws.amazon.com/linux/amazon-linux-2023/faqs)。
+ Bottlerocket 提供專為 FIPS 設計的變體，這類變體會限制核心與使用者空間元件，僅使用已提交至 FIPS 140-3 密碼編譯模組驗證計劃的密碼編譯模組。

### EKS AMI 驅動程式與版本變更日誌
<a name="_eks_ami_driver_and_versions_changelog"></a>

關於所有 EKS AMI 元件及其版本的完整清單，請參閱 GitHub 上的 [Amazon EKS AMI 版本備註](https://github.com/awslabs/amazon-eks-ami/releases)。

# 使用最佳化的 Amazon Linux AMI 建立節點
<a name="eks-optimized-ami"></a>

Amazon Elastic Kubernetes Service (Amazon EKS) 提供專門的 Amazon Machine Image (AMIs)，針對執行 Kubernetes 工作者節點進行最佳化。這些 EKS 最佳化 Amazon Linux (AL) AMIs 已預先設定基本元件，例如 `kubelet`、AWS IAM Authenticator 和 `containerd`，以確保叢集內的無縫整合和安全性。本指南詳細說明可用的 AMI 版本，並概述加速運算和 Arm 型架構的特殊選項。

## 考量事項
<a name="ami-considerations"></a>
+ 您可以透過選擇所需版本的標籤，在 [Amazon Linux 安全中心](https://alas.aws.amazon.com/)追蹤 Amazon Linux 的安全或隱私權事件。您也可以訂閱適用的 RSS 摘要。安全與隱私權事件包含問題的概觀、哪些套件受到影響，以及如何更新您的執行個體以修正問題。
+ 部署加速或 Arm AMI 之前，請先檢閱 [Amazon EKS 最佳化加速 Amazon Linux AMIs ](#gpu-ami)和 中的資訊[Amazon EKS 最佳化 Arm Amazon Linux AMIs](#arm-ami)。
+ Amazon EC2 `P2` 執行個體在 Amazon EKS 上不受支援, 因為它們需要 `NVIDIA` 驅動程式版本 470 或更早版本。
+ 在版本 `1.30` 或更新版本的叢集中，任何新建立的受管節點群組將自動預設使用 AL2023 作為節點作業系統。

## Amazon EKS 最佳化加速 Amazon Linux AMIs
<a name="gpu-ami"></a>

Amazon EKS 最佳化加速 Amazon Linux (AL) AMIs 是以標準 EKS 最佳化 Amazon Linux AMIs 為基礎建置。它們已設定為 Amazon EKS 節點的選用映像，用以支援以 GPU、[Inferentia](https://aws.amazon.com/machine-learning/inferentia/) 和 [Trainium](https://aws.amazon.com/machine-learning/trainium/) 為基礎的工作負載。

如需詳細資訊，請參閱[針對 GPU 執行個體使用 EKS 最佳化AMIs](ml-eks-optimized-ami.md)。

## Amazon EKS 最佳化 Arm Amazon Linux AMIs
<a name="arm-ami"></a>

Arm 執行個體可為擴增和 Arm 型應用程式節省大量的成本，例如 Web 伺服器、容器化微型服務、快取機群和分散式資料存放區。將 Arm 節點新增至叢集時，請檢閱下列考量事項。
+ 如果叢集是在 2020 年 8 月 17 日之前部署，您必須對重要的叢集附加元件資訊清單進行一次性升級。如此一來，Kubernetes 就可以為叢集中使用中的每個硬體架構提取正確的映像。如需更新叢集附加元件的詳細資訊，請參閱 [步驟 1：準備升級](update-cluster.md#update-existing-cluster)。如果您在 2020 年 8 月 17 當天或之後部署叢集，則 CoreDNS、`kube-proxy` 和 Kubernetes 專用 Amazon VPC CNI 外掛程式已經具有多架構能力。
+ 部署至 Arm 節點的應用程式必須針對 Arm 進行編譯。
+ 如果您在現有叢集中部署了 DaemonSet，或者您想將它們部署到您也想在其中部署 Arm 節點的新叢集，請確認您的 DaemonSet 是否可以在您叢集中的所有硬體架構上執行。
+ 您可以在相同的叢集中執行 Arm 節點群組和 x86 節點群組。如果您這麼做，請考慮將多架構容器映像部署到容器儲存庫 (例如 Amazon Elastic Container Registry)，然後將節點選取器新增至資訊清單，以便 Kubernetes 知道 Pod 可以部署到哪些硬體架構。如需詳細資訊，請參閱《Amazon ECR 使用者指南》**中的[推送多架構映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-multi-architecture-image.html)和[適用於 Amazon ECR 的多架構容器映像簡介](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr)部落格一文。

## 其他資訊
<a name="linux-more-information"></a>

如需使用 Amazon EKS 最佳化 Amazon Linux AMIs 的詳細資訊，請參閱下列章節：
+ 若要將 Amazon Linux 與受管節點群組搭配使用，請參閱 [透過受管節點群組來簡化節點生命週期](managed-node-groups.md)。
+ 若要啟動自我管理的 Amazon Linux 節點，請參閱 [擷取建議的 Amazon Linux AMI ID](retrieve-ami-id.md)。
+ 如需版本資訊，請參閱[擷取 Amazon Linux AMI 版本資訊](eks-linux-ami-versions.md)。
+ 若要擷取 Amazon EKS 最佳化 Amazon Linux AMIs 的最新 IDs，請參閱 [擷取建議的 Amazon Linux AMI ID](retrieve-ami-id.md)。
+ 如需用於建置 Amazon EKS 最佳化 AMIs開放原始碼指令碼，請參閱 [建置自訂 EKS 最佳化的 Amazon Linux AMI](eks-ami-build-scripts.md)。

# 從 Amazon Linux 2 升級到 Amazon Linux 2023
<a name="al2023"></a>

**警告**  
Amazon EKS 已於 2025 年 11 月 26 日停止發佈 EKS 最佳化的 Amazon Linux 2 (AL2) AMIs。適用於 Amazon EKS 的 AL2023 和 Bottlerocket 型 AMIs 適用於所有支援的 Kubernetes 版本，包括 1.33 和更新版本。

AL2023 是以 Linux 為基礎的作業系統，旨在為您的雲端應用程式提供安全、穩定且高效能的環境。它是 Amazon Web Services 推出的下一代 Amazon Linux，適用於所有受支援的 Amazon EKS 版本。

相較於 AL2，AL2023 提供了多項改進。有關完整的比較，請參閱《*Amazon Linux 2023 使用者指南*》中的[比較 AL2 和 Amazon Linux 2023](https://docs.aws.amazon.com/linux/al2023/ug/compare-with-al2.html)。已從 AL2 新增、升級和移除數個套件。強烈建議在升級前，使用 AL2023 測試您的應用程式。有關 AL2023 中所有套件變更的清單，請參閱《[Amazon Linux 2023 版本備註](https://docs.aws.amazon.com/linux/al2023/release-notes/compare-packages.html)》中的 *Amazon Linux 2023 中的套件變更*。

除了上述變更，您還應注意以下事項：
+ AL2023 引入了新的節點初始化程序 `nodeadm`，該程序使用 YAML 組態結構描述。如果您使用自我管理節點群組或具有啟動範本的 AMI，則在建立新節點群組時，需要明確提供額外的叢集中繼資料。以下連結展示了一個包含最低必要參數的[範例](https://awslabs.github.io/amazon-eks-ami/nodeadm/)，其中 `apiServerEndpoint`、`certificateAuthority` 和服務 `cidr` 現在是必需的：

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: my-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
  ```

  在 AL2 中，這些參數的中繼資料是透過 Amazon EKS `DescribeCluster` API 呼叫自動發現的。在 AL2023 中，此行為已改變，因為額外的 API 呼叫在大規模節點擴展時有被限流的風險。如果您使用沒有啟動範本的受管節點群組，或使用 Karpenter，則此變更不會對您造成影響。如需有關 `certificateAuthority` 和服務 `cidr` 的更多資訊，請參閱《*Amazon EKS API 參考*》中的 [https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeCluster.html)。
+ 對於 AL2023，`nodeadm` 也更改了使用 [https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/api/#nodeconfigspec) 將參數應用到每個節點 `kubelet` 的格式。在 AL2 中，這是透過 `--kubelet-extra-args` 參數完成的。這通常用於為節點新增標籤和污點。下面的範例展示了如何將 `maxPods` 和 `--node-labels` 套用至節點。

  ```
  ---
  apiVersion: node.eks.aws/v1alpha1
  kind: NodeConfig
  spec:
    cluster:
      name: test-cluster
      apiServerEndpoint: https://example.com
      certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
      cidr: 10.100.0.0/16
    kubelet:
      config:
        maxPods: 110
      flags:
        - --node-labels=karpenter.sh/capacity-type=on-demand,karpenter.sh/nodepool=test
  ```
+ AL2023 需要 Amazon VPC CNI 版本 `1.16.2` 或以上。
+ AL2023 預設要求使用 `IMDSv2`。`IMDSv2` 有多項有助於提升安全狀態的優點。它使用面向工作階段的身分驗證方法，需要透過一個簡單的 HTTP PUT 請求來建立一個秘密權杖以啟動工作階段。工作階段的權杖有效期可設定為 1 秒到 6 小時之間的任何時間。如需如何從 轉換`IMDSv1`至 的詳細資訊`IMDSv2`，請參閱[使用執行個體中繼資料服務第 2 版的轉換](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html)和[取得 IMDSv2 的完整優點，以及在整個 AWS 基礎設施中停用 IMDSv1](https://aws.amazon.com/blogs/security/get-the-full-benefits-of-imdsv2-and-disable-imdsv1-across-your-aws-infrastructure)。若您仍想使用 `IMDSv1`，可以透過使用執行個體中繼資料選項啟動屬性，手動覆寫設定來實現。
**注意**  
對於 AL2023 的 `IMDSv2`，受管節點群組的預設跳數可能有所不同：  
當不使用啟動範本時，預設值設為 `1`。這意味著容器將無法使用 IMDS 存取節點的憑證。若您的容器需要存取節點的憑證，您仍可透過使用[自訂的 Amazon EC2 啟動範本](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html)來實現。
當在啟動範本中使用自訂 AMI 時，預設的 `HttpPutResponseHopLimit` 設為 `2`。您可以在啟動範本中手動覆寫 `HttpPutResponseHopLimit`。
或者，您可使用 [Amazon EKS Pod 身分識別](pod-identities.md)來提供憑證，而非使用 `IMDSv2`。
+ AL2023 採用了下一代統一控制組層次結構 (`cgroupv2`)。`cgroupv2` 用於實現容器執行時期，並由 `systemd` 執行。雖然 AL2023 仍然包含可以讓系統使用 `cgroupv1` 運行的程式碼，但這不是建議建議組態或受支援組態。此組態將在未來的 Amazon Linux 主要版本中完全移除。
+  `eksctl` 需要 `eksctl` 版本 `0.176.0` 或以上才能支援 AL2023。

對於既有的受管節點群組，您可根據使用啟動範本的方式執行就地升級或藍綠升級：
+ 若您對受管節點群組使用自訂 AMI，可透過交換啟動範本中的 AMI ID 來執行就地升級。在執行此升級策略前，您應確保應用程式和任何使用者資料都能移轉到 AL2023。
+ 如果您使用帶有標準啟動範本或未指定 AMI ID 的自訂啟動範本的受管節點群組，則需要使用藍綠策略進行升級。藍綠升級通常更複雜，涉及建立一個全新的節點群組，並在其中指定 AL2023 作為 AMI 類型。然後需要仔細設定新的節點群組，以確保來自 AL2 節點群組的所有自訂資料都與新的作業系統相容。一旦新的節點群組經過您的應用程式測試和驗證，Pod 可以從舊節點群組移轉到新節點群組。移轉完成後，您可刪除舊的節點群組。

若您使用 Karpenter 並希望使用 AL2023，需要修改 `EC2NodeClass` `amiFamily` 欄位為 AL2023。預設情況下，Karpenter 啟用了偏離。這意味著一旦 `amiFamily` 欄位被更改，Karpenter 將在最新 AMI 可用時自動更新您的工作節點。

## 有關 nodeadm 的其他資訊
<a name="_additional_information_about_nodeadm"></a>

使用 EKS 最佳化 Amazon Linux 2023 AMI 或透過官方 amazon-eks-ami GitHub 儲存庫中提供的 Packer 指令碼建置自訂 EKS Amazon Linux 2023 AMI 時，您應該避免在 EC2 使用者資料內或作為自訂 AMI 的一部分明確執行 nodeadm init。

如果您想要在使用者資料中產生動態 NodeConfig，您可以將該組態寫入 中的插入式 yaml 或 json 檔案`/etc/eks/nodeadm.d`。當 Nodeadm init 稍後在開機程序中自動啟動時，這些組態檔案將會合併並套用至您的節點。例如：

```
cat > /etc/eks/nodeadm.d/additional-node-labels.yaml << EOF
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  kubelet:
    flags:
      - --node-labels=foo=bar
EOF
```

EKS 最佳化的 Amazon Linux 2023 AMIs 會透過單獨的系統化服務，以兩個階段自動執行 nodeadm init：Nodeadm-config 會在使用者資料執行之前執行，而 nodeadm-run 會在之後執行。nodeadm-config 服務會在使用者資料執行之前建立容器化和 kubelet 的基準組態。nodeadm-run 服務會執行選取系統協助程式，並在使用者資料執行後完成任何最終組態。如果透過使用者資料或自訂 AMI 再執行一次 nodeadm init 命令，可能會破壞有關執行排序的假設，導致非預期的結果，包括設定ENIs。

# 擷取 Amazon Linux AMI 版本資訊
<a name="eks-linux-ami-versions"></a>

Amazon EKS 最佳化 Amazon Linux AMI 是由 Kubernetes 版本和 AMI 發行日期進行版本化，格式如下：

```
k8s_major_version.k8s_minor_version.k8s_patch_version-release_date
```

每個 AMI 發行版本均包含 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)、Linux 核心和 [containerd](https://containerd.io/) 的各種版本。加速的 AMI 亦包括 NVIDIA 驅動程序的各種版本。您現在可以在 GitHub 上的[變更日誌](https://github.com/awslabs/amazon-eks-ami/blob/main/CHANGELOG.md)找到此版本資訊。

# 擷取建議的 Amazon Linux AMI ID
<a name="retrieve-ami-id"></a>

您在部署節點時，可針對預先建置的 Amazon EKS 最佳化 Amazon Machine Image (AMI) 指定 ID。若要擷取符合您所需組態的 AMI ID，請查詢 AWS Systems Manager 參數存放區 API。使用此 API 無需手動查詢 Amazon EKS 最佳化的 AMI ID。如需詳細資訊，請參閱 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)。您使用的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必須擁有 `ssm:GetParameter` IAM 許可，才能擷取 Amazon EKS 最佳化 AMI 中繼資料。

您可透過以下命令擷取最新建議的 Amazon EKS 最佳化 Amazon Linux AMI 的映像檔 ID，這會使用子參數 `image_id`。視需要對命令進行下列修改，然後執行修改後的命令：
+ 使用 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)來取代 `<kubernetes-version>`。
+ 使用以下其中一個選項來取代 *ami-type*。若要了解 Amazon EC2 執行個體類型的相關詳細資訊，請參閱 [Amazon EC2 執行個體類型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。
  + 若是 Amazon Linux 2023 (AL2023) `x86` 型執行個體，則使用 *amazon-linux-2023/x86\$164/standard*。
  + 若是 AL2023 ARM 執行個體，例如 [AWS Graviton](https://aws.amazon.com/ec2/graviton/) 型執行個體，則使用 *amazon-linux-2023/arm64/standard*。
  + 若是最近核准的 AL2023 NVIDIA `x86` 型執行個體，則使用 *amazon-linux-2023/x86\$164/nvidia*。
  + 若是最近核准的 AL2023 NVIDIA `arm64` 型執行個體，則使用 *amazon-linux-2023/arm64/nvidia*。
  + 若是最近的 AL2023 [AWS Neuron](https://aws.amazon.com/machine-learning/neuron/) 執行個體，則使用 *amazon-linux-2023/x86\$164/neuron*。
+ `<region-code>` 將 取代為您想要 AMI ID 的 [Amazon EKS 支援 AWS 區域](https://docs.aws.amazon.com/general/latest/gr/eks.html)。

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/<kubernetes-version>/<ami-type>/recommended/image_id \
    --region <region-code> --query "Parameter.Value" --output text
```

下面介紹了取代預留位置之後的命令範例。

```
aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.31/amazon-linux-2023/x86_64/standard/recommended/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

範例輸出如下。

```
ami-1234567890abcdef0
```

# 建置自訂 EKS 最佳化的 Amazon Linux AMI
<a name="eks-ami-build-scripts"></a>

**警告**  
Amazon EKS 已於 2025 年 11 月 26 日停止發佈 EKS 最佳化的 Amazon Linux 2 (AL2) AMIs。適用於 Amazon EKS 的 AL2023 和 Bottlerocket 型 AMIs 適用於所有支援的 Kubernetes 版本，包括 1.33 和更新版本。

Amazon EKS 在 [Amazon EKS AMI Build Specification](https://github.com/awslabs/amazon-eks-ami) 儲存庫中提供開放原始碼建置指令碼，可用來檢視 的組態`kubelet`、執行時間、適用於 Kubernetes 的 AWS IAM Authenticator，以及從頭開始建置您自己的 AL 型 AMI。

此儲存庫包含[適用於 AL2 的專用引導指令碼](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2/runtime/bootstrap.sh)，以及[適用於 AL2023 的 nodeadm 工具](https://awslabs.github.io/amazon-eks-ami/nodeadm/)，其會在開機時間執行。這些指令碼會設定您的執行個體的憑證資料、控制平面端點、叢集名稱等。指令碼被視為 Amazon EKS 最佳化 AMI 建置的事實來源，因此您可以遵循 GitHub 儲存庫來監控 AMIs的變更。

使用 EKS 最佳化 AMIs 作為基礎建置自訂 AMIs 時，不建議或支援執行作業系統升級 （即 `dnf upgrade`) 或升級 EKS 最佳化 AMIs 中包含的任何 Kubernetes 或 GPU 套件，因為這會破壞元件相容性。如果您確實升級 EKS 最佳化 AMIs 中包含的作業系統或套件，建議您在部署到生產環境之前，先在開發或預備環境中徹底測試。

為 GPU 執行個體建置自訂 AMIs 時，建議您為要執行的每個執行個體類型產生和系列分別建置自訂 AMIs。EKS 最佳化加速 AMIs 會根據基礎執行個體類型產生和系列，在執行時間選擇性地安裝驅動程式和套件。如需詳細資訊，請參閱[安裝](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/provisioners/install-nvidia-driver.sh)和[執行時間](https://github.com/awslabs/amazon-eks-ami/blob/main/templates/al2023/runtime/gpu/nvidia-kmod-load.sh)的 EKS AMI 指令碼。

## 先決條件
<a name="_prerequisites"></a>
+  [安裝 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 
+  [安裝 HashiCorp Packer 1.9.4 版及以上](https://developer.hashicorp.com/packer/downloads) 
+  [安裝 GNU Make](https://www.gnu.org/software/make/) 

## 快速指南
<a name="_quickstart"></a>

此快速入門會向您顯示在您的 AWS 帳戶中建立自訂 AMI 的命令。要進一步了解可用於自訂 AMI 的組態，請參閱 [Amazon Linux 2023 ](https://awslabs.github.io/amazon-eks-ami/usage/al2023/)頁面上的範本變數。

### 先決條件
<a name="_prerequisites_2"></a>

安裝所需 [Amazon 外掛程式](https://developer.hashicorp.com/packer/integrations/hashicorp/amazon)。例如：

```
packer plugins install github.com/hashicorp/amazon
```

### 步驟 1. 設定您的環境
<a name="_step_1_setup_your_environment"></a>

複製或分支官方 Amazon EKS AMI 儲存庫。例如：

```
git clone https://github.com/awslabs/amazon-eks-ami.git
cd amazon-eks-ami
```

確認 Packer 已安裝：

```
packer --version
```

### 步驟 2. 建立自訂 AMI
<a name="_step_2_create_a_custom_ami"></a>

以下是各種自訂 AMI 的範例命令。

 **基本 NVIDIA AL2 AMI：**

```
make k8s=1.31 os_distro=al2 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **基本 NVIDIA AL2023 AMI：**

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=nvidia \
  nvidia_driver_major_version=560 \
  enable_efa=true
```

 **STIG 合規 Neuron AL2023 AMI：**

```
make k8s=1.31 os_distro=al2023 \
  enable_accelerator=neuron \
  enable_fips=true \
  source_ami_id=ami-0abcd1234efgh5678 \
  kms_key_id=alias/aws-stig
```

執行這些命令後，Packer 將執行以下操作：\$1 啟動一個臨時 Amazon EC2 執行個體。\$1 安裝 Kubernetes 元件、驅動程式和組態。\$1 在 AWS 帳戶中建立 AMI。

預期的輸出應類似以下：

```
==> Wait completed after 8 minutes 42 seconds

==> Builds finished. The artifacts of successful builds are:
--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9

--> amazon-ebs: AMIs were created:
us-west-2: ami-0e139a4b1a7a9a3e9
```

### 步驟 3。檢視預設值
<a name="_step_3_view_default_values"></a>

要檢視預設值和其他選項，請執行以下命令：

```
make help
```

# 使用最佳化的 Bottlerocket AMI 建立節點
<a name="eks-optimized-ami-bottlerocket"></a>

 [Bottlerocket](https://aws.amazon.com/bottlerocket/) 是由 贊助和支援的開放原始碼 Linux 發行版本 AWS。Bottlerocket 專為託管容器工作負載而打造。利用 Bottlerocket，您可以自動化容器基礎結構的更新，進而改善容器化部署的可用性並降低營運成本。Bottlerocket 僅包含執行容器的基本軟體，可改善資源用量、減少安全威脅，並降低管理開銷。Bottlerocket AMI 包含 `containerd`、 `kubelet`和 AWS IAM Authenticator。除了受管節點群組和自我管理節點外，[Karpenter](https://karpenter.sh/) 亦支援 Bottlerocket。

## 優點
<a name="bottlerocket-advantages"></a>

將 Bottlerocket 與 Amazon EKS 叢集搭配使用具有以下優勢：
+  **更長的正常運行時間、更低的營運成本和更低的管理複雜性** – 與其他 Linux 發行版相比，Bottlerocket 具有更低的資源佔用、更短的啟動時間，並且不易受到安全威脅。Bottlerocket 更小的佔用空間使用更少的儲存、運算和網路資源，有助於降低成本。
+  **透過自動作業系統更新提高安全性** – 對 Bottlerocket 的更新作為一個單元套用，必要時可以復原。這消除了損毀或失敗更新可能使系統處於無法使用狀態的風險。使用 Bottlerocket，只要安全更新可用，就會以干擾性最小的方式自動套用，並在發生故障時復原。
+  **進階支援** – 在 Amazon EC2 上 AWS 提供的 Bottlerocket 組建涵蓋在相同的 AWS 支援計畫中，該計畫也涵蓋 Amazon EC2、Amazon EKS 和 Amazon ECR 等 AWS 服務。

## 考量事項
<a name="bottlerocket-considerations"></a>

將 Bottlerocket 用於 AMI 類型時，請考慮下列事項：
+ Bottlerocket 支援具有 `x86_64` 與 `arm64` 處理器的 Amazon EC2 執行個體。
+ Bottlerocket 支援具有 GPUs 的 Amazon EC2 執行個體。如需詳細資訊，請參閱[針對 GPU 執行個體使用 EKS 最佳化AMIs](ml-eks-optimized-ami.md)。
+ Bottlerocket 映像不會包含 SSH 伺服器或 Shell。您可以採用頻外存取方法來允許 SSH。這些方法啟用管理員容器，並傳遞一些引導組態步驟與使用者資料。如需詳細資訊，請參閱 GitHub 上 [Bottlerocket OS](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md) 中的下列章節：
  +  [探勘](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#exploration) 
  +  [管理員容器](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#admin-container) 
  +  [Kubernetes 設定](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#kubernetes-settings) 
+ Bottlerocket 使用不同的容器類型：
  + 在預設情況下，已啟用[控制容器](https://github.com/bottlerocket-os/bottlerocket-control-container)。此容器會執行 [AWS Systems Manager 代理程式](https://github.com/aws/amazon-ssm-agent)，可以讓您在 Amazon EC2 Bottlerocket 執行個體上執行命令或啟動 Shell 工作階段。如需詳細資訊，請參閱 Systems [Manager 使用者指南中的設定 Session](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started.html) Manager。 * AWS *
  + 如果在建立節點群組時提供 SSH 金鑰，則啟用管理容器。建議只在開發和測試案例中使用管理容器，不要在生產環境中使用此種容器。如需詳細資訊，請參閱 GitHub 上的[管理容器](https://github.com/bottlerocket-os/bottlerocket/blob/develop/README.md#admin-container)。

## 其他資訊
<a name="bottlerocket-more-information"></a>

如需使用 Amazon EKS 最佳化 Bottlerocket AMI 的詳細資訊，請參閱下列區段：
+ 如需 Bottlerocket 的更多資訊，請參閱 [Bottlerocket 文件](https://bottlerocket.dev/en/)。
+ 有關版本資訊資源，請參閱 [擷取 Bottlerocket AMI 版本資訊](eks-ami-versions-bottlerocket.md)。
+ 若要將 Bottlerocket 與受管節點群組搭配使用，請參閱 [透過受管節點群組來簡化節點生命週期](managed-node-groups.md)。
+ 若要啟動自我管理的 Bottlerocket 節點，請參閱 [建立自我管理的 Bottlerocket 節點](launch-node-bottlerocket.md)。
+ 若要擷取 Amazon EKS 最佳化 Bottlerocket AMI 的最新 ID，請參閱 [擷取建議的 Bottlerocket AMI ID](retrieve-ami-id-bottlerocket.md)。
+ 如需合規性支援的詳細資訊，請參閱 [透過 Bottlerocket 滿足合規要求](bottlerocket-compliance-support.md)。

# 擷取 Bottlerocket AMI 版本資訊
<a name="eks-ami-versions-bottlerocket"></a>

每個 Bottlerocket AMI 發行版本均包含 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)、Bottlerocket 核心和 [containerd](https://containerd.io/) 的各種版本。加速的 AMI 變體亦包括 NVIDIA 驅動程序的各種版本。您可在 *Bottlerocket 文件*的[作業系統](https://bottlerocket.dev/en/os/)主題中找到此版本資訊。從該頁面，導覽至適用的*版本資訊*子主題。

*Bottlerocket 文件*的更新速度有時可能會落後於 GitHub 上提供的版本。您可在 GitHub 的[版本](https://github.com/bottlerocket-os/bottlerocket/releases)中找到最新版本的變更清單。

# 擷取建議的 Bottlerocket AMI ID
<a name="retrieve-ami-id-bottlerocket"></a>

您在部署節點時，可針對預先建置的 Amazon EKS 最佳化 Amazon Machine Image (AMI) 指定 ID。如需要擷取與您的所需組態相符的 AMI ID，請查詢 AWS Systems Manager 參數存放區 API。使用此 API 無需手動查詢 Amazon EKS 最佳化的 AMI ID。如需詳細資訊，請參閱 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)。您使用的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必須擁有 `ssm:GetParameter` IAM 許可，才能擷取 Amazon EKS 最佳化 AMI 中繼資料。

您可以使用下列 AWS CLI 命令，擷取最新推薦的 Amazon EKS 最佳化 Bottlerocket AMI 的映像 ID，這會使用子參數 `image_id`。視需要對命令進行下列修改，然後執行修改後的命令：
+ 使用支援的[平台版本](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)來取代 *kubernetes-version*。
+ 使用以下其中一個選項來取代 *-flavor*。
  + 若是未啟用 GPU 的變體，則移除 *-flavor*。
  + 若是啟用 GPU 的變體，則使用 *-nvidia*。
  + 若是啟用 FIPS 的變體，則使用 *-fips*。
+ 使用以下其中一個選項來取代*架構*。
  + 若是 `x86` 型執行個體，則使用 *x86\$164*。
  + 若是 ARM 執行個體，則使用 *arm64*。
+ 使用您需要取得 AMI ID 的 [Amazon EKS 支援的 AWS 區域](https://docs.aws.amazon.com/general/latest/gr/eks.html)來取代 *region-code*。

```
aws ssm get-parameter --name /aws/service/bottlerocket/aws-k8s-kubernetes-version-flavor/architecture/latest/image_id \
    --region region-code --query "Parameter.Value" --output text
```

下面介紹了取代預留位置之後的命令範例。

```
aws ssm get-parameter --name /aws/service/bottlerocket/aws-k8s-1.31/x86_64/latest/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

範例輸出如下。

```
ami-1234567890abcdef0
```

# 透過 Bottlerocket 滿足合規要求
<a name="bottlerocket-compliance-support"></a>

Bottlerocket 符合各種組織定義的建議：
+ 為 Bottlerocket 定義了 [CIS 基準](https://www.cisecurity.org/benchmark/bottlerocket)。在預設組態中，Bottlerocket 映像具有 CIS 第 1 級組態設定檔所需的大部分控制項。您可以實作 CIS 第 2 級組態設定檔所需的控制項。如需詳細資訊，請參閱 AWS 部落格上的[針對 CIS 基準驗證 Amazon EKS 最佳化 Bottlerocket AMI](https://aws.amazon.com/blogs/containers/validating-amazon-eks-optimized-bottlerocket-ami-against-the-cis-benchmark)。
+ 功能集最佳化和受攻擊面減少表示 Bottlerocket 執行個體只需較少的組態即可滿足 PCI DSS 需求。[Bottlerocket 的 CIS 基準](https://www.cisecurity.org/benchmark/bottlerocket)是強化指引的極佳資源，可支援您在 PCI DSS 需求 2.2 下對安全組態標準的需求。您也可以利用 [Fluent Bit](https://opensearch.org/blog/technical-post/2022/07/bottlerocket-k8s-fluent-bit/) 來支援 PCI DSS 需求 10.2 下作業系統層級稽核日誌記錄的需求。AWS 定期發布新的 (已修補的) Bottlerocket 執行個體，以協助您符合 PCI DSS 需求 6.2 (適用於 3.2.1 版) 和需求 6.3.3 (適用於 4.0 版)。
+ Bottlerocket 是符合 HIPAA 資格的功能，經授權可與 Amazon EC2 和 Amazon EKS 的受管制工作負載搭配使用。如需詳細資訊，請參閱 [HIPAA 資格服務參照](https://aws.amazon.com/compliance/hipaa-eligible-services-reference/)。
+ 可使用預先設定為利用 FIPS 140-3 驗證加密模組的 Bottlerocket AMI。其中包含 Amazon Linux 2023 核心加密 API 加密模組與 AWS-LC 加密模組。如需詳細資訊，請參閱 [使用 Bottlerocket FIPS AMI 讓您的工作節點符合 FIPS 就緒狀態](bottlerocket-fips-amis.md)。

# 使用 Bottlerocket FIPS AMI 讓您的工作節點符合 FIPS 就緒狀態
<a name="bottlerocket-fips-amis"></a>

美國聯邦資訊處理標準 (FIPS) 第 140-3 號公報中，美國和加拿大政府的安全標準具體說明密碼模組的安全要求，以保護敏感資訊。Bottlerocket 透過提供具有 FIPS 核心的 AMI，讓您更容易遵循 FIPS 規範。

這些 AMI 已預先設定為使用 FIPS 140-3 驗證的密碼編譯模組。這包括 Amazon Linux 2023 核心密碼編譯 API 密碼編譯模組和 Go 密碼編譯模組。

使用 Bottlerocket FIPS AMI 可讓您的工作節點成為「FIPS 就緒」，但不會自動成為「FIPS 相容」。如需詳細資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

## 考量事項
<a name="_considerations"></a>
+ 如果您的叢集使用隔離子網路，則 Amazon ECR FIPS 端點可能無法存取。這可能導致節點引導失敗。請確保您的網路組態允許存取必要的 FIPS 端點。如需詳細資訊，請參閱 * AWS PrivateLink 指南*中的[透過資源 VPC 端點存取資源](https://docs.aws.amazon.com/vpc/latest/privatelink/use-resource-endpoint.html)。
+ 如果您的叢集使用具有 [PrivateLink](vpc-interface-endpoints.md)的子網路，則映像提取將會失敗，因為 Amazon ECR FIPS 端點無法透過 PrivateLink 使用。

## 使用 Bottlerocket FIPS AMI 建立受管節點群組
<a name="_create_a_managed_node_group_with_a_bottlerocket_fips_ami"></a>

Bottlerocket FIPS AMI 提供四種支援工作負載的變體：
+  `BOTTLEROCKET_x86_64_FIPS` 
+  `BOTTLEROCKET_ARM_64_FIPS` 
+  `BOTTLEROCKET_x86_64_NVIDIA_FIPS` 
+  `BOTTLEROCKET_ARM_64_NVIDIA_FIPS` 

要使用 Bottlerocket FIPS AMI 建立受管節點群組，請在建立程序中選擇適用的 AMI 類型。如需詳細資訊，請參閱[建立叢集的受管節點群組](create-managed-node-group.md)。

有關選擇啟用 FIPS 的變體的更多資訊，請參閱 [擷取建議的 Bottlerocket AMI ID](retrieve-ami-id-bottlerocket.md)。

## 停用不支援 AWS 區域的 FIPS 端點
<a name="disable_the_fips_endpoint_for_non_supported_shared_aws_regions"></a>

Bottlerocket FIPS AMIs 直接在美國支援，包括 AWS GovCloud (US) 區域。對於可使用 AMIs 但無法直接支援的 AWS 區域，您仍然可以透過使用啟動範本建立受管節點群組來使用 AMIs。

Bottlerocket FIPS AMI 在啟動程序期間依賴 Amazon ECR FIPS 端點，而這些端點在美國以外地區通常不可用。若要在沒有 Amazon ECR FIPS 端點可用的 AWS 區域中，將 AMI 用於其 FIPS 核心，請執行下列步驟來停用 FIPS 端點：

1. 建立一個包含以下內容的新組態檔案，或將該內容整合到您現有的組態檔中。

```
[default]
use_fips_endpoint=false
```

1. 將檔案內容編碼為 Base64 格式。

1. 在您的啟動範本的 `UserData` 中，使用 TOML 格式加入以下編碼字串：

```
[settings.aws]
config = "<your-base64-encoded-string>"
```

對於其他設定，[請參閱 GitHub 上 Bottlerocket 的設定描述](https://github.com/bottlerocket-os/bottlerocket?tab=readme-ov-file#description-of-settings)。

以下是啟動範本中 `UserData` 的範例：

```
[settings]
motd = "Hello from eksctl!"
[settings.aws]
config = "W2RlZmF1bHRdCnVzZV9maXBzX2VuZHBvaW50PWZhbHNlCg==" # Base64-encoded string.
[settings.kubernetes]
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
cluster-name = "<cluster-name>"
...<other-settings>
```

有關使用使用者資料建立啟動範本的更多資訊，請參閱 [使用啟動範本自訂受管節點](launch-templates.md)。

# 使用最佳化的 Ubuntu Linux AMI 建立節點
<a name="eks-partner-amis"></a>

Canonical 已與 Amazon EKS 合作，建立了可供您用於叢集的節點 AMI。

 [Canonical](https://www.canonical.com/) 提供專為特定用途打造的 Kubernetes 節點作業系統映像。此基本款 Ubuntu 映像已針對 Amazon EKS 最佳化，包含了與 AWS 共同開發的自訂 AWS 核心。如需詳細資訊，請參閱 [Amazon Elastic Kubernetes Service (EKS) 上的 Ubuntu](https://cloud-images.ubuntu.com/aws-eks/) 和 [建立自我管理的 Ubuntu Linux 節點](launch-node-ubuntu.md)。如需有關支援的資訊，請參閱 *AWS Premium Support 常見問答集*的[第三方軟體](https://aws.amazon.com/premiumsupport/faqs/#Third-party_software)章節。

# 使用最佳化的 Windows AMI 建立節點
<a name="eks-optimized-windows-ami"></a>

Windows Amazon EKS 最佳化 AMIs 建置於 Windows Server 2019、Windows Server 2022 和 Windows Server 2025 之上。這些 AMI 已設定為 Amazon EKS 節點的基礎映像。預設情況下，AMI 會包括以下組件：
+  [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) 
+  [kube-proxy](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/) 
+  [AWS 適用於 Kubernetes 的 IAM Authenticator](https://github.com/kubernetes-sigs/aws-iam-authenticator) 
+  [csi-proxy](https://github.com/kubernetes-csi/csi-proxy) 
+  [containerd](https://containerd.io/) 

**注意**  
您可以使用 [Microsoft 安全性更新指南](https://portal.msrc.microsoft.com/en-us/security-guidance)，追蹤 Windows Server 的安全性或隱私權事件。

適用於 Amazon EKS 提供針對有下列變化之 Windows 容器最佳化的 AMI：
+ Amazon EKS 最佳化 Windows Server 2019 Core AMI
+ Amazon EKS 最佳化 Windows Server 2019 Full AMI
+ Amazon EKS 最佳化 Windows Server 2022 Core AMI
+ Amazon EKS 最佳化 Windows Server 2022 完整 AMI
+ Amazon EKS 最佳化 Windows Server 2025 Core AMI
+ Amazon EKS 最佳化 Windows Server 2025 Full AMI

**重要**  
Amazon EKS 最佳化 Windows Server 20H2 Core AMI 正在逐漸棄用。不再發佈此 AMI 的新版本。
為了確保您預設擁有最新的安全性更新，Amazon EKS 會維護最近 4 個月的最佳化 Windows AMI。每個新的 AMI 自首次發布起將提供 4 個月。此期限過後，較舊的 AMI 將被設為私有且無法再存取。我們建議使用最新的 AMI，以避免安全性漏洞並失去對已達支援生命週期終點的舊版 AMI 的存取權。雖然我們無法保證我們可以提供已設為私有AMIs 存取權，但您可以透過向 AWS Support 提交票證來請求存取權。

## 版本發佈日曆
<a name="windows-ami-release-calendar"></a>

下表列出 Amazon EKS 上 Windows 版本的發佈和終止支援日期。如果終止日期為空白，則是因為版本仍然受到支援。


| Windows 版本 | Amazon EKS 發佈 | Amazon EKS 終止支援 | 
| --- | --- | --- | 
|  Windows Server 2025 Core  |  01/27/2026  |  | 
|  Windows Server 2025 完整  |  01/27/2026  |  | 
|  Windows Server 2022 Core  |  10/17/2022  |  | 
|  Windows Server 2022 Full  |  10/17/2022  |  | 
|  Windows Server 20H2 Core  |  8/12/2021  |  8/9/2022  | 
|  Windows Server 2004 Core  |  8/19/2020  |  12/14/2021  | 
|  Windows Server 2019 Core  |  10/7/2019  |  | 
|  Windows Server 2019 Full  |  10/7/2019  |  | 
|  Windows Server 1909 Core  |  10/7/2019  |  12/8/2020  | 

## 引導指令碼組態參數
<a name="bootstrap-script-configuration-parameters"></a>

建立 Windows 節點時，節點上會有允許設定不同參數的指令碼。根據設定，可以在節點上類似於以下位置的地方找到該指令碼：`C:\Program Files\Amazon\EKS\Start-EKSBootstrap.ps1`。您可將自訂參數值指定為引導指令碼的引數，以指定自訂參數值。例如，您可以更新啟動範本中的使用者資料。如需詳細資訊，請參閱[Amazon EC2 使用者資料](launch-templates.md#launch-template-user-data)。

該指令碼包括下列命令列參數：
+  `-EKSClusterName`：指定此工作節點要加入的 Amazon EKS 叢集名稱。
+  `-KubeletExtraArgs`：指定 `kubelet` 額外的引數 (選用)。
+  `-KubeProxyExtraArgs`：指定 `kube-proxy` 額外的引數 (選用)。
+  `-APIServerEndpoint`：指定 Amazon EKS 叢集 API 伺服器端點 (可選)。僅在搭配 `-Base64ClusterCA` 使用時有效。略過呼叫 `Get-EKSCluster`。
+  `-Base64ClusterCA`：指定 Base64 編碼的叢集 CA 內容 (可選)。僅在搭配 `-APIServerEndpoint` 使用時有效。略過呼叫 `Get-EKSCluster`。
+  `-DNSClusterIP`：覆寫要用於叢集內 DNS 查詢的 IP 地址 (選用)。根據主要介面的 IP 地址，預設為 `10.100.0.10` 或 `172.20.0.10`。
+  `-ServiceCIDR` – 覆寫叢集服務從中尋址的 Kubernetes 服務 IP 位址範圍。根據主要介面的 IP 地址，預設為 `172.20.0.0/16` 或 `10.100.0.0/16`。
+  `-ExcludedSnatCIDRs`：要從來源網路地址轉譯 (SNAT) 排除的 `IPv4` CIDR 清單。這表示 VPC 可定址的 Pod 私有 IP 不會轉譯為傳出流量執行個體 ENI 主要 `IPv4` 位址的 IP 位址。依預設，會新增用於 Amazon EKS Windows 節點之 VPC 的 `IPv4` CIDR。將 CIDR 指定給此參數也會另外排除指定的 CIDR。如需詳細資訊，請參閱[啟用 Pod 的傳出網際網路存取](external-snat.md)。

除了命令列參數之外，您還可以指定一些環境變數參數。指定命令列參數時，它的優先順序高於個別的環境變數。環境變數應定義為機器 (或系統) 範圍，因為引導指令碼只會讀取機器範圍的變數。

此指令碼會考慮下列環境變數：
+  `SERVICE_IPV4_CIDR`：請參閱 `ServiceCIDR` 命令列參數了解定義。
+  `EXCLUDED_SNAT_CIDRS`：應為逗號分隔的字串。請參閱 `ExcludedSnatCIDRs` 命令列參數了解定義。

### gMSA 身分驗證支援
<a name="ad-and-gmsa-support"></a>

Amazon EKS Windows Pod 允許不同類型的群組受管服務帳戶 (gMSA) 身分驗證。
+ Amazon EKS 支援 Active Directory 網域身分進行身分驗證。如需加入網域的 gMSA 的詳細資訊，請參閱 AWS 部落格上的 [Amazon EKS Windowspods 上的 Windows 身分驗證](https://aws.amazon.com/blogs/containers/windows-authentication-on-amazon-eks-windows-pods)。
+ Amazon EKS 提供的外掛程式可讓未加入網域的 Windows 節點擷取具有可攜式使用者身分的 gMSA 憑證。如需無網域 gMSA 的詳細資訊，請參閱 AWS 部落格上的[適用於 Amazon EKS Windowspods 的無網域 Windows 身分驗證](https://aws.amazon.com/blogs/containers/domainless-windows-authentication-for-amazon-eks-windows-pods)。

## 快取容器映像
<a name="windows-cached-container-images"></a>

Amazon EKS Windows 最佳化 AMI 具有針對 `containerd` 執行時期執行期快取的特定容器映像。使用 Amazon 受管建置元件建置自訂 AMI 時，會快取容器映像。如需詳細資訊，請參閱[使用 Amazon 受管建置元件](eks-custom-ami-windows.md#custom-windows-ami-build-component)。

下列的快取容器映像適用於 `containerd` 執行期：
+  `amazonaws.com/eks/pause-windows` 
+  `mcr.microsoft.com/windows/nanoserver` 
+  `mcr.microsoft.com/windows/servercore` 

## 其他資訊
<a name="windows-more-information"></a>

如需使用 Amazon EKS 最佳化 Windows AMI 的詳細資訊，請參閱下列區段：
+ 有關在 Amazon EKS 最佳化加速 Windows AMI 上執行工作負載的詳細資訊，請參 [執行 GPU 加速容器 (Windows on EC2 G 系列)](ml-eks-windows-optimized-ami.md)。
+ 若要將 Windows 與受管節點群組搭配使用，請參閱 [透過受管節點群組來簡化節點生命週期](managed-node-groups.md)。
+ 若要啟動自我管理的 Windows 節點，請參閱 [建立自我管理的 Microsoft Windows 節點](launch-windows-workers.md)。
+ 如需版本資訊，請參閱[擷取 Windows AMI 版本資訊](eks-ami-versions-windows.md)。
+ 若要擷取 Amazon EKS 最佳化 Windows AMI 的最新 ID，請參閱 [擷取建議的 Microsoft Windows AMI ID](retrieve-windows-ami-id.md)。
+ 若要使用 Amazon EC2 Image Builder 來建立自訂 Amazon EKS 最佳化 Windows AMI，請參閱 [使用 Image Builder 建置自訂 Windows AMI](eks-custom-ami-windows.md)。
+ 如需最佳實務，請參閱《*EKS 最佳實務指南*》中的 [Amazon EKS 最佳化 Windows AMI 管理](https://aws.github.io/aws-eks-best-practices/windows/docs/ami/)。

# 藉助 `eksctl` 建立自我管理 Windows Server 2022 節點
<a name="self-managed-windows-server-2022"></a>

您可以使用下列 `test-windows-2022.yaml` 作為建立自我管理 Windows Server 2022 節點的參考。使用您自己的值取代每一個*範例值*。

**注意**  
您必須使用 `eksctl` [0.116.0](https://github.com/weaveworks/eksctl/releases/tag/v0.116.0) 版或更新版本，才能執行自我管理 Windows Server 2022 節點。

```
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: windows-2022-cluster
  region: region-code
  version: '1.35'

nodeGroups:
  - name: windows-ng
    instanceType: m5.2xlarge
    amiFamily: WindowsServer2022FullContainer
    volumeSize: 100
    minSize: 2
    maxSize: 3
  - name: linux-ng
    amiFamily: AmazonLinux2
    minSize: 2
    maxSize: 3
```

然後，可以使用以下命令建立節點群組。

```
eksctl create cluster -f test-windows-2022.yaml
```

# 擷取 Windows AMI 版本資訊
<a name="eks-ami-versions-windows"></a>

本主題列出 Amazon EKS 最佳化 Windows AMI 版本及其 [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)、[containerd](https://containerd.io/) 和 [csi-proxy](https://github.com/kubernetes-csi/csi-proxy) 的對應版本。

可透過程式設計方式擷取每個變體的 Amazon EKS 最佳化 AMI 中繼資料 (包括 AMI ID)。如需詳細資訊，請參閱[擷取建議的 Microsoft Windows AMI ID](retrieve-windows-ami-id.md)。

AMI 是由 Kubernetes 版本和 AMI 發行日期進行版本化，格式如下：

```
k8s_major_version.k8s_minor_version-release_date
```

**注意**  
Amazon EKS 受管節點群組支援 2022 年 11 月及後來的 Windows AMI 版本。

如需接收有關此特定文件頁面所有來源檔案變更的通知，您可透過 RSS 閱讀器來訂閱以下 URL：

```
https://github.com/awsdocs/amazon-eks-user-guide/commits/mainline/latest/ug/nodes/eks-ami-versions-windows.adoc.atom
```

## Amazon EKS 最佳化 Windows Server 2025 Core AMI
<a name="eks-ami-versions-windows-2025-core"></a>

下表列出 Amazon EKS 最佳化 Windows Server 2025 Core AMI 的目前和先前版本。

**Example**  


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 

## Amazon EKS 最佳化 Windows Server 2025 Full AMI
<a name="eks-ami-versions-windows-2025-full"></a>

下表列出 Amazon EKS 最佳化 Windows Server 2025 Full AMI 的目前和先前版本。

**Example**  


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 

## Amazon EKS 最佳化 Windows Server 2022 Core AMI
<a name="eks-ami-versions-windows-2022-core"></a>

下表列出 Amazon EKS 最佳化 Windows Server 2022 Core AMI 的目前版本和先前版本。

**Example**  


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  已將 `containerd` 升級至 `2.1.6`。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.14`。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。已將 `kubelet` 升級至 `1.29.3`。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.29-2024.03.12`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  修正 `kubelet` 垃圾回收程序錯誤刪除暫停映像的錯誤。  | 
|   `1.29-2024.01.11`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  排除 Windows Server 2022 Core AMI 上的獨立 Windows 更新 [KB5034439](https://support.microsoft.com/en-au/topic/kb5034439-windows-recovery-environment-update-for-azure-stack-hci-version-22h2-and-windows-server-2022-january-9-2024-6f9d26e6-784c-4503-a3c6-0beedda443ca)。此 KB 僅適用於具有獨立 WinRE 分割區的 Windows 安裝，而我們的任何 Amazon EKS 最佳化 Windows AMI 均未包含此分割區。  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。已將 `kubelet` 升級至 `1.28.8`。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.25`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.28-2024.03.12`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.11`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  排除 Windows Server 2022 Core AMI 上的獨立 Windows 更新 [KB5034439](https://support.microsoft.com/en-au/topic/kb5034439-windows-recovery-environment-update-for-azure-stack-hci-version-22h2-and-windows-server-2022-january-9-2024-6f9d26e6-784c-4503-a3c6-0beedda443ca)。此 KB 僅適用於具有獨立 WinRE 分割區的 Windows 安裝，而我們的任何 Amazon EKS 最佳化 Windows AMI 均未包含此分割區。  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  包含 `CVE-2023-5528` 的修補程式。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.18`。已新增[引導指令碼環境變數](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` 和 `EXCLUDED_SNAT_CIDRS`)。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  已修正 `kubelet` 的 [安全性公告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 最佳化 Windows Server 2022 Full AMI
<a name="eks-ami-versions-windows-2022-full"></a>

下表列出 Amazon EKS 最佳化 Windows Server 2022 Full AMI 的目前版本和先前版本。

**Example**  


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  已將 `containerd` 升級至 `2.1.6`。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`   | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.01`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.14`。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。已將 `kubelet` 升級至 `1.29.3`。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.29-2024.03.12`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  修正 `kubelet` 垃圾回收程序錯誤刪除暫停映像的錯誤。  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025.01.01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。已將 `kubelet` 升級至 `1.28.8`。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.25`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.28-2024.03.12`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  包含 `CVE-2023-5528` 的修補程式。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.18`。已新增[引導指令碼環境變數](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` 和 `EXCLUDED_SNAT_CIDRS`)。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  已修正 `kubelet` 的 [安全性公告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 最佳化 Windows Server 2019 Core AMI
<a name="eks-ami-versions-windows-2019-core"></a>

下表列出 Amazon EKS 最佳化 Windows Server 2019 Core AMI 的目前版本和先前版本。

**Example**  


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  已將 `containerd` 升級至 `2.1.6`。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.4`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.30-2025-02-15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.14`。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。已將 `kubelet` 升級至 `1.29.3`。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.29-2024.03.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  修正 `kubelet` 垃圾回收程序錯誤刪除暫停映像的錯誤。  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。已將 `kubelet` 升級至 `1.28.8`。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.25`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.28-2024.03.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  包含 `CVE-2023-5528` 的修補程式。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.18`。已新增[引導指令碼環境變數](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` 和 `EXCLUDED_SNAT_CIDRS`)。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  已修正 `kubelet` 的 [安全性公告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

## Amazon EKS 最佳化 Windows Server 2019 Full AMI
<a name="eks-ami-versions-windows-2019-full"></a>

下表列出 Amazon EKS 最佳化 Windows Server 2019 Full AMI 的目前版本和先前版本。

**Example**  


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.35-2026.02.16`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.35-2026-01-22`   |   `1.35.0`   |   `2.1.6`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.34-2026.02.13`   |   `1.34.3`   |   `2.1.6`   |   `1.2.1`   |  | 
|   `1.34-2026.01.22`   |   `1.34.2`   |   `2.1.6`   |   `1.2.1`   |  已將 `containerd` 升級至 `2.1.6`。  | 
|   `1.34-2025.12.15`   |   `1.34.2`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.11.14`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.10.18`   |   `1.34.1`   |   `2.1.4`   |   `1.2.1`   |  | 
|   `1.34-2025.09.13`   |   `1.34.0`   |   `2.1.4`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.33-2026.02.13`   |   `1.33.7`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.33-2026.01.22`   |   `1.33.5`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.33-2025.12.15`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.11.14`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.10.18`   |   `1.33.5`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.33-2025.09.13`   |   `1.33.4`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.33-2025.08.18`   |   `1.33.3`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.07.16`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.06.13`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.33-2025.05.17`   |   `1.33.1`   |   `1.7.27`   |   `1.2.1`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.32-2026.02.13`   |   `1.32.11`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.32-2026.01.22`   |   `1.32.9`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.32-2025.12.15`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.11.14`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.10.18`   |   `1.32.9`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.32-2025.09.13`   |   `1.32.8`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.32-2025.08.18`   |   `1.32.7`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.07.16`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.32-2025.06.13`   |   `1.32.5`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.32-2025.05.17`   |   `1.32.5`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.32-2025.04.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.03.14`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.02.18`   |   `1.32.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.32-2025.01.15`   |   `1.32.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.31-2026.02.13`   |   `1.31.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.31-2026.01.22`   |   `1.31.13`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.31-2025.12.15`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.11.14`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.10.18`   |   `1.31.13`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.31-2025.09.13`   |   `1.31.12`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.31-2025.08.18`   |   `1.31.11`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.07.16`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.31-2025.06.13`   |   `1.31.9`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.31-2025.05.17`   |   `1.31.9`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.31-2025.04.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.03.14`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.02.15`   |   `1.31.5`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.15`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2025.01.01`   |   `1.31.4`   |   `1.7.20`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.31-2024.12.13`   |   `1.31.3`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.11.12`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.08`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.10.01`   |   `1.31.1`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.31-2024.09.10`   |   `1.31.0`   |   `1.7.20`   |   `1.1.3`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.30-2026.02.13`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.30-2026.01.22`   |   `1.30.14`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.30-2025.12.15`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.11.21`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.10.18`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.30-2025.09.13`   |   `1.30.14`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.30-2025.08.18`   |   `1.30.14`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.07.16`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.30-2025.06.13`   |   `1.30.13`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.30-2025.05.17`   |   `1.30.13`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.30-2025.04.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.30-2025.03.14`   |   `1.30.9`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.30-2025.02.15`   |   `1.30.9`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.15`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2025.01.01`   |   `1.30.8`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.30-2024.12.11`   |   `1.30.7`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.11.12`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.10.08`   |   `1.30.4`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.09.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.08.13`   |   `1.30.2`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.30-2024.07.10`   |   `1.30.2`   |   `1.7.14`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.30-2024.06.17`   |   `1.30.0`   |   `1.7.14`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.14`。  | 
|   `1.30-2024.05.15`   |   `1.30.0`   |   `1.6.28`   |   `1.1.2`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.29-2026.02.13`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  | 
|   `1.29-2026.01.22`   |   `1.29.15`   |   `1.7.30`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.30`。  | 
|   `1.29-2025.12.15`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.11.14`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.10.18`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.29-2025.09.13`   |   `1.29.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.29-2025.08.18`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.07.16`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.29-2025.06.13`   |   `1.29.15`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.29-2025.05.17`   |   `1.29.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.29-2025.04.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.29-2025.03.14`   |   `1.29.13`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.29-2025.02.15`   |   `1.29.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.15`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2025.01.01`   |   `1.29.12`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.29-2024.12.11`   |   `1.29.10`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.11.12`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.10.08`   |   `1.29.8`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.09.10`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.08.13`   |   `1.29.6`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.29-2024.07.10`   |   `1.29.6`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.29-2024.06.17`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  | 
|   `1.29-2024.05.15`   |   `1.29.3`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。已將 `kubelet` 升級至 `1.29.3`。  | 
|   `1.29-2024.04.09`   |   `1.29.0`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.29-2024.03.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.13`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  | 
|   `1.29-2024.02.06`   |   `1.29.0`   |   `1.6.25`   |   `1.1.2`   |  修正 `kubelet` 垃圾回收程序錯誤刪除暫停映像的錯誤。  | 
|   `1.29-2024.01.09`   |   `1.29.0`   |   `1.6.18`   |   `1.1.2`   |  | 


| AMI 版本 | kubelet 版本 | containerd 版本 | csi-proxy 版本 | 版本備註 | 
| --- | --- | --- | --- | --- | 
|   `1.28-2025.11.14`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.10.18`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  | 
|   `1.28-2025.09.13`   |   `1.28.15`   |   `1.7.28`   |   `1.2.1`   |  將 GMSA 外掛程式日誌變更為 Windows Events  | 
|   `1.28-2025.08.18`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.07.16`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  | 
|   `1.28-2025.06.13`   |   `1.28.15`   |   `1.7.27`   |   `1.2.1`   |  已將 `containerd` 升級至 `1.7.27`。  | 
|   `1.28-2025.05.17`   |   `1.28.15`   |   `1.7.20`   |   `1.2.1`   |  | 
|   `1.28-2025.04.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  | 
|   `1.28-2025.03.14`   |   `1.28.15`   |   `1.7.20`   |   `1.1.3`   |  已將 `containerd` 升級至 `1.7.20`。  | 
|   `1.28-2025.02.15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-15`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2025-01-01`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  包含 `CVE-2024-9042` 的修補程式。  | 
|   `1.28-2024.12.11`   |   `1.28.15`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.11.12`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.10.08`   |   `1.28.13`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.09.10`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.08.13`   |   `1.28.11`   |   `1.7.14`   |   `1.1.3`   |  | 
|   `1.28-2024.07.10`   |   `1.28.11`   |   `1.7.11`   |   `1.1.2`   |  包含 `CVE-2024-5321` 的修補程式。  | 
|   `1.28-2024.06.17`   |   `1.28.8`   |   `1.7.11`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.7.11`。  | 
|   `1.28-2024.05.14`   |   `1.28.8`   |   `1.6.28`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.28`。已將 `kubelet` 升級至 `1.28.8`。  | 
|   `1.28-2024.04.09`   |   `1.28.5`   |   `1.6.25`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.25`。使用 `golang 1.22.1` 重建 CNI 和 `csi-proxy`。  | 
|   `1.28-2024.03.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.02.13`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2024.01.09`   |   `1.28.5`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.12.12`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  | 
|   `1.28-2023.11.14`   |   `1.28.3`   |   `1.6.18`   |   `1.1.2`   |  包含 `CVE-2023-5528` 的修補程式。  | 
|   `1.28-2023.10.19`   |   `1.28.2`   |   `1.6.18`   |   `1.1.2`   |  已將 `containerd` 升級至 `1.6.18`。已新增[引導指令碼環境變數](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters) (`SERVICE_IPV4_CIDR` 和 `EXCLUDED_SNAT_CIDRS`)。  | 
|   `1.28-2023-09.27`   |   `1.28.2`   |   `1.6.6`   |   `1.1.2`   |  已修正 `kubelet` 的 [安全性公告](https://github.com/advisories/GHSA-6xv5-86q9-7xr8)。  | 
|   `1.28-2023.09.12`   |   `1.28.1`   |   `1.6.6`   |   `1.1.2`   |  | 

# 擷取建議的 Microsoft Windows AMI ID
<a name="retrieve-windows-ami-id"></a>

您在部署節點時，可針對預先建置的 Amazon EKS 最佳化 Amazon Machine Image (AMI) 指定 ID。若要擷取符合您所需組態的 AMI ID，請查詢 AWS Systems Manager 參數存放區 API。使用此 API 無需手動查詢 Amazon EKS 最佳化的 AMI ID。如需詳細資訊，請參閱 [GetParameter](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html)。您使用的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-principal)必須擁有 `ssm:GetParameter` IAM 許可，才能擷取 Amazon EKS 最佳化 AMI 中繼資料。

您可透過以下命令擷取最新建議的 Amazon EKS 最佳化 Windows AMI 的映像檔 ID，這會使用子參數 `image_id`。視需要對命令進行下列修改，然後執行修改後的命令：
+ 使用以下其中一個選項來取代*發行版本*。
  + 針對 Windows Server *2025* 使用 2025。
  + 若是 Windows Server *2022*，則使用 2022。
  + 若是 Windows Server *2019*，則使用 2019。
+ 使用以下其中一個選項來取代 *installation-option*。如需詳細資訊，請參閱 [Windows Server 中有哪些 Server Core 安裝選項](https://learn.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core)。
  + 使用 *Core*，實現最少安裝以減少攻擊面。
  + 使用 *Full*，可包括 Windows 桌面體驗。
+ 使用支援的[平台版本](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html)來取代 *kubernetes-version*。
+ 將 *region-code* 取代為您想要 AMI ID 的 [Amazon EKS 支援 AWS 區域](https://docs.aws.amazon.com/general/latest/gr/eks.html)。

```
aws ssm get-parameter --name /aws/service/ami-windows-latest/Windows_Server-release-English-installation-option-EKS_Optimized-kubernetes-version/image_id \
    --region region-code --query "Parameter.Value" --output text
```

下面介紹了取代預留位置之後的命令範例。

```
aws ssm get-parameter --name /aws/service/ami-windows-latest/Windows_Server-2022-English-Core-EKS_Optimized-k8s-n-2/image_id \
    --region us-west-2 --query "Parameter.Value" --output text
```

範例輸出如下。

```
ami-1234567890abcdef0
```

# 使用 Image Builder 建置自訂 Windows AMI
<a name="eks-custom-ami-windows"></a>

您可以透過下列其中一種選項，使用 EC2 Image Builder 來建立自訂 Amazon EKS 最佳化 Windows AMI：
+  [將 Amazon EKS 最佳化 Windows AMI 用作基礎](#custom-windows-ami-as-base) 
+  [使用 Amazon 受管建置元件](#custom-windows-ami-build-component) 

兩種方法都需要您建立自己的 Image Builder 配方。如需詳細資訊，請參閱《Image Builder 使用者指南》中的[建立映像配方的新版本](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html)。

**重要**  
下列 `eks` 專用的 **Amazon 受管**元件包含 `CVE-2024-5321` 的修補程式。  
 `1.28.2` 和更高版本
 `1.29.2` 和更高版本
 `1.30.1` 和更高版本
Kubernetes 1.31 及更高版本的全部版本

## 將 Amazon EKS 最佳化 Windows AMI 用作基礎
<a name="custom-windows-ami-as-base"></a>

此選項是建立自訂 Windows AMI 的建議方式。相較於 Amazon 受管建置元件，我們提供的 Amazon EKS 最佳化 Windows AMI 會更頻繁地更新。

1. 啟動新的 Image Builder 配方。

   1. 在 https：//https://console.aws.amazon.com/imagebuilder 開啟 EC2 Image Builder 主控台。

   1. 在左側導覽窗格中，選擇**映像配方**。

   1. 選擇**建立映像配方**。

1. 在**配方詳細資訊**區段中，輸入**名稱**和**版本**。

1. 在**基礎映像**區段中指定 Amazon EKS 最佳化 Windows AMI 的 ID。

   1. 選擇**輸入自訂 AMI ID**。

   1. 擷取所需的 Windows 作業系統版本 AMI ID。如需詳細資訊，請參閱[擷取建議的 Microsoft Windows AMI ID](retrieve-windows-ami-id.md)。

   1. 輸入自訂 **AMI ID**。如果找不到 AMI ID，請確定 AMI ID AWS 的區域與主控台右上角顯示 AWS 的區域相符。

1. (選用) 若要取得最新的安全性更新，請在**建置元件：**區段中新增 `update-windows` 元件。

   1. 從**依名稱尋找元件**搜尋方塊右側的下拉式清單中，選擇 **Amazon 受管**。

   1. 在**依名稱尋找元件**搜尋方塊中，輸入 `update-windows`。

   1. 選取 **`update-windows`** 搜尋結果的核取方塊。此元件包含作業系統的最新 Windows 修補程式。

1. 完成具備您所需之組態的剩餘映像配方輸入。如需詳細資訊，請參閱《Image Builder 使用者指南》中的[建立映像配方的新版本 (主控台)](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html#create-image-recipe-version-console)。

1. 選擇**建立配方**。

1. 在新的或現有的映像管道中使用新的映像配方。映像管道成功執行後，您的自訂 AMI 將被列為輸出映像並可供使用。如需詳細資訊，請參閱[使用 EC2 Image Builder 主控台精靈建立映像管道](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html)。

## 使用 Amazon 受管建置元件
<a name="custom-windows-ami-build-component"></a>

當無法將 Amazon EKS 最佳化 Windows AMI 用作基礎時，您可以改用 Amazon 受管建置元件。在最新支援的 Kubernetes 版本中，此選項可能會延遲。

1. 啟動新的 Image Builder 配方。

   1. 在 https：//https://console.aws.amazon.com/imagebuilder 開啟 EC2 Image Builder 主控台。

   1. 在左側導覽窗格中，選擇**映像配方**。

   1. 選擇**建立映像配方**。

1. 在**配方詳細資訊**區段中，輸入**名稱**和**版本**。

1. 在**基礎映像**區段中，決定您將用來建立自訂 AMI 的選項：
   +  **選取受管映像**：對於您的**映像作業系統 (OS)** 選擇 **Windows**。然後對於**映像來源**，選擇下列其中一個選項：
     +  **Quick start (Amazon 受管)** – 在**映像名稱**下拉式清單中，選取 Amazon EKS 支援的 Windows Server 版本。如需詳細資訊，請參閱[使用最佳化的 Windows AMI 建立節點](eks-optimized-windows-ami.md)。
     +  **我擁有的映像**：對於**映像名稱**，請使用您自己的授權選擇您自己的映像 ARN。您提供的映像尚未安裝 Amazon EKS 元件。
   +  **輸入自訂 AMI ID**：對於 AMI ID，請使用您自己的授權輸入 AMI 的 ID。您提供的映像尚未安裝 Amazon EKS 元件。

1. 在**建置元件 – 視窗**區段中，執行下列操作：

   1. 從**依名稱尋找元件**搜尋方塊右側的下拉式清單中，選擇 **Amazon 受管**。

   1. 在**依名稱尋找元件**搜尋方塊中，輸入 `eks`。

   1. 選取 **`eks-optimized-ami-windows`** 搜尋結果的核取方塊，即使傳回的結果可能不是您想要的版本。

   1. 在**依名稱尋找元件**搜尋方塊中，輸入 `update-windows`。

   1. 選取 **update-windows** 搜尋結果的核取方塊。此元件包含作業系統的最新 Windows 修補程式。

1. 在**選取元件**區段中，執行下列操作：

   1. 選擇 **`eks-optimized-ami-windows`** 的**版本控制選項**。

   1. 選擇**指定元件版本**。

   1. 在**元件版本**欄位中，輸入 *version.x*，以支援 Kubernetes 的版本取代*版本*。輸入版本號碼片段的 *x*，即表示使用最新的元件版本，其亦符合您明確定義的版本片段。請注意控制台輸出，因為它會告知您所需的版本是否可作為受管元件使用。請記住，最新 Kubernetes 版本可能不適用於建置元件。如需有關可用版本的詳細資訊，請參閱 [擷取 `eks-optimized-ami-windows` 元件版本的相關資訊](#custom-windows-ami-component-versions)。

1. 完成具備您所需之組態的剩餘映像配方輸入。如需詳細資訊，請參閱《Image Builder 使用者指南》中的[建立映像配方的新版本 (主控台)](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html#create-image-recipe-version-console)。

1. 選擇**建立配方**。

1. 在新的或現有的映像管道中使用新的映像配方。映像管道成功執行後，您的自訂 AMI 將被列為輸出映像並可供使用。如需詳細資訊，請參閱[使用 EC2 Image Builder 主控台精靈建立映像管道](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html)。

## 擷取 `eks-optimized-ami-windows` 元件版本的相關資訊
<a name="custom-windows-ami-component-versions"></a>

您可以擷取與每個元件安裝之內容相關的特定資訊。例如，您可以確認安裝的 `kubelet` 版本。這些元件會在 Amazon EKS 支援的 Windows 作業系統版本上進行功能測試。如需詳細資訊，請參閱[版本發佈日曆](eks-optimized-windows-ami.md#windows-ami-release-calendar)。任何其他未列為支援之 Windows 作業系統版本，或已達到終止支援者可能與元件不相容。

1. 在 https：//https://console.aws.amazon.com/imagebuilder 開啟 EC2 Image Builder 主控台。

1. 在左側導覽窗格中選擇**元件**。

1. 從**依名稱尋找元件**搜尋方塊右側的下拉式清單中，將**我擁有的**變更為 **Quick start (Amazon 受管)**。

1. 在 **Find components by name** (依名稱尋找元件) 方塊中，輸入 `eks`。

1. (選用) 如果您使用的是最新版本，請選擇兩次，將**版本**欄以遞減順序排序。

1. 選擇具有所需版本的 **`eks-optimized-ami-windows`** 連結。

結果頁面中的**描述**會顯示特定資訊。

# 偵測節點運作狀態問題並啟用自動節點修復
<a name="node-health"></a>

節點運作狀態是指 Kubernetes 節點有效執行工作負載的操作狀態和功能。運作狀態良好的節點會維持預期的網路連線能力、有足夠的運算和儲存資源，而且可以成功執行工作負載而不會中斷。

為了協助在 EKS 叢集中維護正常運作的節點，EKS 提供*節點監控代理*程式和*自動節點修復*。這些功能會透過 EKS Auto Mode 運算自動啟用。您也可以搭配 EKS 受管節點群組和 Karpenter 使用自動節點修復，也可以搭配 AWS Fargate 以外的任何 EKS 運算類型使用 EKS 節點監控代理程式。EKS 節點監控代理程式和自動節點修復在一起使用時最有效，但也可以在 EKS 叢集中個別使用。

**重要**  
*節點監控代理程式*與*節點自動修復*功能僅適用於 Linux。這些功能不適用於 Windows。

## 節點監控代理程式
<a name="node-monitoring-agent"></a>

EKS 節點監控代理程式會讀取節點日誌，以偵測運作狀態問題。它會剖析日誌，以偵測故障並顯示節點運作狀態的相關資訊。對於偵測到的每個問題類別，代理程式會將專用 `NodeCondition` 套用至工作者節點。如需 EKS 節點監控代理程式偵測到的節點運作狀態問題詳細資訊，請參閱 [使用 EKS 節點監控代理程式偵測節點運作狀態問題](node-health-nma.md)。

EKS Auto Mode 運算包含節點監控代理程式。對於其他 EKS 運算類型，您可以將節點監控代理程式新增為 EKS 附加元件，也可以使用 Helm 等 Kubernetes 工具進行管理。如需詳細資訊，請參閱[設定節點監控代理程式](node-health-nma.md#node-monitoring-agent-configure)。

使用 EKS 節點監控代理程式時，下列類別的節點運作狀態問題會呈現為節點條件。請注意，`Ready`、 `DiskPressure`和 `MemoryPressure`是標準 Kubernetes 節點條件，即使沒有 EKS 節點監控代理程式也會呈現。


| 節點條件 | Description | 
| --- | --- | 
|  AcceleratedHardwareReady  |  AcceleratedHardwareReady 指出節點上的加速硬體 (GPU、Neuron) 是否正常運作。  | 
|  ContainerRuntimeReady  |  ContainerRuntimeReady 指出容器執行時間 （容器等） 是否正常運作且能夠執行容器。  | 
|  DiskPressure  |  DiskPressure 是標準 Kubernetes 條件，表示節點遇到磁碟壓力 （磁碟空間不足或 I/O 高）。  | 
|  KernelReady  |  KernelReady 指出核心是否正常運作，而不會發生嚴重錯誤、恐慌或資源耗盡。  | 
|  MemoryPressure  |  MemoryPressure 是標準 Kubernetes 條件，表示節點正經歷記憶體壓力 （可用的記憶體不足）。  | 
|  NetworkingReady  |  NetworkingReady 指出節點的網路堆疊是否正常運作 （介面、路由、連線能力）。  | 
|  StorageReady  |  StorageReady 指出節點的儲存子系統是否正常運作 （磁碟、檔案系統、I/O)。  | 
|  備妥  |  Ready 是標準 Kubernetes 條件，表示節點運作狀態良好且已準備好接受 Pod。  | 

## 自動節點修復
<a name="node-auto-repair"></a>

EKS 自動節點修復會持續監控節點運作狀態、對偵測到的問題做出反應，並盡可能取代或重新啟動節點。這可在最少手動介入的情況下改善叢集可靠性，並有助於減少應用程式停機時間。

EKS 自動節點修復本身會回應 kubelet `Ready`的條件、任何手動刪除的節點物件，以及無法加入叢集的 EKS 受管節點群組執行個體。在安裝節點監控代理程式的情況下啟用 EKS 自動節點修復時，EKS 自動節點修復會回應其他節點條件：`AcceleratedHardwareReady`、`ContainerRuntimeReady`、`KernelReady`、 `NetworkingReady`和 `StorageReady`。

EKS 自動節點修復不會回應標準 Kubernetes `DiskPressure``MemoryPressure`、 或 `PIDPressure`節點條件。這些條件通常表示應用程式行為、工作負載組態或資源限制的問題，而不是節點層級失敗，因此難以判斷適當的預設修復動作。在這些情況下，工作負載會受到 Kubernetes [節點壓力移出行為](https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction)的約束。

如需 EKS 自動節點修復的詳細資訊，請參閱 [自動修復 EKS 叢集中的節點](node-repair.md)。

**Topics**

# 使用 EKS 節點監控代理程式偵測節點運作狀態問題
<a name="node-health-nma"></a>

本主題詳細說明 EKS 節點監控代理程式偵測到的節點運作狀態問題、這些問題如何呈現為節點條件或事件，以及如何設定節點監控代理程式。

EKS 節點監控代理程式可以搭配或不搭配 EKS 自動節點修復使用。如需 EKS 自動節點修復的詳細資訊，請參閱 [自動修復 EKS 叢集中的節點](node-repair.md)。

EKS 節點監控代理程式的原始碼會發佈在 [aws/eks-node-monitoring-agent](https://github.com/aws/eks-node-monitoring-agent) 儲存庫的 GitHub 上。

## 節點運作狀態問題
<a name="node-health-issues"></a>

下表中列出了節點監控代理程式能夠偵測的節點運作狀態問題。有兩種類型的問題：
+ 條件 – 必須執行修復動作的終端問題，例如，執行個體取代或重新啟動。啟用自動修復後，Amazon EKS 將執行修復動作，取代節點或重新啟動。如需詳細資訊，請參閱[節點條件](learn-status-conditions.md#status-node-conditions)。
+ 事件 – 暫時性問題或次佳節點組態。無須執行自動修復動作。如需詳細資訊，請參閱[事件節點](learn-status-conditions.md#status-node-events)。

## AcceleratedHardware 節點運作狀態問題
<a name="node-health-AcceleratedHardware"></a>

針對下表中所列嚴重性為「條件」的問題，監控條件為 `AcceleratedHardwareReady`。下表中的事件和條件適用於 NVIDIA 和 Neuron 相關的節點運作狀態問題。


| 名稱 | 嚴重性 | Description | 修復動作 | 
| --- | --- | --- | --- | 
|  DCGMDiagnosticFailure  |  條件  |  DCGM 作用中診斷測試套件的測試案例失敗。  |  無  | 
|  DCGMError  |  條件  |  DCGM 主機程序的連線遺失或無法建立。  |  無  | 
|  DCGMFieldError【代碼】  |  事件  |  DCGM 透過欄位識別符偵測到 GPU 降級。  |  無  | 
|  DCGMHealthCode【Code】  |  事件  |  DCGM 運作狀態檢查以非嚴重方式失敗。  |  無  | 
|  DCGMHealthCode【Code】  |  條件  |  DCGM 運作狀態檢查嚴重失敗。  |  無  | 
|  NeuronDMAError  |  條件  |  DMA 引擎遇到無法復原的錯誤。  |  取代  | 
|  NeuronHBMUncorrectableError  |  條件  |  HBM 遇到無法修正的錯誤，且產生了錯誤結果。  |  取代  | 
|  NeuronNCUncorrectableError  |  條件  |  偵測到 Neuron Core 無法修正的記憶體錯誤。  |  取代  | 
|  NeuronSRAMUncorrectableError  |  條件  |  晶片上 SRAM 遇到同位錯誤，且產生了錯誤結果。  |  取代  | 
|  NvidiaDeviceCountMismatch  |  事件  |  透過 NVML 可見的 GPUs 數量與檔案系統上的 NVIDIA 裝置計數不一致。  |  無  | 
|  NvidiaDoubleBitError  |  條件  |  GPU 驅動程式產生了雙位元錯誤。  |  取代  | 
|  NvidiaNCCLError  |  事件  |  NVIDIA Collective Communications 程式庫 () 中發生分段錯誤`libnccl`。  |  無  | 
|  NvidiaNVLinkError  |  條件  |  GPU 驅動程式報告了 NVLink 錯誤。  |  取代  | 
|  NvidiaPCIeError  |  事件  |  觸發 PCIe 重播以從傳輸錯誤中復原。  |  無  | 
|  NvidiaPageRetirement  |  事件  |  GPU 驅動程式已標記記憶體頁面進行淘汰。若在同一位址遇到單一雙位元錯誤或兩個單一位元錯誤，可能會發生此情況。  |  無  | 
|  NvidiaPowerError  |  事件  |  GPUs 的用電量超過允許的閾值。  |  無  | 
|  NvidiaThermalError  |  事件  |  GPUs 的熱狀態超過允許的閾值。  |  無  | 
|  NvidiaXID【Code】Error  |  條件  |  發生嚴重 GPU 錯誤。  |  取代或重新啟動  | 
|  NvidiaXID[Code]Warning  |  事件  |  發生非關鍵 GPU 錯誤。  |  無  | 

## NVIDIA XID 錯誤代碼
<a name="nvidia-xid-codes"></a>

節點監控代理程式會從 GPU 核心日誌偵測 NVIDIA XID 錯誤。XID 錯誤分為兩個類別：
+  **眾所周知的 XID 代碼** – 設定節點條件 (`AcceleratedHardwareReady=False`) 並在啟用時觸發自動修復的嚴重錯誤。原因碼格式為 `NvidiaXID[Code]Error`。EKS 節點監控代理程式偵測到的已知 XID 代碼可能不代表需要修復動作的 NVIDIA XID 代碼完整清單。
+  **未知 XID 代碼** – 僅記錄為 Kubernetes 事件。這些不會觸發自動修復。原因碼格式為 `NvidiaXID[Code]Warning`。若要調查未知的 XID 錯誤，請使用 檢閱您的核心日誌`dmesg | grep -i nvrm`。

若要了解 XID 錯誤的詳細資訊，請參閱 *NVIDIA GPU 部署與管理文件中*的 [Xid 錯誤](https://docs.nvidia.com/deploy/xid-errors/index.html#topic_5_1)。若要了解個別 XID 訊息的詳細資訊，請參閱 *NVIDIA GPU 部署與管理文件中*的[了解 Xid 訊息](https://docs.nvidia.com/deploy/gpu-debug-guidelines/index.html#understanding-xid-messages)。

下表列出已知的 XID 代碼、其意義，以及啟用的預設節點修復動作。


| XID 代碼 | Description | 修復動作 | 
| --- | --- | --- | 
|  13  |  圖形引擎例外狀況 – 發生 GPU 圖形引擎錯誤，通常是由軟體問題或驅動程式錯誤造成。  |  重新啟動  | 
|  31  |  GPU 記憶體頁面故障 – 應用程式嘗試存取無法映射或可存取的 GPU 記憶體。  |  重新啟動  | 
|  48  |  雙位元 ECC 錯誤 – GPU 記憶體中發生無法修正的雙位元錯誤，表示潛在的硬體降級。  |  重新啟動  | 
|  63  |  GPU 記憶體重新映射事件 – GPU 驅動程式因為偵測到錯誤而重新映射一部分 GPU 記憶體。這通常可以復原。  |  重新啟動  | 
|  64  |  GPU 記憶體重新映射失敗 – GPU 無法重新映射故障的記憶體，表示硬體問題。  |  重新啟動  | 
|  74  |  NVLink 錯誤 – GPUs 之間的高速 NVLink 互連發生錯誤。  |  取代  | 
|  79  |  GPU 已脫離匯流排 – 無法再透過 PCIe 存取 GPU，通常表示硬體故障或電源問題。  |  取代  | 
|  94  |  包含的記憶體錯誤 – 發生記憶體錯誤，但已包含且不會影響其他應用程式。  |  重新啟動  | 
|  95  |  未包含的記憶體錯誤 – 發生記憶體錯誤，可能已影響其他應用程式或系統記憶體。  |  重新啟動  | 
|  119  |  GSP RPC 逾時 – 與 GPU 系統處理器的通訊逾時，可能是因為韌體問題。  |  取代  | 
|  120  |  GSP 錯誤 – GPU 系統處理器發生錯誤。  |  取代  | 
|  121  |  C2C 錯誤 – chip-to-chip互連 （用於多晶片 GPUs) 發生錯誤。  |  取代  | 
|  140  |  ECC 未復原錯誤 – ECC 錯誤逸出遏制，可能已損毀資料。  |  取代  | 

若要檢視與 GPU 運作狀態相關的目前節點條件，請執行下列命令。

```
kubectl get nodes -o custom-columns='NAME:.metadata.name,ACCELERATOR_READY:.status.conditions[?(@.type=="AcceleratedHardwareReady")].status,REASON:.status.conditions[?(@.type=="AcceleratedHardwareReady")].reason'
```

若要檢視叢集上的 XID 相關事件，請執行下列其中一個命令。

```
kubectl get events | grep -i "NvidiaXID"
```

## ContainerRuntime 節點運作狀態問題
<a name="node-health-ContainerRuntime"></a>

針對下表中所列嚴重性為「條件」的問題，監控條件為 `ContainerRuntimeReady`。


| 名稱 | 嚴重性 | Description | 修復動作 | 
| --- | --- | --- | --- | 
|  ContainerRuntimeFailed  |  事件  |  容器執行時期未能建立容器，若重複發生，很可能與任何報告的問題相關。  |  無  | 
|  DeprecatedContainerdConfiguration  |  事件  |  使用已棄用映像資訊清單第 2 版的容器映像，結構描述 1 最近透過 提取至節點`containerd`。  |  無  | 
|  KubeletFailed  |  事件  |  kubelet 進入失敗狀態。  |  無  | 
|  LivenessProbeFailures  |  事件  |  偵測到活體探查失敗，若重複發生，可能表明應用程式碼問題或逾時值不足。  |  無  | 
|  PodStuckTerminating  |  條件  |  Pod 終止或終止時凍結時間過長，可能是由於阻止 Pod 狀態進度的 CRI 錯誤所致。  |  取代  | 
|  ReadinessProbeFailures  |  事件  |  偵測到整備探查失敗，若重複發生，可能表明應用程式碼問題或逾時值不足。  |  無  | 
|  【Name】RepeatedRestart  |  事件  |  系統化單位經常重新啟動。  |  無  | 
|  ServiceFailedToStart  |  事件  |  未能啟動系統化單元。  |  無  | 

## 核心節點運作狀態問題
<a name="node-health-Kernel"></a>

針對下表中所列嚴重性為「條件」的問題，監控條件為 `KernelReady`。


| 名稱 | 嚴重性 | Description | 修復動作 | 
| --- | --- | --- | --- | 
|  AppBlocked  |  事件  |  排程導致任務已遭到長時間封鎖，通常是由於輸入或輸出遭到封鎖所致。  |  無  | 
|  AppCrash  |  事件  |  節點上的應用程式已當機。  |  無  | 
|  ApproachingKernelPidMax  |  事件  |  程序數量接近目前`kernel.pid_max`設定可用的 PIDs 數量上限，之後就無法再啟動任何程序。  |  無  | 
|  ApproachingMaxOpenFiles  |  事件  |  依據目前的核心設定，開啟的檔案數目正在接近可開啟的最大檔案數目，之後將無法開啟新檔案。  |  無  | 
|  ConntrackExceededKernel  |  事件  |  連線追蹤超出核心上限，並且不能建立新的連線，這可能會導致封包遺失。  |  無  | 
|  ExcessiveZombieProcesses  |  事件  |  若程序不能完全回收，則會大量累積，這表明存在應用程式問題，並且可能會導致達到系統程序限制。  |  無  | 
|  ForkFailedOutOfPIDs  |  條件  |  系統缺少程序 ID 或記憶體導致分支或執行呼叫失敗，這可能是由於殭屍程序或實體記憶體耗盡所致。  |  取代  | 
|  KernelBug  |  事件  |  Linux 核心本身偵測並報告了核心錯誤，但此錯誤有時可能是由於節點具有高 CPU 或記憶體而導致事件處理延遲所致。  |  無  | 
|  LargeEnvironment  |  事件  |  此程序的環境變數數量大於預期，可能是由許多將 `enableServiceLinks`設為 true 的服務所造成，這可能會導致效能問題。  |  無  | 
|  RapidCron  |  事件  |  此節點上每五分鐘的 Cron 任務執行速度更快，若任務取用大量資源，則可能會影響效能。  |  無  | 
|  SoftLockup  |  事件  |  CPU 在一定時間內停滯。  |  無  | 

## 聯網節點運作狀態問題
<a name="node-health-Networking"></a>

針對下表中所列嚴重性為「條件」的問題，監控條件為 `NetworkingReady`。


| 名稱 | 嚴重性 | Description | 修復動作 | 
| --- | --- | --- | --- | 
|  BandwidthInExceeded  |  事件  |  因傳入的彙總頻寬超過執行個體的上限而排入佇列或丟棄的封包數目。  |  無  | 
|  BandwidthOutExceeded  |  事件  |  因傳出的彙總頻寬超過執行個體的上限而排入佇列或丟棄的封包數目。  |  無  | 
|  ConntrackExceeded  |  事件  |  連線追蹤超出執行個體上限，並且不能建立新的連線，這可能會導致封包遺失。  |  無  | 
|  EFAErrorMetric  |  事件  |  EFA 驅動程式指標顯示有一個具有效能降級的界面。  |  無  | 
|  IPAMDInconsistentState  |  事件  |  磁碟上 IPAMD 檢查點的狀態不會反映容器執行時間中的 IPs。  |  無  | 
|  IPAMDNoIPs  |  事件  |  IPAMD 沒有 IP 地址。  |  無  | 
|  IPAMDNotReady  |  條件  |  IPAMD 未能連線至 API 伺服器。  |  取代  | 
|  IPAMDNotRunning  |  條件  |  找不到正在執行的 Amazon VPC CNI 程序。  |  取代  | 
|  IPAMDRepeatedlyRestart  |  事件  |  IPAMD 服務發生多次重新啟動。  |  無  | 
|  InterfaceNotRunning  |  條件  |  此介面看起來未在執行中，或者存在網路問題。  |  取代  | 
|  InterfaceNotUp  |  條件  |  此介面看起來未啟用，或者存在網路問題。  |  取代  | 
|  KubeProxyNotReady  |  事件  |  Kube-proxy 未能監看或列示資源。  |  無  | 
|  LinkLocalExceeded  |  事件  |  由於本機代理伺服器服務的流量 PPS 超過網路介面上限而丟棄的封包數目。  |  無  | 
|  MACAddressPolicyMisconfigured  |  事件  |  systemd-networkd 連結組態的值不正確`MACAddressPolicy`。  |  無  | 
|  MissingDefaultRoutes  |  事件  |  缺少預設路由規則。  |  無  | 
|  MissingIPRoutes  |  事件  |  Pod IPs 缺少路由。  |  無  | 
|  MissingIPRules  |  事件  |  Pod IPs 缺少規則。  |  無  | 
|  MissingLoopbackInterface  |  條件  |  此執行個體缺少迴路介面，從而導致服務未能執行，具體取決於本機連線。  |  取代  | 
|  NetworkSysctl  |  事件  |  此節點的網路`sysctl`設定可能不正確。  |  無  | 
|  PPSExceeded  |  事件  |  因雙向 PPS 超過執行個體的上限而排入佇列或丟棄的封包數目。  |  無  | 
|  PortConflict  |  事件  |  如果 Pod 使用 hostPort，它可以撰寫`iptables`規則來覆寫主機的已繫結連接埠，從而可能阻止 API 伺服器存取 `kubelet`。  |  無  | 
|  UnexpectedRejectRule  |  事件  |  在 中找到非預期的 `REJECT`或 `DROP`規則`iptables`，可能封鎖預期的流量。  |  無  | 

## 儲存節點運作狀態問題
<a name="node-health-Storage"></a>

針對下表中所列嚴重性為「條件」的問題，監控條件為 `StorageReady`。


| 名稱 | 嚴重性 | Description | 修復動作 | 
| --- | --- | --- | --- | 
|  EBSInstanceIOPSExceeded  |  事件  |  已超過執行個體的 IOPS 上限。  |  無  | 
|  EBSInstanceThroughputExceeded  |  事件  |  已超過執行個體的最大輸送量。  |  無  | 
|  EBSVolumeIOPSExceeded  |  事件  |  已超過特定 EBS 磁碟區的 IOPS 上限。  |  無  | 
|  EBSVolumeThroughputExceeded  |  事件  |  已超過特定 Amazon EBS 磁碟區的輸送量上限。  |  無  | 
|  EtcHostsMountFailed  |  事件  |  由於使用者資料在`kubelet-container`操作`/var/lib/kubelet/pods`期間重新掛載，因此產生的 kubelet 掛載`/etc/hosts`失敗。  |  無  | 
|  IODelays  |  事件  |  程序中偵測到輸入或輸出延遲，若過多，可能表明輸入輸出佈建不足。  |  無  | 
|  KubeletDiskUsageSlow  |  事件  |  `kubelet` 會在嘗試存取 檔案系統時報告磁碟用量緩慢。這可能表示磁碟輸入輸出不足或檔案系統問題。  |  無  | 
|  XFSSmallAverageClusterSize  |  事件  |  XFS 平均叢集大小很小，表示可用空間分段過多。這可以防止在可用節點或可用空間的情況下建立檔案。  |  無  | 

## 設定節點監控代理程式
<a name="node-monitoring-agent-configure"></a>

EKS 節點監控代理程式會部署為 DaemonSet。當您將其部署為 EKS 附加元件時，您可以使用下列組態值來自訂安裝。如需預設組態，請參閱 EKS 節點監控代理程式 [Helm Chart](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml)。


| 組態選項 | Description | 
| --- | --- | 
|   `monitoringAgent.resources.requests.cpu`   |  監控代理程式的 CPU 資源請求。  | 
|   `monitoringAgent.resources.requests.memory`   |  監控代理程式的記憶體資源請求。  | 
|   `monitoringAgent.resources.limits.cpu`   |  監控代理程式的 CPU 資源限制。  | 
|   `monitoringAgent.resources.limits.memory`   |  監控代理程式的記憶體資源限制。  | 
|   `monitoringAgent.tolerations`   |  在污點節點上排程監控代理程式的容錯。  | 
|   `monitoringAgent.additionalArgs`   |  要傳遞給監控代理程式的其他命令列引數。  | 

**注意**  
您可以使用 EKS 附加元件或 Helm 安裝`verbosity``monitoringAgent.additionalArgs`來設定 `hostname-override`和 。您目前無法使用 EKS 附加元件`8002`或 Helm 安裝，透過其他 args 自訂節點監控代理程式的 `probe-address`() 或 `metrics-address`(`8003`)。

節點監控代理程式包含用於監控 NVIDIA GPUs 的 NVIDIA DCGM （資料中心 GPU Manager) 伺服器元件 (`nv-hostengine`)。此元件只會在屬於 NVIDIA GPU 執行個體類型的節點上執行，如代理程式 [Helm Chart](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml) `nodeAffinity`中的 所示。您無法搭配 EKS 節點監控代理程式使用現有的 NVIDIA DCGM 安裝，如果您需要此功能，請針對 EKS 藍圖 [GitHub 問題 \$12763](https://github.com/aws/containers-roadmap/issues/2763) 提供意見回饋。

當您將 EKS 節點監控代理程式部署為 EKS 附加元件時，您可以使用下列組態值自訂 NVIDIA DCGM 安裝。


| 組態選項 | Description | 
| --- | --- | 
|   `dcgmAgent.resources.requests.cpu`   |  DCGM 代理程式的 CPU 資源請求。  | 
|   `dcgmAgent.resources.requests.memory`   |  DCGM 代理程式的記憶體資源請求。  | 
|   `dcgmAgent.resources.limits.cpu`   |  DCGM 代理程式的 CPU 資源限制。  | 
|   `dcgmAgent.resources.limits.memory`   |  DCGM 代理程式的記憶體資源限制。  | 
|   `dcgmAgent.tolerations`   |  在污點節點上排程 DCGM 代理程式的容錯。  | 

您可以使用下列 AWS CLI 命令來取得 EKS 節點監控代理程式 EKS 附加元件的版本和結構描述的實用資訊。

取得 Kubernetes 版本的最新代理程式附加元件版本。將 取代`1.35`為您的 Kubernetes 版本。

```
aws eks describe-addon-versions \
  --addon-name eks-node-monitoring-agent \
  --kubernetes-version 1.35 \
  --query='addons[].addonVersions[].addonVersion'
```

取得 EKS 附加元件中支援的代理程式附加元件結構描述。`v1.5.1-eksbuild.1` 將 取代為您的代理程式版本。

```
aws eks describe-addon-configuration \
  --addon-name eks-node-monitoring-agent \
  --addon-version v1.5.1-eksbuild.1
```

# 自動修復 EKS 叢集中的節點
<a name="node-repair"></a>

本主題詳細說明 EKS 自動節點修復行為，以及如何將其設定為滿足您的需求。EKS 自動節點修復預設為在 EKS Auto 模式中啟用，可與 EKS 受管節點群組和 Karpenter 搭配使用。

預設 EKS 自動節點修復動作摘要如下表所示，適用於 EKS Auto Mode、EKS 受管節點群組和 Karpenter 的行為。使用 EKS Auto Mode 或 Karpenter 時，所有`AcceleratedHardwareReady`修復動作都是 `Replace`，只有 EKS 受管節點群組支援`Reboot`做為修復動作。

如需 EKS 節點監控代理程式偵測到的節點運作狀態問題及其對應節點修復動作的詳細清單，請參閱 [使用 EKS 節點監控代理程式偵測節點運作狀態問題](node-health-nma.md)。


| 節點條件 | Description | 在 之後修復 | 修復動作 （多個） | 
| --- | --- | --- | --- | 
|  AcceleratedHardwareReady  |  AcceleratedHardwareReady 指出節點上的加速硬體 (GPU、Neuron) 是否正常運作。  |  10m  |  取代或重新啟動  | 
|  ContainerRuntimeReady  |  ContainerRuntimeReady 指出容器執行時間 （容器等） 是否正常運作且能夠執行容器。  |  30m  |  取代  | 
|  DiskPressure  |  DiskPressure 是標準 Kubernetes 條件，表示節點遇到磁碟壓力 （磁碟空間不足或 I/O 高）。  |  N/A  |  無  | 
|  KernelReady  |  KernelReady 指出核心是否正常運作，而不會發生嚴重錯誤、恐慌或資源耗盡。  |  30m  |  取代  | 
|  MemoryPressure  |  MemoryPressure 是標準 Kubernetes 條件，表示節點正經歷記憶體壓力 （可用的記憶體不足）。  |  N/A  |  無  | 
|  NetworkingReady  |  NetworkingReady 指出節點的網路堆疊是否正常運作 （介面、路由、連線能力）。  |  30m  |  取代  | 
|  StorageReady  |  StorageReady 指出節點的儲存子系統是否正常運作 （磁碟、檔案系統、I/O)。  |  30m  |  取代  | 
|  備妥  |  Ready 是標準 Kubernetes 條件，表示節點運作狀態良好且已準備好接受 Pod。  |  30m  |  取代  | 

在下列情況下，EKS 自動節點修復動作預設為停用。在每個案例中，進行中的節點修復動作都會繼續。如需如何覆寫這些預設設定[設定自動節點修復](#configure-node-repair)，請參閱 。

 **EKS 受管節點群組** 
+ 節點群組有超過五個節點，且節點群組中超過 20% 的節點運作狀態不佳。
+ 透過應用程式復原控制器 (ARC) 觸發叢集的區域轉移。

 **EKS 自動模式和 Karpenter** 
+ NodePool 中超過 20% 的節點運作狀態不佳。
+ 對於獨立 NodeClaims，叢集中的 20% 節點運作狀態不佳。

## 設定自動節點修復
<a name="configure-node-repair"></a>

使用 EKS Auto Mode 時，無法設定自動節點修復，且一律以與 Karpenter 相同的預設設定啟用。

### Karpenter
<a name="configure-node-repair-karpenter"></a>

若要搭配 Karpenter 使用自動節點修復，請啟用功能閘道 `NodeRepair=true`。您可以透過 CLI `--feature-gates` 選項或 Karpenter 部署中的`FEATURE_GATES`環境變數來啟用功能閘道。如需詳細資訊，請參閱 [Karpenter](https://karpenter.sh/docs/concepts/disruption/#node-auto-repair) 文件。

### 受管節點群組
<a name="configure-node-repair-mng"></a>

您可以在建立新的 EKS 受管節點群組或更新現有的 EKS 受管節點群組時啟用自動節點修復。
+  **Amazon EKS 主控台** – 選取受管**節點群組的啟用節點自動修復**核取方塊。如需詳細資訊，請參閱[建立叢集的受管節點群組](create-managed-node-group.md)。
+  ** AWS CLI** – `--node-repair-config enabled=true`新增至 [https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html](https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html)或 [https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html](https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html)命令。
+  **eksctl** – 設定 `managedNodeGroups.nodeRepairConfig.enabled: true`，請參閱 [eksctl GitHub](https://github.com/eksctl-io/eksctl/blob/main/examples/44-node-repair.yaml) 中的範例。

使用 EKS 受管節點群組時，您可以使用下列設定控制節點自動修復行為。

若要控制節點自動修復何時停止採取動作，請根據節點群組中運作狀態不佳的節點數目來設定閾值。設定絕對計數或百分比，但不能同時設定兩者。


| 設定 | Description | 
| --- | --- | 
|   `maxUnhealthyNodeThresholdCount`   |  節點自動修復停止運作狀態不佳的節點絕對數量。使用此項目來限制修復的範圍。  | 
|   `maxUnhealthyNodeThresholdPercentage`   |  節點自動修復停止運作狀態不佳的節點百分比 (0-100)。  | 

若要控制同時修復的節點數量，您可以設定修復平行處理。如同運作狀態不佳的節點閾值，請設定絕對計數或百分比，但不能同時設定兩者。


| 設定 | Description | 
| --- | --- | 
|   `maxParallelNodesRepairedCount`   |  要同時修復的節點數目上限。  | 
|   `maxParallelNodesRepairedPercentage`   |  要同時修復的不良節點百分比上限 (0-100)。  | 

使用 `nodeRepairConfigOverrides`，您可以針對特定條件自訂修復行為。當您需要不同的修復動作或不同問題類型的等待時間時，請使用此選項。

每個覆寫都需要下列所有欄位：


| 欄位 | Description | 
| --- | --- | 
|   `nodeMonitoringCondition`   |  節點監控代理程式報告的節點條件類型。例如：`AcceleratedHardwareReady`、`NetworkingReady`、`StorageReady`、`KernelReady`。  | 
|   `nodeUnhealthyReason`   |  狀況不良的特定原因代碼。例如：`NvidiaXID31Error`、`IPAMDNotRunning`。  | 
|   `minRepairWaitTimeMins`   |  在節點符合修復資格之前，條件必須保留的最短時間，以分鐘為單位。使用此選項可避免針對暫時問題修復節點。  | 
|   `repairAction`   |  符合條件時要採取的動作。有效值： `Replace`（終止並取代節點）、 `Reboot`（重新啟動節點） 或 `NoAction`（無修復動作）。  | 

下列 AWS CLI 範例會建立具有自訂修復設定的節點群組。

```
aws eks create-nodegroup \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --node-role arn:aws:iam::111122223333:role/NodeRole \
  --subnets subnet-0123456789abcdef0 \
  --node-repair-config '{
    "enabled": true,
    "maxUnhealthyNodeThresholdPercentage": 10,
    "maxParallelNodesRepairedCount": 3,
    "nodeRepairConfigOverrides": [
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID64Error",
        "minRepairWaitTimeMins": 5,
        "repairAction": "Replace"
      },
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID31Error",
        "minRepairWaitTimeMins": 15,
        "repairAction": "NoAction"
      }
    ]
  }'
```

此組態會執行下列動作：
+ 啟用節點自動修復
+ 當超過 10% 的節點運作狀態不佳時，停止修復動作
+ 一次最多可修復 3 個節點
+ 覆寫 XID 64 錯誤 (GPU 記憶體重新映射失敗），以在 5 分鐘後取代節點。預設值為 10 分鐘後重新啟動。
+ 覆寫 XID 31 錯誤 (GPU 記憶體頁面錯誤） 不採取任何動作。預設值為 10 分鐘後重新啟動。

# 檢視節點的運作狀態
<a name="learn-status-conditions"></a>

本主題說明可用於監控 Amazon EKS 叢集中節點運作狀態的工具和方法。相關資訊涵蓋節點條件、事件和偵測案例，可協助您識別和診斷節點層級問題。使用此處所述的命令和模式來檢查節點運作狀態資源、解譯狀態條件，並分析節點事件以進行操作故障診斷。

您可以針對所有節點使用 Kubernetes 命令，以取得一些節點運作狀態資訊。此外，如果您透過 Amazon EKS 自動模式或 Amazon EKS 受管附加元件使用節點監控代理程式，您將會取得更多種類的節點訊號，進而協助故障診斷。在可觀測性儀表板中，還會提供節點監控代理程式偵測的運作狀態問題說明。如需詳細資訊，請參閱[使用 EKS 節點監控代理程式偵測節點運作狀態問題](node-health-nma.md)。

## 節點條件
<a name="status-node-conditions"></a>

節點條件代表需要修復動作的終端問題，例如執行個體替換或重新啟動。

 **若要取得所有節點的條件：**

```
kubectl get nodes -o 'custom-columns=NAME:.metadata.name,CONDITIONS:.status.conditions[*].type,STATUS:.status.conditions[*].status'
```

 **若要取得特定節點的詳細條件** 

```
kubectl describe node node-name
```

 **運作狀態良好的節點的範例條件輸出：**

```
  - lastHeartbeatTime: "2024-11-21T19:07:40Z"
    lastTransitionTime: "2024-11-08T03:57:40Z"
    message: Monitoring for the Networking system is active
    reason: NetworkingIsReady
    status: "True"
    type: NetworkingReady
```

 **存在聯網問題的運作狀態不佳的節點的範例條件：**

```
  - lastHeartbeatTime: "2024-11-21T19:12:29Z"
    lastTransitionTime: "2024-11-08T17:04:17Z"
    message: IPAM-D has failed to connect to API Server which could be an issue with
      IPTable rules or any other network configuration.
    reason: IPAMDNotReady
    status: "False"
    type: NetworkingReady
```

## 事件節點
<a name="status-node-events"></a>

節點事件表示暫時性問題或非最佳化的組態。

 **若要取得節點監控代理程式報告的所有事件** 

節點監控代理程式可用時，您可以執行下列命令。

```
kubectl get events --field-selector=reportingComponent=eks-node-monitoring-agent
```

輸出範例：

```
LAST SEEN   TYPE      REASON       OBJECT                                              MESSAGE
4s          Warning   SoftLockup   node/ip-192-168-71-251.us-west-2.compute.internal   CPU stuck for 23s
```

 **若要取得所有節點的事件** 

```
kubectl get events --field-selector involvedObject.kind=Node
```

 **若要取得特定節點的事件** 

```
kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=node-name
```

 **若要即時監看事件** 

```
kubectl get events -w --field-selector involvedObject.kind=Node
```

 **範例事件輸出：**

```
LAST SEEN   TYPE     REASON           OBJECT         MESSAGE
2m          Warning  MemoryPressure   Node/node-1    Node experiencing memory pressure
5m          Normal   NodeReady        Node/node-1    Node became ready
```

## 常見的故障診斷命令
<a name="status-node-troubleshooting"></a>

```
# Get comprehensive node status
kubectl get node node-name -o yaml

# Watch node status changes
kubectl get nodes -w

# Get node metrics
kubectl top node
```

# 使用 kubectl 及 S3 擷取受管節點的節點日誌
<a name="auto-get-logs"></a>

了解如何為已安裝節點監控代理程式的 Amazon EKS 受管節點擷取節點記錄。

## 先決條件
<a name="_prerequisites"></a>

請確認您已具備以項目：
+ 現有已安裝節點監控代理程式的 Amazon EKS 叢集。如需詳細資訊，請參閱[偵測節點運作狀態問題並啟用自動節點修復](node-health.md)。
+ 已安裝並設定為可與您叢集通訊的 `kubectl` 命令列工具。
+ 安裝並登入 AWS 的 CLI 具有足夠的許可來建立 S3 儲存貯體和物件。
+ 已安裝最新版本 Python 3
+ 已安裝適用於 Python 3、Boto 3 的 AWS SDK。

## 步驟 1：建立 S3 儲存貯體目的地 (選用)
<a name="_step_1_create_s3_bucket_destination_optional"></a>

若您還沒有 S3 儲存貯體來儲存日誌，請先建立一個。使用下列 AWS CLI 命令。儲存貯體預設為 `private` 存取控制清單。以您選擇的唯一儲存貯體名稱取代 *bucket-name*。

```
aws s3api create-bucket --bucket <bucket-name>
```

## 步驟 2：建立用於 HTTP Put 的預先簽章 S3 URL
<a name="_step_2_create_pre_signed_s3_url_for_http_put"></a>

Amazon EKS 透過對您指定的 URL 執行 HTTP PUT 操作來回傳節點記錄。在本教學中，我們將產生一個預先簽章的 S3 HTTP PUT URL。

日誌會以 gzip 壓縮的 tar 檔 (副檔名為 `.tar.gz`) 形式傳回。

**注意**  
您必須使用 AWS API 或 SDK 來建立預先簽章的 S3 上傳 URL，以供 EKS 上傳日誌檔案。您無法使用 CLI 建立預先簽章的 S3 AWS 上傳 URL。

1. 決定您要在儲存貯體中的哪個位置儲存日誌。例如，您可以使用 *2024-11-12/logs1.tar.gz* 做為金鑰。

1. 將下列 Python 程式碼儲存至檔案 https：//*presign-upload.py*。取代 *<bucket-name>* 和 *<key>*。金鑰應以 `.tar.gz` 結尾。

   ```
   import boto3; print(boto3.client('s3').generate_presigned_url(
      ClientMethod='put_object',
      Params={'Bucket': '<bucket-name>', 'Key': '<key>'},
      ExpiresIn=1000
   ))
   ```

1. 使用以下命令執行指令碼

   ```
   python presign-upload.py
   ```

1. 記錄 URL 輸出。在下一個步驟中使用此值做為 *http-put-destination*。

如需詳細資訊，請參閱[在適用於 Python 文件的Boto3 開發套件中產生預先簽章的 URL 以上傳檔案](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html#generating-a-presigned-url-to-upload-a-file)。 AWS Boto3 

## 步驟 3：建立 NodeDiagnostic 資源
<a name="_step_3_create_nodediagnostic_resource"></a>

識別您要從中收集日誌的節點名稱。

建立 `NodeDiagnostic` 資訊清單，使用該節點名稱作為資源名稱，並提供 HTTP PUT URL 目的地。

```
apiVersion: eks.amazonaws.com/v1alpha1
kind: NodeDiagnostic
metadata:
    name: <node-name>
spec:
    logCapture:
        destination: http-put-destination
```

將清單檔案套用至叢集。

```
kubectl apply -f nodediagnostic.yaml
```

您可以透過描述 `NodeDiagnostic` 資源以檢查集合的狀態：
+ 狀態為 `Success` 或 `SuccessWithErrors` 表示任務已完成，且日誌已上傳到提供的目的地 (`SuccessWithErrors` 表示可能缺少部分日誌)
+ 如果狀態為「失敗」，請確認上傳 URL 格式正確且未過期。

```
kubectl describe nodediagnostics.eks.amazonaws.com/<node-name>
```

## 步驟 4：從 S3 下載日誌
<a name="_step_4_download_logs_from_s3"></a>

請等待大約一分鐘再嘗試下載日誌。然後使用 S3 CLI 下載日誌。

```
# Once NodeDiagnostic shows Success status, download the logs
aws s3 cp s3://<bucket-name>/key ./<path-to-node-logs>.tar.gz
```

## 步驟 5：清理 NodeDiagnostic 資源
<a name="_step_5_clean_up_nodediagnostic_resource"></a>
+  `NodeDiagnostic` 資源不會自動刪除。取得日誌成品後，您應自行清除這些項目

```
# Delete the NodeDiagnostic resource
kubectl delete nodediagnostics.eks.amazonaws.com/<node-name>
```

## NodeDiagnostic `node` 目的地
<a name="_nodediagnostic_node_destination"></a>

從節點監控代理`v1.6.1-eksbuild.1`程式的版本開始，您可以選擇將日誌收集目的地設定為 `node`。使用此目的地將導致節點上日誌的收集和暫時保留，以供稍後收集。除了此功能之外，在節點監控代理程式的 GitHub 儲存庫中，您還可以安裝 `kubectl` 外掛程式，以便輕鬆互動和收集日誌。如需詳細資訊，請參閱 [`kubectl ekslogs` 外掛程式的文件](https://github.com/aws/eks-node-monitoring-agent/blob/main/tools/kubectl-ekslogs/README.md)。

## 使用範例
<a name="_example_usage"></a>

```
# Collect NodeDiagnostic logs from a single node
kubectl ekslogs <node-name>

# Collect NodeDiagnostic logs from multiple nodes
kubectl ekslogs <node-name-1> <node-name-2> <node-name-3>

# Collect NodeDiagnostic logs from all nodes with a specific label
kubectl ekslogs -l <key>=<value>
```

# 使用 kubectl 和 S3 擷取受管節點上的網路流量
<a name="auto-get-tcpdump"></a>

了解如何在具有節點監控代理程式的 Amazon EKS 受管節點上擷取網路流量。代理程式會在節點上執行 tcpdump、壓縮擷取檔案，並將它們上傳到您的 S3 儲存貯體。

## 先決條件
<a name="_prerequisites"></a>

請確認您已具備以項目：
+ 具有節點監控代理程式的現有 Amazon EKS Auto Mode 叢集。如需詳細資訊，請參閱[偵測節點運作狀態問題並啟用自動節點修復](node-health.md)。
+ 已安裝並設定為可與您叢集通訊的 `kubectl` 命令列工具。
+ 安裝並登入 AWS 的 CLI 具有建立 S3 儲存貯體和物件的足夠許可。
+ 已安裝最新版本的 Python 3。
+ 已安裝適用於 Python 3、Boto 3 的 AWS SDK。
+ 已安裝 PyYAML 程式庫 (`pip install pyyaml`)。

## 步驟 1：建立 S3 儲存貯體目的地 (選用)
<a name="_step_1_create_s3_bucket_destination_optional"></a>

如果您還沒有儲存擷取檔案的 S3 儲存貯體，請建立一個。將 *bucket-name* 和 *region* 取代為您的值。

```
aws s3api create-bucket --bucket <bucket-name> \
    --region <region> \
    --create-bucket-configuration LocationConstraint=<region>
```

**注意**  
除了 以外的所有區域都需要 `--create-bucket-configuration` 參數`us-east-1`。

## 步驟 2：開始封包擷取
<a name="_step_2_start_packet_capture"></a>

使用[節點監控代理程式儲存庫](https://github.com/aws/eks-node-monitoring-agent) (`tools/start-capture.py`) 中的`start-capture.py`指令碼來產生預先簽章的 S3 登入資料、建立`NodeDiagnostic`資源，並將其套用至您的叢集。

1. 識別您要從中擷取流量的節點。

   ```
   kubectl get nodes
   ```

1. 將 [start-capture.py](https://github.com/aws/eks-node-monitoring-agent/blob/main/tools/start-capture.py) 指令碼從節點監控代理程式儲存庫儲存至本機電腦，然後執行它。將 *<bucket-name>* 和 *<node-name>* 取代為您的值。

   ```
   python3 start-capture.py --bucket <bucket-name> --node <node-name>
   ```

   常見選項：

   ```
   # Capture for 5 minutes on eth0 with a filter
   python3 start-capture.py --bucket <bucket-name> --node <node-name> \
       --duration 5m --interface eth0 --filter "tcp port 443"
   
   # Preview the YAML without applying
   python3 start-capture.py --bucket <bucket-name> --node <node-name> --dry-run
   ```

   指令碼需要使用已安裝 `boto3`和 的 Python 3`pyyaml`，並為您的叢集`kubectl`進行設定。

   指令碼會產生類似下列`NodeDiagnostic`的資源。此範例僅供參考；請注意，`upload`欄位需要由指令碼以程式設計方式產生的預先簽章 S3 POST 登入資料。

   ```
   apiVersion: eks.amazonaws.com/v1alpha1
   kind: NodeDiagnostic
   metadata:
     name: <node-name>                    # Required: node instance ID
   spec:
     packetCapture:
       duration: "30s"                       # Required: capture duration (max 1h)
       # interface: "eth0"                   # Optional: default is primary ENI. Use "any" for all interfaces
       # filter: "tcp port 443"             # Optional: tcpdump filter expression
       # chunkSizeMB: 10                    # Optional: file rotation size in MB (1-100, default: 10)
       upload:                               # Required: pre-signed S3 POST credentials
         url: "https://<bucket>.s3.amazonaws.com/"
         fields:
           key: "captures/<node-name>/${filename}"
           # ... other pre-signed POST fields (generated by the script)
   ```

## 步驟 3：監控擷取進度
<a name="_step_3_monitor_capture_progress"></a>

檢查擷取的狀態。

```
kubectl describe nodediagnostic <node-name>
```

狀態會顯示：
+  `Running` 擷取進行時。
+  `Completed` 以及擷取完成和所有檔案上傳`Success`的原因。
+  `Completed` `Failure` 如果擷取發生錯誤，則為 原因。

若要查看完整狀態，包括 `captureID`（用於 S3 路徑識別）：

```
kubectl get nodediagnostic <node-name> -o jsonpath='{.status.captureStatuses}'
```

## 步驟 4：從 S3 下載擷取檔案
<a name="_step_4_download_capture_files_from_s3"></a>

狀態顯示 後`Success`，請從 S3 下載擷取檔案。

```
aws s3 cp s3://<bucket-name>/captures/ ./captures/ --recursive
```

這些檔案是 gzip 壓縮的 pcap 格式。使用 tcpdump 或 Wireshark 解壓縮和分析：

```
gunzip captures/*.gz
tcpdump -r captures/capture.pcap0000 -n
```

## 步驟 5：清除
<a name="_step_5_clean_up"></a>

 `NodeDiagnostic` 資源不會自動刪除。在您取得擷取檔案後清除 。在擷取執行時刪除資源會立即停止擷取。

```
kubectl delete nodediagnostic <node-name>
```

## 組態選項和行為
<a name="_configuration_options_and_behavior"></a>

如需完整的`packetCapture`規格參考、組態選項和行為詳細資訊，請參閱節點監控代理程式儲存庫中的[封包擷取文件](https://github.com/aws/eks-node-monitoring-agent/blob/main/docs/packet-capture.adoc)。

# Amazon EKS 混合節點概觀
<a name="hybrid-nodes-overview"></a>

透過 *Amazon EKS 混合節點*，您可以使用內部部署和邊緣基礎結構作為 Amazon EKS 叢集中的節點。AWS 負責管理 Amazon EKS 叢集的 AWS 託管 Kubernetes 控制平面，而您可管理在內部部署或邊緣環境中執行的混合節點。這會統一您環境中的 Kubernetes 管理，並將內部部署和邊緣應用程式的 Kubernetes 控制平面管理卸載至 AWS。

Amazon EKS 混合節點可與任何內部部署硬體或虛擬機器搭配使用，將 Amazon EKS 的效率、可擴展性和可用性帶入需要執行應用程式的任何環境。您可以搭配 Amazon EKS 混合節點使用各種 Amazon EKS 功能，包括 Amazon EKS 附加元件、Amazon EKS Pod 身分識別、叢集存取項目、叢集洞察和擴充的 Kubernetes 版本支援。Amazon EKS 混合節點會以原生方式與 AWS Systems Manager、AWS IAM Roles Anywhere、Amazon Managed Service for Prometheus 和 Amazon CloudWatch 等 AWS 服務整合，以進行集中式監控、記錄和身分管理。

使用 Amazon EKS 混合節點時，沒有前期承諾，也沒有最低費用，並且當您混合節點的 vCPU 資源連接到 Amazon EKS 叢集時，會按小時向您收費。如需有關定價的詳細資訊，請參閱 [Amazon EKS 定價](https://aws.amazon.com/eks/pricing/)。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/tFn9IdlddBw?rel=0/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/tFn9IdlddBw?rel=0)


## 功能
<a name="hybrid-nodes-features"></a>

EKS 混合節點具有下列高階功能：
+  **受管 Kubernetes 控制平面**：AWS 負責管理 EKS 叢集的 AWS 託管 Kubernetes 控制平面，而您可管理在內部部署或邊緣環境中執行的混合節點。這會統一您環境中的 Kubernetes 管理，並將內部部署和邊緣應用程式的 Kubernetes 控制平面管理卸載至 AWS。透過將 Kubernetes 控制平面移動至 AWS，您可以為應用程式節省內部部署容量，並信任 Kubernetes 控制平面會隨工作負載擴展。
+  **一致的 EKS 體驗**：EKS 混合節點支援大多數 EKS 功能，可在內部部署和雲端環境中提供一致的 EKS 體驗，包括 EKS 附加元件、EKS Pod 身分識別、叢集存取項目、叢集洞察、擴充的 Kubernetes 版本支援等。如需 EKS 混合節點支援的 EKS 附加元件的詳細資訊，請參閱 [設定混合節點的附加元件](hybrid-nodes-add-ons.md)。
+  **集中式可觀測性和身分管理**：EKS 混合節點會以原生方式與 AWS Systems Manager、AWS IAM Roles Anywhere、Amazon Managed Service for Prometheus 和 Amazon CloudWatch 等 AWS 服務整合，以進行集中式監控、記錄和身分管理。
+  **爆量至雲端或新增內部部署容量**：單一 EKS 叢集可用於執行混合節點以及 AWS 區域、AWS Local Zones 或 AWS Outpost 中的節點，以便爆量至雲端或向您的 EKS 叢集新增內部部署容量。如需詳細資訊，請參閱[混合模式叢集的考量事項](hybrid-nodes-webhooks.md#hybrid-nodes-considerations-mixed-mode)。
+  **彈性基礎結構**：EKS 混合節點遵循*自有基礎結構*方法，並且與您用於混合節點的基礎結構無關。您可以在實體或虛擬機器以及 x86 和 ARM 架構上執行混合節點，從而能夠跨不同的基礎結構類型移轉在混合節點上執行的內部部署工作負載。
+  **彈性聯網**：使用 EKS 混合節點，EKS 控制平面和混合節點之間的通訊會透過您在叢集建立期間傳遞的 VPC 和子網路路由，而該子網路以 EKS 中用於控制平面到節點聯網的[現有機制](https://docs.aws.amazon.com/eks/latest/best-practices/subnets.html)為建構基礎。這對於將您的內部部署網路連線至 AWS 中的 VPC 的慣用方法而言非常靈活。有多種[記錄的選項](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)可供使用，包括 AWS Site-to-Site VPN、AWS Direct Connect 或您自己的 VPN 解決方案，而您可以選擇最適合您使用案例的方法。

## 限制
<a name="hybrid-node-limits"></a>
+ 每個叢集最多支援 15 個遠端節點網路 CIDR 和 15 個 遠端 Pod 網路 CIDR。

## 考量事項
<a name="hybrid-nodes-general"></a>
+ EKS 混合節點可與新的或現有的 EKS 叢集搭配使用。
+ EKS 混合節點可在所有 AWS 區域中使用，AWS GovCloud (美國) 區域和 AWS 中國區域除外。
+ EKS 混合節點必須在您的內部部署環境與 AWS 之間建立可靠的連線。EKS 混合節點不適用於中斷連線、中斷、間歇性或受限 (DDIL) 環境。如果您在 DDIL 環境中執行，請考慮 [Amazon EKS Anywhere](https://aws.amazon.com/eks/eks-anywhere/)。如需混合節點在網路中斷連線案例中的行為方式的資訊，請參閱 [EKS 混合節點的最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/hybrid-nodes-network-disconnections.html)。
+ 不支援在雲端基礎結構上執行 EKS 混合節點，包括 AWS 區域、AWS Local Zones、AWS Outpost 或其他雲端。如果您在 Amazon EC2 執行個體上執行混合節點，則需支付混合節點費用。
+ 混合節點的計費從節點加入 EKS 叢集時開始，並在節點從叢集中移除時停止。如果您未使用混合節點，則請務必從 EKS 叢集中將其移除。

## 其他資源
<a name="hybrid-nodes-resources"></a>
+  [https://www.eksworkshop.com/docs/networking/eks-hybrid-nodes/](https://www.eksworkshop.com/docs/networking/eks-hybrid-nodes/)：在示範環境中部署 EKS 混合節點的逐步說明。
+  [https://www.youtube.com/watch?v=ZxC7SkemxvU](https://www.youtube.com/watch?v=ZxC7SkemxvU)：AWS re:Invent 工作階段會向客戶介紹 EKS 混合節點啟動，顯示他們如何在其環境中使用 EKS 混合節點。
+  [https://repost.aws/articles/ARL44xuau6TG2t-JoJ3mJ5Mw/unpacking-the-cluster-networking-for-amazon-eks-hybrid-nodes](https://repost.aws/articles/ARL44xuau6TG2t-JoJ3mJ5Mw/unpacking-the-cluster-networking-for-amazon-eks-hybrid-nodes)：文章說明各種為 EKS 混合節點設定聯網的方法。
+  [https://aws.amazon.com/blogs/containers/run-genai-inference-across-environments-with-amazon-eks-hybrid-nodes/](https://aws.amazon.com/blogs/containers/run-genai-inference-across-environments-with-amazon-eks-hybrid-nodes/)：部落格文章說明如何使用 EKS 混合節點跨環境執行 GenAI 推論。

# 混合節點的先決條件設定
<a name="hybrid-nodes-prereqs"></a>

若要使用 Amazon EKS 混合節點，您必須擁有從內部部署環境往返的私有連線 AWS、具有支援作業系統的裸機伺服器或虛擬機器，以及已設定的 AWS IAM Roles Anywhere 或 AWS Systems Manager (SSM) 混合啟用。您負責在整個混合節點生命週期中管理這些先決條件。
+ 從內部部署環境往返的混合網路連線 AWS 
+ 實體或虛擬機器形式的基礎結構
+ 與混合節點相容的作業系統
+ 內部部署 IAM 憑證提供者已設定

![\[混合節點網路連線。\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-prereq-diagram.png)


## 混合網路連線
<a name="hybrid-nodes-prereqs-connect"></a>

Amazon EKS 控制平面和混合節點之間的通訊會透過您在叢集建立期間傳遞的 VPC 和子網路路由，而該子網路以 Amazon EKS 中用於控制平面到節點聯網的[現有機制](https://aws.github.io/aws-eks-best-practices/networking/subnets/)為建構基礎。有數個[文件記錄的選項](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)可讓您將內部部署環境與您的 VPC 連接，包括 AWS Site-to-Site VPN、 AWS Direct Connect 或您自己的 VPN 連接。如需如何使用這些解決方案進行混合網路連線的詳細資訊，請參閱 [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html) 和 [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 使用者指南。

為了獲得最佳體驗，我們建議您擁有至少 100 Mbps 的可靠網路連線能力，以及最多 200 毫秒的混合節點往返延遲。 AWS 這是適用於大多數使用案例的一般指引，但並非嚴格要求。頻寬和延遲需求可能會因混合節點的數量和工作負載特性而有所不同，例如應用程式映像大小、應用程式彈性、監控和記錄組態，以及存取儲存在其他服務中的資料的應用程式相依性 AWS 。建議您在部署到生產環境之前，先使用您自己的應用程式和環境進行測試，以驗證您的聯網設定是否符合工作負載的需求。

## 內部部署網路組態
<a name="hybrid-nodes-prereqs-onprem"></a>

您必須啟用從 Amazon EKS 控制平面到內部部署環境的傳入網路存取，以允許 Amazon EKS 控制平面與在混合節點上執行的 `kubelet` 通訊，並且也可以選擇與在混合節點上執行的 Webhook 通訊。此外，您必須為在其上執行的混合節點和元件啟用傳出網路存取，以便與 Amazon EKS 控制平面通訊。您可以設定此通訊，讓 AWS Direct Connect、 AWS Site-to-Site或您自己的 VPN 連線保持完全私有。

您用於內部部署節點和 Pod 網路的無類別網域間路由 (CIDR) 範圍必須使用 IPv4 RFC-1918 或 CGNAT 地址範圍。您的內部部署路由器必須設定為路由至您的內部部署節點和選用 Pod。如需內部部署網路需求的詳細資訊，請參閱 [內部部署聯網組態](hybrid-nodes-networking.md#hybrid-nodes-networking-on-prem)，包括必須在防火牆和內部部署環境中啟用的必要連接埠和通訊協定的完整清單。

## EKS 叢集組態
<a name="hybrid-nodes-prereqs-cluster"></a>

為了將延遲降至最低，建議您在最接近內部部署或邊緣環境的 AWS 區域中建立 Amazon EKS 叢集。您可以在 Amazon EKS 叢集建立期間，透過兩個 API 欄位傳遞內部部署節點和 Pod CIDR：`RemoteNodeNetwork` 和 `RemotePodNetwork`。您可能需要與您的內部部署網路團隊討論，以識別您的內部部署節點和 Pod CIDR。如果您為 CNI 使用覆蓋網路，節點 CIDR 會從內部部署網路配置，而 Pod CIDR 會從您使用的容器網路介面 (CNI) 配置。根據預設，Cilium 和 Calico 會使用覆蓋網路。

您透過 `RemoteNodeNetwork` 和 `RemotePodNetwork` 欄位設定的內部部署節點和 Pod CIDR 可用於設定 Amazon EKS 控制平面，進而將流量透過 VPC 路由至 `kubelet` 以及在混合節點上執行的 Pod。您的內部部署節點和 Pod CIDR 不能彼此重疊，亦不能與您在叢集建立期間傳遞的 VPC CIDR 或 Amazon EKS 叢集的服務 IPv4 組態重疊。此外，Pod CIDR 對每個 EKS 叢集必須是唯一的，以便您的內部部署路由器可以路由流量。

建議您對 Amazon EKS Kubernetes API 伺服器端點使用公有或私有端點存取。如果您選擇「公有和私有」，Amazon EKS Kubernetes API 伺服器端點一律會解析為在 VPC 外部執行的混合節點的公有 IP，以防止您的混合節點加入叢集。當您使用公有端點存取時，Kubernetes API 伺服器端點會解析為公共 IP，而從混合節點到 Amazon EKS 控制平面的通訊將會透過網際網路路由。當您選擇私有端點存取時，Kubernetes API 伺服器端點會解析為私有 IPs，而且從混合節點到 Amazon EKS 控制平面的通訊將透過您的私有連線連結路由，在大多數情況下是 AWS Direct Connect AWS Site-to-Site VPN。

## VPC 組態
<a name="hybrid-nodes-prereqs-vpc"></a>

您必須為您的內部部署節點，使用其路由表中的路由設定在 Amazon EKS 叢集建立期間傳遞的 VPC，以及使用作為目標的虛擬私有閘道 (VGW) 或傳輸閘道 (TGW) 設定 Pod 網路 (選用)。以下所示為範例。使用內部部署網路的值取代 `REMOTE_NODE_CIDR` 和 `REMOTE_POD_CIDR`。


| 目標 | Target | Description | 
| --- | --- | --- | 
|  10.226.0.0/16  |  本機  |  VPC 內 VPC 路由的本機流量  | 
|  REMOTE\$1NODE\$1CIDR  |  tgw-abcdef123456  |  內部部署節點 CIDR，將流量路由到 TGW  | 
|  REMOTE\$1POD\$1CIDR  |  tgw-abcdef123456  |  內部部署 Pod CIDR，將流量路由到 TGW  | 

## 安全群組組態
<a name="hybrid-nodes-prereqs-sg"></a>

當您建立叢集時，Amazon EKS 會建立名稱為 `eks-cluster-sg-<cluster-name>-<uniqueID>` 的安全群組。您無法更改此叢集安全群組的傳入規則，但可以限制傳出規則。您必須將其他安全群組新增至叢集，才能啟用在混合節點上執行的 kubelet 和 Webhook (選用)，進而聯絡 Amazon EKS 控制平面。這個其他安全群組所需的傳入規則如下所示。使用內部部署網路的值取代 `REMOTE_NODE_CIDR` 和 `REMOTE_POD_CIDR`。


| 名稱 | 安全群組規則 ID | IP 版本 | Type | 通訊協定 | 連接埠範圍 | 來源 | 
| --- | --- | --- | --- | --- | --- | --- | 
|  內部部署節點傳入  |  sgr-abcdef123456  |  IPv4  |  HTTPS  |  TCP  |  443  |  REMOTE\$1NODE\$1CIDR  | 
|  內部部署 Pod 傳入  |  sgr-abcdef654321  |  IPv4  |  HTTPS  |  TCP  |  443  |  REMOTE\$1POD\$1CIDR  | 

## 基礎設施
<a name="hybrid-nodes-prereqs-infra"></a>

您必須擁有可用作混合節點的裸機伺服器或虛擬機器。混合節點與底層基礎結構無關，並可支援 x86 和 ARM 架構。Amazon EKS 混合節點遵循「自有基礎結構」方法，而您要負責佈建和管理用於混合節點的裸機伺服器或虛擬機器。雖然沒有嚴格的最低資源需求，但我們建議您為混合節點使用至少具有 1 個 vCPU 和 1GiB RAM 的主機。

## 作業系統
<a name="hybrid-nodes-prereqs-os"></a>

Bottlerocket、Amazon Linux 2023 (AL2023)、Ubuntu 和 RHEL 經過持續驗證，可用作混合節點的節點作業系統。Bottlerocket 僅支援 VMware vSphere 環境中 AWS的 。在 Amazon EC2 外部執行時， AWS 支援計劃不涵蓋 AL2023。 Amazon EC2 AL2023 只能在內部部署虛擬化環境中使用，如需詳細資訊，請參閱 [Amazon Linux 2023 使用者指南](https://docs.aws.amazon.com/linux/al2023/ug/outside-ec2.html)。 AWS 支援與 Ubuntu 和 RHEL 作業系統整合的混合節點，但不支援作業系統本身。

您負責作業系統佈建和管理。在首次測試混合節點時，最簡單的方式是在已佈建的主機上執行 Amazon EKS 混合節點 CLI (`nodeadm`)。對於生產部署，建議您在黃金作業系統映像中包含 `nodeadm`，並將它設定為作為 systemd 服務執行，以便在主機啟動時自動將主機加入 Amazon EKS 叢集。

## 內部部署 IAM 憑證提供者
<a name="hybrid-nodes-prereqs-iam"></a>

Amazon EKS 混合節點使用由 AWS SSM 混合啟用或 IAM Roles Anywhere AWS 佈建的臨時 IAM 登入資料來驗證 Amazon EKS 叢集。您必須將 AWS SSM 混合啟用或 AWS IAM Roles Anywhere 與 Amazon EKS 混合節點 CLI () 搭配使用`nodeadm`。如果您現有的公有金鑰基礎設施 (PKI) 沒有憑證授權機構 (CA) 和內部部署環境的憑證，建議您使用 AWS SSM 混合啟用。如果您有現有的 PKI 和現場部署憑證，請使用 AWS IAM Roles Anywhere。

與在 Amazon EC2 上執行的節點的 [Amazon EKS 節點 IAM 角色](create-node-role.md) 類似，您將建立混合節點 IAM 角色，其中包含將混合節點加入 Amazon EKS 叢集所需的許可。如果您使用的是 AWS IAM Roles Anywhere，請設定信任政策，允許 AWS IAM Roles Anywhere 擔任混合節點 IAM 角色，並使用混合節點 AWS IAM 角色做為可擔任的角色來設定 IAM Roles Anywhere 設定檔。如果您使用的是 AWS SSM，請設定信任政策，允許 AWS SSM 擔任混合節點 IAM 角色，並使用混合節點 IAM 角色建立混合啟用。如需有關如何建立具有必要許可的混合節點 IAM 角色的資訊，請參閱 [準備混合節點的憑證](hybrid-nodes-creds.md)。

# 準備混合節點的聯網
<a name="hybrid-nodes-networking"></a>

本主題概述了您在建立 Amazon EKS 叢集和連接混合節點之前必須設定的聯網設定。本指南假設您已符合使用 [AWS Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/SetUpVPNConnections.html)、[AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 或您自己的 VPN 解決方案實現混合網路連線的先決條件要求。

![\[混合節點網路連線。\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-prereq-diagram.png)


## 內部部署聯網組態
<a name="hybrid-nodes-networking-on-prem"></a>

### 最低網路需求
<a name="hybrid-nodes-networking-min-reqs"></a>

為了獲得最佳體驗，我們建議您擁有至少 100 Mbps 的可靠網路連線能力，以及最多 200 毫秒的混合節點往返延遲。 AWS 這是適用於大多數使用案例的一般指引，但並非嚴格要求。頻寬和延遲需求可能會因混合節點的數量和工作負載特性而有所不同，例如應用程式映像大小、應用程式彈性、監控和記錄組態，以及存取儲存在其他服務中的資料的應用程式相依性 AWS 。建議您在部署到生產環境之前，先使用您自己的應用程式和環境進行測試，以驗證您的聯網設定是否符合工作負載的需求。

### 內部部署節點和 Pod CIDR
<a name="hybrid-nodes-networking-on-prem-cidrs"></a>

識別將用於混合節點及其上執行的工作負載的節點和 Pod CIDR。如果您為 CNI 使用覆蓋網路，節點 CIDR 會從內部部署網路配置，而 Pod CIDR 會從您的容器網路介面 (CNI) 配置。當您使用 `RemoteNodeNetwork` 和 `RemotePodNetwork` 欄位建立 EKS 叢集時，您可以將內部部署節點 CIDR 和 Pod CIDR 作為輸入進行傳遞。您的內部部署節點 CIDR 必須在內部部署網路上可路由。如需內部部署 Pod CIDR 可路由性的資訊，請參閱下一節。

內部部署節點和 Pod CIDR 區塊必須符合下列要求：

1. 在下列其中一個 `IPv4` RFC-1918 範圍內：`10.0.0.0/8`、 `172.16.0.0/12`或 `192.168.0.0/16` ，或在 RFC 6598 定義的 CGNAT 範圍內：`100.64.0.0/10`。

1. EKS 叢集的 VPC CIDR 或您的 Kubernetes Service `IPv4` CIDR 不會彼此重疊。

### 內部部署 Pod 網路路由
<a name="hybrid-nodes-networking-on-prem-pod-routing"></a>

使用 EKS 混合節點時，我們通常會建議您將內部部署網路上的內部部署 Pod CIDR 設定為可路由，以便啟用雲端和內部部署環境之間的完整叢集通訊和功能。

 **可路由的 Pod 網路** 

如果您能夠將內部部署網路上的 Pod 網路設定為可路由，請遵循下列指引。

1. 設定以下 `RemotePodNetwork` 欄位：使用內部部署 Pod CIDR 的 EKS 叢集、使用內部部署 Pod CIDR 的 VPC 路由表，以及使用內部部署 Pod CIDR 的 EKS 叢集安全群組。

1. 您可以使用多種技術，讓您的內部部署 Pod CIDR 在內部部署網路上可路由，包括邊界閘道協定 (BGP)、靜態路由或其他自訂路由解決方案。BGP 是建議的解決方案，因為它比需要自訂或手動路由組態的替代解決方案更具可擴展性且更容易管理。 AWS 支援 Cilium 和 Calico 的 BGP 功能來公告 Pod CIDRs，如需詳細資訊，請參閱 [可路由的遠端 Pod CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs) [設定混合節點的 CNI](hybrid-nodes-cni.md)和 。

1. Webhooks 可以在混合節點上執行，因為 EKS 控制平面能夠與指派給 Webhook 的 Pod IP 位址進行通訊。

1. 在雲端節點上執行的工作負載能夠直接與同一 EKS 叢集中混合節點上執行的工作負載進行通訊。

1.  AWS 其他服務，例如 AWS Application Load Balancer 和 Amazon Managed Service for Prometheus，能夠與混合節點上執行的工作負載進行通訊，以平衡網路流量和湊集 Pod 指標。

 **不可路由的 Pod 網路** 

如果您*不*能將內部部署網路上的 Pod 網路設定為可路由，請遵循下列指引。

1. Webhook 無法在混合節點上執行，因為 Webhook 需要從 EKS 控制平面連線至指派給 Webhook 的 Pod IP 位址。在此情況下，我們建議您在與混合節點相同的 EKS 叢集中的雲端節點上執行 Webhook，如需詳細資訊，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

1. 當對雲端節點使用 VPC CNI 及對混合節點使用 Cilium 或 Calico 時，雲端節點上執行的工作負載將不能直接與混合節點上執行的工作負載進行通訊。

1. 使用服務流量分佈，以將流量保持在其來源區域的本機。如需有關服務流量分佈的詳細資訊，請參閱 [設定服務流量分佈](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution)。

1. 將 CNI 設定為在 Pod 流量離開內部部署主機時，使用輸出偽裝或網路位址轉譯 (NAT)。在 Cilium 中，其預設為啟用。Calico 需要將 `natOutgoing` 設定為 `true`。

1. Application AWS Load Balancer 和 Amazon Managed Service for Prometheus 等 AWS 其他服務無法與在混合節點上執行的工作負載通訊。

### 混合節點安裝和升級期間所需的存取
<a name="hybrid-nodes-networking-access-reqs"></a>

在安裝過程中 (即您在主機上安裝混合節點相依性時)，您必須可以存取下列網域。當您建置作業系統映像時，可以執行此程序一次；另外在執行時期，也可在每個主機上執行此程序。這包括初始安裝以及升級混合節點的 Kubernetes 版本時。

某些套件是使用作業系統的預設套件管理工具進行安裝的。對於 AL2023 和 RHEL，`yum` 命令可用於安裝 `containerd`、`ca-certificates`、`iptables` 和 `amazon-ssm-agent`。對於 Ubuntu，`apt` 可用於安裝 `containerd`、`ca-certificates` 和 `iptables`，而 `snap` 可用於安裝 `amazon-ssm-agent`。


| 元件 | URL | 通訊協定 | 站點 | 
| --- | --- | --- | --- | 
|  EKS 節點成品 (S3)  |  https://hybrid-assets.eks.amazonaws.com  |  HTTPS  |  443  | 
|   [EKS 服務端點](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  https://eks.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [ECR 服務端點](https://docs.aws.amazon.com/general/latest/gr/ecr.html)   |  https://api.ecr.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  EKS ECR 端點  |  請參閱 [檢視 Amazon EKS 附加元件的 Amazon 容器映像登錄檔](add-ons-images.md) 了解區域端點。  |  HTTPS  |  443  | 
|  SSM 二進位檔端點 1   |  https://amazon-ssm-*region*.s3.*region*.amazonaws.com  |  HTTPS  |  443  | 
|   [SSM 服務端點](https://docs.aws.amazon.com/general/latest/gr/ssm.html) 1   |  https://ssm.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  IAM Anywhere 二進位檔端點 2   |  https://rolesanywhere.amazonaws.com  |  HTTPS  |  443  | 
|   [IAM Anywhere 服務端點](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html) 2   |  https://rolesanywhere.*region*.amazonaws.com  |  HTTPS  |  443  | 
|  作業系統套件管理工具端點  |  套件儲存庫端點是作業系統特定的，並且可能因地理區域而有所不同。  |  HTTPS  |  443  | 

**注意**  
 1 只有在您為內部部署 AWS IAM 憑證提供者使用 AWS SSM 混合啟用時，才需要存取 SSM 端點。  
 2 只有在您為內部部署 AWS IAM 憑證提供者使用 AWS IAM Roles Anywhere 時，才需要存取 IAM 端點。

### 持續叢集操作所需的存取
<a name="hybrid-nodes-networking-access-reqs-ongoing"></a>

持續叢集操作需要為您的內部部署防火牆提供下列網路存取。

**重要**  
視您選擇的 CNI 而定，您需要為 CNI 連接埠設定其他網路存取規則。如需詳細資訊，請參閱 [Cilium 文件](https://docs.cilium.io/en/stable/operations/system_requirements/#firewall-rules)和 [Calico 文件](https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements#network-requirements)。


| Type | 通訊協定 | Direction | 站點 | 來源 | 目標 | Usage | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  傳出  |  443  |  遠端節點 CIDR  |  EKS 叢集 IP 1   |  kubelet 到 Kubernetes API 伺服器  | 
|  HTTPS  |  TCP  |  傳出  |  443  |  遠端 Pod CIDR  |  EKS 叢集 IP 1   |  Pod 到 Kubernetes API 伺服器  | 
|  HTTPS  |  TCP  |  傳出  |  443  |  遠端節點 CIDR  |   [SSM 服務端點](https://docs.aws.amazon.com/general/latest/gr/ssm.html)   |  SSM 混合啟用憑證重新整理和 SSM 活動訊號，每 5 分鐘一次  | 
|  HTTPS  |  TCP  |  傳出  |  443  |  遠端節點 CIDR  |   [IAM Anywhere 服務端點](https://docs.aws.amazon.com/general/latest/gr/rolesanywhere.html)   |  IAM Roles Anywhere 憑證重新整理  | 
|  HTTPS  |  TCP  |  傳出  |  443  |  遠端 Pod CIDR  |   [STS 區域端點](https://docs.aws.amazon.com/general/latest/gr/sts.html)   |  Pod 到 STS 端點，僅 IRSA 需要  | 
|  HTTPS  |  TCP  |  傳出  |  443  |  遠端節點 CIDR  |   [Amazon EKS Auth 服務端點](https://docs.aws.amazon.com/general/latest/gr/eks.html)   |  節點至 Amazon EKS 身分驗證端點，僅 Amazon EKS Pod 身分識別需要  | 
|  HTTPS  |  TCP  |  傳入  |  10250  |  EKS 叢集 IP 1   |  遠端節點 CIDR  |  Kubernetes API 伺服器到 kubelet  | 
|  HTTPS  |  TCP  |  傳入  |  Webhook 連接埠  |  EKS 叢集 IP 1   |  遠端 Pod CIDR  |  Kubernetes API 伺服器到 Webhook  | 
|  HTTPS  |  TCP/UDP  |  傳入，傳出  |  53  |  遠端 Pod CIDR  |  遠端 Pod CIDR  |  Pod 到 CoreDNS。如果您在雲端中執行至少 1 個 CoreDNS 複本，則必須允許 DNS 流量通往執行 CoreDNS 的 VPC。  | 
|  使用者定義  |  使用者定義  |  傳入，傳出  |  應用程式連接埠  |  遠端 Pod CIDR  |  遠端 Pod CIDR  |  Pod 到 Pod  | 

**注意**  
 1 EKS 叢集的 IP。請參閱以下有關 Amazon EKS 彈性網路介面的章節。

### Amazon EKS 網路介面
<a name="hybrid-nodes-networking-eks-network-interfaces"></a>

Amazon EKS 會將網路介面連接到您在叢集建立期間傳遞的 VPC 中的子網路，以啟用 EKS 控制平面與 VPC 之間的通訊。Amazon EKS 建立的網路界面可在 Amazon EC2 主控台或使用 AWS CLI 建立叢集後找到。在 EKS 叢集上套用變更時，會刪除原始網路介面並建立新的網路介面，例如 Kubernetes 版本升級。您可對叢集建立期間傳遞的子網路使用受限子網路大小以限制 Amazon EKS 網路介面的 IP 範圍，這樣您就能更輕鬆地設定內部部署防火牆，以允許與這組已知的受限 IP 建立傳入/傳出連線。若要控制在其中建立的子網路網路介面，可以限制建立叢集時指定的子網路數量，或在建立叢集後您可以更新子網路。

Amazon EKS 佈建的網路介面具有格式 `Amazon EKS your-cluster-name ` 的說明。如需可用來尋找 Amazon AWS EKS 佈建之網路介面 IP 地址的 CLI 命令，請參閱下列範例。使用您在叢集建立期間傳遞的 VPC 的 ID 取代 `VPC_ID`。

```
aws ec2 describe-network-interfaces \
--query 'NetworkInterfaces[?(VpcId == VPC_ID && contains(Description,Amazon EKS))].PrivateIpAddress'
```

## AWS VPC 和子網路設定
<a name="hybrid-nodes-networking-vpc"></a>

Amazon EKS 的現有 [VPC 和子網路要求](network-reqs.md)適用於具有混合節點的叢集。此外，您的 VPC CIDR 無法與內部部署節點和 Pod CIDR 重疊。您必須在 VPC 路由表中為內部部署節點設定路由，也可選擇性地為 Pod CIDR 設定路由。必須設定這些路由，以將流量路由到您用於混合網路連線的閘道，該閘道通常是虛擬私有閘道 (VGW) 或傳輸閘道 (TGW)。如果您使用 TGW 或 VGW 將 VPC 連接到內部部署環境，則必須為您的 VPC 建立 TGW 或 VGW 附件。您的 VPC 必須支援 DNS 主機名稱和 DNS 解析。

下列步驟使用 AWS CLI。您也可以在 中 AWS 管理主控台 或透過 AWS CloudFormation、 AWS CDK 或 Terraform 等其他界面建立這些資源。

### 步驟 1：建立 VPC
<a name="_step_1_create_vpc"></a>

1. 執行下列命令以建立 VPC。將 VPC\$1CIDR 取代為 RFC 1918 （私有）、CGNAT (RFC 6598) 或非 RFC 1918/非 CGNAT （公有） （例如 10.0.0.0/16) 的 IPv4 CIDR 範圍。注意：根據預設，已為 VPC 啟用 DNS 解析 (這是 EKS 要求)。

   ```
   aws ec2 create-vpc --cidr-block VPC_CIDR
   ```

1. 為您的 VPC 啟用 DNS 主機名稱。請注意，根據預設，已為 VPC 啟用 DNS 解析。使用您在上一個步驟中建立的 VPC 的 ID 取代 `VPC_ID`。

   ```
   aws ec2 modify-vpc-attribute --vpc-id VPC_ID --enable-dns-hostnames
   ```

### 步驟 2：建立子網路
<a name="_step_2_create_subnets"></a>

建立至少 2 個子網路。Amazon EKS 會將這些子網路用於叢集網路介面。如需詳細資訊，請參閱[子網路要求和考量事項](network-reqs.md#network-requirements-subnets)。

1. 您可以使用下列命令尋找 AWS 區域的可用區域。使用您的區域取代 `us-west-2`。

   ```
   aws ec2 describe-availability-zones \
        --query 'AvailabilityZones[?(RegionName == us-west-2)].ZoneName'
   ```

1. 建立子網。使用 VPC 的 ID 取代 `VPC_ID`。使用您子網路的 CIDR 區塊取代 `SUBNET_CIDR` (例如 10.0.1.0/24)。使用將建立子網路的可用區域取代 `AZ` (例如 us-west-2a)。您建立的子網路必須至少位於 2 個不同的可用區域。

   ```
   aws ec2 create-subnet \
       --vpc-id VPC_ID \
       --cidr-block SUBNET_CIDR \
       --availability-zone AZ
   ```

### （選用） 步驟 3：使用 Amazon VPC Transit Gateway (TGW) 或 AWS Direct Connect 虛擬私有閘道 (VGW) 連接 VPC
<a name="optional_step_3_attach_vpc_with_amazon_vpc_transit_gateway_tgw_or_shared_aws_direct_connect_virtual_private_gateway_vgw"></a>

如果您使用的是 TGW 或 VGW，則請將 VPC 連接到 TGW 或 VGW。如需詳細資訊，請參閱 [Amazon VPC Transit Gateways 中的 Amazon VPC 附件](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html)或 [AWS Direct Connect 虛擬私有閘道關聯](https://docs.aws.amazon.com/vpn/latest/s2svpn/how_it_works.html#VPNGateway)。

 **轉換閘道** 

執行下列命令以連接 Transit Gateway。使用 VPC 的 ID 取代 `VPC_ID`。使用您在上一個步驟中建立的子網路的 ID 取代 `SUBNET_ID1` 和 `SUBNET_ID2`。使用您 TGW 的 ID 取代 `TGW_ID`。

```
aws ec2 create-transit-gateway-vpc-attachment \
    --vpc-id VPC_ID \
    --subnet-ids SUBNET_ID1 SUBNET_ID2 \
    --transit-gateway-id TGW_ID
```

 **虛擬私有閘道** 

執行下列命令以連接 Transit Gateway。使用您 VGW 的 ID 取代 `VPN_ID`。使用 VPC 的 ID 取代 `VPC_ID`。

```
aws ec2 attach-vpn-gateway \
    --vpn-gateway-id VPN_ID \
    --vpc-id VPC_ID
```

### (選用) 步驟 4：建立路由表
<a name="_optional_step_4_create_route_table"></a>

您可以修改 VPC 的主要路由表，也可以建立自訂路由表。下列步驟會建立自訂路由表，其中包含通往內部部署節點和 Pod CIDR 的路由。如需詳細資訊，請參閱[子網路路由表](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-route-tables.html)。使用 VPC 的 ID 取代 `VPC_ID`。

```
aws ec2 create-route-table --vpc-id VPC_ID
```

### 步驟 5：建立內部部署節點和 Pod 的路由
<a name="_step_5_create_routes_for_on_premises_nodes_and_pods"></a>

在路由表中，為每個內部部署遠端節點建立路由。您可以修改 VPC 的主要路由表，也可以使用您在上一個步驟中建立的自訂路由表。

以下範例顯示如何為您的內部部署節點和 Pod CIDR 建立路由。在範例中，傳輸閘道 (TGW) 可用於連接 VPC 與內部部署環境。如果您有多個內部部署節點和 Pod CIDR，請對每個 CIDR 重複這些步驟。
+ 如果您使用的是網際網路閘道或虛擬私有閘道 (VGW)，則請使用 `--gateway-id` 取代 `--transit-gateway-id`。
+ 使用您在上一個步驟中建立的路由表的 ID 取代 `RT_ID`。
+ 使用您將用於混合節點的 CIDR 範圍取代 `REMOTE_NODE_CIDR`。
+ 使用您將用於為混合節點上執行的 Pod 的 CIDR 範圍取代 `REMOTE_POD_CIDR`。Pod CIDR 範圍會對應至容器聯網介面 (CNI) 組態，而此組態最常使用覆蓋網路內部部署。如需詳細資訊，請參閱[設定混合節點的 CNI](hybrid-nodes-cni.md)。
+ 使用您 TGW 的 ID 取代 `TGW_ID`。

 **遠端節點網路** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_NODE_CIDR \
    --transit-gateway-id TGW_ID
```

 **遠端 Pod 網路** 

```
aws ec2 create-route \
    --route-table-id RT_ID \
    --destination-cidr-block REMOTE_POD_CIDR \
    --transit-gateway-id TGW_ID
```

### (選用) 步驟 6：將子網路和路由表建立關聯
<a name="_optional_step_6_associate_subnets_with_route_table"></a>

如果您在上一個步驟中建立了自訂路由表，請將您在上一個步驟中建立的每個子網路與您的自訂路由表建立關聯。如果您要修改 VPC 主要路由表，子網路會自動與 VPC 的主要路由表建立關聯，並且您可以略過此步驟。

對先前步驟中建立的每個子網路，執行下列命令。使用您在上一個步驟中建立的路由表取代 `RT_ID`。使用子網路的 ID 取代 `SUBNET_ID`。

```
aws ec2 associate-route-table --route-table-id RT_ID --subnet-id SUBNET_ID
```

## 叢集安全群組組態
<a name="hybrid-nodes-networking-cluster-sg"></a>

持續叢集操作需要為 EKS 叢集安全群組提供下列存取。當您使用設定的遠端節點和 Pod 網路建立或更新叢集時，Amazon EKS 會自動為混合節點建立必要的**傳入**安全群組規則。由於根據預設，安全群組允許所有**傳出**流量，Amazon EKS 不會自動修改混合節點的叢集安全群組的**傳出**規則。如果您想要自訂叢集安全群組，您可以根據下表中的規則限制流量。


| Type | 通訊協定 | Direction | 站點 | 來源 | 目標 | Usage | 
| --- | --- | --- | --- | --- | --- | --- | 
|  HTTPS  |  TCP  |  傳入  |  443  |  遠端節點 CIDR  |  N/A  |  kubelet 到 Kubernetes API 伺服器  | 
|  HTTPS  |  TCP  |  傳入  |  443  |  遠端 Pod CIDR  |  N/A  |  Pod，當 CNI 未針對 Pod 流量使用 NAT 時，需要存取 K8s API 伺服器。  | 
|  HTTPS  |  TCP  |  傳出  |  10250  |  N/A  |  遠端節點 CIDR  |  Kubernetes API 伺服器到 Kubelet  | 
|  HTTPS  |  TCP  |  傳出  |  Webhook 連接埠  |  N/A  |  遠端 Pod CIDR  |  Kubernetes API 伺服器到 Webhook (如果在混合節點上執行 Webhooks on hybrid nodes)  | 

**重要**  
 **安全群組規則限制**：根據預設，Amazon EC2 安全群組最多有 60 條傳入規則。如果您的叢集安全群組接近此限制，則安全群組傳入規則可能不適用。在此情況下，可能需要在缺少的傳入規則中手動進行新增。  
 **CIDR 清除責任**：如果您從 EKS 叢集中移除遠端節點或 Pod 網路，EKS 不會自動移除對應的安全群組規則。您負責從安全群組規則中手動移除未使用的遠端節點或 Pod 網路。

如需有關 Amazon EKS 建立的叢集安全群組的詳細資訊，請參閱 [檢視叢集的 Amazon EKS 安全群組要求](sec-group-reqs.md)。

### (選用) 手動安全群組組態
<a name="_optional_manual_security_group_configuration"></a>

如果您需要建立其他安全群組或修改自動建立的規則，您可以使用下列命令作為參考。根據預設，以下命令會建立一個允許所有傳出存取的安全群組。您可以將傳出存取限制為僅包含上述規則。如果您正在考慮限制傳出規則，建議您先徹底測試所有應用程式和 Pod 連線，之後再將變更的規則套用到生產叢集。
+ 在第一個命令中，使用您安全群組的名稱取代 `SG_NAME`
+ 在第一個命令中，使用您在上一個步驟中建立的 VPC 的 ID 取代 `VPC_ID`
+ 在第二個命令中，使用您在第一個命令中建立的安全群組的 ID 取代 `SG_ID`
+ 在第二個命令中，使用混合節點和內部部署網路的值取代 `REMOTE_NODE_CIDR` 和 `REMOTE_POD_CIDR`。

```
aws ec2 create-security-group \
    --group-name SG_NAME \
    --description "security group for hybrid nodes" \
    --vpc-id VPC_ID
```

```
aws ec2 authorize-security-group-ingress \
    --group-id SG_ID \
    --ip-permissions '[{"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "IpRanges": [{"CidrIp": "REMOTE_NODE_CIDR"}, {"CidrIp": "REMOTE_POD_CIDR"}]}]'
```

# 準備混合節點的作業系統
<a name="hybrid-nodes-os"></a>

Bottlerocket、Amazon Linux 2023 (AL2023)、Ubuntu 和 RHEL 經過持續驗證，可用作混合節點的節點作業系統。Bottlerocket 僅支援 VMware vSphere 環境中 AWS的 。在 Amazon EC2 外部執行時， AWS 支援計劃不涵蓋 AL2023。 Amazon EC2 AL2023 只能在內部部署虛擬化環境中使用，如需詳細資訊，請參閱 [Amazon Linux 2023 使用者指南](https://docs.aws.amazon.com/linux/al2023/ug/outside-ec2.html)。 AWS 支援與 Ubuntu 和 RHEL 作業系統整合的混合節點，但不支援作業系統本身。

您負責作業系統佈建和管理。在首次測試混合節點時，最簡單的方式是在已佈建的主機上執行 Amazon EKS 混合節點 CLI (`nodeadm`)。對於生產部署，建議您在作業系統映像中包含 `nodeadm`，並將它設定為作為 systemd 服務執行，以便在主機啟動時自動將主機加入 Amazon EKS 叢集。如果您在 vSphere 上使用 Bottlerocket 作為節點作業系統，則不需要使用 `nodeadm`，因為 Bottlerocket 已包含混合節點所需的相依性，並且會在主機啟動時自動連接至您設定的叢集。

## 版本相容性
<a name="_version_compatibility"></a>

下表所列的作業系統版本代表相容且經過驗證可用作混合節點的節點作業系統。如果您使用的是不包含在此資料表中的其他作業系統變體或版本，則 AWS Support 不會涵蓋混合節點與作業系統變體或版本的相容性。混合節點與底層基礎結構無關，並可支援 x86 和 ARM 架構。


| 作業系統 | 版本 | 
| --- | --- | 
|  Amazon Linux  |  Amazon Linux 2023 (AL2023)  | 
|  Bottlerocket  |  執行 Kubernetes v1.28 及更新版本的 v1.37.0 及更新版本的 VMware 變體  | 
|  Ubuntu  |  Ubuntu 20.04、Ubuntu 22.04、Ubuntu 24.04  | 
|  Red Hat Enterprise Linux  |  RHEL 8、RHEL 9  | 

## 作業系統考量事項
<a name="_operating_system_considerations"></a>

### 一般
<a name="_general"></a>
+ Amazon EKS 混合節點 CLI (`nodeadm`) 可用於簡化混合節點元件和相依性的安裝和組態。在作業系統映像建置管道期間或每個內部部署主機的執行時期，您可以執行 `nodeadm install` 程序。如需有關 `nodeadm` 安裝的元件的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。
+ 如果您在內部部署環境中使用代理連線至網際網路，安裝和升級程序需要額外的作業系統組態，才能將套件管理工具設定為使用代理。如需說明，請參閱 [設定混合節點的代理](hybrid-nodes-proxy.md)。

### Bottlerocket
<a name="_bottlerocket"></a>
+ 連接 Bottlerocket 節點的步驟和工具與其他作業系統的步驟不同，並會在 [使用 Bottlerocket 連接混合節點](hybrid-nodes-bottlerocket.md) 中單獨介紹，而不會涵蓋在 [連接混合節點](hybrid-nodes-join.md) 的步驟中。
+ Bottlerocket 的步驟不會使用混合節點 CLI 工具 `nodeadm`。
+ EKS 混合節點僅支援 Bottlerocket 版本 1.37.0 及更新版本的 VMware 變體。Bottlerocket 的 VMware 變體適用於 Kubernetes 版本 1.28 及更新版本。不支援[其他 Bottlerocket 變體](https://bottlerocket.dev/en/os/1.36.x/concepts/variants)作為混合節點作業系統。注意： Bottlerocket 的 VMware 變體僅適用於 x86\$164 架構。

### Containerd
<a name="_containerd"></a>
+ Containerd 是標準 Kubernetes 容器執行時期，也是混合節點以及所有 Amazon EKS 節點運算類型的相依性。Amazon EKS 混合節點 CLI (`nodeadm`) 會嘗試在 `nodeadm install` 程序期間安裝 containerd。您可以使用 `--containerd-source` 命令列選項，在 `nodeadm install` 執行時期設定 containerd 安裝。有效選項為 `none`、`distro` 和 `docker`。如果您使用的是 RHEL，則 `distro` 不是有效選項，並且您可以將 `nodeadm` 設定為從 Docker 的儲存庫安裝 containerd 建置，也可以手動安裝 containerd。使用 AL2023 或 Ubuntu 時，`nodeadm` 預設為從作業系統分佈中安裝 containerd。如果您不希望 nodeadm 安裝 containerd，則請使用 `--containerd-source none` 選項。

### Ubuntu
<a name="_ubuntu"></a>
+ 如果您使用的是 Ubuntu 24.04，您可能需要更新您的 containerd 版本，或變更 AppArmor 組態以採用允許 Pod 正確終止的修正，請參閱 [Ubuntu \$12065423](https://bugs.launchpad.net/ubuntu/+source/containerd-app/\+bug/2065423)。需要重新啟動才能將變更套用至 AppArmor 設定檔。Ubuntu 24.04 的最新版本在其套件管理工具中具有更新的 containerd 版本，且帶有修正 (containerd 版本 1.7.19\$1)。

### ARM
<a name="_arm"></a>
+ 如果您使用的是 ARM 硬體，則需要具有密碼編譯延伸功能的 ARMv8.2 相容處理器 (ARMv8.2\$1crypto)，才能執行 EKS kube-proxy 附加元件的版本 1.31 及更新版本。Raspberry Pi 5 之前的所有 Raspberry Pi 系統，以及 Cortex-A72 型處理器皆不符合此要求。解決方法是：您可以繼續使用 EKS kube-proxy 附加元件的版本 1.30，直到 2026 年 7 月延長支援結束為止，請參閱 [Kubernetes 發布行事曆](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)，或使用來自上游的自訂 kube-proxy 映像。
+ kube-proxy 日誌中的下列錯誤訊息會指出這種不相容性：

```
Fatal glibc error: This version of Amazon Linux requires a newer ARM64 processor compliant with at least ARM architecture 8.2-a with Cryptographic extensions. On EC2 this is Graviton 2 or later.
```

## 建置作業系統映像
<a name="_building_operating_system_images"></a>

Amazon EKS 提供[範例 Packer 範本](https://github.com/aws/eks-hybrid/tree/main/example/packer)，您可使用這些範本來建立包含 `nodeadm` 的作業系統映像，並將其設定為在主機啟動時執行。建議執行此程序，以避免在每個主機上個別提取混合節點相依性，並自動化混合節點引導程序。您可以搭配 Ubuntu 22.04、Ubuntu 24.04、RHEL 8 或 RHEL 9 ISO 映像使用範例 Packer 範本，並且可以使用這些格式輸出映像：OVA、Qcow2 或 raw。

### 先決條件
<a name="_prerequisites"></a>

使用範例 Packer 範本之前，您必須在執行 Packer 的機器上安裝下列內容。
+ Packer 版本 1.11.0 或更新版本。如需有關安裝 Packer 的指示，請參閱 Packer 文件中的[安裝 Packer](https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli)。
+ 如果建置 OVA，則為 VMware vSphere 外掛程式 1.4.0 或更新版本
+ 如果是建置 `Qcow2` 或原始映像，則為 QEMU 外掛程式版本 1.x

### 設定環境變數
<a name="_set_environment_variables"></a>

在執行 Packer 建置之前，請在執行 Packer 的機器上設定下列環境變數。

 **一般** 

必須設定下列環境變數，才能運用所有作業系統和輸出格式建置映像。


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
|  PKR\$1SSH\$1PASSWORD  |  String  |  Packer 會在佈建時使用 `ssh_username` 和 `ssh_password` 變數，將 SSH 傳送至建立的機器。這需要與在個別作業系統的啟動或使用者資料檔案中建立初始使用者的密碼相符。預設值設定為 "builder" 或 "ubuntu"，視作業系統而定。設定密碼時，請務必在對應的 `ks.cfg` 或 `user-data` 檔案中對其進行變更，以保持相符。  | 
|  ISO\$1URL  |  String  |  要使用的 ISO 的 URL。可以是從伺服器下載的 Web 連結，也可以是本機檔案的絕對路徑  | 
|  ISO\$1CHECKSUM  |  String  |  所提供 ISO 的關聯檢查總和。  | 
|  CREDENTIAL\$1PROVIDER  |  String  |  混合節點的憑證提供者。對於 SSM 混合啟用，有效值為 `ssm` (預設)，而對於 IAM Roles Anywhere，有效值為 `iam`  | 
|  K8S\$1VERSION  |  String  |  混合節點的 Kubernetes 版本 (例如 `1.31`)。如需支援的 Kubernetes 版本，請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。  | 
|  NODEADM\$1ARCH  |  String  |  `nodeadm install` 的架構。選取 `amd` 或 `arm`。  | 

 **RHEL** 

如果您使用的是 RHEL，則必須設定下列環境變數。


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
|  RH\$1USERNAME  |  String  |  RHEL 訂閱管理員使用者名稱  | 
|  RH\$1PASSWORD  |  String  |  RHEL 訂閱管理員密碼  | 
|  RHEL\$1VERSION  |  String  |  要使用的 Rhel iso 版本。有效值為 `8` 或 `9`。  | 

 **Ubuntu** 

不需要 Ubuntu 專屬環境變數。

 **vSphere** 

如果您要建置 VMware vSphere OVA，則必須設定下列環境變數。


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
|  VSPHERE\$1SERVER  |  String  |  vSphere 伺服器地址  | 
|  VSPHERE\$1USER  |  String  |  vSphere 使用者名稱  | 
|  VSPHERE\$1PASSWORD  |  String  |  vSphere 密碼  | 
|  VSPHERE\$1DATACENTER  |  String  |  vSphere 資料中心名稱  | 
|  VSPHERE\$1CLUSTER  |  String  |  vSphere 叢集名稱  | 
|  VSPHERE\$1DATASTORE  |  String  |  vSphere 資料儲存名稱  | 
|  VSPHERE\$1NETWORK  |  String  |  vSphere 網路名稱  | 
|  VSPHERE\$1OUTPUT\$1FOLDER  |  String  |  範本的 vSphere 輸出資料夾  | 

 **QEMU** 


| 環境變數 | Type | 說明 | 
| --- | --- | --- | 
|  PACKER\$1OUTPUT\$1FORMAT  |  String  |  QEMU 建置器的輸出格式。有效值為 `qcow2` 和 `raw`。  | 

 **驗證範本** 

執行建置之前，請設定環境變數，然後使用下列命令驗證範本。如果您對範本使用不同的名稱，請取代 `template.pkr.hcl`。

```
packer validate template.pkr.hcl
```

### 建置映像
<a name="_build_images"></a>

使用下列命令建置映像，並使用 `-only` 旗標來指定映像的目標和作業系統。如果您對範本使用不同的名稱，請取代 `template.pkr.hcl`。

 **vSphere OVA** 

**注意**  
如果您搭配 vSphere 使用 RHEL，您需要將啟動檔案轉換為 OEMDRV 映像，並將其作為 ISO 傳遞以進行引導。如需詳細資訊，請參閱 EKS 混合節點 GitHub 儲存庫中的 [Packer Readme](https://github.com/aws/eks-hybrid/tree/main/example/packer#utilizing-rhel-with-vsphere)。

 **Ubuntu 22.04 OVA** 

```
packer build -only=general-build.vsphere-iso.ubuntu22 template.pkr.hcl
```

 **Ubuntu 24.04 OVA** 

```
packer build -only=general-build.vsphere-iso.ubuntu24 template.pkr.hcl
```

 **RHEL 8 OVA** 

```
packer build -only=general-build.vsphere-iso.rhel8 template.pkr.hcl
```

 **RHEL 9 OVA** 

```
packer build -only=general-build.vsphere-iso.rhel9 template.pkr.hcl
```

 **QEMU** 

**注意**  
如果您要為與建置器主機不相符的特定主機 CPU 建置映像，請參閱 [QEMU](https://www.qemu.org/docs/master/system/qemu-cpu-models.html) 文件以取得與您主機 CPU 相符的名稱，並在執行下列命令時，使用具有主機 CPU 名稱的 `-cpu` 旗標。

 **Ubuntu 22.04 Qcow2 / Raw** 

```
packer build -only=general-build.qemu.ubuntu22 template.pkr.hcl
```

 **Ubuntu 24.04 Qcow2 / Raw** 

```
packer build -only=general-build.qemu.ubuntu24 template.pkr.hcl
```

 **RHEL 8 Qcow2 / Raw** 

```
packer build -only=general-build.qemu.rhel8 template.pkr.hcl
```

 **RHEL 9 Qcow2 / Raw** 

```
packer build -only=general-build.qemu.rhel9 template.pkr.hcl
```

### 透過使用者資料傳遞 nodeadm 組態
<a name="_pass_nodeadm_configuration_through_user_data"></a>

您可以透過 cloud-init 傳遞使用者資料中 `nodeadm` 的組態，以在主機啟動時設定混合節點並自動將其連接至 EKS 叢集。以下範例說明如何在使用 VMware vSphere 作為混合節點的基礎結構時完成此操作。

1. 遵循 GitHub 上 [govc readme](https://github.com/vmware/govmomi/blob/main/govc/README.md) 中的指示安裝 `govc` CLI。

1. 在上一節中執行 Packer 建置並佈建範本後，您可以使用下列內容複製範本，進而建立多個不同的節點。對於要建立且將用於混合節點的每個新 VM，您必須複製相應的範本。使用您環境的值取代以下命令中的變數。當您透過 `metadata.yaml` 檔案插入 VM 的名稱時，以下命令中的 `VM_NAME` 可用作您的 `NODE_NAME`。

   ```
   govc vm.clone -vm "/PATH/TO/TEMPLATE" -ds="YOUR_DATASTORE" \
       -on=false -template=false -folder=/FOLDER/TO/SAVE/VM "VM_NAME"
   ```

1. 複製每個新 VM 的範本之後，請為您的 VM 建立 `userdata.yaml` 和 `metadata.yaml`。在以下步驟中，您的 VM 可以共用相同的 `userdata.yaml` 和 `metadata.yaml`，並且您將以每個 VM 為基礎填入。`nodeadm` 組態可由 `userdata.yaml` 的 `write_files` 區段建立並定義。以下範例使用 AWS SSM 混合啟用做為混合節點的內部部署憑證提供者。如需有關 `nodeadm` 組態的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

    **userdata.yaml：**

   ```
   #cloud-config
   users:
     - name: # username for login. Use 'builder' for RHEL or 'ubuntu' for Ubuntu.
       passwd: # password to login. Default is 'builder' for RHEL.
       groups: [adm, cdrom, dip, plugdev, lxd, sudo]
       lock-passwd: false
       sudo: ALL=(ALL) NOPASSWD:ALL
       shell: /bin/bash
   
   write_files:
     - path: /usr/local/bin/nodeConfig.yaml
       permissions: '0644'
       content: |
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
             cluster:
                 name: # Cluster Name
                 region: # AWS region
             hybrid:
                 ssm:
                     activationCode: # Your ssm activation code
                     activationId: # Your ssm activation id
   
   runcmd:
     - /usr/local/bin/nodeadm init -c file:///usr/local/bin/nodeConfig.yaml >> /var/log/nodeadm-init.log 2>&1
   ```

    **metadata.yaml：**

   為您的環境建立 `metadata.yaml`。在檔案中保留 `"$NODE_NAME"` 變數格式，因為會在後續步驟中填入這些值。

   ```
   instance-id: "$NODE_NAME"
   local-hostname: "$NODE_NAME"
   network:
     version: 2
     ethernets:
       nics:
         match:
           name: ens*
         dhcp4: yes
   ```

1. 使用下列命令將 `userdata.yaml` 和 `metadata.yaml` 檔案新增為 `gzip+base64` 字串。應該為您建立的每個 VM 執行下列命令。使用您要更新的 VM 的名稱取代 `VM_NAME`。

   ```
   export NODE_NAME="VM_NAME"
   export USER_DATA=$(gzip -c9 <userdata.yaml | base64)
   
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata="${USER_DATA}"
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.userdata.encoding=gzip+base64
   
   envsubst '$NODE_NAME' < metadata.yaml > metadata.yaml.tmp
   export METADATA=$(gzip -c9 <metadata.yaml.tmp | base64)
   
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata="${METADATA}"
   govc vm.change -dc="YOUR_DATASTORE" -vm "$NODE_NAME" -e guestinfo.metadata.encoding=gzip+base64
   ```

1. 開啟新 VM 的電源，而這應該會自動連接到您設定的 EKS 叢集。

   ```
   govc vm.power -on "${NODE_NAME}"
   ```

# 準備混合節點的憑證
<a name="hybrid-nodes-creds"></a>

Amazon EKS 混合節點使用由 AWS SSM 混合啟用或 IAM Roles Anywhere AWS 佈建的臨時 IAM 登入資料來驗證 Amazon EKS 叢集。您必須將 AWS SSM 混合啟用或 AWS IAM Roles Anywhere 與 Amazon EKS 混合節點 CLI () 搭配使用`nodeadm`。您不應該同時使用 AWS SSM 混合啟用和 AWS IAM Roles Anywhere。如果您現有的公有金鑰基礎設施 (PKI) 沒有憑證授權機構 (CA) 和內部部署環境的憑證，建議您使用 AWS SSM 混合啟用。如果您有現有的 PKI 和現場部署憑證，請使用 AWS IAM Roles Anywhere。

## 混合節點 IAM 角色
<a name="hybrid-nodes-role"></a>

在將混合節點連接到 Amazon EKS 叢集之前，您必須建立 IAM 角色，以搭配混合節點憑證的 AWS SSM 混合啟用或 AWS IAM Roles Anywhere 使用。建立叢集後，您將搭配 Amazon EKS 存取項目或 `aws-auth` ConfigMap 項目使用此角色，以將 IAM 角色映射至 Kubernetes 角色型存取控制 (RBAC)。如需建立混合節點 IAM 角色與 Kubernetes RBAC 的關聯的詳細資訊，請參閱 [準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)。

混合節點 IAM 角色必須具有下列許可。
+ `nodeadm` 使用 `eks:DescribeCluster`動作來收集您要連接混合節點之叢集相關資訊的許可。如果您未啟用 `eks:DescribeCluster`動作，則必須在傳遞給`nodeadm init`命令的節點組態中傳遞 Kubernetes API 端點、叢集 CA 套件和服務 IPv4 CIDR。
+ `nodeadm` 使用 `eks:ListAccessEntries`動作列出您要連接混合節點之叢集上存取項目的許可。如果您未啟用 `eks:ListAccessEntries`動作，則必須在執行 `nodeadm init`命令時傳遞 `--skip cluster-access-validation`旗標。
+ kubelet 使用 Amazon Elastic Container Registry (Amazon ECR) 中容器映像的許可，如 [AmazonEC2ContainerRegistryPullOnly](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEC2ContainerRegistryPullOnly.html) 政策所定義。
+ 如果使用 AWS SSM，`nodeadm init`則允許 使用[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSSMManagedInstanceCore.html)政策中定義的 AWS SSM 混合啟用。
+ 如果使用 AWS SSM，則使用 `ssm:DeregisterManagedInstance`動作和 `ssm:DescribeInstanceInformation`動作`nodeadm uninstall`取消註冊執行個體的許可。
+ (選用) Amazon EKS Pod 身分識別代理程式使用 `eks-auth:AssumeRoleForPodIdentity` 動作擷取 Pod 憑證的許可。

## 設定 AWS SSM 混合啟用
<a name="hybrid-nodes-ssm"></a>

在設定 AWS SSM 混合啟用之前，您必須建立並設定混合節點 IAM 角色。如需詳細資訊，請參閱[建立混合節點 IAM 角色](#hybrid-nodes-create-role)。遵循 Systems [Manager 使用者指南中的建立混合啟用中的指示，向 Systems Manager 註冊節點](https://docs.aws.amazon.com/systems-manager/latest/userguide/hybrid-activation-managed-nodes.html)，為您的混合節點建立 AWS SSM 混合啟用。 AWS 當您將主機作為混合節點註冊到 Amazon EKS 叢集時，請搭配 `nodeadm` 使用您收到的啟用碼和 ID。在您為混合節點建立及準備好 Amazon EKS 叢集後，您可以稍後再返回此步驟。

**重要**  
Systems Manager 會立即將啟用代碼和 ID 傳回主控台或命令視窗，視您如何建立啟用而定。複製此資訊，並將其存放在安全的地方。如果您離開主控台或關閉命令視窗，您可能會遺失此資訊。如果您遺失此資訊，您必須建立新的啟用。

根據預設， AWS SSM 混合啟用會處於作用中狀態 24 小時。或者，您亦可在以時間戳格式建立混合啟用時指定 `--expiration-date`，例如 `2024-08-01T00:00:00`。當您使用 AWS SSM 做為登入資料提供者時，混合節點的節點名稱無法設定，且由 AWS SSM 自動產生。您可以在 Fleet Manager 下的 AWS Systems Manager 主控台中檢視和管理 AWS SSM 受管執行個體。每個 AWS 區域每個帳戶最多可註冊 1，000 個標準[混合啟用節點](https://docs.aws.amazon.com/systems-manager/latest/userguide/activations.html)，無需額外費用。不過，登錄超過 1,000 個混合節點需要啟用進階執行個體層。使用 advanced-instances 方案會產生費用，而且 [Amazon EKS 混合節點定價](https://aws.amazon.com/eks/pricing/)中未包含該方案。如需詳細資訊，請參閱 [AWS Systems Manager 定價](https://aws.amazon.com/systems-manager/pricing/)。

請參閱以下範例，了解如何使用混合節點 IAM 角色建立 AWS SSM 混合啟用。當您針對混合節點登入資料使用 AWS SSM 混合啟用時，混合節點的名稱將具有 格式，`mi-012345678abcdefgh`且 AWS SSM 佈建的臨時登入資料有效期為 1 小時。使用 AWS SSM 做為登入資料提供者時，您無法變更節點名稱或登入資料持續時間。SSM AWS 會自動輪換臨時登入資料，輪換不會影響節點或應用程式的狀態。

我們建議您每個 EKS 叢集使用一個 AWS SSM 混合啟用，將混合節點 IAM 角色的 AWS SSM `ssm:DeregisterManagedInstance`許可範圍限定為只能取消註冊與您的 AWS SSM 混合啟用相關聯的執行個體。在此頁面上的範例中，使用具有 EKS 叢集 ARN 的標籤，可用於將您的 AWS SSM 混合啟用映射至 EKS 叢集。或者，您也可以根據您的許可界限和要求，使用您偏好的標籤和方法來擴展 AWS SSM 許可。以下命令中的 `REGISTRATION_LIMIT`選項是整數，用於限制可使用 AWS SSM 混合啟用的機器數量 （例如 `10`)

```
aws ssm create-activation \
     --region AWS_REGION \
     --default-instance-name eks-hybrid-nodes \
     --description "Activation for EKS hybrid nodes" \
     --iam-role AmazonEKSHybridNodesRole \
     --tags Key=EKSClusterARN,Value=arn:aws: eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME \
     --registration-limit REGISTRATION_LIMIT
```

如需 AWS SSM [混合啟用可用組態設定的詳細資訊，請參閱建立混合啟用以向 Systems Manager 註冊節點](https://docs.aws.amazon.com/systems-manager/latest/userguide/hybrid-activation-managed-nodes.html)的說明。

## 隨處設定 AWS IAM 角色
<a name="hybrid-nodes-iam-roles-anywhere"></a>

請遵循《IAM Roles Anywhere 使用者指南》中 [IAM Roles Anywhere 入門](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/getting-started.html)上的指示，設定您要用於混合節點 IAM 角色的臨時 IAM 憑證的信任錨和設定檔。建立設定檔時，您可以選擇建立時不新增任何角色。您可以建立此設定檔，返回可建立混合節點 IAM 角色的步驟，然後在建立角色後，將其新增至您的設定檔。或者，您可以在此頁面稍後使用 AWS CloudFormation 步驟來完成混合節點的 IAM Roles Anywhere 設定。

當您將混合節點 IAM 角色新增至設定檔時，請在 **IAM Roles Anywhere 主控台的編輯設定檔頁面底部的自訂角色工作階段名稱面板中選取接受**自訂角色工作階段名稱。 **** **** AWS 這會對應至 `CreateProfile` API 的 [acceptRoleSessionName](https://docs.aws.amazon.com/rolesanywhere/latest/APIReference/API_CreateProfile.html#rolesanywhere-CreateProfile-request-acceptRoleSessionName) 欄位。這可讓您在引導程序過程中，於傳遞給 `nodeadm` 的組態中，為混合節點提供自訂節點名稱。需要在 `nodeadm init` 過程中傳遞自訂節點名稱。建立設定檔後，您可以更新您的設定檔，以接受自訂角色工作階段名稱。

您可以透過 IAM Roles Anywhere AWS 設定檔的 [durationSeconds](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/authentication-create-session#credentials-object) 欄位，使用 IAM Roles Anywhere AWS 設定憑證有效性持續時間。預設持續時間為 1 小時，最長為 12 小時。混合節點 IAM 角色上的`MaxSessionDuration`設定必須大於 IAM Roles Anywhere AWS 設定檔上的`durationSeconds`設定。如需有關 `MaxSessionDuration` 的詳細資訊，請參閱 [UpdateRole API 文件](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_UpdateRole.html)。

從憑證認證機構 (CA) 產生的每個機器憑證和金鑰，必須放置在每個混合節點的 `/etc/iam/pki` 目錄中，其中包含的檔案名稱 `server.pem` 指代憑證，`server.key` 指代金鑰。

## 建立混合節點 IAM 角色
<a name="hybrid-nodes-create-role"></a>

若要執行本節中的步驟，使用 AWS 主控台或 CLI 的 IAM AWS 主體必須具有下列許可。
+  `iam:CreatePolicy` 
+  `iam:CreateRole` 
+  `iam:AttachRolePolicy` 
+ 如果使用 AWS IAM Roles Anywhere
  +  `rolesanywhere:CreateTrustAnchor` 
  +  `rolesanywhere:CreateProfile` 
  +  `iam:PassRole` 

### AWS CloudFormation
<a name="hybrid-nodes-creds-cloudformation"></a>

如果您尚未安裝和設定 AWS CLI。請參閱[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

 ** AWS SSM 混合啟用的步驟** 

CloudFormation 堆疊會使用上述許可來建立混合節點 IAM 角色。CloudFormation 範本不會建立 AWS SSM 混合啟用。

1. 下載混合節點的 AWS SSM CloudFormation 範本：

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-ssm-cfn.yaml'
   ```

1. 使用下列選項建立 `cfn-ssm-parameters.json`：

   1. 使用混合節點 IAM 角色的名稱取代 `ROLE_NAME`。根據預設，如果您未指定名稱，CloudFormation 範本會使用 `AmazonEKSHybridNodesRole` 作為其建立的角色的名稱。

   1. `TAG_KEY` 將 取代為您在建立 AWS SSM 混合啟用時使用的 AWS SSM 資源標籤金鑰。標籤索引鍵和標籤值的組合用於 的條件`ssm:DeregisterManagedInstance`，只允許混合節點 IAM 角色取消註冊與您的 AWS SSM 混合啟用相關聯的 AWS SSM 受管執行個體。在 CloudFormation 範本中，`TAG_KEY` 預設為 `EKSClusterARN`。

   1. `TAG_VALUE` 將 取代為您建立 AWS SSM 混合啟用時使用的 AWS SSM 資源標籤值。標籤索引鍵和標籤值的組合用於 的條件`ssm:DeregisterManagedInstance`，只允許混合節點 IAM 角色取消註冊與您的 AWS SSM 混合啟用相關聯的 AWS SSM 受管執行個體。如果您使用 `EKSClusterARN` 的預設值 `TAG_KEY`，則請將您的 EKS 叢集 ARN 作為 `TAG_VALUE` 進行傳遞。EKS 叢集 ARN 的格式為 ` arn:aws: eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME`。

      ```
      {
        "Parameters": {
          "RoleName": "ROLE_NAME",
          "SSMDeregisterConditionTagKey": "TAG_KEY",
          "SSMDeregisterConditionTagValue": "TAG_VALUE"
        }
      }
      ```

1. 部署 CloudFormation 堆疊。使用 CloudFormation 堆疊的名稱取代 `STACK_NAME`。

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --template-file hybrid-ssm-cfn.yaml \
       --parameter-overrides file://cfn-ssm-parameters.json \
       --capabilities CAPABILITY_NAMED_IAM
   ```

 ** AWS IAM Roles Anywhere 的步驟** 

CloudFormation 堆疊會使用您設定的憑證授權機構 AWS (CA) 建立 IAM Roles Anywhere 信任錨點、建立 AWS IAM Roles Anywhere 設定檔，以及使用先前概述的許可建立混合節點 IAM 角色。

1. 設定憑證認證機構 (CA)

   1. 若要使用 AWS Private CA 資源，請開啟 [AWS Private Certificate Authority 主控台](https://console.aws.amazon.com/acm-pca/home)。請遵循《[AWS 私有 CA 使用者指南](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)》中的指示。

   1. 若要使用外部 CA，請遵循 CA 提供的指示。您將在後續步驟中提供憑證內文。

   1. 從公有 CA 核發的憑證不能用作信任錨。

1. 下載混合節點的 AWS IAM Roles Anywhere CloudFormation 範本

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-ira-cfn.yaml'
   ```

1. 使用下列選項建立 `cfn-iamra-parameters.json`：

   1. 使用混合節點 IAM 角色的名稱取代 `ROLE_NAME`。根據預設，如果您未指定名稱，CloudFormation 範本會使用 `AmazonEKSHybridNodesRole` 作為其建立的角色的名稱。

   1. 使用可唯一識別您主機的每個機器憑證屬性取代 `CERT_ATTRIBUTE`。在您將混合節點連接至叢集時，您使用的憑證屬性必須與您用於 `nodeadm` 組態的 nodeName 相符。如需更多資訊，請參閱[混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。根據預設，CloudFormation 範本會將 `${aws:PrincipalTag/x509Subject/CN}` 用作 `CERT_ATTRIBUTE`，而其會對應至每個機器憑證的 CN 欄位。或者，您可以將 `$(aws:PrincipalTag/x509SAN/Name/CN}` 作為 `CERT_ATTRIBUTE` 進行傳遞。

   1. 使用您 CA 的憑證內文取代 `CA_CERT_BODY`，且沒有分行符號。`CA_CERT_BODY` 必須是隱私權增強式郵件 (PEM) 格式。如果您的 CA 憑證採用 PEM 格式，則請先移除分行符號以及 BEGIN CERTIFICATE 和 END CERTIFICATE 行，然後再將 CA 憑證內文放入 `cfn-iamra-parameters.json` 檔案中。

      ```
      {
        "Parameters": {
          "RoleName": "ROLE_NAME",
          "CertAttributeTrustPolicy": "CERT_ATTRIBUTE",
          "CABundleCert": "CA_CERT_BODY"
        }
      }
      ```

1. 部署 CloudFormation 範本。使用 CloudFormation 堆疊的名稱取代 `STACK_NAME`。

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --template-file hybrid-ira-cfn.yaml \
       --parameter-overrides file://cfn-iamra-parameters.json
       --capabilities CAPABILITY_NAMED_IAM
   ```

### AWS CLI
<a name="hybrid-nodes-creds-awscli"></a>

如果您尚未安裝和設定 AWS CLI。請參閱[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

 **建立 EKS 描述叢集政策** 

1. 使用下列內容建立名為 `eks-describe-cluster-policy.json` 的檔案：

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "eks:DescribeCluster"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

1. 使用下列命令建立政策：

   ```
   aws iam create-policy \
       --policy-name EKSDescribeClusterPolicy \
       --policy-document file://eks-describe-cluster-policy.json
   ```

 ** AWS SSM 混合啟用的步驟** 

1. 使用下列內容建立名為 `eks-hybrid-ssm-policy.json` 的檔案。此政策會將授與兩個動作 (`ssm:DescribeInstanceInformation` 和 `ssm:DeregisterManagedInstance`) 的許可。此政策會根據您在信任政策中指定的資源標籤，將`ssm:DeregisterManagedInstance`許可限制為與您的 SSM 混合啟用相關聯的 AWS SSM AWS 受管執行個體。

   1. `AWS_REGION` 將 取代為 AWS SSM 混合啟用 AWS 的區域。

   1. 將 取代`AWS_ACCOUNT_ID`為 AWS 您的帳戶 ID。

   1. `TAG_KEY` 將 取代為您在建立 AWS SSM 混合啟用時使用的 AWS SSM 資源標籤金鑰。標籤索引鍵和標籤值的組合用於 的條件`ssm:DeregisterManagedInstance`，只允許混合節點 IAM 角色取消註冊與您的 AWS SSM 混合啟用相關聯的 AWS SSM 受管執行個體。在 CloudFormation 範本中，`TAG_KEY` 預設為 `EKSClusterARN`。

   1. `TAG_VALUE` 將 取代為您建立 AWS SSM 混合啟用時使用的 AWS SSM 資源標籤值。標籤索引鍵和標籤值的組合用於 的條件`ssm:DeregisterManagedInstance`，只允許混合節點 IAM 角色取消註冊與您的 AWS SSM 混合啟用相關聯的 AWS SSM 受管執行個體。如果您使用 `EKSClusterARN` 的預設值 `TAG_KEY`，則請將您的 EKS 叢集 ARN 作為 `TAG_VALUE` 進行傳遞。EKS 叢集 ARN 的格式為 ` arn:aws: eks:AWS_REGION:AWS_ACCOUNT_ID:cluster/CLUSTER_NAME`。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "ssm:DescribeInstanceInformation",
                  "Resource": "*"
              },
              {
                  "Effect": "Allow",
                  "Action": "ssm:DeregisterManagedInstance",
                  "Resource": "arn:aws:ssm:us-east-1:123456789012:managed-instance/*",
                  "Condition": {
                      "StringEquals": {
                          "ssm:resourceTag/TAG_KEY": "TAG_VALUE"
                      }
                  }
              }
          ]
      }
      ```

1. 使用下列命令建立政策

   ```
   aws iam create-policy \
       --policy-name EKSHybridSSMPolicy \
       --policy-document file://eks-hybrid-ssm-policy.json
   ```

1. 建立名為 `eks-hybrid-ssm-trust.json` 的檔案。`AWS_REGION` 將 取代為 AWS SSM 混合啟用 AWS 的區域，並將 `AWS_ACCOUNT_ID`取代為 AWS 您的帳戶 ID。

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Sid":"",
            "Effect":"Allow",
            "Principal":{
               "Service":"ssm.amazonaws.com"
            },
            "Action":"sts:AssumeRole",
            "Condition":{
               "StringEquals":{
                  "aws:SourceAccount":"123456789012"
               },
               "ArnEquals":{
                  "aws:SourceArn":"arn:aws:ssm:us-east-1:123456789012:*"
               }
            }
         }
      ]
   }
   ```

1. 使用下列命令建立角色。

   ```
   aws iam create-role \
       --role-name AmazonEKSHybridNodesRole \
       --assume-role-policy-document file://eks-hybrid-ssm-trust.json
   ```

1. 連接 `EKSHybridSSMPolicy` 和您在先前步驟中建立的 `EKSDescribeClusterPolicy`。將 取代`AWS_ACCOUNT_ID`為 AWS 您的帳戶 ID。

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws: iam::AWS_ACCOUNT_ID:policy/EKSDescribeClusterPolicy
   ```

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws: iam::AWS_ACCOUNT_ID:policy/EKSHybridSSMPolicy
   ```

1. 連接 `AmazonEC2ContainerRegistryPullOnly`和 `AmazonSSMManagedInstanceCore` AWS 受管政策。

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws: iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
   ```

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws: iam::aws:policy/AmazonSSMManagedInstanceCore
   ```

 **IAM Roles Anywhere AWS 的步驟** 

若要使用 AWS IAM Roles Anywhere，您必須在建立混合節點 AWS IAM 角色之前設定 IAM Roles Anywhere 信任錨點。如需說明，請參閱 [隨處設定 AWS IAM 角色](#hybrid-nodes-iam-roles-anywhere)。

1. 建立名為 `eks-hybrid-iamra-trust.json` 的檔案。使用您在 [隨處設定 AWS IAM 角色](#hybrid-nodes-iam-roles-anywhere) 步驟中建立的信任錨的 ARN 取代 `TRUST_ANCHOR ARN`。此信任政策中的 條件會限制 AWS IAM Roles Anywhere 擔任混合節點 IAM 角色的能力，只有在角色工作階段名稱符合安裝在混合節點上 x509 憑證中的 CN 時，才能交換臨時 IAM 憑證。或者，您也可以使用其他憑證屬性來唯一識別您的節點。您在信任政策中使用的憑證屬性必須對應至您在 `nodeadm` 組態中設定的 `nodeName`。如需更多資訊，請參閱[混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "rolesanywhere.amazonaws.com"
               },
               "Action": [
                   "sts:TagSession",
                   "sts:SetSourceIdentity"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                   },
                   "ArnEquals": {
                       "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "rolesanywhere.amazonaws.com"
               },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}",
                       "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                   },
                   "ArnEquals": {
                       "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                   }
               }
           }
       ]
   }
   ```

1. 使用下列命令建立角色。

   ```
   aws iam create-role \
       --role-name AmazonEKSHybridNodesRole \
       --assume-role-policy-document file://eks-hybrid-iamra-trust.json
   ```

1. 連接您在先前步驟中建立的 `EKSDescribeClusterPolicy`。將 取代`AWS_ACCOUNT_ID`為 AWS 您的帳戶 ID。

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws: iam::AWS_ACCOUNT_ID:policy/EKSDescribeClusterPolicy
   ```

1. 連接 `AmazonEC2ContainerRegistryPullOnly` AWS 受管政策

   ```
   aws iam attach-role-policy \
       --role-name AmazonEKSHybridNodesRole \
       --policy-arn arn:aws: iam::aws:policy/AmazonEC2ContainerRegistryPullOnly
   ```

### AWS 管理主控台
<a name="hybrid-nodes-creds-console"></a>

 **建立 EKS 描述叢集政策** 

1. 開啟 [Amazon IAM 主控台](https://console.aws.amazon.com/iam/home) 

1. 在左側導覽窗格中選擇 **Policies** (政策)。

1. 在**政策**頁面上，選擇**建立政策**。

1. 在指定許可頁面，在選取服務面板中，選擇 EKS。

   1. 篩選 **DescribeCluster** 的動作，然後選取 **DescribeCluster** Read 動作。

   1. 選擇**下一步**。

1. 在**檢閱和建立**頁面上

   1. 輸入政策的**政策名稱**，例如 `EKSDescribeClusterPolicy`。

   1. 選擇**建立政策**。

 ** AWS SSM 混合啟用的步驟** 

1. 開啟 [Amazon IAM 主控台](https://console.aws.amazon.com/iam/home) 

1. 在左側導覽窗格中選擇 **Policies** (政策)。

1. 在**政策**頁面上，選擇**建立政策**。

1. 在**指定許可**頁面上，在**政策編輯器**右上角導覽中，選擇 **JSON**。貼上下列程式碼片段。`AWS_REGION` 將 取代為 AWS SSM 混合啟用 AWS 的區域，並將 取代`AWS_ACCOUNT_ID`為 AWS 您的帳戶 ID。`TAG_VALUE` 使用您在建立 AWS SSM 混合啟用時使用的 AWS SSM 資源標籤金鑰取代 `TAG_KEY`和 。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "ssm:DescribeInstanceInformation",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": "ssm:DeregisterManagedInstance",
               "Resource": "arn:aws:ssm:us-east-1:123456789012:managed-instance/*",
               "Condition": {
                   "StringEquals": {
                       "ssm:resourceTag/TAG_KEY": "TAG_VALUE"
                   }
               }
           }
       ]
   }
   ```

   1. 選擇**下一步**。

1. 在**檢閱和建立**頁面上。

   1. 輸入政策的**政策**名稱，例如 `EKSHybridSSMPolicy` 

   1. 選擇**建立政策**。

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 在 **Roles** (角色) 頁面上，選擇 **Create role** (建立角色)。

1. 在 **Select trusted entity** (選取信任的實體) 頁面上，執行以下作業：

   1. 在**可信實體類型區段**中，選擇**自訂信任政策**。將下列政策貼到自訂信任政策編輯器。`AWS_REGION` 將 取代為 AWS SSM 混合啟用 AWS 的區域，並將 `AWS_ACCOUNT_ID`取代為 AWS 您的帳戶 ID。

      ```
      {
         "Version":"2012-10-17",		 	 	 
         "Statement":[
            {
               "Sid":"",
               "Effect":"Allow",
               "Principal":{
                  "Service":"ssm.amazonaws.com"
               },
               "Action":"sts:AssumeRole",
               "Condition":{
                  "StringEquals":{
                     "aws:SourceAccount":"123456789012"
                  },
                  "ArnEquals":{
                     "aws:SourceArn":"arn:aws:ssm:us-east-1:123456789012:*"
                  }
               }
            }
         ]
      }
      ```

   1. 選擇下一步。

1. 在**新增許可**頁面上，連接自訂政策或執行下列動作：

   1. 在**篩選政策**方塊中，輸入 `EKSDescribeClusterPolicy` 或您在上文建立的政策名稱。勾選搜尋結果中您的政策名稱左側的核取方塊。

   1. 在**篩選政策**方塊中，輸入 `EKSHybridSSMPolicy` 或您在上文建立的政策名稱。勾選搜尋結果中您的政策名稱左側的核取方塊。

   1. 在 **Filter policies** (篩選政策) 方塊中，輸入 `AmazonEC2ContainerRegistryPullOnly`。勾選搜尋結果中 `AmazonEC2ContainerRegistryPullOnly` 左側的核取方塊。

   1. 在 **Filter policies** (篩選政策) 方塊中，輸入 `AmazonSSMManagedInstanceCore`。勾選搜尋結果中 `AmazonSSMManagedInstanceCore` 左側的核取方塊。

   1. 選擇**下一步**。

1. 在 **Name, review, and create** (命名、檢閱和建立) 頁面上，執行以下作業：

   1. 針對 **Role name** (角色名稱)，為您的角色輸入唯一名稱 (例如 `AmazonEKSHybridNodesRole`)。

   1. 針對 **Description** (描述)，請以描述性文字 (例如 `Amazon EKS - Hybrid Nodes role`) 取代目前的文字。

   1. 選擇建**立角色**。

 **IAM Roles Anywhere AWS 的步驟** 

若要使用 AWS IAM Roles Anywhere，您必須在建立混合節點 AWS IAM 角色之前設定 IAM Roles Anywhere 信任錨點。如需說明，請參閱 [隨處設定 AWS IAM 角色](#hybrid-nodes-iam-roles-anywhere)。

1. 開啟 [Amazon IAM 主控台](https://console.aws.amazon.com/iam/home) 

1. 在左側導覽窗格中，選擇 **Roles** (角色)。

1. 在 **Roles** (角色) 頁面上，選擇 **Create role** (建立角色)。

1. 在 **Select trusted entity** (選取信任的實體) 頁面上，執行以下作業：

   1. 在**可信實體類型區段**中，選擇**自訂信任政策**。將下列政策貼到自訂信任政策編輯器。使用您在 [隨處設定 AWS IAM 角色](#hybrid-nodes-iam-roles-anywhere) 步驟中建立的信任錨的 ARN 取代 `TRUST_ANCHOR ARN`。此信任政策中的 條件會限制 AWS IAM Roles Anywhere 擔任混合節點 IAM 角色的能力，只有在角色工作階段名稱符合安裝在混合節點上 x509 憑證中的 CN 時，才能交換臨時 IAM 憑證。或者，您也可以使用其他憑證屬性來唯一識別您的節點。您在信任政策中使用的憑證屬性必須對應至您在 nodeadm 組態中設定的 nodeName。如需更多資訊，請參閱[混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "rolesanywhere.amazonaws.com"
                  },
                  "Action": [
                      "sts:TagSession",
                      "sts:SetSourceIdentity"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                      },
                      "ArnEquals": {
                          "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                      }
                  }
              },
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "rolesanywhere.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}",
                          "aws:PrincipalTag/x509Subject/CN": "${aws:PrincipalTag/x509Subject/CN}"
                      },
                      "ArnEquals": {
                          "aws:SourceArn": "arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/TA_ID"
                      }
                  }
              }
          ]
      }
      ```

   1. 選擇下一步。

1. 在**新增許可**頁面上，連接自訂政策或執行下列動作：

   1. 在**篩選政策**方塊中，輸入 `EKSDescribeClusterPolicy` 或您在上文建立的政策名稱。勾選搜尋結果中您的政策名稱左側的核取方塊。

   1. 在 **Filter policies** (篩選政策) 方塊中，輸入 `AmazonEC2ContainerRegistryPullOnly`。勾選搜尋結果中 `AmazonEC2ContainerRegistryPullOnly` 左側的核取方塊。

   1. 選擇**下一步**。

1. 在 **Name, review, and create** (命名、檢閱和建立) 頁面上，執行以下作業：

   1. 針對 **Role name** (角色名稱)，為您的角色輸入唯一名稱 (例如 `AmazonEKSHybridNodesRole`)。

   1. 針對 **Description** (描述)，請以描述性文字 (例如 `Amazon EKS - Hybrid Nodes role`) 取代目前的文字。

   1. 選擇建**立角色**。

# 建立具有混合節點的 Amazon EKS 叢集
<a name="hybrid-nodes-cluster-create"></a>

本主題提供可用選項的概觀，並介紹建立已啟用混合節點的 Amazon EKS 叢集時需要考量的事項。EKS 混合節點與包含雲端節點的 Amazon EKS 叢集具有相同的 [Kubernetes 版本支援](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)，包括標準支援和延長支援。

如果您未打算使用 EKS 混合節點，請參閱 [建立 Amazon EKS 叢集](create-cluster.md) 中的主要 Amazon EKS 建立叢集文件。

## 先決條件
<a name="hybrid-nodes-cluster-create-prep"></a>
+ [混合節點的先決條件設定](hybrid-nodes-prereqs.md) 已完成。建立已啟用混合節點的叢集之前，您必須識別出內部部署節點和選用的 Pod CIDR，根據 EKS 要求和混合節點要求建立 VPC 和子網路，以及建立具有適用於內部部署和選用 Pod CIDR 的傳入規則的安全群組。如需有關這些先決條件的詳細資訊，請參閱 [準備混合節點的聯網](hybrid-nodes-networking.md)。
+ 在您裝置上安裝和設定的最新版本 AWS 命令列界面 (AWS CLI)。若要檢查您目前的版本，請使用 `aws --version`。適用於 macOS 的 yum、apt-get 或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 AWS 命令列界面使用者指南》中的[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 和[設定 AWS CLI 的設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。
+ 具有建立 IAM 角色和連接政策以及建立和描述 EKS 叢集之許可的 IAM [主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)

## 考量事項
<a name="hybrid-nodes-cluster-create-consider"></a>
+ 您的叢集必須使用 `API` 或 `API_AND_CONFIG_MAP` 作為叢集身分驗證模式。
+ 您的叢集必須使用 IPv4 位址系列。
+ 您的叢集必須使用公有或私有叢集端點連線。您的叢集無法使用「公有和私有」叢集端點連線，因為 Amazon EKS Kubernetes API 伺服器端點會解析為在您的 VPC 外部執行的混合節點的公共 IP。
+ 具有混合節點的 EKS 叢集支援 OIDC 身分驗證。
+ 您可以新增、變更或移除現有叢集的混合節點組態。如需詳細資訊，請參閱[在現有的 Amazon EKS 叢集上啟用混合節點或修改組態](hybrid-nodes-cluster-update.md)。

## 步驟 1：建立叢集 IAM 角色
<a name="hybrid-nodes-cluster-create-iam"></a>

如果您已有叢集 IAM 角色，或者您要使用 `eksctl` or AWS CloudFormation 建立叢集，則可以略過此步驟。根據預設，`eksctl` AWS CloudFormation 範本會為您建立叢集 IAM 角色。

1. 執行下列命令以建立 IAM 信任政策 JSON 檔案。

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "eks.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

1. 建立 Amazon EKS 叢集 IAM 角色。如有必要，請在 eks-cluster-role-trust-policy.json 前面加上您在上一步中寫入檔案的電腦的路徑。命令會將您在上一步驟中建立的信任策略與角色相關聯。若要建立 IAM 角色，必須為建立角色的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)指派以下 `iam:CreateRole` 動作 (許可)。

   ```
   aws iam create-role \
       --role-name myAmazonEKSClusterRole \
       --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
   ```

1. 您可以指派 Amazon EKS 受管政策或建立自己的自訂政策。如需了解在自訂政策中必須使用的最低許可，請參閱 [Amazon EKS 節點 IAM 角色](create-node-role.md)。將名為 `AmazonEKSClusterPolicy` 的 Amazon EKS 受管 IAM 政策連接到角色。若要將 IAM 政策連接至 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)，必須為連接政策的 IAM 實體指派以下 IAM 動作之一 (許可)：`iam:AttachUserPolicy` 或 `iam:AttachRolePolicy`。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws: iam::aws:policy/AmazonEKSClusterPolicy \
       --role-name myAmazonEKSClusterRole
   ```

## 步驟 2：建立已啟用混合節點的叢集
<a name="hybrid-nodes-cluster-create-cluster"></a>

您可以透過以下方式建立叢集：
+  [eksctl](#hybrid-nodes-cluster-create-eksctl) 
+  [AWS CloudFormation](#hybrid-nodes-cluster-create-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-create-cli) 
+  [AWS 管理主控台](#hybrid-nodes-cluster-create-console) 

### 建立已啟用混合節點的叢集 - eksctl
<a name="hybrid-nodes-cluster-create-eksctl"></a>

您需要安裝最新版本的 `eksctl` 命令列工具。如需有關安裝或更新 `eksctl` 的指示，請參閱 `eksctl` 文件中的[安裝](https://eksctl.io/installation)一節。

1. 建立 `cluster-config.yaml` 以定義已啟用混合節點的 Amazon EKS IPv4 叢集。請在您的 `cluster-config.yaml` 中執行下列取代。如需設定的完整清單，請參閱 [eksctl 文件](https://eksctl.io/getting-started/)。

   1. 使用您的叢集名稱取代 `CLUSTER_NAME`。此名稱僅能使用英數字元 (區分大小寫) 和連字號。必須以英數字元開頭，且長度不可超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。

   1. `AWS_REGION` 將 取代為您要在其中建立叢集 AWS 的區域。

   1. 使用任何 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)取代 `K8S_VERSION`。

   1. 使用 `ssm` 或 `ira` 取代 `CREDS_PROVIDER`，具體取決於您在 [準備混合節點的憑證](hybrid-nodes-creds.md) 步驟中設定的憑證提供者。

   1. `CA_BUNDLE_CERT` 如果您的登入資料提供者設定為 `ira`，則取代 ，這會使用 AWS IAM Roles Anywhere 做為登入資料提供者。CA\$1BUNDLE\$1CERT 是憑證認證機構 (CA) 憑證內文，取決於您選擇的 CA。憑證必須是隱私權增強式郵件 (PEM) 格式。

   1. 使用要連接到 VPC 的虛擬私有閘道或傳輸閘道的 ID 取代 `GATEWAY_ID`。

   1. 使用混合節點的內部部署節點 CIDR 取代 `REMOTE_NODE_CIDRS`。

   1. 對於在混合節點上執行的工作負載，使用內部部署 Pod CIDR 取代為 `REMOTE_POD_CIDRS`；或者如果您未在混合節點上執行 Webhook，則請從組態中移除該行。如果在 Pod 流量離開您的內部部署主機時，您的 CNI 未使用網路位址轉譯 (NAT) 或偽裝 Pod IP 位址，您必須設定您的 `REMOTE_POD_CIDRS`。如果您在混合節點上執行 Webhook，您必須設定 `REMOTE_POD_CIDRS`，如需詳細資訊，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

   1. 您的內部部署節點和 Pod CIDR 區塊必須符合下列要求：

      1. 在其中一個 IPv4 RFC-1918 範圍內：`10.0.0.0/8`、 `172.16.0.0/12`或 `192.168.0.0/16` ，或在 RFC 6598 定義的 CGNAT 範圍內：`100.64.0.0/10`。

      1. 您叢集的 `VPC CIDR` 或您的 Kubernetes Service IPv4 CIDR 不會彼此重疊

         ```
         apiVersion: eksctl.io/v1alpha5
         kind: ClusterConfig
         
         metadata:
           name: CLUSTER_NAME
           region: AWS_REGION
           version: "K8S_VERSION"
         
         remoteNetworkConfig:
           iam:
             provider: CREDS_PROVIDER # default SSM, can also be set to IRA
             # caBundleCert: CA_BUNDLE_CERT
           vpcGatewayID: GATEWAY_ID
           remoteNodeNetworks:
           - cidrs: ["REMOTE_NODE_CIDRS"]
           remotePodNetworks:
           - cidrs: ["REMOTE_POD_CIDRS"]
         ```

1. 執行以下命令：

   ```
   eksctl create cluster -f cluster-config.yaml
   ```

   叢集佈建需要幾分鐘的時間。建立叢集時，會出現幾行輸出。輸出的最後一行類似於下面的範例行。

   ```
   [✓]  EKS cluster "CLUSTER_NAME" in "REGION" region is ready
   ```

1. 繼續進行 [步驟 3：更新 kubeconfig](#hybrid-nodes-cluster-create-kubeconfig)。

### 建立啟用混合節點的叢集 - AWS CloudFormation
<a name="hybrid-nodes-cluster-create-cfn"></a>

CloudFormation 堆疊會使用您指定的 `RemoteNodeNetwork` 和 `RemotePodNetwork` 來建立 EKS 叢集 IAM 角色和 EKS 叢集。修改 CloudFormation 範本 如果您需要自訂 CloudFormation 範本中未公開的 EKS 叢集的設定。

1. 下載 CloudFormation 範本。

   ```
   curl -OL 'https://raw.githubusercontent.com/aws/eks-hybrid/refs/heads/main/example/hybrid-eks-cfn.yaml'
   ```

1. 建立 `cfn-eks-parameters.json`，並為每個值指定您的組態。

   1.  `CLUSTER_NAME`：要建立的 EKS 叢集的名稱

   1.  `CLUSTER_ROLE_NAME`：要建立的 EKS 叢集 IAM 角色的名稱。範本中的預設值為 "EKSClusterRole"。

   1.  `SUBNET1_ID`：您在先決條件步驟中建立的第一個子網路的 ID

   1.  `SUBNET2_ID`：您在先決條件步驟中建立的第二個子網路的 ID

   1.  `SG_ID`：您在先決條件步驟中建立的安全群組 ID

   1.  `REMOTE_NODE_CIDRS`：混合節點的內部部署節點 CIDR

   1.  `REMOTE_POD_CIDRS`：在混合節點上執行的工作負載的內部部署 Pod CIDR。如果在 Pod 流量離開您的內部部署主機時，您的 CNI 未使用網路位址轉譯 (NAT) 或偽裝 Pod IP 位址，您必須設定您的 `REMOTE_POD_CIDRS`。如果您在混合節點上執行 Webhook，您必須設定 `REMOTE_POD_CIDRS`，如需詳細資訊，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

   1. 您的內部部署節點和 Pod CIDR 區塊必須符合下列要求：

      1. 在其中一個 IPv4 RFC-1918 範圍內：`10.0.0.0/8`、 `172.16.0.0/12`或 `192.168.0.0/16`，或在 RFC 6598 定義的 CGNAT 範圍內：`100.64.0.0/10`。

      1. 您叢集的 `VPC CIDR` 或您的 Kubernetes Service IPv4 CIDR 不會彼此重疊。

   1.  `CLUSTER_AUTH`：您的叢集的叢集身分驗證模式。有效值為 `API` 和 `API_AND_CONFIG_MAP`。範本中的預設值為 `API_AND_CONFIG_MAP`。

   1.  `CLUSTER_ENDPOINT`：您叢集的叢集端點連線。有效值為 "Public" 或 "Private"。範本中的預設值為私有，這表示您只能從 VPC 內連接至 Kubernetes API 端點。

   1.  `K8S_VERSION`：要用於您叢集的 Kubernetes 版本。請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。

      ```
      {
        "Parameters": {
          "ClusterName": "CLUSTER_NAME",
          "ClusterRoleName": "CLUSTER_ROLE_NAME",
          "SubnetId1": "SUBNET1_ID",
          "SubnetId2": "SUBNET2_ID",
          "SecurityGroupId" "SG_ID",
          "RemoteNodeCIDR": "REMOTE_NODE_CIDRS",
          "RemotePodCIDR": "REMOTE_POD_CIDRS",
          "ClusterAuthMode": "CLUSTER_AUTH",
          "ClusterEndpointConnectivity": "CLUSTER_ENDPOINT",
          "K8sVersion": "K8S_VERSION"
        }
       }
      ```

1. 部署 CloudFormation 堆疊。`STACK_NAME` 將 取代為 CloudFormation 堆疊的名稱，並將 `AWS_REGION`取代為建立叢集的 AWS 區域。

   ```
   aws cloudformation deploy \
       --stack-name STACK_NAME \
       --region AWS_REGION \
       --template-file hybrid-eks-cfn.yaml \
       --parameter-overrides file://cfn-eks-parameters.json \
       --capabilities CAPABILITY_NAMED_IAM
   ```

   叢集佈建需要幾分鐘的時間。您可以使用下列命令來檢查堆疊的狀態。`STACK_NAME` 將 取代為 CloudFormation 堆疊的名稱，並將 `AWS_REGION`取代為建立叢集的 AWS 區域。

   ```
   aws cloudformation describe-stacks \
       --stack-name STACK_NAME \
       --region AWS_REGION \
       --query 'Stacks[].StackStatus'
   ```

1. 繼續進行 [步驟 3：更新 kubeconfig](#hybrid-nodes-cluster-create-kubeconfig)。

### 建立啟用混合節點的叢集 - AWS CLI
<a name="hybrid-nodes-cluster-create-cli"></a>

1. 執行下列命令以建立已啟用混合節點的 EKS 叢集和節點。執行命令之前，請使用您的設定取代下列內容。如需設定的完整清單，請參閱 [建立 Amazon EKS 叢集](create-cluster.md) 文件。

   1.  `CLUSTER_NAME`：要建立的 EKS 叢集的名稱

   1.  `AWS_REGION`：建立叢集 AWS 的區域。

   1.  `K8S_VERSION`：要用於您叢集的 Kubernetes 版本。請參閱 Amazon EKS 支援的版本。

   1.  `ROLE_ARN`：您為叢集設定的 Amazon EKS 叢集角色。如需詳細資訊，請參閱 Amazon EKS 叢集 IAM 角色。

   1.  `SUBNET1_ID`：您在先決條件步驟中建立的第一個子網路的 ID

   1.  `SUBNET2_ID`：您在先決條件步驟中建立的第二個子網路的 ID

   1.  `SG_ID`：您在先決條件步驟中建立的安全群組 ID

   1. 您可以使用 `API` 和 `API_AND_CONFIG_MAP` 作為叢集存取身分驗證模式。在以下命令中，叢集存取身分驗證模式設定為 `API_AND_CONFIG_MAP`。

   1. 您可以使用 `endpointPublicAccess` 和 `endpointPrivateAccess` 參數來啟用或停用叢集的 Kubernetes API 伺服器端點的公有和私有存取。在以下命令中，`endpointPublicAccess` 設定為 false，而 `endpointPrivateAccess` 設定為 true。

   1.  `REMOTE_NODE_CIDRS`：混合節點的內部部署節點 CIDR。

   1.  `REMOTE_POD_CIDRS` (選用)：在混合節點上執行的工作負載的內部部署 Pod CIDR。

   1. 您的內部部署節點和 Pod CIDR 區塊必須符合下列要求：

      1. 在其中一個 IPv4 RFC-1918 範圍內：`10.0.0.0/8`、 `172.16.0.0/12`或 `192.168.0.0/16`，或在 RFC 6598 定義的 CGNAT 範圍內：`100.64.0.0/10`。

      1. Amazon EKS 叢集的 `VPC CIDR` 或您的 Kubernetes Service IPv4 CIDR 不會彼此重疊。

         ```
         aws eks create-cluster \
             --name CLUSTER_NAME \
             --region AWS_REGION \
             --kubernetes-version K8S_VERSION \
             --role-arn ROLE_ARN \
             --resources-vpc-config subnetIds=SUBNET1_ID,SUBNET2_ID,securityGroupIds=SG_ID,endpointPrivateAccess=true,endpointPublicAccess=false \
             --access-config authenticationMode=API_AND_CONFIG_MAP \
             --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["REMOTE_POD_CIDRS"]}]}'
         ```

1. 佈建叢集需要幾分鐘才能完成。您可以使用下列命令來查詢叢集的狀態。`CLUSTER_NAME` 將 取代為您建立的叢集名稱，並將 `AWS_REGION`取代為您建立叢集的 AWS 區域。在傳回的輸出為 `ACTIVE` 之前，請勿進行下一個步驟。

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

1. 繼續進行 [步驟 3：更新 kubeconfig](#hybrid-nodes-cluster-create-kubeconfig)。

### 建立啟用混合節點的叢集 - AWS 管理主控台
<a name="hybrid-nodes-cluster-create-console"></a>

1. 在 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)開啟 Amazon EKS 主控台。

1. 選取 Add cluster (新增叢集)，然後選取 Create (建立)。

1. 在 Configure cluster (設定叢集) 頁面上，輸入下列欄位：

   1.  **Name** (名稱)：叢集的名稱。名稱僅包含英數字元 (區分大小寫)、連字號和底線。必須以英數字元開頭，且長度不可超過 100 個字元。名稱在您要建立叢集 AWS 的區域和 AWS 帳戶中必須是唯一的。

   1.  **叢集 IAM 角色** – 選擇您建立的 Amazon EKS 叢集 IAM 角色，以允許 Kubernetes 控制平面代表您管理 AWS 資源。

   1.  **Kubernetes version** (Kubernetes 版本) – 您的叢集使用的 Kubernetes 版本。我們建議選取最新版本，除非您需要較早版本。

   1.  **升級政策**：選擇延長或標準。

      1.  **延長：**此選項會在 Kubernetes 版本發布日期後持續為其提供 26 個月的支援。延長支援期間產生額外的每小時成本，該成本會從標準支援期間結束後開始計費。延長支援結束時，您的叢集將會自動升級至下一個版本。

      1.  **延伸：**此選項會在 Kubernetes 版本發布日期後持續為其提供 14 個月的支援。無需額外付費。標準支援結束時，您的叢集將會自動升級至下一個版本。

   1.  **叢集存取** - 選擇允許或不允許叢集管理員存取，然後選取身分驗證模式。已啟用混合節點的叢集支援下列身分驗證模式。

      1.  **EKS API**：叢集將僅從 EKS 存取項目 API 取得已經過身分驗證的 IAM 主體。

      1.  **EKS API 和 ConfigMap**：叢集將從 EKS 存取項目 API 和 `aws-auth` ConfigMap 取得已經過身分驗證的 IAM 主體。

   1.  **Secrets encryption** (秘密加密)：(選用) 選擇使用 KMS 金鑰啟用 Kubernetes 秘密的秘密加密。您也可以在建立叢集後啟用此功能。啟用此功能之前，請確定您已熟悉 [在現有叢集上使用 KMS 加密 Kubernetes 秘密](enable-kms.md) 中的資訊。

   1.  **ARC 區域轉移**：如果啟用，EKS 將向 ARC 區域轉移註冊您的叢集，以讓您能夠使用區域轉移將應用程式流量從可用區域轉移。

   1.  **Tags** (標籤) – (選用) 將任何標籤新增到您的叢集。如需詳細資訊，請參閱[使用標籤組織 Amazon EKS 資源](eks-using-tags.md)。

   1. 完成此頁面後，請選擇**下一步**。

1. 在 **Specify networking (指定網路)** 頁面上，選取下列欄位的值：

   1.  **VPC**：選擇符合 [檢視 VPC 和子網路的 Amazon EKS 聯網需求](network-reqs.md) 和 [Amazon EKS 混合節點要求](hybrid-nodes-prereqs.md) 的現有 VPC。選擇 VPC 之前，建議您先熟悉檢視 VPC、子網路和混合節點的 Amazon EKS 聯網需求中的所有要求和考量事項。建立叢集後，您無法變更要使用的 VPC。如果沒有列出 VPC，則您需要先建立一個。如需詳細資訊，請參閱 [為您的 Amazon EKS 叢集建立 Amazon VPC](creating-a-vpc.md) 和 [Amazon EKS 混合節點聯網需求](hybrid-nodes-prereqs.md)。

   1.  **Subnets** (子網路)：根據預設，前一個欄位指定的 VPC 中的所有可用子網路會預先選取。您必須選取至少兩個。

   1.  **安全群組**:(選用) 指定一或多個您希望 Amazon EKS 與其建立的網路介面相關聯的安全群組。您指定的安全群組中至少有一個必須具有適用於內部部署節點和 (選用) Pod CIDR 的傳入規則。如需詳細資訊，請參閱 [Amazon EKS 混合節點聯網需求](hybrid-nodes-networking.md)。無論您是否選擇任何安全群組，Amazon EKS 都會建立一個安全群組，以支援您的叢集和 VPC 之間的通訊。Amazon EKS 將此安全群組及您選擇的任何群組與其建立的網路介面相關聯。如需有關 Amazon EKS 建立的叢集安全群組的詳細資訊，請參閱 [檢視叢集的 Amazon EKS 安全群組要求](sec-group-reqs.md) 您可以修改 Amazon EKS 建立的叢集安全群組中的規則。

   1.  **選擇叢集 IP 位址系列**：您必須為已啟用混合節點的叢集選擇 IPv4。

   1. (選用) 選擇**設定 Kubernetes 服務 IP 位址範圍**，並指定**服務 IPv4 範圍**。

   1.  **選擇設定遠端網路以啟用混合節點**，然後為混合節點指定您的內部部署節點和 Pod CIDR。

   1. 如果在 Pod 流量離開您的內部部署主機時，您的 CNI 未使用網路位址轉譯 (NAT) 或偽裝 Pod IP 位址，您必須設定您的遠端 Pod CIDR。如果您在混合節點上執行 Webhook，則必須設定遠端 Pod CIDR。

   1. 您的內部部署節點和 Pod CIDR 區塊必須符合下列要求：

      1. 在其中一個 IPv4 RFC-1918 範圍內：`10.0.0.0/8`、 `172.16.0.0/12`或 `192.168.0.0/16`，或在 RFC 6598 定義的 CGNAT 範圍內：`100.64.0.0/10`。

      1. 您叢集的 `VPC CIDR` 或您的 Kubernetes Service IPv4 CIDR 不會彼此重疊

   1. 針對 **Cluster endpoint access** (叢集端點存取)，選取一個選項。建立叢集後，您可以變更此選項。對於已啟用混合節點的叢集，您必須選擇公有或私有。在選取非預設選項之前，請務必熟悉這些選項及其含義。如需詳細資訊，請參閱[叢集 API 伺服器端點](cluster-endpoint.md)。

   1. 完成此頁面後，請選擇**下一步**。

1. (選用) 在**設定**可觀測性頁面上，選擇要開啟的指標和控制平面記錄選項。根據預設，系統會關閉每個日誌類型。

   1. 如需有關 Prometheus 指標選項的詳細資訊，請參閱 [藉助 Prometheus 監控叢集指標](prometheus.md)。

   1. 如需 EKS 控制記錄選項的詳細資訊，請參閱 [將控制平面日誌傳送至 CloudWatch Logs](control-plane-logs.md)。

   1. 完成此頁面後，請選擇**下一步**。

1. 在 **Select add-ons** (選取附加元件) 頁面上，選擇您要新增至叢集的附加元件。

   1. 您可以視需要選擇任意數量的 **Amazon EKS 附加元件**和 ** AWS Marketplace 附加元件**。與混合節點不相容的 Amazon EKS 附加元件會標記為「與混合節點不相容」，並且附加元件具有反親和性規則，可防止其在混合節點上執行。如需詳細資訊，請參閱設定混合節點的附加元件。如果您想要安裝的 ** AWS Marketplace** 附加元件未列出，您可以在搜尋方塊中輸入文字來搜尋可用的 ** AWS Marketplace 附加元件**。您也可以依 **category** (類別)、**vendor** (廠商) 或 **pricing model** (定價模式) 進行搜尋，然後從搜尋結果中選擇附加元件。

   1. 一些附加元件，例如 CoreDNS 和 kube-proxy，是預設安裝的。如果停用任何預設附加元件，可能會影響您執行 Kubernetes 應用程式的能力。

   1. 完成此頁面後，請選擇 `Next`。

1. 在**設定選取的附加元件設定**頁面上，選取您要安裝的版本。

   1. 建立叢集後，您隨時皆可更新至更新版本。您可以在建立叢集後更新每個附加元件的組態。如需有關設定附加元件的詳細資訊，請參閱[更新 Amazon EKS 附加元件](updating-an-add-on.md)。如需與混合節點相容的附加元件版本，請參閱 [設定混合節點的附加元件](hybrid-nodes-add-ons.md)。

   1. 完成此頁面後，請選擇下一步。

1. 在 **Review and create (檢閱並建立)** 頁面上，檢閱您在先前頁面上輸入或選取的資訊。如需變更，請選擇 **Edit** (編輯)。當您感到滿意時，請選擇**建立**。在佈建叢集時，**Status** (狀態) 欄位顯示 **CREATING** (正在建立)。叢集佈建需要幾分鐘的時間。

1. 繼續進行 [步驟 3：更新 kubeconfig](#hybrid-nodes-cluster-create-kubeconfig)。

## 步驟 3：更新 kubeconfig
<a name="hybrid-nodes-cluster-create-kubeconfig"></a>

如果您使用 `eksctl` 建立叢集，則可以略過此步驟。這是因為 `eksctl` 已為您完成此步驟。透過向 `kubectl` 組態檔案新增內容，使 `kubectl` 能夠與您的叢集通訊。如需建立和更新檔案的詳細資訊，請參閱 [透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

```
aws eks update-kubeconfig --name CLUSTER_NAME --region AWS_REGION
```

範例輸出如下。

```
Added new context arn:aws: eks:AWS_REGION:111122223333:cluster/CLUSTER_NAME to /home/username/.kube/config
```

透過執行以下命令確認與叢集的通訊。

```
kubectl get svc
```

範例輸出如下。

```
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   28h
```

## 步驟 4：叢集設定
<a name="_step_4_cluster_setup"></a>

下一步，請參閱 [準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)，以啟用對混合節點的存取，進而加入叢集。

# 在現有的 Amazon EKS 叢集上啟用混合節點或修改組態
<a name="hybrid-nodes-cluster-update"></a>

本主題提供可用選項的概觀，並介紹您建立新增、變更或移除 Amazon EKS 叢集的混合節點組態時需要考量的問題。

若要讓 Amazon EKS 叢集使用混合節點，請在 `RemoteNetworkConfig` 組態中新增內部部署節點的 IP 位址 CIDR 範圍和選用的 Pod 網路。EKS 使用此 CIDR 清單來啟用叢集與內部部署網路之間的連線。如需更新叢集組態時選項的完整清單，請參閱《*Amazon EKS API 參考*》中的 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)。

您可以對叢集中的 EKS 混合節點聯網組態執行下列任何動作：
+  [新增遠端網路組態，以在現有叢集中啟用 EKS 混合節點。](#hybrid-nodes-cluster-enable-existing)
+  [在現有叢集中新增、變更或移除遠端節點網路或遠端 Pod 網路。](#hybrid-nodes-cluster-update-config)
+  [移除所有遠端節點網路 CIDR 範圍，以在現有叢集中停用 EKS 混合節點。](#hybrid-nodes-cluster-disable)

## 先決條件
<a name="hybrid-nodes-cluster-enable-prep"></a>
+ 為混合節點啟用 Amazon EKS 叢集之前，請確保您的環境符合 [混合節點的先決條件設定](hybrid-nodes-prereqs.md) 中概述的要求以及 [準備混合節點的聯網](hybrid-nodes-networking.md)、 [準備混合節點的作業系統](hybrid-nodes-os.md) 和 [準備混合節點的憑證](hybrid-nodes-creds.md) 中詳細說明的要求。
+ 您的叢集必須使用 IPv4 位址系列。
+ 您的叢集必須使用 `API` 或 `API_AND_CONFIG_MAP` 作為叢集身分驗證模式。修改叢集身分驗證模式的程序在 [變更驗證模式以使用存取項目](setting-up-access-entries.md) 中說明。
+ 建議您對 Amazon EKS Kubernetes API 伺服器端點使用公有或私有端點存取，但不能同時使用兩者。如果您選擇「公有和私有」，Amazon EKS Kubernetes API 伺服器端點一律會解析為在 VPC 外部執行的混合節點的公有 IP，以防止您的混合節點加入叢集。修改叢集網路存取的程序在 [叢集 API 伺服器端點](cluster-endpoint.md) 中說明。
+ 在您裝置上安裝和設定的最新版本 AWS 命令列界面 (AWS CLI)。若要檢查您目前的版本，請使用 `aws --version`。適用於 macOS 的 yum、apt-get 或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 AWS 命令列界面使用者指南》中的[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 和[設定 AWS CLI 的設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。
+ 具有在您的 Amazon EKS 叢集上呼叫 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html) 的許可的 [IAM 主體](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles#iam-term-principal)。
+ 將附加元件更新為與混合節點相容的版本。如需與混合節點相容的附加元件版本，請參閱 [設定混合節點的附加元件](hybrid-nodes-add-ons.md)。
+ 如果您執行的附加元件與混合節點不相容，請確保附加元件 [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/) 或[部署](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)具有下列親和性規則，以防止部署到混合節點。如果尚未存在，請新增下列親和性規則。

  ```
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
  ```

## 考量事項
<a name="hybrid-nodes-cluster-enable-consider"></a>

`remoteNetworkConfig` JSON 物件在更新期間具有下列行為：
+ 您未指定的任何現有組態部分均未變更。如果您未指定 `remoteNodeNetworks` 或 `remotePodNetworks`，則該部分將保持不變。
+ 如果您要修改 CIDR 的 `remoteNodeNetworks` 或 `remotePodNetworks` 清單，則必須在最終組態中指定您想要的完整 CIDR 清單。當您指定對 `remoteNodeNetworks` 或 `remotePodNetworks` CIDR 清單的變更時，EKS 會在更新期間取代原始清單。
+ 您的內部部署節點和 Pod CIDR 區塊必須符合下列要求：

  1. 在其中一個 IPv4 RFC-1918 範圍內：10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16，或在 RFC 6598 定義的 CGNAT 範圍內： `100.64.0.0/10`

  1. Amazon EKS 叢集的 VPC 的所有 CIDR 或您的 Kubernetes Service IPv4 CIDR 不會彼此重疊。

## 在現有叢集上啟用混合節點
<a name="hybrid-nodes-cluster-enable-existing"></a>

您可以使用下列方式，在現有叢集中啟用 EKS 混合節點：
+  [AWS CloudFormation](#hybrid-nodes-cluster-enable-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-enable-cli) 
+  [AWS 管理主控台](#hybrid-nodes-cluster-enable-console) 

### 在現有叢集中啟用 EKS 混合節點 - AWS CloudFormation
<a name="hybrid-nodes-cluster-enable-cfn"></a>

1. 若要在叢集中啟用 EKS 混合節點，請將 `RemoteNodeNetwork` 和 (選用) `RemotePodNetwork` 新增至 CloudFormation 範本並更新堆疊。請注意，`RemoteNodeNetwork` 是最多包含一個 `Cidrs` 項目的清單，而 `Cidrs` 是多個 IP CIDR 範圍的清單。

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks:
       - Cidrs: [RemoteNodeCIDR]
     RemotePodNetworks:
       - Cidrs: [RemotePodCIDR]
   ```

1. 繼續進行[準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)。

### 在現有叢集中啟用 EKS 混合節點 - AWS CLI
<a name="hybrid-nodes-cluster-enable-cli"></a>

1. 執行下列命令以為您的 EKS 叢集啟用 EKS 混合節點的 `RemoteNetworkConfig`。執行命令之前，請使用您的設定取代下列內容。如需設定的完整清單，請參閱《*Amazon EKS API 參考*》中的 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)。

   1.  `CLUSTER_NAME`：要更新的 EKS 叢集的名稱。

   1.  `AWS_REGION`：EKS 叢集執行所在的 AWS 區域。

   1.  `REMOTE_NODE_CIDRS`：混合節點的內部部署節點 CIDR。

   1.  `REMOTE_POD_CIDRS` (選用)：在混合節點上執行的工作負載的內部部署 Pod CIDR。

      ```
      aws eks update-cluster-config \
          --name CLUSTER_NAME \
          --region AWS_REGION \
          --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["REMOTE_POD_CIDRS"]}]}'
      ```

1. 更新叢集需要幾分鐘才能完成。您可以使用下列命令來查詢叢集的狀態。`CLUSTER_NAME` 將 取代為您修改的叢集名稱，並將 `AWS_REGION`取代為您執行叢集的 AWS 區域。在傳回的輸出為 `ACTIVE` 之前，請勿進行下一個步驟。

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

1. 繼續進行[準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)。

### 在現有叢集中啟用 EKS 混合節點 - AWS 管理主控台
<a name="hybrid-nodes-cluster-enable-console"></a>

1. 在 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)開啟 Amazon EKS 主控台。

1. 選擇叢集名稱以顯示您叢集的資訊。

1. 選擇**聯網**索引標籤，然後選擇**管理**。

1. 在下拉式清單中，選擇**遠端網路**。

1.  **選擇設定遠端網路以啟用混合節點**，然後為混合節點指定您的內部部署節點和 Pod CIDR。

1. 選擇 **Save changes** (儲存變更) 以完成操作。等待叢集狀態變回**作用中**。

1. 繼續進行[準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)。

## 在現有叢集中更新混合節點組態
<a name="hybrid-nodes-cluster-update-config"></a>

您可以使用下列任何一種方式，在現有混合叢集中修改 `remoteNetworkConfig`：
+  [AWS CloudFormation](#hybrid-nodes-cluster-update-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-update-cli) 
+  [AWS 管理主控台](#hybrid-nodes-cluster-update-console) 

### 更新現有叢集 - AWS CloudFormation 中的混合組態
<a name="hybrid-nodes-cluster-update-cfn"></a>

1. 使用新的網路 CIDR 值更新您的 CloudFormation 範本。

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks:
       - Cidrs: [NEW_REMOTE_NODE_CIDRS]
     RemotePodNetworks:
       - Cidrs: [NEW_REMOTE_POD_CIDRS]
   ```
**注意**  
更新 `RemoteNodeNetworks` 或 `RemotePodNetworks` CIDR 清單時，請包含所有 CIDR (新的和現有的)。EKS 會在更新期間取代整個清單。從更新請求省略這些欄位將會保留其現有組態。

1. 使用修改過的範本更新 CloudFormation 堆疊，並等待堆疊更新完成。

### 更新現有叢集 - AWS CLI 中的混合組態
<a name="hybrid-nodes-cluster-update-cli"></a>

1. 若要修改遠端網路 CIDR，請執行下列命令。使用您的設定取代這些值：

   ```
   aws eks update-cluster-config
   --name CLUSTER_NAME
   --region AWS_REGION
   --remote-network-config '{"remoteNodeNetworks":[{"cidrs":["NEW_REMOTE_NODE_CIDRS"]}],"remotePodNetworks":[{"cidrs":["NEW_REMOTE_POD_CIDRS"]}]}'
   ```
**注意**  
更新 `remoteNodeNetworks` 或 `remotePodNetworks` CIDR 清單時，請包含所有 CIDR (新的和現有的)。EKS 會在更新期間取代整個清單。從更新請求省略這些欄位將會保留其現有組態。

1. 等待叢集狀態變回「作用中」，然後再繼續。

### 更新現有叢集中的混合組態 - AWS 管理主控台
<a name="hybrid-nodes-cluster-update-console"></a>

1. 在 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)開啟 Amazon EKS 主控台。

1. 選擇叢集名稱以顯示您叢集的資訊。

1. 選擇**聯網**索引標籤，然後選擇**管理**。

1. 在下拉式清單中，選擇**遠端網路**。

1. 視需要更新 `Remote node networks` 和 `Remote pod networks - Optional` 下的 CIDR。

1. 選擇**儲存變更**，然後等待叢集狀態返回**作用中**。

## 在現有叢集中停用混合節點
<a name="hybrid-nodes-cluster-disable"></a>

您可以使用下列方式，在現有叢集中停用 EKS 混合節點：
+  [AWS CloudFormation](#hybrid-nodes-cluster-disable-cfn) 
+  [AWS CLI](#hybrid-nodes-cluster-disable-cli) 
+  [AWS 管理主控台](#hybrid-nodes-cluster-disable-console) 

### 在現有叢集中停用 EKS 混合節點 - AWS CloudFormation
<a name="hybrid-nodes-cluster-disable-cfn"></a>

1. 若要停用叢集中的 EKS 混合節點，請在 CloudFormation 範本中將 `RemoteNodeNetworks` 和 `RemotePodNetworks` 設定為空陣列，並更新堆疊。

   ```
   RemoteNetworkConfig:
     RemoteNodeNetworks: []
     RemotePodNetworks: []
   ```

### 在現有叢集中停用 EKS 混合節點 - AWS CLI
<a name="hybrid-nodes-cluster-disable-cli"></a>

1. 執行下列命令以從 EKS 叢集中移除 `RemoteNetworkConfig`。執行命令之前，請使用您的設定取代下列內容。如需設定的完整清單，請參閱《*Amazon EKS API 參考*》中的 [UpdateClusterConfig](https://docs.aws.amazon.com/eks/latest/APIReference/API_UpdateClusterConfig.html)。

   1.  `CLUSTER_NAME`：要更新的 EKS 叢集的名稱。

   1.  `AWS_REGION`：EKS 叢集執行所在的 AWS 區域。

      ```
      aws eks update-cluster-config \
          --name CLUSTER_NAME \
          --region AWS_REGION \
          --remote-network-config '{"remoteNodeNetworks":[],"remotePodNetworks":[]}'
      ```

1. 更新叢集需要幾分鐘才能完成。您可以使用下列命令來查詢叢集的狀態。`CLUSTER_NAME` 將 取代為您修改的叢集名稱，並將 `AWS_REGION`取代為您執行叢集的 AWS 區域。在傳回的輸出為 `ACTIVE` 之前，請勿進行下一個步驟。

   ```
   aws eks describe-cluster \
       --name CLUSTER_NAME \
       --region AWS_REGION \
       --query "cluster.status"
   ```

### 在現有叢集中停用 EKS 混合節點 - AWS 管理主控台
<a name="hybrid-nodes-cluster-disable-console"></a>

1. 在 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)開啟 Amazon EKS 主控台。

1. 選擇叢集名稱以顯示您叢集的資訊。

1. 選擇**聯網**索引標籤，然後選擇**管理**。

1. 在下拉式清單中，選擇**遠端網路**。

1. 選擇**設定遠端網路以啟用混合節點**，然後移除 `Remote node networks` 和 `Remote pod networks - Optional` 下的所有 CIDR。

1. 選擇 **Save changes** (儲存變更) 以完成操作。等待叢集狀態變回**作用中**。

# 準備混合節點的叢集存取
<a name="hybrid-nodes-cluster-prep"></a>

將混合節點連線至 Amazon EKS 叢集之前，您必須啟用具有 Kubernetes 許可的混合節點 IAM 角色，才能加入叢集。如需如何建立混合節點 IAM 角色的資訊，請參閱 [準備混合節點的憑證](hybrid-nodes-creds.md)。Amazon EKS 支援兩種方式將 IAM 主體與 Kubernetes 角色型存取控制 (RBAC)、Amazon EKS 存取項目和 `aws-auth` ConfigMap 建立關聯。如需有關 Amazon EKS 存取管理的詳細資訊，請參閱 [授予 IAM 使用者和角色對 Kubernetes APIs存取權](grant-k8s-access.md)。

使用以下程序，以將您的混合節點 IAM 角色與 Kubernetes 許可建立關聯。若要使用 Amazon EKS 存取項目，您的叢集必須已使用 `API` 或 `API_AND_CONFIG_MAP` 身分驗證模式建立。若要使用 `aws-auth` ConfigMap，您的叢集必須已使用 `API_AND_CONFIG_MAP` 身分驗證模式建立。已啟用混合節點的 Amazon EKS 叢集不支援僅限 `CONFIG_MAP` 的身分驗證模式。

## 使用混合節點的 Amazon EKS 存取項目 IAM 角色
<a name="_using_amazon_eks_access_entries_for_hybrid_nodes_iam_role"></a>

名為 HYBRID\$1LINUX 的混合節點 Amazon EKS 存取項目類型，可與 IAM 角色搭配使用。使用此存取項目類型時，使用者名稱會自動設定為 system:node:\$1\$1SessionName\$1\$1。如需建立存取項目的詳細資訊，請參閱 [建立存取項目](creating-access-entries.md)。

### AWS CLI
<a name="shared_aws_cli"></a>

1. 您必須在裝置上安裝並設定最新版本的 AWS CLI。若要檢查您目前的版本，請使用 `aws --version`。適用於 macOS 的 yum、apt-get 或 Homebrew 等套件管理員通常是最新版本 CLI AWS 後面的幾個版本。若要安裝最新版本，請參閱《 AWS 命令列界面使用者指南》中的使用 aws 設定安裝 和快速組態。

1. 使用下列命令建立您的存取項目。將 CLUSTER\$1NAME 取代為您的叢集名稱，並將 HYBRID\$1NODES\$1ROLE\$1ARN 取代為您在 [準備混合節點的憑證](hybrid-nodes-creds.md) 的步驟中建立的角色的 ARN。

   ```
   aws eks create-access-entry --cluster-name CLUSTER_NAME \
       --principal-arn HYBRID_NODES_ROLE_ARN \
       --type HYBRID_LINUX
   ```

### AWS 管理主控台
<a name="hybrid-nodes-cluster-prep-console"></a>

1. 在 [Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)開啟 Amazon EKS 主控台。

1. 選擇已啟用混合節點的叢集的名稱。

1. 選擇**存取**索引標籤。

1. 選擇**建立存取項目**。

1. 針對 **IAM 主體**，選取您在 [準備混合節點的憑證](hybrid-nodes-creds.md) 的步驟中建立的混合節點 IAM 角色。

1. 針對**類型**，選取**混合 Linux**。

1. (選用) 您可以使用**標籤**為存取項目指派標籤。例如，為了更輕鬆地找到具有相同標籤的所有資源而指定標籤。

1. 選擇**跳至檢閱和建立**。您無法將政策新增至混合 Linux 存取項目或變更其存取範圍。

1. 檢查存取項目的組態。如果有任何內容看起來不正確，請選擇**上一步**以返回上一步並修正錯誤。如果組態正確，請選擇**建立**。

## 針對混合節點 IAM 角色,使用 aws-auth ConfigMap
<a name="_using_aws_auth_configmap_for_hybrid_nodes_iam_role"></a>

在下列步驟中，您將使用您在 `aws-auth` 的步驟中建立的混合節點 IAM 角色的 ARN 來建立或更新 [準備混合節點的憑證](hybrid-nodes-creds.md) ConfigMap。

1. 檢查您的叢集是否已有現有的 `aws-auth` ConfigMap。請注意，如果您使用特定 `kubeconfig` 檔案，則請使用 `--kubeconfig` 旗標。

   ```
   kubectl describe configmap -n kube-system aws-auth
   ```

1. 如果看到 `aws-auth` ConfigMap，則請視需要進行更新。

   1. 開啟 ConfigMap 進行編輯。

      ```
      kubectl edit -n kube-system configmap/aws-auth
      ```

   1. 視需要新增 `mapRoles` 個項目。使用混合節點 IAM 角色的 ARN 取代 `HYBRID_NODES_ROLE_ARN`。請注意，`{{SessionName}}` 是在 ConfigMap 中儲存的正確範本格式。請勿將其取代為其他值。

      ```
      data:
        mapRoles: |
        - groups:
          - system:bootstrappers
          - system:nodes
          rolearn: HYBRID_NODES_ROLE_ARN
          username: system:node:{{SessionName}}
      ```

   1. 儲存檔案並結束您的文字編輯器。

1. 如果您的叢集沒有現有的 `aws-auth` ConfigMap，則請使用下列命令予以建立。使用混合節點 IAM 角色的 ARN 取代 `HYBRID_NODES_ROLE_ARN`。請注意，`{{SessionName}}` 是在 ConfigMap 中儲存的正確範本格式。請勿將其取代為其他值。

   ```
   kubectl apply -f=/dev/stdin <<-EOF
   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: aws-auth
     namespace: kube-system
   data:
     mapRoles: |
     - groups:
       - system:bootstrappers
       - system:nodes
       rolearn: HYBRID_NODES_ROLE_ARN
       username: system:node:{{SessionName}}
   EOF
   ```

# 在混合節點上執行內部部署工作負載
<a name="hybrid-nodes-tutorial"></a>

在已啟用混合節點的 EKS 叢集中，您可以使用您在 AWS 雲端中使用的相同 Amazon EKS 叢集、功能和工具，在自己的基礎結構上執行內部部署和邊緣應用程式。

下列各節包含使用混合節點的逐步說明。

**Topics**
+ [連接混合節點](hybrid-nodes-join.md)
+ [使用 Bottlerocket 連接混合節點](hybrid-nodes-bottlerocket.md)
+ [升級混合節點](hybrid-nodes-upgrade.md)
+ [修補程式混合節點](hybrid-nodes-security.md)
+ [刪除混合節點](hybrid-nodes-remove.md)

# 連接混合節點
<a name="hybrid-nodes-join"></a>

**注意**  
下列步驟適用於執行 Bottlerocket 以外的相容作業系統的混合節點。如需連線執行 Bottlerocket 的混合節點的步驟，請參閱 [使用 Bottlerocket 連接混合節點](hybrid-nodes-bottlerocket.md)。

本主題會說明如何將混合節點連接至 Amazon EKS 叢集。混合節點加入叢集後，其即會在 Amazon EKS 主控台和 Kubernetes 相容工具 (例如 kubectl) 中顯示為「未就緒」狀態。完成此頁面上的步驟後，請繼續 [設定混合節點的 CNI](hybrid-nodes-cni.md)，以讓您的混合節點準備好執行應用程式。

## 先決條件
<a name="_prerequisites"></a>

將混合節點連接至 Amazon EKS 叢集之前，請確保您已完成先決條件步驟。
+ 您的內部部署環境與託管您的 Amazon EKS 叢集的 AWS 區域之間已建立網路連線。如需詳細資訊，請參閱「[準備混合節點的聯網](hybrid-nodes-networking.md)」。
+ 您已在內部部署主機上安裝了適用於混合節點的相容作業系統。如需詳細資訊，請參閱「[準備混合節點的作業系統](hybrid-nodes-os.md)」。
+ 您已建立混合節點 IAM 角色，並設定內部部署憑證提供者 (AWS Systems Manager 混合啟用或 AWS IAM Roles Anywhere)。如需詳細資訊，請參閱「[準備混合節點的憑證](hybrid-nodes-creds.md)」。
+ 您已建立了已啟用混合節點的 Amazon EKS 叢集。如需詳細資訊，請參閱「[建立具有混合節點的 Amazon EKS 叢集](hybrid-nodes-cluster-create.md)」。
+ 您已將混合節點 IAM 角色與 Kubernetes 角色型存取控制 (RBAC) 許可建立關聯。如需詳細資訊，請參閱「[準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)」。

## 步驟 1：在每個內部部署主機上安裝混合節點 CLI (`nodeadm`)
<a name="_step_1_install_the_hybrid_nodes_cli_nodeadm_on_each_on_premises_host"></a>

如果您在預先建置的作業系統映像中包含 Amazon EKS 混合節點 CLI (`nodeadm`)，則可以略過此步驟。如需 `nodeadm` 混合節點版本的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

`nodeadm` 的混合節點版本託管於前端為 Amazon CloudFront 的 Amazon S3 中。若要在每個內部部署主機上安裝 `nodeadm`，您可以從內部部署主機執行下列命令。

 **對於 x86\$164 主機：**

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/amd64/nodeadm'
```

 **對於 ARM 主機** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/arm64/nodeadm'
```

在每個主機上，為下載的二進位檔新增可執行檔許可。

```
chmod +x nodeadm
```

## 步驟 2：使用 `nodeadm` 安裝混合節點相依性
<a name="_step_2_install_the_hybrid_nodes_dependencies_with_nodeadm"></a>

如果您要在預先建置的作業系統映像中安裝混合節點相依性，則可以略過此步驟。`nodeadm install` 命令可用於安裝混合節點所需的所有相依性。混合節點相依性包括 containerd、kubelet、kubectl 和 AWS SSM 或 AWS IAM Roles Anywhere 元件。如需 `nodeadm install` 所安裝元件和檔案位置的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。如需 `nodeadm install` 程序必須在內部部署防火牆中允許的網域的詳細資訊，請參閱混合節點的 [準備混合節點的聯網](hybrid-nodes-networking.md)。

執行以下命令，以在您的內部部署主機上安裝混合節點相依性。以下命令必須由主機上具有 sudo/root 存取權的使用者執行。

**重要**  
混合節點 CLI (`nodeadm`) 必須由主機上具有 sudo/root 存取權的使用者執行。
+ 使用 Amazon EKS 叢集的 Kubernetes 次要版本取代 `K8S_VERSION`，例如 `1.31`。如需支援的 Kubernetes 版本的清單，請參閱 [Amazon EKS 支援的版本](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。
+ 使用您正在使用的內部部署憑證提供者取代 `CREDS_PROVIDER`。AWS SSM 的有效值為 `ssm`，而 AWS IAM Roles Anywhere 的有效值為 `iam-ra`。

```
nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER
```

## 步驟 3：將混合節點連接至您的叢集
<a name="_step_3_connect_hybrid_nodes_to_your_cluster"></a>

將混合節點連接至您的叢集之前，請確保您已獲得內部部署防火牆和叢集的安全群組中的必要存取權，允許往返 Amazon EKS 控制平面與混合節點之間的通訊。此步驟中的大多數問題都與防火牆組態、安全群組組態或混合節點 IAM 角色組態相關。

**重要**  
混合節點 CLI (`nodeadm`) 必須由主機上具有 sudo/root 存取權的使用者執行。

1. 在每個主機上建立包含部署值的 `nodeConfig.yaml` 檔案。如需可用組態設定的完整說明，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。如果您的混合節點 IAM 角色沒有 `eks:DescribeCluster` 動作的許可，您必須在 `nodeConfig.yaml` 的叢集區段中傳遞 Kubernetes API 端點、叢集 CA 套件和 Kubernetes Service IPv4 CIDR。

   1. 如果您為內部部署憑證提供者使用 AWS SSM 混合啟用，請使用下列 `nodeConfig.yaml` 範例。

      1. 使用您叢集的名稱取代 `CLUSTER_NAME`。

      1. 使用託管叢集的 AWS 區域取代 `AWS_REGION`。例如 `us-west-2`。

      1. 使用您在建立 AWS SSM 混合啟用時收到的啟用代碼取代 `ACTIVATION_CODE`。如需詳細資訊，請參閱「[準備混合節點的憑證](hybrid-nodes-creds.md)」。

      1. 使用您在建立 AWS SSM 混合啟用時收到的啟用 ID 取代 `ACTIVATION_ID`。您可以從 AWS Systems Manager 主控台或 AWS CLI `aws ssm describe-activations` 命令擷取此資訊。

         ```
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
           cluster:
             name: CLUSTER_NAME
             region: AWS_REGION
           hybrid:
             ssm:
               activationCode: ACTIVATION_CODE
               activationId: ACTIVATION_ID
         ```

   1. 如果您為內部部署憑證提供者使用 AWS IAM Roles Anywhere，請使用下列 `nodeConfig.yaml` 範例。

      1. 使用您叢集的名稱取代 `CLUSTER_NAME`。

      1. 使用託管叢集的 AWS 區域取代 `AWS_REGION`。例如 `us-west-2`。

      1. 使用您節點的名稱取代 `NODE_NAME`。如果您已使用 `"sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}"` 資源條件設定混合節點 IAM 角色的信任政策，則節點名稱必須與主機上的憑證的 CN 相符。您使用的 `nodeName` 不可超過 64 個字元。

      1. 使用您在準備混合節點憑證的步驟中設定的信任錨的 ARN 取代 `TRUST_ANCHOR_ARN`。

      1. 使用您在 [準備混合節點的憑證](hybrid-nodes-creds.md) 的步驟中設定的信任錨的 ARN 取代 `PROFILE_ARN`。

      1. 使用混合節點 IAM 角色的 ARN 取代 `ROLE_ARN`。

      1. 使用磁碟中節點憑證的路徑取代 `CERTIFICATE_PATH`。如未指定，預設為 `/etc/iam/pki/server.pem`。

      1. 使用磁碟中憑證私有金鑰的路徑取代 `KEY_PATH`。如未指定，預設為 `/etc/iam/pki/server.key`。

         ```
         apiVersion: node.eks.aws/v1alpha1
         kind: NodeConfig
         spec:
           cluster:
             name: CLUSTER_NAME
             region: AWS_REGION
           hybrid:
             iamRolesAnywhere:
               nodeName: NODE_NAME
               trustAnchorArn: TRUST_ANCHOR_ARN
               profileArn: PROFILE_ARN
               roleArn: ROLE_ARN
               certificatePath: CERTIFICATE_PATH
               privateKeyPath: KEY_PATH
         ```

1. 使用您的 `nodeConfig.yaml` 執行 `nodeadm init` 命令，以將混合節點連接至 Amazon EKS 叢集。

   ```
   nodeadm init -c file://nodeConfig.yaml
   ```

如果上述命令成功完成，則您的混合節點已加入您的 Amazon EKS 叢集。您可以在 Amazon EKS 主控台中透過導覽至叢集的 Compute (運算) 索引標籤 ([確保 IAM 主體具有檢視許可](view-kubernetes-resources.md#view-kubernetes-resources-permissions)) 或使用 `kubectl get nodes` 來驗證這一點。

**重要**  
您的節點將處於 `Not Ready` 狀態，這在意料之中，因為您的混合節點上並未執行 CNI。如果您的節點未加入叢集，請參閱 [故障診斷混合節點](hybrid-nodes-troubleshooting.md)。

## 步驟 4：設定混合節點的 CNI
<a name="_step_4_configure_a_cni_for_hybrid_nodes"></a>

要讓您的混合節點準備好執行應用程式，請繼續執行 [設定混合節點的 CNI](hybrid-nodes-cni.md) 上的步驟。

# 使用 Bottlerocket 連接混合節點
<a name="hybrid-nodes-bottlerocket"></a>

本主題會說明如何將執行 Bottlerocket 的混合節點連接至 Amazon EKS 叢集。[Bottlerocket](https://aws.amazon.com/bottlerocket/) 是由 贊助和支援的開放原始碼 Linux 發行版本 AWS。Bottlerocket 專為託管容器工作負載而打造。利用 Bottlerocket，您可以自動化容器基礎結構的更新，進而改善容器化部署的可用性並降低營運成本。Bottlerocket 僅包含執行容器的基本軟體，可改善資源用量、減少安全威脅，並降低管理開銷。

EKS 混合節點僅支援 Bottlerocket 版本 1.37.0 及更新版本的 VMware 變體。Bottlerocket 的 VMware 變體適用於 Kubernetes 版本 1.28 及更新版本。這些變體的作業系統映像包括 kubelet、containerd、aws-iam-authenticator 和 EKS 混合節點的其他軟體先決條件。您可以使用 Bottlerocket [設定](https://github.com/bottlerocket-os/bottlerocket#settings)檔案來設定這些元件，其中該檔案包含 Bottlerocket 引導和管理員容器的 base64 編碼使用者資料。設定這些設定可讓 Bottlerocket 使用您的混合節點憑證提供者，進而驗證叢集的混合節點。混合節點加入叢集後，其即會在 Amazon EKS 主控台和 Kubernetes 相容工具 (例如 `kubectl`) 中顯示為「`Not Ready`」狀態。完成此頁面上的步驟後，請繼續 [設定混合節點的 CNI](hybrid-nodes-cni.md)，以讓您的混合節點準備好執行應用程式。

## 先決條件
<a name="_prerequisites"></a>

將混合節點連接至 Amazon EKS 叢集之前，請確保您已完成先決條件步驟。
+ 您可以從內部部署環境連線至託管 Amazon EKS 叢集 AWS 的區域。如需詳細資訊，請參閱[準備混合節點的聯網](hybrid-nodes-networking.md)。
+ 您已建立混合節點 IAM 角色，並設定內部部署憑證提供者 (AWS Systems Manager 混合啟用或 AWS IAM Roles Anywhere)。如需詳細資訊，請參閱[準備混合節點的憑證](hybrid-nodes-creds.md)。
+ 您已建立了已啟用混合節點的 Amazon EKS 叢集。如需詳細資訊，請參閱[建立具有混合節點的 Amazon EKS 叢集](hybrid-nodes-cluster-create.md)。
+ 您已將混合節點 IAM 角色與 Kubernetes 角色型存取控制 (RBAC) 許可建立關聯。如需詳細資訊，請參閱[準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md)。

## 步驟 1：建立 Bottlerocket 設定 TOML 檔案
<a name="_step_1_create_the_bottlerocket_settings_toml_file"></a>

若要為混合節點設定 Bottlerocket，您需要建立具有必要組態的 `settings.toml` 檔案。TOML 檔案的內容會根據您使用的憑證提供者 (SSM 或 IAM Roles Anywhere) 而有所不同。佈建 Bottlerocket 執行個體時，此檔案將會作為使用者資料傳遞。

**注意**  
以下提供的 TOML 檔案僅代表將 Bottlerocket VMWare 機器初始化為 EKS 叢集上的節點所需的最低設定。Bottlerocket 提供廣泛的設定，可處理多種不同的使用案例，因此對於混合節點初始化以外的其他組態選項，請參閱 [Bottlerocket 文件](https://bottlerocket.dev/en)，以取得您使用之 Bottlerocket 版本的所有文件化設定的完整清單 （例如，[以下](https://bottlerocket.dev/en/os/1.51.x/api/settings-index)是 Bottlerocket 1.51.x 可用的所有設定）。

### SSM
<a name="_ssm"></a>

如果您使用 AWS Systems Manager 做為登入資料提供者，請使用下列內容建立`settings.toml`檔案：

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.goskope.com.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "ssm"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"

[settings.host-containers.control]
enabled = true
```

使用下列值取代預留位置：
+  `<cluster-name>`：Amazon EKS 叢集的名稱。
+  `<api-server-endpoint>`：叢集的 API 伺服器端點。
+  `<cluster-certificate-authority>`：叢集的 base64 編碼 CA 套件。
+  `<region>`：託管叢集 AWS 的區域，例如 "us-east-1"。
+  `<hostname>`：Bottlerocket 執行個體的主機名稱，其也會設定為節點名稱。這可以是您選擇的任何唯一值，不過必須遵循 [Kubernetes 物件命名慣例](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)。此外，您使用的主機名稱不可超過 64 個字元。注意：使用 SSM 提供商時，在向 SSM 註冊執行個體之後，此主機名稱和節點名稱將會取代為受管執行個體 ID (例如 `mi-*` ID)。
+  `<base64-encoded-admin-container-userdata>`：Bottlerocket 管理員容器組態的 base64 編碼內容。啟用管理員容器可讓您使用 SSH 連接至 Bottlerocket 執行個體，以進行系統勘探和偵錯。雖然這並非必要的設定，但我們建議您將其啟用，以便進行故障診斷。如需使用管理員容器進行身分驗證的詳細資訊，請參閱 [Bottlerocket 管理員容器文件](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)。管理員容器採用 JSON 格式的 SSH 使用者和金鑰輸入，例如：

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`：Bottlerocket 引導容器組態的 base64 編碼內容。如需其組態的詳細資訊，請參閱 [Bottlerocket 引導容器文件](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)。引導容器負責將執行個體註冊為 AWS SSM 受管執行個體，並將其聯結為 Amazon EKS 叢集上的 Kubernetes 節點。傳遞至引導容器的使用者資料採用命令調用的形式，而其接受您先前建立的 SSM 混合啟用代碼和 ID 作為輸入：

```
eks-hybrid-ssm-setup --activation-id=<activation-id> --activation-code=<activation-code> --region=<region>
```

### IAM Roles Anywhere
<a name="_iam_roles_anywhere"></a>

如果您使用 AWS IAM Roles Anywhere 做為登入資料提供者，請使用下列內容建立`settings.toml`檔案：

```
[settings.kubernetes]
cluster-name = "<cluster-name>"
api-server = "<api-server-endpoint>"
cluster-certificate = "<cluster-certificate-authority>"
hostname-override = "<hostname>"
provider-id = "eks-hybrid:///<region>/<cluster-name>/<hostname>"
authentication-mode = "aws"
cloud-provider = ""
server-tls-bootstrap = true

[settings.network]
hostname = "<hostname>"

[settings.aws]
region = "<region>"
config = "<base64-encoded-aws-config-file>"

[settings.kubernetes.credential-providers.ecr-credential-provider]
enabled = true
cache-duration = "12h"
image-patterns = [
    "*.dkr.ecr.*.amazonaws.com",
    "*.dkr.ecr.*.amazonaws.com.rproxy.goskope.com.cn",
    "*.dkr.ecr.*.amazonaws.eu",
    "*.dkr.ecr-fips.*.amazonaws.com",
    "*.dkr.ecr-fips.*.amazonaws.eu",
    "public.ecr.aws"
]

[settings.kubernetes.node-labels]
"eks.amazonaws.com/compute-type" = "hybrid"
"eks.amazonaws.com/hybrid-credential-provider" = "iam-ra"

[settings.host-containers.admin]
enabled = true
user-data = "<base64-encoded-admin-container-userdata>"

[settings.bootstrap-containers.eks-hybrid-setup]
mode = "always"
user-data = "<base64-encoded-bootstrap-container-userdata>"
```

使用下列值取代預留位置：
+  `<cluster-name>`：Amazon EKS 叢集的名稱。
+  `<api-server-endpoint>`：叢集的 API 伺服器端點。
+  `<cluster-certificate-authority>`：叢集的 base64 編碼 CA 套件。
+  `<region>`：託管叢集 AWS 的區域，例如 "us-east-1"
+  `<hostname>`：Bottlerocket 執行個體的主機名稱，其也會設定為節點名稱。這可以是您選擇的任何唯一值，不過必須遵循 [Kubernetes 物件命名慣例](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names)。此外，您使用的主機名稱不可超過 64 個字元。注意：使用 IAM-RA 提供商時，如果您已使用 `"sts:RoleSessionName": "${aws:PrincipalTag/x509Subject/CN}"` 資源條件設定混合節點 IAM 角色的信任政策，則節點名稱必須與主機上的憑證的 CN 相符。
+  `<base64-encoded-aws-config-file>`：組態檔案的 base64 AWS 編碼內容。檔案的內容應如下所示：

```
[default]
credential_process = aws_signing_helper credential-process --certificate /root/.aws/node.crt --private-key /root/.aws/node.key --profile-arn <profile-arn> --role-arn <role-arn> --trust-anchor-arn <trust-anchor-arn> --role-session-name <role-session-name>
```
+  `<base64-encoded-admin-container-userdata>`：Bottlerocket 管理員容器組態的 base64 編碼內容。啟用管理員容器可讓您使用 SSH 連接至 Bottlerocket 執行個體，以進行系統勘探和偵錯。雖然這並非必要的設定，但我們建議您將其啟用，以便進行故障診斷。如需使用管理員容器進行身分驗證的詳細資訊，請參閱 [Bottlerocket 管理員容器文件](https://github.com/bottlerocket-os/bottlerocket-admin-container#authenticating-with-the-admin-container)。管理員容器採用 JSON 格式的 SSH 使用者和金鑰輸入，例如：

```
{
  "user": "<ssh-user>",
  "ssh": {
    "authorized-keys": [
      "<ssh-authorized-key>"
    ]
  }
}
```
+  `<base64-encoded-bootstrap-container-userdata>`：Bottlerocket 引導容器組態的 base64 編碼內容。如需其組態的詳細資訊，請參閱 [Bottlerocket 引導容器文件](https://github.com/bottlerocket-os/bottlerocket-bootstrap-container)。引導容器負責在執行個體上建立 IAM Roles Anywhere 主機憑證和憑證私有金鑰檔案。然後，`aws_signing_helper` 會使用這些憑證來取得臨時憑證，以便與您的 Amazon EKS 叢集進行身分驗證。傳遞至引導容器的使用者資料採用命令調用的形式，而其接受您先前建立的憑證和私有金鑰的內容作為輸入：

```
eks-hybrid-iam-ra-setup --certificate=<certificate> --key=<private-key>
```

## 步驟 2：使用使用者資料佈建 Bottlerocket vSphere VM
<a name="_step_2_provision_the_bottlerocket_vsphere_vm_with_user_data"></a>

建構 TOML 檔案後，請在 vSphere VM 建立期間將其作為使用者資料進行傳遞。請記住，必須在 VM 第一次開機之前設定使用者資料。因此，您需要在建立執行個體時提供它，或者如果您想要提前建立 VM，則 VM 必須處於關機狀態，直到您為其設定使用者資料為止。例如，如果使用 `govc` CLI：

### 第一次建立 VM
<a name="_creating_vm_for_the_first_time"></a>

```
govc vm.create \
  -on=true \
  -c=2 \
  -m=4096 \
  -net.adapter=<network-adapter> \
  -net=<network-name> \
  -e guestinfo.userdata.encoding="base64" \
  -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
  -template=<template-name> \
  <vm-name>
```

### 更新現有 VM 的使用者資料
<a name="_updating_user_data_for_an_existing_vm"></a>

```
govc vm.create \
    -on=false \
    -c=2 \
    -m=4096 \
    -net.adapter=<network-adapter> \
    -net=<network-name> \
    -template=<template-name> \
    <vm-name>

govc vm.change
    -vm <vm-name> \
    -e guestinfo.userdata="$(base64 -w0 settings.toml)" \
    -e guestinfo.userdata.encoding="base64"

govc vm.power -on <vm-name>
```

在上述區段中，`-e guestinfo.userdata.encoding="base64"` 選項會指定使用者資料採用 base64 編碼。`-e guestinfo.userdata` 選項會將 `settings.toml` 檔案的 base64 編碼內容作為使用者資料傳遞至 Bottlerocket 執行個體。使用特定值取代預留位置，例如 Bottlerocket OVA 範本和聯網詳細資訊。

## 步驟 3：驗證混合節點連線
<a name="_step_3_verify_the_hybrid_node_connection"></a>

Bottlerocket 執行個體啟動後，其會嘗試加入您的 Amazon EKS 叢集。您可以導覽至叢集的「運算」索引標籤，或執行下列命令，以在 Amazon EKS 主控台中驗證連線：

```
kubectl get nodes
```

**重要**  
您的節點將處於 `Not Ready` 狀態，這在意料之中，因為您的混合節點上並未執行 CNI。如果您的節點未加入叢集，請參閱 [故障診斷混合節點](hybrid-nodes-troubleshooting.md)。

## 步驟 4：設定混合節點的 CNI
<a name="_step_4_configure_a_cni_for_hybrid_nodes"></a>

要讓您的混合節點準備好執行應用程式，請繼續執行 [設定混合節點的 CNI](hybrid-nodes-cni.md) 上的步驟。

# 升級叢集的混合節點
<a name="hybrid-nodes-upgrade"></a>

升級混合節點的指引類似於在 Amazon EC2 中執行的自我管理的 Amazon EKS 節點。我們建議您在目標 Kubernetes 版本上建立新的混合節點、將現有的應用程式從容移轉至新 Kubernetes 版本上的混合節點，接著從叢集移除舊 Kubernetes 版本上的混合節點。開始升級之前，請務必檢閱 [Amazon EKS 最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/cluster-upgrades.html)，以了解升級的相關資訊。Amazon EKS 混合節點對包含雲端節點的 Amazon EKS 叢集具有相同的 [Kubernetes 版本支援](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)，包括標準支援和延長支援。

Amazon EKS 混合節點遵循與上游 Kubernetes 相同的[節點版本差異政策](https://kubernetes.io/releases/version-skew-policy/#supported-version-skew)。Amazon EKS 混合節點不能使用比 Amazon EKS 控制平面更新的版本，而混合節點最多可能比 Amazon EKS 控制平面次要版本低三個 Kubernetes 次要版本。

如果您沒有備用容量，可在目標 Kubernetes 版本上建立新的混合節點以進行切換移轉升級策略，則您也可以使用 Amazon EKS 混合節點 CLI (`nodeadm`) 來就地升級混合節點的 Kubernetes 版本。

**重要**  
如果您要使用 `nodeadm` 就地升級混合節點，則在關閉舊版 Kubernetes 元件以及安裝和啟動新的 Kubernetes 版本元件的過程中，節點可能會出現停機時間。

## 先決條件
<a name="_prerequisites"></a>

升級之前，請確認您已完成下列先決條件。
+ 混合節點升級的目標 Kubernetes 版本必須等於或小於 Amazon EKS 控制平面版本。
+ 如果您遵循切換移轉升級策略，則在目標 Kubernetes 版本上安裝的新混合節點必須符合 [混合節點的先決條件設定](hybrid-nodes-prereqs.md) 要求。這包括您在 Amazon EKS 叢集建立期間傳遞的遠端節點網路 CIDR 內的 IP 位址。
+ 對於切換移轉和就地升級，混合節點必須能夠存取[必要網域](hybrid-nodes-networking.md#hybrid-nodes-networking-on-prem)，以提取混合節點相依性的新版本。
+ 您必須在用來與 Amazon EKS Kubernetes API 端點互動的本機電腦或執行個體上安裝 kubectl。
+ 您的 CNI 版本必須支援您要升級到的 Kubernetes 版本。如果不能，則請在先升級 CNI 版本，然後再升級您的混合節點。如需詳細資訊，請參閱「[設定混合節點的 CNI](hybrid-nodes-cni.md)」。

## 切換移轉 (藍綠) 升級
<a name="hybrid-nodes-upgrade-cutover"></a>

 *切換移轉升級*是指使用目標 Kubernetes 版本在新主機上建立新的混合節點、將現有的應用程式從容移轉至目標 Kubernetes 版本上的新混合節點，以及從叢集移除舊 Kubernetes 版本上的混合節點的過程。此策略也稱為藍綠移轉。

1. 請遵循 [連接混合節點](hybrid-nodes-join.md) 步驟，將您的新主機連接為混合節點。執行 `nodeadm install` 命令時，請使用您的目標 Kubernetes 版本。

1. 啟用目標 Kubernetes 版本上的新混合節點與舊 Kubernetes 版本上的混合節點之間的通訊。此組態可讓您在將工作負載移轉至目標 Kubernetes 版本上的混合節點時，Pod 之間能夠彼此進行通訊。

1. 確認目標 Kubernetes 版本上的混合節點已成功加入叢集，且狀態為就緒。

1. 使用下列命令，將每個您想要移除的節點標記為不可排程。這樣就不會在您要取代的節點上排程或重新排程新的 Pod。如需詳細資訊，請參閱 Kubernetes 文件中的 [kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)。使用舊 Kubernetes 版本上的混合節點的名稱取代 `NODE_NAME`。

   ```
   kubectl cordon NODE_NAME
   ```

   您可以使用下列程式碼片段來識別及包圍隔離特定 Kubernetes 版本 (在此情況下為 `1.28`) 的所有節點。

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Cordoning $node"
       kubectl cordon $node
   done
   ```

1. 如果您目前的部署在混合節點上執行的 CoreDNS 複本少於兩個，請將部署擴增為至少兩個複本。我們建議您在混合節點上執行至少兩個 CoreDNS 複本，以在正常操作期間實現彈性。

   ```
   kubectl scale deployments/coredns --replicas=2 -n kube-system
   ```

1. 使用下列命令，耗盡清空您想要從叢集移除的舊 Kubernetes 版本上的每個混合節點。如需耗盡節點的詳細資訊，請參閱 Kubernetes 文件中的[安全地耗盡節點](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)。使用舊 Kubernetes 版本上的混合節點的名稱取代 `NODE_NAME`。

   ```
   kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
   ```

   您可以使用下列程式碼片段來識別及耗盡特定 Kubernetes 版本 (在此情況下為 `1.28`) 的所有節點。

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Draining $node"
       kubectl drain $node --ignore-daemonsets --delete-emptydir-data
   done
   ```

1. 您可以使用 `nodeadm` 從主機停止和移除混合節點成品。您必須與擁有 root/sudo 權限的使用者一同執行 `nodeadm`。根據預設，如果節點上還有剩餘的 Pod，則 `nodeadm uninstall` 不會繼續。如需更多資訊，請參閱[混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

   ```
   nodeadm uninstall
   ```

1. 若停止並解除安裝混合節點成品，則請從您的叢集中移除節點資源。

   ```
   kubectl delete node node-name
   ```

   您可以使用下列程式碼片段來識別及刪除特定 Kubernetes 版本 (在此情況下為 `1.28`) 的所有節點。

   ```
   K8S_VERSION=1.28
   for node in $(kubectl get nodes -o json | jq --arg K8S_VERSION "$K8S_VERSION" -r '.items[] | select(.status.nodeInfo.kubeletVersion | match("\($K8S_VERSION)")).metadata.name')
   do
       echo "Deleting $node"
       kubectl delete node $node
   done
   ```

1. 視您選擇的 CNI 而定，在執行上述步驟後，您的混合節點上可能會有成品剩餘。如需詳細資訊，請參閱「[設定混合節點的 CNI](hybrid-nodes-cni.md)」。

## 就地升級
<a name="hybrid-nodes-upgrade-inplace"></a>

就地升級程序是指使用 `nodeadm upgrade` 來升級混合節點的 Kubernetes 版本，而無需使用新的實體或虛擬主機和切換移轉策略。`nodeadm upgrade` 程序會關閉在混合節點上執行的現有的較舊 Kubernetes 元件、解除安裝現有的較舊 Kubernetes 元件、安裝新的目標 Kubernetes 元件，以及啟動新的目標 Kubernetes 元件。強烈建議您一次升級一個節點，以最大限度地降低對混合節點上執行的應用程式的影響。此程序的持續時間取決於您的網路頻寬和延遲。

1. 使用下列命令，將您要升級的節點標記為不可排程。這樣就不會在您要升級的節點上排程或重新排程新的 Pod。如需詳細資訊，請參閱 Kubernetes 文件中的 [kubectl cordon](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/)。使用您要升級的混合節點的名稱取代 `NODE_NAME`

   ```
   kubectl cordon NODE_NAME
   ```

1. 使用下列命令，耗盡您要升級的節點。如需耗盡節點的詳細資訊，請參閱 Kubernetes 文件中的[安全地耗盡節點](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)。使用您要升級的混合節點的名稱取代 `NODE_NAME`。

   ```
   kubectl drain NODE_NAME --ignore-daemonsets --delete-emptydir-data
   ```

1. 在您要升級的混合節點上執行 `nodeadm upgrade`。您必須與擁有 root/sudo 權限的使用者一同執行 `nodeadm`。節點的名稱會透過 AWS SSM 和 IAM Roles Anywhere AWS 憑證提供者的升級加以保留。您無法在升級程序期間變更憑證提供者。如需 `nodeConfig.yaml` 的組態值，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。使用您要升級的目標 Kubernetes 版本取代 `K8S_VERSION`。

   ```
   nodeadm upgrade K8S_VERSION -c file://nodeConfig.yaml
   ```

1. 若要允許於升級之後在節點上排程 Pod，請輸入下列內容。使用節點的名稱取代 `NODE_NAME`。

   ```
   kubectl uncordon NODE_NAME
   ```

1. 觀察混合節點的狀態，等待節點關閉，然後以就緒狀態重新啟動新的 Kubernetes 版本。

   ```
   kubectl get nodes -o wide -w
   ```

# 混合節點的修補程式安全更新
<a name="hybrid-nodes-security"></a>

本主題會說明針對混合節點上執行的特定套件和相依性，就地執行安全更新修補的程序。基於最佳實務，我們建議您定期更新您的混合節點，以接收 CVE 和安全修補程式。

如需升級 Kubernetes 版本的步驟，請參閱 [升級叢集的混合節點](hybrid-nodes-upgrade.md)。

可能需要安全修補的軟體範例之一是 `containerd`。

## `Containerd`
<a name="_containerd"></a>

 `containerd` 是 EKS 混合節點的標準 Kubernetes 容器執行時期和核心相依性，可用於管理容器生命週期，包括提取映像和管理容器執行。在混合節點上，您可以透過 [nodeadm CLI](https://docs.aws.amazon.com/eks/latest/userguide/hybrid-nodes-nodeadm.html) 或手動安裝 `containerd`。視節點的作業系統而定，`nodeadm` 會從作業系統分散式套件或 Docker 套件安裝 `containerd`。

當 `containerd` 中的 CVE 發布後，您可透過下列選項將您混合節點上的 `containerd` 升級至修補程式版本。

## 步驟 1：檢查修補程式是否已發布至套件管理工具
<a name="_step_1_check_if_the_patch_published_to_package_managers"></a>

您可以參考對應的安全公告，檢查 CVE `containerd` 修補程式是否已發布至每個各自的作業系統套件管理工具：
+  [Amazon Linux 2023](https://alas.aws.amazon.com/alas2023.html) 
+  [RHEL](https://access.redhat.com/security/security-updates/security-advisories) 
+  [Ubuntu 20.04](https://ubuntu.com/security/notices?order=newest&release=focal) 
+  [Ubuntu 22.04](https://ubuntu.com/security/notices?order=newest&release=jammy) 
+  [Ubuntu 24.04](https://ubuntu.com/security/notices?order=newest&release=noble) 

如果您使用 Docker 儲存庫作為 `containerd` 的來源，您可以檢查 [Docker 安全公告](https://docs.docker.com/security/security-announcements/)，以識別 Docker 儲存庫中提供的修補版本。

## 步驟 2：選擇安裝修補程式的方法
<a name="_step_2_choose_the_method_to_install_the_patch"></a>

您可以透過三種方法來在節點上就地修補和安裝安全升級。您可使用哪種方法取決於套件管理工具中的作業系統是否提供該修補程式：

1. 使用發布至套件管理工具的 `nodeadm upgrade` 安裝修補程式，請參閱[步驟 2 a](#hybrid-nodes-security-nodeadm)。

1. 使用套件管理工具直接安裝修補程式，請參閱[步驟 2 b](#hybrid-nodes-security-package)。

1. 安裝尚未在套件管理工具中發布的自訂修補程式。請注意，對於 `containerd` 的自訂修補程式，存在特殊考量，請參閱[步驟 2 c](#hybrid-nodes-security-manual)。

## 步驟 2 a：使用 `nodeadm upgrade` 進行修補
<a name="hybrid-nodes-security-nodeadm"></a>

確認 `containerd` CVE 修補程式已發布至作業系統或 Docker 儲存庫 (Apt 或 RPM) 後，您可以使用 `nodeadm upgrade` 命令升級至 `containerd` 的最新版本。由於這並非 Kubernetes 版本升級，您必須將目前的 Kubernetes 版本傳遞至 `nodeadm` 升級命令。

```
nodeadm upgrade K8S_VERSION --config-source file:///root/nodeConfig.yaml
```

## 步驟 2 b：使用作業系統套件管理工具進行修補
<a name="hybrid-nodes-security-package"></a>

或者，您也可以透過各自的套件管理工具進行更新，並使用它來升級 `containerd` 套件，如下所示。

 **Amazon Linux 2023** 

```
sudo yum update -y
sudo yum install -y containerd
```

 **RHEL** 

```
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo yum update -y
sudo yum install -y containerd
```

 **Ubuntu** 

```
sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update -y
sudo apt install -y --only-upgrade containerd.io
```

## 步驟 2 c：套件管理工具中尚未發布的 `Containerd` CVE 修補程式
<a name="hybrid-nodes-security-manual"></a>

如果 `containerd` 的修補程式版本僅可透過套件管理工具以外的其他方式獲得，例如在 GitHub 發行版本中，則您可以從官方 GitHub 網站安裝 `containerd`。

1. 如果機器已將叢集加入為混合節點，則需要執行 `nodeadm uninstall` 命令。

1. 安裝官方 `containerd` 二進位檔。您可以使用 GitHub 上的步驟[官方安裝步驟](https://github.com/containerd/containerd/blob/main/docs/getting-started.md#option-1-from-the-official-binaries)。

1. 執行 `nodeadm install` 命令，並將 `--containerd-source` 引數設定為 `none`，因此可透過 `nodeadm` 略過 `containerd` 安裝。對於節點正在執行的任何作業系統，您可以使用 `containerd` 來源中的 `none` 值。

   ```
   nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER --containerd-source none
   ```

# 移除混合節點
<a name="hybrid-nodes-remove"></a>

本主題會說明如何從 Amazon EKS 叢集中刪除混合節點。您必須使用您選擇的 Kubernetes 相容工具 (例如 [kubectl](https://kubernetes.io/docs/reference/kubectl/)) 刪除混合節點。節點物件從 Amazon EKS 叢集移除時，即會停止收取混合節點的費用。如需混合節點定價的詳細資訊，請參閱 [Amazon EKS 定價](https://aws.amazon.com/eks/pricing/)。

**重要**  
移除節點會對節點上執行的工作負載產生干擾。刪除混合節點之前，建議您先耗盡節點，以將 Pod 移動至另一個作用中的節點。如需耗盡節點的詳細資訊，請參閱 Kubernetes 文件中的[安全地耗盡節點](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/)。

從您用來與 Amazon EKS 叢集的 Kubernetes API 端點互動的本機機器或執行個體，執行下列 kubectl 步驟。如果您使用特定 `kubeconfig` 檔案，則請使用 `--kubeconfig` 旗標。

## 步驟 1：列出您的節點
<a name="_step_1_list_your_nodes"></a>

```
kubectl get nodes
```

## 步驟 2：耗盡您的節點
<a name="_step_2_drain_your_node"></a>

如需 `kubectl drain` 命令的詳細資訊，請參閱 Kubernetes 文件中的 [kubectl 耗盡](https://kubernetes.io/docs/reference/kubectl/generated/kubectl_drain/)。

```
kubectl drain --ignore-daemonsets <node-name>
```

## 步驟 3：停止並解除安裝混合節點成品
<a name="_step_3_stop_and_uninstall_hybrid_nodes_artifacts"></a>

您可以使用 Amazon EKS 混合節點 CLI (`nodeadm`)，以從主機停止和移除混合節點成品。您必須與擁有 root/sudo 權限的使用者一同執行 `nodeadm`。根據預設，如果節點上還有剩餘的 Pod，則 `nodeadm uninstall` 不會繼續。如果您使用 AWS Systems Manager (SSM) 作為憑證提供者，則 `nodeadm uninstall` 命令會將主機取消註冊為 AWS SSM 受管執行個體。如需詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

```
nodeadm uninstall
```

## 步驟 4：從叢集中刪除節點
<a name="_step_4_delete_your_node_from_the_cluster"></a>

若停止並解除安裝混合節點成品，則請從您的叢集中移除節點資源。

```
kubectl delete node <node-name>
```

## 步驟 5：檢查剩餘的成品
<a name="_step_5_check_for_remaining_artifacts"></a>

視您選擇的 CNI 而定，在執行上述步驟後，您的混合節點上可能會有成品剩餘。如需詳細資訊，請參閱「[設定混合節點的 CNI](hybrid-nodes-cni.md)」。

# 設定混合節點的應用程式聯網、附加元件和 Webhook
<a name="hybrid-nodes-configure"></a>

為混合節點建立 EKS 叢集後，請設定應用程式聯網的其他功能 (CNI、BGP、傳入、負載平衡、網路政策)、附加元件、Webhook 和代理設定。如需與混合節點相容的 EKS 和社群附加元件的完整清單，請參閱 [設定混合節點的附加元件](hybrid-nodes-add-ons.md)。

 **EKS 叢集洞察** EKS 包括混合節點設定中錯誤組態的洞察檢查，這些設定可能會使叢集或工作負載的功能受損。如需有關叢集洞察的詳細資訊，請參閱 [利用叢集洞見為 Kubernetes 版本升級做好準備，並為錯誤組態進行故障診斷](cluster-insights.md)。

以下清單列出了您可與混合節點搭配使用的常見功能和附加元件：
+  **容器聯網介面 (CNI)**：AWS 支援 [Cilium](https://docs.cilium.io/en/stable/index.html) 作為混合節點的 CNI。如需詳細資訊，請參閱 [設定混合節點的 CNI](hybrid-nodes-cni.md)。請注意，AWS VPC CNI 無法與混合節點搭配使用。
+  **CoreDNS 和 `kube-proxy` **：CoreDNS 和 `kube-proxy` 會在混合節點加入 EKS 叢集時自動安裝。這些附加元件可以在叢集建立後作為 EKS 附加元件進行管理。
+  **傳入及負載平衡**：您可以將 AWS Load Balancer 控制器和 Application Load Balancer (ALB) 或 Network Load Balancer (NLB) 與在混合節點上執行的工作負載的目標類型 `ip` 搭配使用。針對在混合節點上執行的工作負載，AWS 支援 Cilium 的內建傳入、閘道和 Kubernetes Service 負載平衡功能。如需詳細資訊，請參閱[設定混合節點的 Kubernetes Ingress](hybrid-nodes-ingress.md)及[為混合節點設定 LoadBalancer 類型的服務](hybrid-nodes-load-balancing.md)。
+  **指標**：您可以使用 Amazon Managed Service for Prometheus (AMP) 無代理程式湊集器、AWS Ditro for Open Telemetry (ADOT) 和具有混合節點的 Amazon CloudWatch 可觀測性代理程式。若要對混合節點上的 Pod 指標使用 AMP 無代理程式湊集器，您的 Pod 必須可從您用於 EKS 叢集的 VPC 存取。
+  **日誌**：您可以為已啟用混合節點的叢集啟用 EKS 控制平面記錄。您可以使用 ADOT EKS 附加元件和 Amazon CloudWatch 可觀測性代理程式 EKS 附加元件進行混合節點和 Pod 記錄。
+  **Pod 身分識別和 IRSA**：您可以搭配混合節點上執行的應用程式使用 EKS Pod 身分識別和服務帳戶的 IAM 角色 (IRSA)，以為在混合節點上執行的 Pod 與其他 AWS 服務啟用精細存取。
+  **Webhook**：如果您正在執行 Webhook，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md) 以了解相關考量事項和步驟，即如果您無法讓內部部署 Pod 網路可路由，則可選擇在雲端節點上執行 Webhook。
+  **代理**：如果您在內部部署環境中為離開資料中心或邊緣環境的流量使用代理伺服器，則您可以將混合節點和叢集設定為使用代理伺服器。如需詳細資訊，請參閱 [設定混合節點的代理](hybrid-nodes-proxy.md)。

**Topics**
+ [設定混合節點的 CNI](hybrid-nodes-cni.md)
+ [設定混合節點的附加元件](hybrid-nodes-add-ons.md)
+ [設定混合節點的 Webhook](hybrid-nodes-webhooks.md)
+ [設定混合節點的代理](hybrid-nodes-proxy.md)
+ [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md)
+ [設定混合節點的 Kubernetes Ingress](hybrid-nodes-ingress.md)
+ [為混合節點設定 LoadBalancer 類型的服務](hybrid-nodes-load-balancing.md)
+ [設定混合節點的 Kubernetes 網路政策](hybrid-nodes-network-policies.md)

# 設定混合節點的 CNI
<a name="hybrid-nodes-cni"></a>

Cilium 是 AWS Amazon EKS 混合節點支援的容器聯網界面 (CNI)。您必須為混合節點安裝 CNI，才能做好準備以為工作負載提供服務。在 CNI 執行之前，混合節點會顯示為 `Not Ready` 狀態。您可以使用您選擇的工具 (例如 Helm) 來管理 CNI。此頁面的說明涵蓋 Cilium 生命週期管理 (安裝、升級、刪除)。如需如何為傳入、載入平衡和網路政策設定 Cilium，請參閱 [Cilium Ingress 和 Cilium Gateway 概觀](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)、[服務類型 LoadBalancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium-loadbalancer) 和 [設定混合節點的 Kubernetes 網路政策](hybrid-nodes-network-policies.md)。

在 AWS 雲端節點上執行 AWS 時，不支援 Cilium。Amazon VPC CNI 與混合節點不相容，且 VPC CNI 已針對 `eks.amazonaws.com/compute-type: hybrid` 標籤設定反親和性。

此頁面上先前的 Calico 文件已移至 [EKS 混合範例儲存庫](https://github.com/aws-samples/eks-hybrid-examples)。

## 版本相容性
<a name="hybrid-nodes-cilium-version-compatibility"></a>

Amazon EKS 支援的每個 Kubernetes 版本`v1.18.x`都支援 Cilium 版本 `v1.17.x`和 EKS 混合節點。

**注意**  
 **Cilium v1.18.3 核心需求**：由於核心需求 (Linux 核心 >= 5.10)，不支援 Cilium v1.18.3：
+ Ubuntu 20.04
+ Red Hat Enterprise Linux (RHEL) 8

如需系統需求，請參閱 [Cilium 系統需求](https://docs.cilium.io/en/stable/operations/system_requirements/)。

如需 Amazon EKS 支援的 Kubernetes 版本，請參閱 [Kubernetes 版本支援](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)。EKS 混合節點對包含雲端節點的 Amazon EKS 叢集具有相同的 Kubernetes 版本支援。

## 支援的功能
<a name="hybrid-nodes-cilium-support"></a>

 AWS 維護以開放原始碼 Cilium [專案為基礎的 EKS 混合節點的 Cilium](https://github.com/cilium/cilium) 組建。若要從 取得 Cilium AWS 的支援，您必須使用 AWS維護的 Cilium 組建和支援的 Cilium 版本。

 AWS 為下列 Cilium 功能的預設組態提供技術支援，以便與 EKS 混合節點搭配使用。如果您計劃在 AWS 支援範圍之外使用功能，建議您取得 Cilium 的替代商業支援，或擁有內部專業知識來故障診斷並對 Cilium 專案提供修正。


| Cilium 功能 | 支援者 AWS  | 
| --- | --- | 
|  Kubernetes 網路一致性  |  是  | 
|  核心叢集連線  |  是  | 
|  IP 系列  |  IPv4  | 
|  生命週期管理  |  Helm  | 
|  聯網模式  |  VXLAN 封裝  | 
|  IP 位址管理 (IPAM)  |  Cilium IPAM 叢集範圍  | 
|  網路政策  |  Kubernetes 網路政策  | 
|  邊界閘道協定 (BGP)  |  Cilium BGP 控制平面  | 
|  Kubernetes Ingress  |  Cilium Ingress、Cilium Gateway  | 
|  Service LoadBalancer IP 配置  |  Cilium Load Balancer IPAM  | 
|  Service LoadBalancer IP 位址公告  |  Cilium BGP 控制平面  | 
|  kube-proxy 取代  |  是  | 

## Cilium 考量事項
<a name="hybrid-nodes-cilium-considerations"></a>
+  **Helm 儲存庫** - 在 Amazon EKS Cilium/Cilium 的 Amazon Elastic Container Registry Public (Amazon ECR Public) 中 AWS 託管 Cilium Helm Chart。 [https://gallery.ecr.aws/eks/cilium/cilium](https://gallery.ecr.aws/eks/cilium/cilium)可用的版本包括：
  + Cilium 1.17.9 版： `oci://public.ecr.aws/eks/cilium/cilium:1.17.9-0`
  + Cilium 1.18.3 版： `oci://public.ecr.aws/eks/cilium/cilium:1.18.3-0`

    本主題中的命令使用此儲存庫。請注意，某些 `helm repo` 命令不適用於 Amazon ECR Public 中的 Helm 儲存庫，因此您無法從本機 Helm 儲存庫名稱引用此儲存庫。反之，大多數命令中會使用完整的 URI。
+ 根據預設，Cilium 已設定為以覆蓋/通道模式執行，並以 VXLAN 作為[封裝法](https://docs.cilium.io/en/stable/network/concepts/routing/#encapsulation)。此模式對基礎實體網路的要求最低。
+ 根據預設，Cilium 會將離開叢集的所有 Pod 流量的來源 IP 位址[偽裝](https://docs.cilium.io/en/stable/network/concepts/masquerading/)為節點的 IP 位址。如果您停用偽裝，則您的 Pod CIDR 必須在內部部署網路上可路由。
+ 如果您在混合節點上執行 Webhook，您的 Pod CIDR 必須在內部部署網路上可路由。如果您的 Pod CIDR 在內部部署網路上不可路由，那麼建議您在相同叢集的雲端節點上執行 Webhook。如需詳細資訊，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md) 和 [準備混合節點的聯網](hybrid-nodes-networking.md)。
+  AWS 建議使用 Cilium 的內建 BGP 功能，讓您的 Pod CIDRs可在內部部署網路上路由。如需如何使用混合節點設定 Cilium BGP 的詳細資訊，請參閱 [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md)。
+ Cilium 中的預設 IP 位址管理 (IPAM) 稱為[叢集範圍](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/)，而 Cilium 運算子會基於使用者設定的 Pod CIDR 為每個節點配置 IP 位址。

## 在混合節點上安裝 Cilium
<a name="hybrid-nodes-cilium-install"></a>

### 程序
<a name="_procedure"></a>

1. 建立稱為 `cilium-values.yaml` 的 YAML 檔案。下列範例透過為 Cilium 代理程式和運算子設定 `eks.amazonaws.com/compute-type: hybrid` 標籤的親和性，將 Cilium 設定為僅在混合節點上執行。
   + 使用您為 EKS 叢集*遠端 Pod 網路*設定的相同 Pod CIDR，進而設定 `clusterPoolIpv4PodCIDRList`。例如 `10.100.0.0/24`。Cilium 運算子會從設定的 `clusterPoolIpv4PodCIDRList` IP 空間內配置 IP 位址配量。您的 Pod CIDR 不得與內部部署節點 CIDR、VPC CIDR 或 Kubernetes Service CIDR 重疊。
   + 基於每個節點所需的 Pod 來設定 `clusterPoolIpv4MaskSize`。例如，對於每個節點 128 個 Pod 的 /25 區段大小，其值為 `25`。
   + 在叢集上部署 Cilium 之後，請勿變更 `clusterPoolIpv4PodCIDRList` 或 `clusterPoolIpv4MaskSize`，如需詳細資訊，請參閱[展開叢集集區](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool)。
   + 如果您以 kube-proxy 取代模式執行 Cilium，請在 Helm 值中設定 `kubeProxyReplacement: "true"`，並確保您並未在與 Cilium 相同的節點上執行現有的 kube-proxy 部署。
   + 以下範例會停用 Cilium 用於 L7 網路政策和傳入的 Envoy Layer 7 (L7) 代理。如需詳細資訊，請參閱[設定混合節點的 Kubernetes 網路政策](hybrid-nodes-network-policies.md)及[Cilium Ingress 和 Cilium Gateway 概觀](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium)。
   + 以下範例會設定 `loadBalancer.serviceTopology`：如果您為服務設定服務流量分佈，其會正確運作，則此為 `true`。如需詳細資訊，請參閱[設定服務流量分佈](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-service-traffic-distribution)。
   + 如需 Cilium 的 Helm 值的完整清單，請參閱 Cilium 文件中的 [Helm 參考](https://docs.cilium.io/en/stable/helm-reference/)。

     ```
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
     ipam:
       mode: cluster-pool
       operator:
         clusterPoolIPv4MaskSize: 25
         clusterPoolIPv4PodCIDRList:
         - POD_CIDR
     loadBalancer:
       serviceTopology: true
     operator:
       affinity:
         nodeAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
             nodeSelectorTerms:
             - matchExpressions:
               - key: eks.amazonaws.com/compute-type
                 operator: In
                 values:
                   - hybrid
       unmanagedPodWatcher:
         restart: false
     loadBalancer:
       serviceTopology: true
     envoy:
       enabled: false
     kubeProxyReplacement: "false"
     ```

1. 在叢集上安裝 Cilium。
   + `CILIUM_VERSION` 將 取代為 Cilium 版本 （例如 `1.17.9-0`或 `1.18.3-0`)。建議為 Cilium 次要版本使用最新的修補程式版本。
   + 確保您的節點符合您所選版本的核心需求。Cilium v1.18.3 需要 Linux 核心 >= 5.10。
   + 如果您使用特定的 kubeconfig 檔案，請搭配 Helm 安裝命令使用 `--kubeconfig` 旗標。

     ```
     helm install cilium oci://public.ecr.aws/eks/cilium/cilium \
         --version CILIUM_VERSION \
         --namespace kube-system \
         --values cilium-values.yaml
     ```

1. 使用下列命令來確認您的 Cilium 安裝是否成功。您應該會看到 `cilium-operator` 部署和每個混合節點上執行的 `cilium-agent`。此外，您的混合節點現在應該處於狀態 `Ready`。如需如何設定 Cilium BGP 將 Pod CIDR 公告至內部部署網路的相關資訊，請繼續 [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md)。

   ```
   kubectl get pods -n kube-system
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   cilium-jjjn8                      1/1     Running   0          11m
   cilium-operator-d4f4d7fcb-sc5xn   1/1     Running   0          11m
   ```

   ```
   kubectl get nodes
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION
   mi-04a2cf999b7112233   Ready    <none>   19m   v1.31.0-eks-a737599
   ```

## 在混合節點上升級 Cilium
<a name="hybrid-nodes-cilium-upgrade"></a>

升級 Cilium 部署之前，請仔細檢閱 [Cilium 升級文件](https://docs.cilium.io/en/v1.17/operations/upgrade/)和升級備註，以了解目標 Cilium 版本中的變更。

1. 請確保您已在命令列環境中安裝了 `helm` CLI。如需安裝說明，請參閱 [Helm 文件](https://helm.sh/docs/intro/quickstart/)。

1. 執行 Cilium 升級預檢檢查。使用目標 Cilium 版本取代 `CILIUM_VERSION`。我們建議您為 Cilium 次要版本執行最新的修補程式版本。您可以在 Cilium 文件的[穩定版本部分](https://github.com/cilium/cilium#stable-releases)中找到指定次要 Cilium 版本的最新修補程式版本。

   ```
   helm install cilium-preflight oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace=kube-system \
     --set preflight.enabled=true \
     --set agent=false \
     --set operator.enabled=false
   ```

1. 套用 `cilium-preflight.yaml` 之後，請確保 `READY` Pod 的數量與執行的 Cilium Pod 數量相同。

   ```
   kubectl get ds -n kube-system | sed -n '1p;/cilium/p'
   ```

   ```
   NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   cilium                    2         2         2       2            2           <none>          1h20m
   cilium-pre-flight-check   2         2         2       2            2           <none>          7m15s
   ```

1. 只要就緒 Pod 的數量相等，請確保 Cilium 預檢部署也標記為 READY 1/1。如果顯示 READY 0/1，請參閱 [CNP 驗證](https://docs.cilium.io/en/v1.17/operations/upgrade/#cnp-validation)部分並解決部署問題，然後再繼續升級。

   ```
   kubectl get deployment -n kube-system cilium-pre-flight-check -w
   ```

   ```
   NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
   cilium-pre-flight-check   1/1     1            0           12s
   ```

1. 刪除預檢

   ```
   helm uninstall cilium-preflight --namespace kube-system
   ```

1. 在執行 `helm upgrade` 命令之前，請保留 `existing-cilium-values.yaml` 中部署的值，或在執行升級命令時，使用 `--set` 命令列選項進行設定。升級操作會覆寫 Cilium ConfigMap，因此請務必在升級時傳遞您的組態值。

   ```
   helm get values cilium --namespace kube-system -o yaml > existing-cilium-values.yaml
   ```

1. 在一般叢集操作期間，所有 Cilium 元件都應執行相同的版本。下列步驟說明如何將所有元件從一個穩定版本升級至更新的穩定版本。從一個次要版本升級到另一個次要版本時，建議先升級到現有 Cilium 次要版本的最新修補程式版本。若要將中斷降至最低，請將 `upgradeCompatibility` 選項設定為您在此叢集中安裝的初始 Cilium 版本。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium --version CILIUM_VERSION \
     --namespace kube-system \
     --set upgradeCompatibility=1.X \
     -f existing-cilium-values.yaml
   ```

1. (選用) 如果您因為問題而需要復原升級，請執行下列命令。

   ```
   helm history cilium --namespace kube-system
   helm rollback cilium [REVISION] --namespace kube-system
   ```

## 從混合節點中刪除 Cilium
<a name="hybrid-nodes-cilium-delete"></a>

1. 執行下列命令以從叢集中解除安裝所有 Cilium 元件。請注意，解除安裝 CNI 可能會影響節點和 Pod 的運作狀態，因此不應在生產叢集上執行。

   ```
   helm uninstall cilium --namespace kube-system
   ```

   從叢集移除 CNI 時，依預設不會移除 Cilium 設定的介面和路由，如需詳細資訊，請參閱 [GitHub 問題](https://github.com/cilium/cilium/issues/34289)。

1. 若要清除磁碟上的組態檔案和資源，如果您使用標準組態目錄，則可以移除 GitHub 上 Cilium 儲存庫中 [`cni-uninstall.sh` 指令碼](https://github.com/cilium/cilium/blob/main/plugins/cilium-cni/cni-uninstall.sh)顯示的檔案。

1. 若要從叢集中移除 Cilium 自訂資源定義 (CRD)，您可以執行下列命令。

   ```
   kubectl get crds -oname | grep "cilium" | xargs kubectl delete
   ```

# 設定混合節點的附加元件
<a name="hybrid-nodes-add-ons"></a>

此頁面說明在 Amazon EKS 混合節點上執行 AWS 附加元件和社群附加元件的考量。若要進一步了解 Amazon EKS 附加元件，以及從叢集建立、升級和移除附加元件的程序，請參閱 [Amazon EKS 附加元件](eks-add-ons.md)。除非此頁面另有說明，否則對於具有混合節點的 Amazon EKS 叢集，建立、升級和移除 Amazon EKS 附加元件的程序與在 AWS Cloud 中執行節點的 Amazon EKS 叢集相同。只有此頁面中包含的附加元件已經過驗證，可與 Amazon EKS 混合節點相容。

下列 AWS 附加元件與 Amazon EKS 混合節點相容。


|  AWS 附加元件 | 相容的附加元件版本 | 
| --- | --- | 
|  kube-proxy  |  v1.25.14-eksbuild.2 及更新版本  | 
|  CoreDNS  |  v1.9.3-eksbuild.7 及更新版本  | 
|   AWS Distro for OpenTelemetry (ADOT)  |  v0.102.1-eksbuild.2 及更新版本  | 
|  CloudWatch 可觀測性代理程式  |  v2.2.1-eksbuild.1 及更新版本  | 
|  EKS Pod 身分識別代理程式  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/hybrid-nodes-add-ons.html)  | 
|  節點監控代理程式  |  v1.2.0-eksbuild.1 及更新版本  | 
|  CSI 快照控制器  |  v8.1.0-eksbuild.1 及更新版本  | 
|   AWS Kubernetes 專用私有 CA 連接器  |  v1.6.0-eksbuild.1 及更新版本  | 
|  Amazon FSx CSI 驅動程式  |  v1.7.0-eksbuild.1 及更高版本  | 
|   AWS Secrets Store CSI 驅動程式提供者  |  v2.1.1-eksbuild.1 及更高版本  | 

下列社群附加元件與 Amazon EKS 混合節點相容。若要進一步了解社群附加元件，請參閱 [社群附加元件](community-addons.md)。


| 社群附加元件 | 相容的附加元件版本 | 
| --- | --- | 
|  Kubernetes 指標伺服器  |  v0.7.2-eksbuild.1 及更新版本  | 
|  cert-manager  |  v1.17.2-eksbuild.1 及更新版本  | 
|  Prometheus Node Exporter  |  v1.9.1-eksbuild.2 及更新版本  | 
|  kube-state-metrics  |  v2.15.0-eksbuild.4 及更新版本  | 
|  外部 DNS  |  v0.19.0-eksbuild.1 及更新版本  | 

除了上表中的 Amazon EKS 附加元件之外，[Amazon Managed Service for Prometheus 收集器](prometheus.md)及適用於[應用程式傳入](alb-ingress.md) (HTTP) 和[負載平衡](network-load-balancing.md) (TCP/UDP) 的 [AWS Load Balancer 控制器](aws-load-balancer-controller.md)可與混合節點相容。

有些 AWS 附加元件和社群附加元件與 Amazon EKS 混合節點不相容。這些附加元件的最新版本對套用至混合節點的預設 `eks.amazonaws.com/compute-type: hybrid` 標籤具有反親和性規則。這可以防止它們在叢集中部署時於混合節點上執行。如果您有在 AWS Cloud 中同時執行混合節點和節點的叢集，您可以將叢集中的這些附加元件部署到在 AWS Cloud 中執行的節點。Amazon VPC CNI 與混合節點不相容，並且支援 Cilium 和 Calico 作為 Amazon EKS 混合節點的容器聯網介面 (CNI)。如需詳細資訊，請參閱[設定混合節點的 CNI](hybrid-nodes-cni.md)。

## AWS 附加元件
<a name="hybrid-nodes-add-ons-aws-add-ons"></a>

以下各節說明在混合節點上執行相容 AWS 附加元件與其他 Amazon EKS 運算類型之間的差異。

## kube-proxy 和 CoreDNS
<a name="hybrid-nodes-add-ons-core"></a>

當您使用 AWS API 和 AWS SDKs 建立 EKS 叢集時，EKS 預設會將 kube-proxy 和 CoreDNS 安裝為自我管理附加元件，包括來自 AWS CLI 的 。建立叢集後，您可以使用 Amazon EKS 附加元件覆寫這些附加元件。如需有關 [在 Amazon EKS 叢集中管理 `kube-proxy`](managing-kube-proxy.md) 和 [管理 Amazon EKS 叢集中的 CoreDNS for DNS](managing-coredns.md) 的詳細資訊，請參閱 EKS 文件。如果您執行的混合模式叢集同時具有混合節點和 AWS Cloud 中的節點， AWS 建議在混合節點上至少有一個 CoreDNS 複本，並在 AWS Cloud 中的節點上至少有一個 CoreDNS 複本。如需組態步驟，請參閱 [設定 CoreDNS 複本](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-coredns)。

## CloudWatch 可觀測性代理程式
<a name="hybrid-nodes-add-ons-cw"></a>

CloudWatch 可觀測性代理程式運算子使用 [Webhook](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)。如果您在混合節點上執行運算子，您的內部部署 Pod CIDR 必須在內部部署網路上可路由，而且您必須使用遠端 Pod 網路設定 EKS 叢集。如需詳細資訊，請參閱[設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

節點層級指標不適用於混合節點，因為 [CloudWatch Container Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContainerInsights.html) 取決於節點層級指標的[執行個體中繼資料服務](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html) (IMDS) 的可用性。叢集、工作負載、Pod 和容器層級指標可供混合節點使用。

遵循[使用 Amazon CloudWatch 可觀測性安裝 CloudWatch 代理程式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Observability-EKS-addon.html)中所述的步驟安裝附加元件後，必須先更新附加元件資訊清單，然後代理程式才能在混合節點上成功執行。編輯叢集上的 `amazoncloudwatchagents` 資源，以新增 `RUN_WITH_IRSA` 環境變數，如下所示。

```
kubectl edit amazoncloudwatchagents -n amazon-cloudwatch cloudwatch-agent
```

```
apiVersion: v1
items:
- apiVersion: cloudwatch.aws.amazon.com/v1alpha1
  kind: AmazonCloudWatchAgent
  metadata:
    ...
    name: cloudwatch-agent
    namespace: amazon-cloudwatch
    ...
  spec:
    ...
    env:
    - name: RUN_WITH_IRSA # <-- Add this
      value: "True" # <-- Add this
    - name: K8S_NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
          ...
```

## 適用於混合節點的 Amazon Managed Prometheus 受管收集器
<a name="hybrid-nodes-add-ons-amp"></a>

Amazon Managed Service for Prometheus (AMP) 受管收集器包含一個抓取器，並且可從 Amazon EKS 叢集中的資源探索和收集指標。AMP 會為您管理抓取器，而無需自行管理任何執行個體、代理程式或抓取器。

您可以使用 AMP 受管收集器，而無需任何其他專屬於混合節點的組態。不過，混合節點上應用程式的指標端點必須可從 VPC 連線，包括從 VPC 路由到遠端 Pod 網路 CIDR 及內部部署防火牆中開啟的連接埠。此外，您的叢集必須擁有[私有叢集端點存取權](cluster-endpoint.md)。

請遵循《Amazon Managed Service for Prometheus 使用者指南》中的[使用 AWS 受管收集器](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector-how-to.html)中的步驟。

## AWS Distro for OpenTelemetry (ADOT)
<a name="hybrid-nodes-add-ons-adot"></a>

您可以使用 AWS Distro for OpenTelemetry (ADOT) 附加元件，從混合節點上執行的應用程式收集指標、日誌和追蹤資料。ADOT 使用許可 [Webhook](https://kubernetes.io/docs/reference/access-authn-authz/webhook/) 來變更和驗證收集器自訂資源請求。如果您在混合節點上執行 ADOT 運算子，您的內部部署 Pod CIDR 必須在內部部署網路上可路由，而且您必須使用遠端 Pod 網路設定 EKS 叢集。如需詳細資訊，請參閱[設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

請遵循 [AWS Distro for OpenTelemetry 文件中的使用 EKS 附加元件的 Distro for OpenTelemetry 入門](https://aws-otel.github.io/docs/getting-started/adot-eks-add-on)中的步驟。 * AWS OpenTelemetry* 

## AWS Load Balancer控制器
<a name="hybrid-nodes-add-ons-lbc"></a>

您可以使用[AWS Load Balancer控制器](aws-load-balancer-controller.md)和 Application Load Balancer (ALB) 或 Network Load Balancer (NLB) 搭配混合節點上`ip`工作負載的目標類型。搭配 ALB 或 NLB 使用的 IP 目標必須可路由 AWS。The AWS Load Balancer 控制器也使用 [Webhook](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)。如果您在混合節點上執行 AWS Load Balancer控制器運算子，您的內部部署 Pod CIDR 必須在內部部署網路上可路由，而且您必須使用遠端 Pod 網路設定 EKS 叢集。如需詳細資訊，請參閱[設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

若要安裝 AWS Load Balancer控制器，請遵循 [AWS Application Load Balancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-alb)或 中的步驟[AWS Network Load Balancer](hybrid-nodes-load-balancing.md#hybrid-nodes-service-lb-nlb)。

對於使用 ALB 的傳入，您必須指定以下註釋。如需詳細資訊，請參閱[透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md)。

```
alb.ingress.kubernetes.io/target-type: ip
```

對於使用 NLB 的負載平衡，您必須指定以下註釋。如需詳細資訊，請參閱[透過 Network Load Balancer 路由 TCP 與 UDP 流量](network-load-balancing.md)。

```
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
```

## EKS Pod 身分識別代理程式
<a name="hybrid-nodes-add-ons-pod-id"></a>

**注意**  
若要在執行 Bottlerocket 的混合節點上成功部署 EKS Pod 身分識別代理程式附加元件，請確保您的 Bottlerocket 版本至少為 v1.39.0。在混合節點環境中，較早版本的 Bottlerocket 不支援 Pod 身分識別代理程式。

原始 Amazon EKS Pod Identity Agent DaemonSet 依賴節點上 EC2 IMDS 的可用性來取得所需的 AWS 登入資料。由於 IMDS 不適用於混合節點，因此從版本 1.3.3-eksbuild.1 開始，Pod 身分識別代理程式附加元件可選擇性地部署會掛載所需憑證的 DaemonSet。執行 Bottlerocket 的混合節點需要不同的方法來掛載憑證，並且版本 1.3.7-eksbuild.2 開始，Pod 身分識別代理程式附加元件可選擇性地部署專門以 Bottlerocket 混合節點為目標的 DaemonSet。下列各節說明啟用選用 DaemonSets 的程序。

### Ubuntu/RHEL/AL2023
<a name="_ubunturhelal2023"></a>

1. 若要在 Ubuntu/RHEL/Al2023 混合節點上使用 Pod 身分識別代理程式，請在 `nodeadm` 組態的混合區段中設定 `enableCredentialsFile: true`，如下所示：

   ```
   apiVersion: node.eks.aws/v1alpha1
   kind: NodeConfig
   spec:
       hybrid:
           enableCredentialsFile: true # <-- Add this
   ```

   這將設定 `nodeadm` 以建立憑證檔案，而該檔案可在 `/eks-hybrid/.aws/credentials` 下的節點上進行設定，且，在其將由 `eks-pod-identity-agent` Pod 使用。此登入資料檔案將包含將定期重新整理的臨時 AWS 登入資料。

1. 更新*每個*節點上的 `nodeadm` 組態後，請使用 `nodeConfig.yaml` 執行下列 `nodeadm init` 命令，以將混合節點加入 Amazon EKS 叢集。如果您的節點先前已加入叢集，仍請再次執行 `nodeadm init` 命令。

   ```
   nodeadm init -c file://nodeConfig.yaml
   ```

1. 使用 CLI 或 ，`eks-pod-identity-agent`在啟用混合節點支援的情況下安裝 AWS AWS 管理主控台。

   1.  AWS CLI：從您用來管理叢集的機器中，執行下列命令來安裝 `eks-pod-identity-agent`，並啟用混合節點的支援。使用您叢集的名稱取代 `my-cluster`。

      ```
      aws eks create-addon \
          --cluster-name my-cluster \
          --addon-name eks-pod-identity-agent \
          --configuration-values '{"daemonsets":{"hybrid":{"create": true}}}'
      ```

   1.  AWS 管理主控台：如果您透過 AWS 主控台安裝 Pod Identity Agent 附加元件，請將下列項目新增至選用組態，以部署以混合節點為目標的 DaemonSet。

      ```
      {"daemonsets":{"hybrid":{"create": true}}}
      ```

### Bottlerocket
<a name="_bottlerocket"></a>

1. 若要在 Bottlerocket 混合節點上使用 Pod 身分識別代理程式，請將 `--enable-credentials-file=true` 旗標新增至用於 Bottlerocket 引導容器使用者資料的命令，如 [使用 Bottlerocket 連接混合節點](hybrid-nodes-bottlerocket.md) 中所述。

   1. 如果您使用的是 SSM 憑證提供者，則您的命令應該如下所示：

      ```
      eks-hybrid-ssm-setup --activation-id=<activation-id> --activation-code=<activation-code> --region=<region> --enable-credentials-file=true
      ```

   1. 如果您使用的是 IAM Roles Anywhere 憑證提供者，則您的命令應該如下所示：

      ```
      eks-hybrid-iam-ra-setup --certificate=<certificate> --key=<private-key> --enable-credentials-file=true
      ```

      這將設定引導指令碼，以在 `/var/eks-hybrid/.aws/credentials` 下的節點上建立憑證，且其將由 `eks-pod-identity-agent` Pod 使用。此登入資料檔案將包含將定期重新整理的臨時 AWS 登入資料。

1. 使用 CLI 或 ，`eks-pod-identity-agent`在已啟用 Bottlerocket AWS 混合節點的支援下安裝 AWS 管理主控台。

   1.  AWS CLI：從您用來管理叢集的機器中，執行下列命令來安裝 `eks-pod-identity-agent` ，並啟用 Bottlerocket 混合節點的支援。使用您叢集的名稱取代 `my-cluster`。

      ```
      aws eks create-addon \
          --cluster-name my-cluster \
          --addon-name eks-pod-identity-agent \
          --configuration-values '{"daemonsets":{"hybrid-bottlerocket":{"create": true}}}'
      ```

   1.  AWS 管理主控台：如果您透過 AWS 主控台安裝 Pod Identity Agent 附加元件，請將下列項目新增至選用組態，以部署以 Bottlerocket 混合節點為目標的 DaemonSet。

      ```
      {"daemonsets":{"hybrid-bottlerocket":{"create": true}}}
      ```

## CSI 快照控制器
<a name="hybrid-nodes-add-ons-csi-snapshotter"></a>

從版本 開始`v8.1.0-eksbuild.2`，[CSI 快照控制器附加元件](csi-snapshot-controller.md)會套用混合節點的軟性反親和性規則，偏好控制器在與 Amazon EKS 控制平面相同的 AWS 區域中於 EC2 `deployment`上執行。在`deployment`與 Amazon EKS 控制平面相同的 AWS 區域中聯合放置 可改善延遲。

## 社群附加元件
<a name="hybrid-nodes-add-ons-community"></a>

以下各節說明在混合節點上執行相容的社群附加元件與其他 Amazon EKS 運算類型之間的差異。

## Kubernetes 指標伺服器
<a name="hybrid-nodes-add-ons-metrics-server"></a>

控制平面需要連接指標伺服器的 Pod IP (如果啟用 hostNetwork，則為節點 IP)。因此，除非您在 hostNetwork 模式下執行指標伺服器，否則您必須在建立 Amazon EKS 叢集時設定遠端 Pod 網路，而且必須使 Pod IP 位址可路由。使用 CNI 實作邊界閘道協定 (BGP) 是讓您的 Pod IP 位址可路由的常見方式之一。

## cert-manager
<a name="hybrid-nodes-add-ons-cert-manager"></a>

 `cert-manager` 會使用 [Webhook](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)。如果您在混合節點上執行 `cert-manager`，您的內部部署 Pod CIDR 必須在內部部署網路上可路由，而且您必須使用遠端 Pod 網路設定 EKS 叢集。如需詳細資訊，請參閱[設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

# 設定混合節點的 Webhook
<a name="hybrid-nodes-webhooks"></a>

此頁面詳細說明使用混合節點執行 Webhook 的考量事項。Webhook 可用於 Kubernetes 應用程式和開放原始碼專案，例如 AWS Load Balancer 控制器和 CloudWatch 可觀測性代理程式，以在執行時期執行變更和驗證功能。

 **可路由的 Pod 網路** 

如果您能夠在內部部署網路上讓內部部署 Pod CIDR 可路由，則可在混合節點上執行 Webhook。您可以使用多種技術，讓您的內部部署 Pod CIDR 在內部部署網路上可路由，包括邊界閘道協定 (BGP)、靜態路由或其他自訂路由解決方案。BGP 是建議的解決方案，因為它比需要自訂或手動路由組態的替代解決方案更具可擴展性且更容易管理。AWS 支援 Cilium 和 Calico 的 BGP 功能，可用於公告 Pod CIDR，如需詳細資訊，請參閱 [設定混合節點的 CNI](hybrid-nodes-cni.md) 和 [可路由的遠端 Pod CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)。

 **不可路由的 Pod 網路** 

如果您*無法*在使內部部署 Pod CIDR 在內部部署網路上可路由並且需要執行 Webhook，則建議您在與混合節點相同的 EKS 叢集中的雲端節點上，執行所有 Webhook。

## 混合模式叢集的考量事項
<a name="hybrid-nodes-considerations-mixed-mode"></a>

 *混合模式叢集*定義為具有混合節點和在 AWS 雲端中執行的節點的 EKS 叢集。執行混合模式叢集時，請考量下列建議：
+ 在 AWS 雲端的節點上執行 VPC CNI，並在混合節點上執行 Cilium 或 Calico。在 AWS 雲端中的節點上執行時，AWS 不支援 Cilium 和 Calico。
+ 設定 Webhook 以在 AWS 雲端中的節點上執行。如需如何為 AWS 和社群附加元件設定 Webhook，請參閱 [為附加元件設定 Webhook](#hybrid-nodes-webhooks-add-ons)。
+ 如果您的應用程式需要在 AWS 雲端中的節點上執行的 Pod 以便直接與在混合節點上執行的 Pod 通訊 (「東西通訊」)，並且您在 AWS 雲端中的節點上使用 VPC CNI，以及在混合節點上使用 Cilium 或 Calico，則您的內部部署 Pod CIDR 必須在內部部署網路上可路由。
+ 在 AWS 雲端中的節點上執行至少一個 CoreDNS 複本，並在混合節點上執行至少一個 CoreDNS 複本。
+ 設定服務流量分佈，以將服務流量保持在其來源區域的本機。如需有關服務流量分佈的詳細資訊，請參閱 [設定服務流量分佈](#hybrid-nodes-mixed-service-traffic-distribution)。
+ 如果您針對混合節點上執行的工作負載流量使用 AWS Application Load Balancers (ALB) 或 Network Load Balancer (NLB)，則搭配 ALB 或 NLB 使用的 IP 目標必須可從 AWS 路由。
+ 指標伺服器附加元件需要從 EKS 控制平面連線至指標伺服器 Pod IP 位址。如果您在混合節點上執行指標伺服器附加元件，則您的內部部署 Pod CIDR 必須在內部部署網路上可路由。
+ 若要使用 Amazon Managed Service for Prometheus (AMP) 受管收集器收集混合節點的指標，您的內部部署 Pod CIDR 必須在內部部署網路上可路由。或者，您可以將 AMP 受管收集器用於在 AWS 雲端中執行的 EKS 控制平面指標和資源，並且使用 AWS Distro for OpenTelemetry (ADOT) 附加元件來收集混合節點的指標。

## 設定混合模式叢集
<a name="hybrid-nodes-mixed-mode"></a>

若要檢視叢集上執行的變更和驗證 Webhook，您可以在叢集的 EKS 主控台的**資源**面板中檢視**延伸模組**模源類型，或者也可以使用下列命令。EKS 還會在叢集可觀測性儀表板中報告 Webhook 指標，如需詳細資訊，請參閱 [使用可觀測性儀表板監控您的叢集](observability-dashboard.md)。

```
kubectl get mutatingwebhookconfigurations
```

```
kubectl get validatingwebhookconfigurations
```

### 設定服務流量分佈
<a name="hybrid-nodes-mixed-service-traffic-distribution"></a>

執行混合模式叢集時，建議您使用[https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution)，以將服務流量保持在其來源區域的本機。服務流量分佈 (適用於 EKS 中的 Kubernetes 版本 1.31 及更新版本) 是[拓撲感知路由](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/)的建議解決方案，因為其可預測性更高。透過服務流量分佈，區域中運作狀態良好的端點將會接收該區域的所有流量。利用拓撲感知路由，每個服務都必須符合該區域中的數個條件，以套用自訂路由，否則其會將流量平均路由至所有端點。

如果您使用 Cilium 作為 CNI，則必須執行 CNI，並將 `enable-service-topology` 設定為 `true` 以啟用服務流量分佈。您可以使用 Helm 安裝旗標 `--set loadBalancer.serviceTopology=true` 傳遞此組態，或者，您也可以使用 Cilium CLI 命令 `cilium config set enable-service-topology true` 更新現有的安裝。更新現有安裝的組態後，必須重新啟動在每個節點上執行的 Cilium 代理程式。

下節會顯示如何為 CoreDNS 服務設定服務流量分佈的範例，並且建議您為叢集中的所有服務啟用相同的服務流量分佈，以避免意外的跨環境流量。

### 設定 CoreDNS 複本
<a name="hybrid-nodes-mixed-coredns"></a>

如果您執行具有混合節點和 AWS 雲端中的節點的混合模式叢集，則建議您在混合節點上至少有一個 CoreDNS 複本，並在 AWS 雲端中的節點上至少有一個 CoreDNS 複本。為了防止混合模式叢集設定中的延遲和網路問題，您可以將 CoreDNS 服務設定為偏好使用具有[服務流量分佈](https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution)的最接近的 CoreDNS 複本。

 *服務流量分佈* (適用於 EKS 中的 Kubernetes 版本 1.31 及更新版本) 是[拓撲感知路由](https://kubernetes.io/docs/concepts/services-networking/topology-aware-routing/)的建議解決方案，因為其可預測性更高。在服務流量分佈中，區域中運作狀態良好的端點將會接收該區域的所有流量。在拓撲感知路由中，每個服務都必須符合該區域中的數個條件，以套用自訂路由，否則其會將流量平均路由至所有端點。下列步驟可設定服務流量分佈。

如果您使用 Cilium 作為 CNI，則必須執行 CNI，並將 `enable-service-topology` 設定為 `true` 以啟用服務流量分佈。您可以使用 Helm 安裝旗標 `--set loadBalancer.serviceTopology=true` 傳遞此組態，或者，您也可以使用 Cilium CLI 命令 `cilium config set enable-service-topology true` 更新現有的安裝。更新現有安裝的組態後，必須重新啟動在每個節點上執行的 Cilium 代理程式。

1. 為每個混合節點新增一個拓撲區域標籤，例如 `topology.kubernetes.io/zone: onprem`。或者，您可以在 `nodeadm` 組態中指定標籤，進而在 `nodeadm init` 階段設定標籤，請參閱 [用於自訂 kubelet 的節點組態 (選用)](hybrid-nodes-nodeadm.md#hybrid-nodes-nodeadm-kubelet)。請注意，在 AWS 雲端中執行的節點會自動取得套用至它們的拓撲區域標籤，而這些節點可對應至節點的可用區域 (AZ)。

   ```
   kubectl label node hybrid-node-name topology.kubernetes.io/zone=zone
   ```

1. 使用拓撲區域金鑰將 `podAntiAffinity` 新增至 CoreDNS 部署。或者，您可以在安裝過程中使用 EKS 附加元件設定 CoreDNS 部署。

   ```
   kubectl edit deployment coredns -n kube-system
   ```

   ```
   spec:
     template:
       spec:
         affinity:
          ...
           podAntiAffinity:
             preferredDuringSchedulingIgnoredDuringExecution:
             - podAffinityTerm:
                 labelSelector:
                   matchExpressions:
                   - key: k8s-app
                     operator: In
                     values:
                     - kube-dns
                 topologyKey: kubernetes.io/hostname
               weight: 100
             - podAffinityTerm:
                 labelSelector:
                   matchExpressions:
                   - key: k8s-app
                     operator: In
                     values:
                     - kube-dns
                 topologyKey: topology.kubernetes.io/zone
               weight: 50
         ...
   ```

1. 將設定 `trafficDistribution: PreferClose` 新增至 `kube-dns` 服務組態，以啟用服務流量分佈。

   ```
   kubectl patch svc kube-dns -n kube-system --type=merge -p '{
     "spec": {
       "trafficDistribution": "PreferClose"
     }
   }'
   ```

1. 您可以檢視 `kube-dns` 服務的端點配量，進而確認已啟用服務流量分佈。您的端點配量必須顯示拓撲區域標籤的 `hints`，進而確認已啟用服務流量分佈。如果您沒有看到每個端點地址的 `hints`，則不會啟用服務流量分佈。

   ```
   kubectl get endpointslice -A | grep "kube-dns"
   ```

   ```
   kubectl get endpointslice [.replaceable]`kube-dns-<id>`  -n kube-system -o yaml
   ```

   ```
   addressType: IPv4
   apiVersion: discovery.k8s.io/v1
   endpoints:
   - addresses:
     - <your-hybrid-node-pod-ip>
     hints:
       forZones:
       - name: onprem
     nodeName: <your-hybrid-node-name>
     zone: onprem
   - addresses:
     - <your-cloud-node-pod-ip>
     hints:
       forZones:
       - name: us-west-2a
     nodeName: <your-cloud-node-name>
     zone: us-west-2a
   ```

### 為附加元件設定 Webhook
<a name="hybrid-nodes-webhooks-add-ons"></a>

下列附加元件使用 Webhook 並支援與混合節點搭配使用。
+  AWS Load Balancer 控制器
+ CloudWatch 可觀測性代理程式
+  AWS Distro for OpenTelemetry (ADOT)
+  `cert-manager` 

請參閱下列各節，以了解如何設定這些附加元件所使用的 Webhook，以便在 AWS 雲端中的節點上執行。

#### AWS Load Balancer 控制器
<a name="hybrid-nodes-mixed-lbc"></a>

若要在混合模式叢集設定中使用 AWS Load Balancer 控制器，您必須在 AWS 雲端中的節點上執行控制器。為此，請將下列內容新增至 Helm 值組態，或使用 EKS 附加元件組態指定值。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
```

#### CloudWatch 可觀測性代理程式
<a name="hybrid-nodes-mixed-cwagent"></a>

CloudWatch 可觀測性代理程式附加元件具有使用 Webhook 的 Kubernetes Operator。若要在混合模式叢集設定中對 AWS 雲端中的節點執行運算子，請編輯 CloudWatch 可觀測性代理程式運算子組態。您無法在安裝過程中使用 Helm 和 EKS 附加元件設定運算子親和性 (請參閱 [Container-roadmap 問題 \$12431](https://github.com/aws/containers-roadmap/issues/2431))。

```
kubectl edit -n amazon-cloudwatch deployment amazon-cloudwatch-observability-controller-manager
```

```
spec:
  ...
  template:
    ...
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: eks.amazonaws.com/compute-type
                operator: NotIn
                values:
                - hybrid
```

#### AWS Distro for OpenTelemetry (ADOT)
<a name="hybrid-nodes-mixed-adot"></a>

AWS Distro for OpenTelemetry (ADOT) 附加元件具有使用 Webhook 的 Kubernetes Operator。若要在混合模式叢集設定中對 AWS 雲端中的節點執行運算子，請將下列項目新增至 Helm 值組態，或使用 EKS 附加元件組態指定值。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
```

如果您的 Pod CIDR 在內部部署網路上不可路由，則 ADOT 收集器必須在混合節點上執行，以從混合節點和在其上執行的工作負載中抓取指標。為此，請編輯自訂資源定義 (CRD)。

```
kubectl -n opentelemetry-operator-system edit opentelemetrycollectors.opentelemetry.io adot-col-prom-metrics
```

```
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: In
            values:
            - hybrid
```

您可以將下列 `relabel_configs` 新增至 ADOT 收集器 CRD 組態中的每個 `scrape_configs`，從而將 ADOT 收集器設定為僅從混合節點和混合節點上執行的資源抓取指標。

```
relabel_configs:
  - action: keep
    regex: hybrid
    source_labels:
    - __meta_kubernetes_node_label_eks_amazonaws_com_compute_type
```

ADOT 附加元件具有一個先決條件要求，即為 ADOT 運算子 Webhook 所使用的 TLS 憑證安裝 `cert-manager`。`cert-manager` 也會執行 Webhook，而且您可以使用下列 Helm 值組態，將其設定為在 AWS 雲端中的節點上執行。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
webhook:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
cainjector:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
startupapicheck:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
```

#### `cert-manager`
<a name="hybrid-nodes-mixed-cert-manager"></a>

`cert-manager` 附加元件會執行 Webhook，並且您可以使用下列 Helm 值組態，將其設定為在 AWS 雲端中的節點上執行。

```
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: eks.amazonaws.com/compute-type
          operator: NotIn
          values:
          - hybrid
webhook:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
cainjector:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
startupapicheck:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: eks.amazonaws.com/compute-type
            operator: NotIn
            values:
            - hybrid
```

# 設定混合節點的代理
<a name="hybrid-nodes-proxy"></a>

如果您在內部部署環境中為離開資料中心或邊緣環境的流量使用代理伺服器，則您需要將節點和叢集分別設定為使用代理伺服器。

叢集  
在叢集上，您需要設定 `kube-proxy`，以使用您的代理伺服器。在建立 Amazon EKS 叢集後，您必須設定 `kube-proxy`。

節點  
在節點上，您必須設定作業系統、`containerd`、`kubelet` 和 Amazon SSM 代理程式，以使用您的代理伺服器。您可以在作業系統映像的建置程序期間或在每個混合節點上執行 `nodeadm init` 之前，進行這些變更。

## 節點層級組態
<a name="_node_level_configuration"></a>

您必須在作業系統映像中或在每個混合節點上執行 `nodeadm init` 之前，套用下列組態。

### `containerd` 代理組態
<a name="_containerd_proxy_configuration"></a>

 `containerd` 是 Kubernetes 的預設容器管理執行時期。如果您使用代理進行網際網路存取，則必須設定 `containerd`，如此才能提取 Kubernetes 和 Amazon EKS 所需的容器映像。

使用下列內容，在 `/etc/systemd/system/containerd.service.d` 目錄中稱為 `http-proxy.conf` 的每個混合節點上，建立檔案。將 `proxy-domain` 和 `port` 取代為您環境的值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### 來自使用者資料的 `containerd` 組態
<a name="_containerd_configuration_from_user_data"></a>

需要為此檔案建立 `containerd.service.d` 目錄。您需要重新載入 systemd，才能在不重新啟動的情況下取得組態檔案。在 AL2023 中，當您的指令碼執行時，服務可能已在執行中，因此您還需要將其重新啟動。

```
mkdir -p /etc/systemd/system/containerd.service.d
echo '[Service]' > /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/containerd.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart containerd
```

### `kubelet` 代理組態
<a name="_kubelet_proxy_configuration"></a>

 `kubelet` 是在每個 Kubernetes 節點上執行的 Kubernetes 節點代理程式，且需負責管理其上執行的節點和 Pod。如果您在內部部署環境中使用代理，則必須設定 `kubelet`，如此才能與您 Amazon EKS 叢集的公有或私有端點通訊。

使用下列內容，在 `/etc/systemd/system/kubelet.service.d/` 目錄中稱為 `http-proxy.conf` 的每個混合節點上，建立檔案。將 `proxy-domain` 和 `port` 取代為您環境的值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### 來自使用者資料的 `kubelet` 組態
<a name="_kubelet_configuration_from_user_data"></a>

必須為此檔案建立 `kubelet.service.d` 目錄。您需要重新載入 systemd，才能在不重新啟動的情況下取得組態檔案。在 AL2023 中，當您的指令碼執行時，服務可能已在執行中，因此您還需要將其重新啟動。

```
mkdir -p /etc/systemd/system/kubelet.service.d
echo '[Service]' > /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://proxy-domain:port"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> /etc/systemd/system/kubelet.service.d/http-proxy.conf
systemctl daemon-reload
systemctl restart kubelet
```

### `ssm` 代理組態
<a name="_ssm_proxy_configuration"></a>

 `ssm` 是可用於初始化混合節點的憑證提供者之一。`ssm` 負責使用 AWS 來進行驗證以及產生 `kubelet` 使用的臨時憑證。如果您在內部部署環境中使用代理，並使用 `ssm` 作為節點上的憑證提供者，則必須設定 `ssm`，以便其可以與 Amazon SSM 服務端點通訊。

根據作業系統，在下列路徑中稱為 `http-proxy.conf` 的每個混合節點上，建立檔案
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d/http-proxy.conf` 
+ Amazon Linux 2023 和 Red Hat Enterprise Linux - `/etc/systemd/system/amazon-ssm-agent.service.d/http-proxy.conf` 

使用下列內容填入檔案。將 `proxy-domain` 和 `port` 取代為您環境的值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

#### 來自使用者資料的 `ssm` 組態
<a name="_ssm_configuration_from_user_data"></a>

必須為此檔案建立 `ssm` systemd 服務檔案目錄。目錄路徑取決於節點上使用的作業系統。
+ Ubuntu - `/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service.d` 
+ Amazon Linux 2023 和 Red Hat Enterprise Linux - `/etc/systemd/system/amazon-ssm-agent.service.d` 

根據節點上使用的作業系統，取代以下重新啟動命令中的 systemd 服務名稱
+ Ubuntu - `snap.amazon-ssm-agent.amazon-ssm-agent` 
+ Amazon Linux 2023 和 Red Hat Enterprise Linux - `amazon-ssm-agent` 

```
mkdir -p systemd-service-file-directory
echo '[Service]' > [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTP_PROXY=http://[.replaceable]#proxy-domain:port"' >> systemd-service-file-directory/http-proxy.conf
echo 'Environment="HTTPS_PROXY=http://[.replaceable]#proxy-domain:port"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
echo 'Environment="NO_PROXY=localhost"' >> [.replaceable]#systemd-service-file-directory/http-proxy.conf
systemctl daemon-reload
systemctl restart [.replaceable]#systemd-service-name
```

### 作業系統代理組態
<a name="_operating_system_proxy_configuration"></a>

如果您使用代理進行網際網路存取，則必須將作業系統設定為能夠從作業系統的套件管理工具提取混合節點相依性。

 **Ubuntu** 

1. 透過以下命令，設定 `snap` 以使用您的代理：

   ```
   sudo snap set system proxy.https=http://proxy-domain:port
   sudo snap set system proxy.http=http://proxy-domain:port
   ```

1. 若要啟用 `apt` 的代理，請在 `/etc/apt/` 目錄中建立稱為 `apt.conf` 的檔案。將代理網域和連接埠取代為您環境的值。

   ```
   Acquire::http::Proxy "http://proxy-domain:port";
   Acquire::https::Proxy "http://proxy-domain:port";
   ```

 **Amazon Linux 2023** 

1. 設定 `dnf` 以使用您的代理。為您的環境建立具有代理網域和連接埠值的檔案 `/etc/dnf/dnf.conf`。

   ```
   proxy=http://proxy-domain:port
   ```

 **Red Hat Enterprise Linux** 

1. 設定 `yum` 以使用您的代理。為您的環境建立具有代理網域和連接埠值的檔案 `/etc/yum.conf`。

   ```
   proxy=http://proxy-domain:port
   ```

### IAM Roles Anywhere 代理組態
<a name="_iam_roles_anywhere_proxy_configuration"></a>

IAM Roles Anywhere 憑證提供者服務負責在搭配 `enableCredentialsFile` 旗標使用 IAM Roles Anywhere 時重新整理憑證 (請參閱 [EKS Pod 身分識別代理程式](hybrid-nodes-add-ons.md#hybrid-nodes-add-ons-pod-id))。如果您在內部部署環境中使用代理，則必須設定服務，以便其可以與 IAM Roles Anywhere 端點通訊。

使用下列內容，在 `/etc/systemd/system/aws_signing_helper_update.service.d/` 目錄中，建立稱為 `http-proxy.conf` 的檔案。將 `proxy-domain` 和 `port` 取代為您環境的值。

```
[Service]
Environment="HTTP_PROXY=http://proxy-domain:port"
Environment="HTTPS_PROXY=http://proxy-domain:port"
Environment="NO_PROXY=localhost"
```

## 整個叢集的組態
<a name="_cluster_wide_configuration"></a>

建立 Amazon EKS 叢集之後以及在每個混合節點上執行 `nodeadm init` 之前，必須套用本節中的組態。

### kube-proxy 代理組態
<a name="_kube_proxy_proxy_configuration"></a>

當您的混合節點加入叢集時，Amazon EKS 會自動在每個混合節點上安裝 `kube-proxy` 作為 DaemonSet。`kube-proxy` 會在由 Amazon EKS 叢集上的 Pod 支援的 服務之間啟用路由。若要設定每個主機，`kube-proxy` 需要對您的 Amazon EKS 叢集端點進行 DNS 解析。

1. 使用下列命令編輯 `kube-proxy` DaemonSet

   ```
   kubectl -n kube-system edit ds kube-proxy
   ```

   這將會在設定的編輯器上開啟 `kube-proxy` DaemonSet 定義。

1. 新增 `HTTP_PROXY` 和 `HTTPS_PROXY` 的環境變數。請注意，`NODE_NAME` 環境變數應該已存在於您的組態中。將 `proxy-domain` 和 `port` 取代為您環境的值。

   ```
   containers:
     - command:
       - kube-proxy
       - --v=2
       - --config=/var/lib/kube-proxy-config/config - --hostname-override=$(NODE_NAME)
       env:
       - name: HTTP_PROXY
         value: http://proxy-domain:port
       - name: HTTPS_PROXY
         value: http://proxy-domain:port
       - name: NODE_NAME
         valueFrom:
           fieldRef:
             apiVersion: v1
             fieldPath: spec.nodeName
   ```

# 設定混合節點的 Cilium BGP
<a name="hybrid-nodes-cilium-bgp"></a>

本主題會說明如何設定 Amazon EKS 混合節點的 Cilium 邊界閘道協定 (BGP)。Cilium 的 BGP 功能稱為 [Cilium BGP 控制平面](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane/)，且可用於向內部部署網路公告 Pod 和服務地址。如需讓 Pod CIDR 在內部部署網路上可路由的替代方法，請參閱 [可路由的遠端 Pod CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)。

## 設定 Cilium BGP
<a name="hybrid-nodes-cilium-bgp-configure"></a>

### 先決條件
<a name="_prerequisites"></a>
+ 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。

### 程序
<a name="_procedure"></a>

1. 若要搭配 Cilium 使用 BGP 向內部部署網路公告 Pod 或服務地址，Cilium 必須與 `bgpControlPlane.enabled: true` 一起安裝。如果您要為現有的 Cilium 部署啟用 BGP，則必須重新啟動 Cilium 運算子才能套用 BGP 組態 (如果先前尚未啟用 BGP)。您可以在 Helm 值中將 `operator.rollOutPods` 設定為 `true`，以在 Helm 安裝/升級程序中重新啟動 Cilium 運算子。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --set bgpControlPlane.enabled=true
   ```

1. 確認 Cilium 運算子和代理程式已重新啟動並正在執行。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

1. 建立稱為 `cilium-bgp-cluster.yaml` 的檔案，其中具有 `CiliumBGPClusterConfig` 定義。您可能需要向您的網路管理員取得下列資訊。
   + 針對執行 Cilium 的節點，使用 ASN 設定 `localASN`。
   + 針對內部部署路由器，使用 ASN 設定 `peerASN`。
   + 使用執行 Cilium 的每個節點將與之對等的內部部署路由器 IP，設定 `peerAddress`。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPClusterConfig
     metadata:
       name: cilium-bgp
     spec:
       nodeSelector:
         matchExpressions:
         - key: eks.amazonaws.com/compute-type
           operator: In
           values:
           - hybrid
       bgpInstances:
       - name: "rack0"
         localASN: NODES_ASN
         peers:
         - name: "onprem-router"
           peerASN: ONPREM_ROUTER_ASN
           peerAddress: ONPREM_ROUTER_IP
           peerConfigRef:
             name: "cilium-peer"
     ```

1. 將 Cilium BGP 叢集組態套用至您的叢集。

   ```
   kubectl apply -f cilium-bgp-cluster.yaml
   ```

1. 使用定義 BGP 對等組態的 `CiliumBGPPeerConfig` 資源建立名為 `cilium-bgp-peer.yaml` 的檔案。多個對等可以共用相同的組態，並提供常見 `CiliumBGPPeerConfig` 資源的參考。如需組態選項的完整清單，請參閱 Cilium 文件中的 [BGP 對等組態](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane-v2/#bgp-peer-configuration)。

   下列 Cilium 對等設定的值必須符合您要對等互連的內部部署路由器的值。
   + 設定 `holdTimeSeconds`，其可決定在宣告工作階段關閉之前 BGP 對等等待保持連線或更新訊息的時長。預設為 90 秒。
   + 設定 `keepAliveTimeSeconds`，其可決定 BGP 對等是否仍可連線，以及 BGP 工作階段是否在作用中。預設為 30 秒。
   + 設定 `restartTimeSeconds`，其可決定 Cilium 的 BGP 控制平面在重新啟動後預期重新建立 BGP 工作階段的時間。預設值為 120 秒。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPPeerConfig
     metadata:
       name: cilium-peer
     spec:
       timers:
         holdTimeSeconds: 90
         keepAliveTimeSeconds: 30
       gracefulRestart:
         enabled: true
         restartTimeSeconds: 120
       families:
         - afi: ipv4
           safi: unicast
           advertisements:
             matchLabels:
               advertise: "bgp"
     ```

1. 將 Cilium BGP 對等組態套用至您的叢集。

   ```
   kubectl apply -f cilium-bgp-peer.yaml
   ```

1. 使用 `CiliumBGPAdvertisement` 資源建立名為 `cilium-bgp-advertisement-pods.yaml` 的檔案，以向內部部署網路公告 Pod CIDR。
   + `CiliumBGPAdvertisement` 資源可用於定義與其相關聯的廣告類型和屬性。以下範例會將 Cilium 設定為僅公告 Pod CIDR。如需設定 Cilium 以公告服務地址的詳細資訊，請參閱 [服務類型 LoadBalancer](hybrid-nodes-ingress.md#hybrid-nodes-ingress-cilium-loadbalancer) 和 [Cilium 叢集內負載平衡](hybrid-nodes-load-balancing.md#hybrid-nodes-service-lb-cilium) 中的範例。
   + 執行 Cilium 代理程式的每個混合節點皆與上游已啟用 BGP 的路由器對等。當 Cilium 的 `advertisementType` 設定為 `PodCIDR` (如以下範例所示) 時，每個節點都會公告其擁有的 Pod CIDR 範圍。如需詳細資訊，請參閱 Cilium 文件中的 [BGP 公告組態](https://docs.cilium.io/en/stable/network/bgp-control-plane/bgp-control-plane-v2/#bgp-advertisements)。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPAdvertisement
     metadata:
       name: bgp-advertisement-pods
       labels:
         advertise: bgp
     spec:
       advertisements:
         - advertisementType: "PodCIDR"
     ```

1. 將 Cilium BGP 公告組態套用至您的叢集。

   ```
   kubectl apply -f cilium-bgp-advertisement-pods.yaml
   ```

1. 您可以使用 `cilium bgp peers` 命令，確認 BGP 對等互連與 [Cilium CLI](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli) 搭配運作。您應該會在環境的輸出中看到正確的值，且工作階段狀態為 `established`。如需有關故障診斷的詳細資訊，請參閱 Cilium 文件中的[故障診斷和操作指南](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane/#troubleshooting-and-operation-guide)。

   在以下範例中，有五個執行 Cilium 代理程式的混合節點，且每個節點將會公告其擁有的 Pod CIDR 範圍。

   ```
   cilium bgp peers
   ```

   ```
   Node                   Local AS    Peer AS               Peer Address        Session State   Uptime     Family         Received   Advertised
   mi-026d6a261e355fba7   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m58s   ipv4/unicast   1          2
   mi-082f73826a163626e   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h19m12s   ipv4/unicast   1          2
   mi-09183e8a3d755abf6   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m47s   ipv4/unicast   1          2
   mi-0d78d815980ed202d   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h19m12s   ipv4/unicast   1          2
   mi-0daa253999fe92daa   NODES_ASN
                     ONPREM_ROUTER_ASN
                     ONPREM_ROUTER_IP    established     1h18m58s   ipv4/unicast   1          2
   ```

   ```
   cilium bgp routes
   ```

   ```
   Node                   VRouter       Prefix           NextHop   Age         Attrs
   mi-026d6a261e355fba7   NODES_ASN     10.86.2.0/26     0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-082f73826a163626e   NODES_ASN     10.86.2.192/26   0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-09183e8a3d755abf6   NODES_ASN     10.86.2.64/26    0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0d78d815980ed202d   NODES_ASN     10.86.2.128/26   0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0daa253999fe92daa   NODES_ASN     10.86.3.0/26     0.0.0.0   1h16m46s   [{Origin: i} {Nexthop: 0.0.0.0}]
   ```

# 設定混合節點的 Kubernetes Ingress
<a name="hybrid-nodes-ingress"></a>

本主題會說明如何為在 Amazon EKS 混合節點上執行的工作負載設定 Kubernetes Ingress。[Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) 會將叢集外部的 HTTP 和 HTTPS 路由公開至叢集內的服務。若要利用傳入資源，需要 Kubernetes Ingress 控制器來設定可提供網路流量的聯網基礎結構和元件。

 AWS 對於在 EKS 混合節點上執行的工作負載，support AWS Application Load Balancer (ALB) 和適用於 Kubernetes Ingress 的 Cilium。使用 ALB 還是 Cilium for Ingress 的決定取決於應用程式流量的來源。如果應用程式流量來自 AWS 區域， AWS 建議使用 AWS ALB 和 AWS Load Balancer控制器。如果應用程式流量來自本機內部部署或邊緣環境， AWS 建議使用 Cilium 的內建輸入功能，可在您的環境中搭配或不搭配負載平衡器基礎設施使用。

![\[EKS 混合節點傳入\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-ingress.png)


## AWS Application Load Balancer
<a name="hybrid-nodes-ingress-alb"></a>

對於在混合節點上執行的工作負載，您可以搭配目標類型 `ip` 使用 [AWS Load Balancer 控制器](aws-load-balancer-controller.md)和 Application Load Balancer (ALB)。使用目標類型 `ip` 時，ALB 可繞過服務層網路路徑，將流量直接轉送至 Pod。若要讓 ALB 達到混合節點上的 Pod IP 目標，您的內部部署 Pod CIDR 必須在內部部署網路上可路由。此外， AWS Load Balancer控制器使用 Webhook，並且需要從 EKS 控制平面直接通訊。如需詳細資訊，請參閱[設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

### 考量事項
<a name="_considerations"></a>
+ 如需 AWS Application Load Balancer和 AWS Load Balancer控制器的詳細資訊[搭配 Helm 的 Install AWS Load Balancer 控制器](lbc-helm.md)，請參閱[透過 Application Load Balancer 路由應用程式與 HTTP 流量](alb-ingress.md)和。
+ 如需如何在 AWS Application Load Balancer[負載平衡器和網路負載平衡器之間選擇的相關資訊，請參閱負載平衡器的最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html)。 AWS Load Balancer
+ 如需可以使用應用程式[AWS Load Balancer為輸入資源設定的註釋清單，請參閱負載平衡器控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/ingress/annotations/)輸入註釋。 AWS Application Load Balancer

### 先決條件
<a name="_prerequisites"></a>
+ 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。
+ 遵循 [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md) 中的指示啟用 Cilium BGP 控制平面。如果您不想使用 BGP，則必須使用替代方法，以讓內部部署 Pod CIDR 在內部部署網路上可路由。如果您未讓內部部署 Pod CIDR 可路由，則 ALB 將無法註冊或聯絡您的 Pod IP 目標。
+ 已在命令列環境中安裝 Helm，如需詳細資訊，請參閱[安裝 Helm 說明](helm.md)。
+ 已在命令列環境中安裝 eksctl，如需詳細資訊，請參閱[安裝 eksctl 說明](install-kubectl.md#eksctl-install-update)。

### 程序
<a name="_procedure"></a>

1. 下載 AWS Load Balancer控制器的 IAM 政策，允許其代表您呼叫 AWS APIs。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
   ```

1. 使用上一個步驟中下載的政策，建立 IAM 政策。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```

1. 將叢集名稱 (`CLUSTER_NAME`)、 AWS 區域 (`AWS_REGION`) 和 AWS 帳戶 ID (`AWS_ACCOUNT_ID`) 的值取代為您的設定，然後執行下列命令。

   ```
   eksctl create iamserviceaccount \
       --cluster=CLUSTER_NAME \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region AWS_REGION \
       --approve
   ```

1. 新增 eks-charts Helm Chart 儲存庫並更新您的本機 Helm 儲存庫，以確保您擁有最近的圖表。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

   ```
   helm repo update eks
   ```

1. 安裝 AWS Load Balancer控制器。將叢集名稱 (`CLUSTER_NAME`)、 AWS 區域 (`AWS_REGION`)、VPC ID (`VPC_ID`) 和 AWS Load Balancer控制器 Helm Chart 版本 (`AWS_LBC_HELM_VERSION`) 的值取代為您的設定，並執行下列命令。如果您在 AWS 雲端中同時執行混合模式叢集與混合節點和節點，則可以遵循 中的指示，在雲端節點上執行 AWS Load Balancer控制器[AWS Load Balancer 控制器](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc)。
   + 您可以透過執行 `helm search repo eks/aws-load-balancer-controller --versions` 來尋找最新版本的 Helm Chart。

     ```
     helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
       -n kube-system \
       --version AWS_LBC_HELM_VERSION \
       --set clusterName=CLUSTER_NAME \
       --set region=AWS_REGION \
       --set vpcId=VPC_ID \
       --set serviceAccount.create=false \
       --set serviceAccount.name=aws-load-balancer-controller
     ```

1. 確認已成功安裝 AWS Load Balancer控制器。

   ```
   kubectl get -n kube-system deployment aws-load-balancer-controller
   ```

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

1. 建立範例應用程式。以下範例會使用 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 範例微服務應用程式。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 使用下列內容建立名為 `my-ingress-alb.yaml` 的檔案。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       alb.ingress.kubernetes.io/load-balancer-name: "my-ingress-alb"
       alb.ingress.kubernetes.io/target-type: "ip"
       alb.ingress.kubernetes.io/scheme: "internet-facing"
       alb.ingress.kubernetes.io/healthcheck-path: "/details/1"
   spec:
     ingressClassName: alb
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. 將傳入組態套用至叢集。

   ```
   kubectl apply -f my-ingress-alb.yaml
   ```

1. 為您的傳入資源佈建 ALB 可能需要幾分鐘的時間。佈建 ALB 後，您的傳入資源將會為其指派一個與 ALB 部署的 DNS 名稱對應的地址。地址的格式為 `<alb-name>-<random-string>.<region>.elb.amazonaws.com`。

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS   HOSTS   ADDRESS                                                     PORTS   AGE
   my-ingress   alb     *       my-ingress-alb-<random-string>.<region>.elb.amazonaws.com   80      23m
   ```

1. 使用 ALB 的地址存取服務。

   ```
   curl -s http//my-ingress-alb-<random-string>.<region>.elb.amazonaws.com:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
     "details": "This is the details page"
   }
   ```

## Cilium Ingress 和 Cilium Gateway 概觀
<a name="hybrid-nodes-ingress-cilium"></a>

Cilium 的傳入功能內建於 Cilium 的架構中，並且可以使用 Kubernetes 傳入 API 或閘道 API 進行管理。如果您沒有現有的輸入資源， AWS 建議您從閘道 API 開始，因為它是定義和管理 Kubernetes 網路資源更明確且靈活的方法。[Kubernetes 閘道 API](https://gateway-api.sigs.k8s.io/) 旨在標準化 Kubernetes 叢集中傳入、負載平衡和服務網格的網路資源的定義和管理方式。

當您啟用 Cilium 的傳入或閘道功能時，Cilium 運算子會協調叢集中的傳入/閘道物件，而每個節點上的 Envoy 代理會處理第 7 層 (L7) 網路流量。Cilium 不會直接佈建傳入/閘道基礎結構，例如負載平衡器。如果您計劃搭配負載平衡器使用 Cilium Ingress/Gateway，則必須使用負載平衡器的工具，通常是傳入或閘道控制器，來部署和管理負載平衡器的基礎結構。

對於傳入/閘道流量，Cilium 會處理核心網路流量和 L3/L4 政策強制執行，而整合式 Envoy 代理則負責處理 L7 網路流量。藉助 Cilium Ingress/Gateway，Envoy 負責套用 L7 路由規則、政策和請求操作、進階流量管理 (例如流量分割和鏡像) 以及 TLS 終止和起始。根據預設，Cilium 的 Envoy 代理會部署為單獨的 DaemonSet (`cilium-envoy`)，這樣一來，Envoy 和 Cilium 代理程式可分別進行更新、擴展和管理。

如需 Cilium Ingress 和 Cilium Gateway 運作方式的詳細資訊，請參閱 Cilium 文件中的 [Cilium Ingress](https://docs.cilium.io/en/stable/network/servicemesh/ingress/) 和 [Cilium Gateway](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/) 頁面。

## Cilium Ingress 和 Gateway 比較
<a name="hybrid-nodes-ingress-cilium-comparison"></a>

下表總結了截至 **Cilium 版本 1.17.x** 的 Cilium Ingress 和 Cilium Gateway 功能。


| 功能 | Ingress | 閘道 | 
| --- | --- | --- | 
|  服務類型 LoadBalancer  |  是  |  是  | 
|  服務類型 NodePort  |  是  |  否1   | 
|  主機網路  |  是  |  是  | 
|  共用的負載平衡器  |  是  |  是  | 
|  專用負載平衡器  |  是  |  否2   | 
|  網路政策  |  是  |  是  | 
|  通訊協定  |  第 7 層 (HTTP(S)、gRPC)  |  第 7 層 (HTTP(S)、gRPC)3   | 
|  TLS 傳遞  |  是  |  是  | 
|  流量管理  |  路徑和主機路由  |  路徑和主機路由、URL 重新導向和重寫、流量分割、標頭修改  | 

 1 Cilium Gateway 計劃在 Cilium 版本 1.18.x 中對 NodePort 服務提供支援 ([\$127273](https://github.com/cilium/cilium/pull/27273))

 2 Cilium Gateway 支援專用負載平衡器 ([\$125567](https://github.com/cilium/cilium/issues/25567))

 3 Cilium Gateway 支援 TCP/UDP ([\$121929](https://github.com/cilium/cilium/issues/21929))

## 安裝 Cilium Gateway
<a name="hybrid-nodes-ingress-cilium-gateway-install"></a>

### 考量事項
<a name="_considerations_2"></a>
+ 必須設定 Cilium，即將 `nodePort.enabled` 設定為 `true`，如以下範例所示。如果您使用的是 Cilium 的 kube-proxy 取代功能，則不需要將 `nodePort.enabled` 設定為 `true`。
+ 必須設定 Cilium，即將 `envoy.enabled` 設定為 `true`，如以下範例所示。
+ Cilium Gateway 可以部署在負載平衡器 (預設) 或主機網路模式中。
+ 在負載平衡器模式下使用 Cilium Gateway 時，必須在閘道資源上設定`service.beta.kubernetes.io/aws-load-balancer-type: "external"`註釋，以防止舊版 AWS 雲端提供者為 Cilium 為閘道資源建立的 LoadBalancer 類型的服務建立 Classic Load Balancer。 LoadBalancer 
+ 在主機網路模式中使用 Cilium Gateway 時，即會停用 LoadBalancer 類型的服務模式。對於沒有負載平衡器基礎結構的環境，主機網路模式非常有用，如需詳細資訊，請參閱 [主機網路](#hybrid-nodes-ingress-cilium-host-network)。

### 先決條件
<a name="_prerequisites_2"></a>

1. 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](helm.md)。

1. 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。

### 程序
<a name="_procedure_2"></a>

1. 安裝 Kubernetes 閘道 API 自訂資源定義 (CRD)。

   ```
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml
   kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.2.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
   ```

1. 建立稱為 `cilium-gateway-values.yaml` 的檔案，其中具有以下內容。以下範例會將 Cilium Gateway 設定為使用預設負載平衡器模式，以及為僅在混合節點上執行的 Envoy 代理使用單獨 `cilium-envoy` DaemonSet。

   ```
   gatewayAPI:
     enabled: true
     # uncomment to use host network mode
     # hostNetwork:
     #   enabled: true
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. 將 Helm 值套用至叢集。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-gateway-values.yaml
   ```

1. 確認 Cilium 運算子、代理程式和 Envoy Pod 正在執行。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## 設定 Cilium Gateway
<a name="hybrid-nodes-ingress-cilium-gateway-configure"></a>

將 `gatewayClassName` 設定為 `cilium`，即可在閘道物件上啟用 Cilium Ingress。Cilium 為閘道資源建立的服務可以使用閘道物件上的欄位進行設定。閘道控制器用來設定負載平衡器基礎結構的常見註釋可以透過閘道物件的 `infrastructure` 欄位進行設定。使用 Cilium 的 LoadBalancer IPAM 時 (請參閱 [服務類型 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) 中的範例)，可在閘道物件的 `addresses` 欄位中設定用於 LoadBalancer 類型的服務的 IP 位址。如需閘道組態的詳細資訊，請參閱 [Kubernetes 閘道 API 規格](https://gateway-api.sigs.k8s.io/reference/spec/#gateway)。

```
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
spec:
  gatewayClassName: cilium
  infrastructure:
    annotations:
      service.beta.kubernetes.io/...
      service.kubernetes.io/...
  addresses:
  - type: IPAddress
    value: <LoadBalancer IP address>
  listeners:
  ...
```

Cilium 和 Kubernetes Gateway 規格支援 GatewayClass、閘道、HTTPRoute、GRPCRoute 和 ReferenceGrant 資源。
+ 如需可用欄位的清單，請參閱 [HTTPRoute](https://gateway-api.sigs.k8s.io/api-types/httproute/HTTPRoute) 和 [GRPCRoute](https://gateway-api.sigs.k8s.io/api-types/grpcroute/GRPCRoute) 規格。
+ 請參閱以下 [部署 Cilium Gateway](#hybrid-nodes-ingress-cilium-gateway-deploy) 章節中的範例及 [Cilium 文件](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#examples)中的範例，以了解如何使用和設定這些資源。

## 部署 Cilium Gateway
<a name="hybrid-nodes-ingress-cilium-gateway-deploy"></a>

1. 建立範例應用程式。以下範例會使用 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 範例微服務應用程式。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 確認應用程式已成功執行。

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 使用下列內容建立名為 `my-gateway.yaml` 的檔案。以下範例使用 `service.beta.kubernetes.io/aws-load-balancer-type: "external"`註釋，以防止舊版 AWS 雲端提供者為 Cilium 為閘道資源建立的 LoadBalancer 類型服務建立 Classic Load Balancer。 LoadBalancer 

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     infrastructure:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
     listeners:
     - protocol: HTTP
       port: 80
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

1. 將閘道資源套用至您的叢集。

   ```
   kubectl apply -f my-gateway.yaml
   ```

1. 確認閘道資源和對應的服務已建立。在此階段，閘道資源的 `ADDRESS` 欄位預期不會填入 IP 位址或主機名稱，而且閘道資源的 LoadBalancer 類型的服務同樣不會指派 IP 位址或主機名稱。

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS   PROGRAMMED   AGE
   my-gateway   cilium             True         10s
   ```

   ```
   kubectl get svc cilium-gateway-my-gateway
   ```

   ```
   NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
   cilium-gateway-my-gateway   LoadBalancer   172.16.227.247   <pending>     80:30912/TCP   24s
   ```

1. 繼續 [服務類型 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) 以設定閘道資源，進而使用 Cilium Load Balancer IPAM 配置的 IP 位址；以及使用 [服務類型 NodePort](#hybrid-nodes-ingress-cilium-nodeport) 或 [主機網路](#hybrid-nodes-ingress-cilium-host-network) 以設定閘道資源，進而使用 NodePort 或主機網路位址。

## 安裝 Cilium Ingress
<a name="hybrid-nodes-ingress-cilium-ingress-install"></a>

### 考量事項
<a name="_considerations_3"></a>
+ 必須設定 Cilium，即將 `nodePort.enabled` 設定為 `true`，如以下範例所示。如果您使用的是 Cilium 的 kube-proxy 取代功能，則不需要將 `nodePort.enabled` 設定為 `true`。
+ 必須設定 Cilium，即將 `envoy.enabled` 設定為 `true`，如以下範例所示。
+ 將 `ingressController.loadbalancerMode` 設定為 `dedicated` 時，Cilium 會為每個傳入資源建立專用服務。將 `ingressController.loadbalancerMode` 設定為 `shared` 時，Cilium 會為叢集中的所有傳入資源建立 LoadBalancer 類型的共用服務。使用 `shared` 負載平衡器模式時，共用服務的設定 (例如 `labels`、`annotations`、`type` 和 `loadBalancerIP`) 可在 Helm 值的 `ingressController.service` 區段中進行設定。如需詳細資訊，請參閱 [Cilium Helm 值參考](https://github.com/cilium/cilium/blob/v1.17.6/install/kubernetes/cilium/values.yaml#L887)。
+ 將 `ingressController.default` 設定 `true` 時，Cilium 會設定為叢集的預設傳入控制器，即使未在傳入資源上指定 `ingressClassName`，也會建立傳入項目。
+ Cilium Ingress 可以部署在負載平衡器 (預設)、節點連接埠或主機網路模式中。在主機網路模式下安裝 Cilium 時，會停用 LoadBalancer 類型的服務和 NodePort 類型的服務模式。如需詳細資訊，請參閱[主機網路](#hybrid-nodes-ingress-cilium-host-network)。
+ 一律在 Helm 值`service.beta.kubernetes.io/aws-load-balancer-type: "external"`中`ingressController.service.annotations`將 設定為 ，以防止舊版 AWS 雲端提供者為 [Cilium Helm Chart](https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/templates/cilium-ingress-service.yaml) 建立的預設`cilium-ingress`服務建立 Classic Load Balancer。

### 先決條件
<a name="_prerequisites_3"></a>

1. 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](helm.md)。

1. 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。

### 程序
<a name="_procedure_3"></a>

1. 建立稱為 `cilium-ingress-values.yaml` 的檔案，其中具有以下內容。以下範例會將 Cilium Ingress 設定為使用預設負載平衡器 `dedicated` 模式，以及為僅在混合節點上執行的 Envoy 代理使用單獨 `cilium-envoy` DaemonSet。

   ```
   ingressController:
     enabled: true
     loadbalancerMode: dedicated
     service:
       annotations:
         service.beta.kubernetes.io/aws-load-balancer-type: "external"
   nodePort:
     enabled: true
   envoy:
     enabled: true
     affinity:
       nodeAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
           nodeSelectorTerms:
           - matchExpressions:
             - key: eks.amazonaws.com/compute-type
               operator: In
               values:
               - hybrid
   ```

1. 將 Helm 值套用至叢集。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     --values cilium-ingress-values.yaml
   ```

1. 確認 Cilium 運算子、代理程式和 Envoy Pod 正在執行。

   ```
   kubectl -n kube-system get pods --selector=app.kubernetes.io/part-of=cilium
   ```

   ```
   NAME                               READY   STATUS    RESTARTS   AGE
   cilium-envoy-5pgnd                 1/1     Running   0          6m31s
   cilium-envoy-6fhg4                 1/1     Running   0          6m30s
   cilium-envoy-jskrk                 1/1     Running   0          6m30s
   cilium-envoy-k2xtb                 1/1     Running   0          6m31s
   cilium-envoy-w5s9j                 1/1     Running   0          6m31s
   cilium-grwlc                       1/1     Running   0          4m12s
   cilium-operator-68f7766967-5nnbl   1/1     Running   0          4m20s
   cilium-operator-68f7766967-7spfz   1/1     Running   0          4m20s
   cilium-pnxcv                       1/1     Running   0          6m29s
   cilium-r7qkj                       1/1     Running   0          4m12s
   cilium-wxhfn                       1/1     Running   0          4m1s
   cilium-z7hlb                       1/1     Running   0          6m30s
   ```

## 設定 Cilium Ingress
<a name="hybrid-nodes-ingress-cilium-ingress-configure"></a>

將 `ingressClassName` 設定為 `cilium`，即可在 Ingress 物件上啟用 Cilium Ingress。當使用 `dedicated` 負載平衡器模式時，Cilium 為傳入資源建立的服務可藉助傳入物件上的注釋進行設定，而當使用 `shared` 負載平衡器模式時，則可在 Cilium/Helm 組態中進行設定。傳入控制器通常會使用這些註釋來設定負載平衡器基礎結構或服務的其他屬性，例如服務類型、負載平衡器模式、連接埠和 TLS 傳遞。重要註釋如下所述。如需支援的註釋的完整清單，請參閱 Cilium 文件中的 [Cilium Ingress 註釋](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#supported-ingress-annotations)。


| 註釋 | Description | 
| --- | --- | 
|   `ingress.cilium.io/loadbalancer-mode`   |   `dedicated`：每個傳入資源的 LoadBalancer 類型的專用服務 (預設)。  `shared`：所有傳入資源的 LoadBalancer 類型的單一服務。  | 
|   `ingress.cilium.io/service-type`   |   `LoadBalancer`：服務屬於 LoadBalancer 類型 (預設)  `NodePort`：服務屬於 NodePort。  | 
|   `service.beta.kubernetes.io/aws-load-balancer-type`   |   `"external"`：防止舊版 AWS 雲端提供者為 LoadBalancer 類型的服務佈建 Classic Load Balancer。 LoadBalancer  | 
|   `lbipam.cilium.io/ips`   |  要從 Cilium LoadBalancer IPAM 配置的 IP 位址的清單  | 

Cilium 和 Kubernetes Ingress 規格可支援傳入路徑的精確、字首和實作特定相符規則。Cilium 支援 regex 作為其實作專屬相符規則。如需詳細資訊，請參閱 Cilium 文件中的[傳入路徑類型和優先順序](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#ingress-path-types-and-precedence)和[路徑類型範例](https://docs.cilium.io/en/stable/network/servicemesh/path-types/)，以及此頁面 [部署 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-deploy) 不分中的範例。

範例 Cilium Ingress 物件如下所示。

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    service.beta.kubernetes.io/...
    service.kubernetes.io/...
spec:
  ingressClassName: cilium
  rules:
  ...
```

## 部署 Cilium Ingress
<a name="hybrid-nodes-ingress-cilium-ingress-deploy"></a>

1. 建立範例應用程式。以下範例會使用 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 範例微服務應用程式。

   ```
   kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
   ```

1. 確認應用程式已成功執行。

   ```
   kubectl get pods
   ```

   ```
   NAME                              READY   STATUS    RESTARTS   AGE
   details-v1-766844796b-9965p       1/1     Running   0          81s
   productpage-v1-54bb874995-jmc8j   1/1     Running   0          80s
   ratings-v1-5dc79b6bcd-smzxz       1/1     Running   0          80s
   reviews-v1-598b896c9d-vj7gb       1/1     Running   0          80s
   reviews-v2-556d6457d-xbt8v        1/1     Running   0          80s
   reviews-v3-564544b4d6-cpmvq       1/1     Running   0          80s
   ```

1. 使用下列內容建立名為 `my-ingress.yaml` 的檔案。以下範例使用 `service.beta.kubernetes.io/aws-load-balancer-type: "external"`註釋，以防止舊版 AWS 雲端提供者為 Cilium 為輸入資源建立的 LoadBalancer 類型的服務建立 Classic Load Balancer。 LoadBalancer 

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. 將傳入資源套用至您的叢集。

   ```
   kubectl apply -f my-ingress.yaml
   ```

1. 確認傳入資源和對應的服務已建立。在此階段，傳入資源的 `ADDRESS` 欄位預期不會填入 IP 位址或主機名稱，而且傳入資源的 LoadBalancer 類型的共用或專用服務同樣不會指派 IP 位址或主機名稱。

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS   PORTS   AGE
   my-ingress   cilium   *                 80      8s
   ```

   對於負載平衡器模式 `shared` 

   ```
   kubectl -n kube-system get svc cilium-ingress
   ```

   ```
   NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress   LoadBalancer   172.16.217.48   <pending>     80:32359/TCP,443:31090/TCP   10m
   ```

   對於負載平衡器模式 `dedicated` 

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   LoadBalancer   172.16.193.15   <pending>     80:32088/TCP,443:30332/TCP   25s
   ```

1. 繼續 [服務類型 LoadBalancer](#hybrid-nodes-ingress-cilium-loadbalancer) 以設定傳入資源，進而使用 Cilium Load Balancer IPAM 配置的 IP 位址；以及使用 [服務類型 NodePort](#hybrid-nodes-ingress-cilium-nodeport) 或 [主機網路](#hybrid-nodes-ingress-cilium-host-network) 以設定傳入資源，進而使用 NodePort 或主機網路位址。

## 服務類型 LoadBalancer
<a name="hybrid-nodes-ingress-cilium-loadbalancer"></a>

### 現有的負載平衡器基礎結構
<a name="_existing_load_balancer_infrastructure"></a>

根據預設，對於 Cilium Ingress 和 Cilium Gateway，Cilium 會為傳入/閘道資源建立 LoadBalancer 類型的 Kubernetes Service。Cilium 建立的服務屬性可以透過傳入和閘道資源進行設定。當您建立傳入或閘道資源時，傳入或閘道的外部公開 IP 位址或主機名稱會從負載平衡器基礎結構進行配置，並且通常由傳入或閘道控制器進行佈建。

許多傳入和閘道控制器會使用註釋來偵測和設定負載平衡器基礎結構。如上述範例所示，這些傳入和閘道控制器的註釋會在傳入或閘道資源上設定。如需其支援的註釋，請參閱傳入或閘道控制器的文件，而如需熱門控制器的清單，則請參閱 [Kubernetes Ingress 文件](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)和 [Kubernetes Gateway 文件](https://gateway-api.sigs.k8s.io/implementations/)。

**重要**  
Cilium Ingress 和 Gateway 不能與 EKS 混合節點的 AWS Load Balancer控制器和 AWS 網路負載平衡器 (NLBs) 搭配使用。嘗試將其一起使用會導致未註冊的目標，因為當 NLB 的 `target-type` 設定為 `ip` 時，NLB 會嘗試直接連接至支援 LoadBalancer 類型的服務的 Pod IP (要求搭配使用 NLB 與在 EKS 混合節點上執行的工作負載)。

### 沒有負載平衡器基礎結構
<a name="_no_load_balancer_infrastructure"></a>

如果您的環境中沒有負載平衡器基礎結構和對應的傳入/閘道控制器，則可以將傳入/閘道資源和對應的 LoadBalancer 類型的服務設定為使用 Cilium [Load Balancer IP 位址管理](https://docs.cilium.io/en/stable/network/lb-ipam/) (LB IPAM) 配置的 IP 位址。Cilium LB IPAM 可以使用來自您內部部署環境的已知 IP 位址範圍進行設定，並且可以使用 Cilium 的內建邊界閘道協定 (BGP) 支援或 L2 公告，從而向內部部署網路公告 LoadBalancer IP 位址。

以下範例說明如何使用 IP 位址設定 Cilium 的 LB IPAM 以用於您的傳入/閘道資源，以及如何設定 Cilium BGP 控制平面以向內部部署網路公告 LoadBalancer IP 位址。根據預設，Cilium 的 LB IPAM 功能已啟用，但在建立 `CiliumLoadBalancerIPPool` 資源之前不會啟動。

#### 先決條件
<a name="_prerequisites_4"></a>
+ 遵循 [安裝 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-install) 或 [安裝 Cilium Gateway](#hybrid-nodes-ingress-cilium-gateway-install) 中的指示安裝 Cilium Ingress 或 Gateway。
+ 遵循 [部署 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-deploy) 或 [部署 Cilium Gateway](#hybrid-nodes-ingress-cilium-gateway-deploy) 中的指示，部署範例應用程式的 Cilium Ingress 或 Gateway 資源。
+ 遵循 [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md) 中的指示啟用 Cilium BGP 控制平面。如果您不想使用 BGP，則可以略過此先決條件，但在 Cilium LB IPAM 配置的 LoadBalancer IP 位址在內部部署網路上可路由之前，您將無法存取您的傳入或閘道資源。

#### 程序
<a name="_procedure_4"></a>

1. 選擇性地修補傳入或閘道資源，以請求用於 LoadBalancer 類型的服務的特定 IP 位址。如果您未請求特定 IP 位址，Cilium 將從後續步驟中的 `CiliumLoadBalancerIPPool` 資源中設定的 IP 位址範圍配置 IP 位址。在下列命令中，使用 IP 位址取代 `LB_IP_ADDRESS`，以請求 LoadBalancer 類型的服務。

    **閘道** 

   ```
   kubectl patch gateway -n default my-gateway --type=merge -p '{
     "spec": {
       "addresses": [{"type": "IPAddress", "value": "LB_IP_ADDRESS"}]
     }
   }'
   ```

    **傳入** 

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
     "metadata": {"annotations": {"lbipam.cilium.io/ips": "LB_IP_ADDRESS"}}
   }'
   ```

1. 使用 `CiliumLoadBalancerIPPool` 資源建立名為 `cilium-lbip-pool-ingress.yaml` 的檔案，以為您的傳入/閘道資源設定 Load Balancer IP 位址範圍。
   + 如果您使用的是 Cilium Ingress，Cilium 會自動將 `cilium.io/ingress: "true"` 標籤套用至其為傳入資源建立的服務。您可以在 `CiliumLoadBalancerIPPool` 資源定義的 `serviceSelector` 欄位中使用此標籤，以選取符合 LB IPAM 資格的服務。
   + 如果您使用的是 Cilium Gateway，則可以使用 `CiliumLoadBalancerIPPool` 資源定義的 `serviceSelector` 欄位中的 `gateway.networking.k8s.io/gateway-name` 標籤來選取符合 LB IPAM 資格的閘道資源。
   + 使用用於 Load Balancer IP 位址的 IP 位址範圍取代 `LB_IP_CIDR`。若要選取單一 IP 位址，請使用 `/32` CIDR。如需詳細資訊，請參閱 Cilium 文件中的 [LoadBalancer IP 位址管理](https://docs.cilium.io/en/stable/network/lb-ipam/)。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumLoadBalancerIPPool
     metadata:
       name: bookinfo-pool
     spec:
       blocks:
       - cidr: "LB_IP_CIDR"
       serviceSelector:
         # if using Cilium Gateway
         matchExpressions:
           - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
         # if using Cilium Ingress
         matchLabels:
           cilium.io/ingress: "true"
     ```

1. 將 `CiliumLoadBalancerIPPool` 資源套用至您的叢集。

   ```
   kubectl apply -f cilium-lbip-pool-ingress.yaml
   ```

1. 確認已從 Cilium LB IPAM 為傳入/閘道資源配置 IP 位址。

    **閘道** 

   ```
   kubectl get gateway my-gateway
   ```

   ```
   NAME         CLASS    ADDRESS        PROGRAMMED   AGE
   my-gateway   cilium   LB_IP_ADDRESS    True         6m41s
   ```

    **傳入** 

   ```
   kubectl get ingress my-ingress
   ```

   ```
   NAME         CLASS    HOSTS   ADDRESS        PORTS   AGE
   my-ingress   cilium   *       LB_IP_ADDRESS   80      10m
   ```

1. 使用 `CiliumBGPAdvertisement` 資源建立名為 `cilium-bgp-advertisement-ingress.yaml` 的檔案，以為您的傳入/閘道資源公告 LoadBalancer IP 位址。如果您不使用 Cilium BGP，則可以略過此步驟。用於傳入/閘道的 LoadBalancer IP 位址必須在內部部署網路上可路由，這樣您才能在下一個步驟中查詢服務。

   ```
   apiVersion: cilium.io/v2alpha1
   kind: CiliumBGPAdvertisement
   metadata:
     name: bgp-advertisement-lb-ip
     labels:
       advertise: bgp
   spec:
     advertisements:
       - advertisementType: "Service"
         service:
           addresses:
             - LoadBalancerIP
         selector:
           # if using Cilium Gateway
           matchExpressions:
             - { key: gateway.networking.k8s.io/gateway-name, operator: In, values: [ my-gateway ] }
           # if using Cilium Ingress
           matchLabels:
             cilium.io/ingress: "true"
   ```

1. 將 `CiliumBGPAdvertisement` 資源套用至您的叢集。

   ```
   kubectl apply -f cilium-bgp-advertisement-ingress.yaml
   ```

1. 使用從 Cilium LB IPAM 配置的 IP 位址存取服務。

   ```
   curl -s http://LB_IP_ADDRESS:80/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## 服務類型 NodePort
<a name="hybrid-nodes-ingress-cilium-nodeport"></a>

如果您在環境中沒有負載平衡器基礎結構和對應的傳入控制器，或者您是自我管理負載平衡器基礎結構或使用 DNS 型負載平衡，則可以將 Cilium Ingress 設定為為傳入資源建立 NodePort 類型的服務。搭配 Cilium Ingress 使用 NodePort 時，NodePort 類型的服務會在連接埠範圍 30000-32767 內每個節點的連接埠上公開。在此模式中，當流量到達 NodePort 上叢集中的任何節點時，即會轉送到可傳回服務的 Pod，而這些 Pod 可能位於相同的節點，也可能位於不同的節點。

**注意**  
Cilium Gateway 計劃在 Cilium 版本 1.18.x 中對 NodePort 服務提供支援 ([\$127273](https://github.com/cilium/cilium/pull/27273))

### 先決條件
<a name="_prerequisites_5"></a>
+ 遵循 [安裝 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-install) 中的指示安裝 Cilium Ingress。
+ 遵循 [部署 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-deploy) 中的指示，部署範例應用程式的 Cilium Ingress 資源。

### 程序
<a name="_procedure_5"></a>

1. 修補現有的傳入資源 `my-ingress`，以將其從 LoadBalancer 類型的服務變更為 NodePort。

   ```
   kubectl patch ingress my-ingress --type=merge -p '{
       "metadata": {"annotations": {"ingress.cilium.io/service-type": "NodePort"}}
   }'
   ```

   如果您尚未建立傳入資源，則可以將下列傳入定義套用至叢集，進而建立傳入資源。請注意，以下傳入定義會使用 [部署 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-deploy) 中所述的 Istio Bookinfo 範例應用程式。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "external"
       "ingress.cilium.io/service-type": "NodePort"
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

1. 確認傳入資源的服務已更新為使用服務類型 NodePort。請注意輸出中的 HTTP 通訊協定的連接埠。在以下範例中，此 HTTP 連接埠是 `32353`，且在後續步驟中，將用其來查詢服務。搭配 NodePort 類型的服務使用 Cilium Ingress 的優點是，對於 Ingress 流量，您可以套用路徑和以主機為基礎的路由以及相關網路政策，而對於沒有 Ingress 的標準 NodePort 類型的服務，您則無法如此操作。

   ```
   kubectl -n default get svc cilium-ingress-my-ingress
   ```

   ```
   NAME                        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
   cilium-ingress-my-ingress   NodePort   172.16.47.153   <none>        80:32353/TCP,443:30253/TCP   27m
   ```

1. 獲取您叢集節點的 IP 位址。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. 使用節點的 IP 位址和上文擷取的 NodePort 存取 NodePort 類型的服務。在以下範例中，使用的節點 IP 位址是 `10.80.146.32`，而 NodePort 是 `32353`。使用您環境的值取代這些值。

   ```
   curl -s http://10.80.146.32:32353/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

## 主機網路
<a name="hybrid-nodes-ingress-cilium-host-network"></a>

類似於 NodePort 類型的服務，如果您沒有負載平衡器基礎結構和傳入或閘道控制器，或者如果您使用外部負載平衡器自我管理負載平衡，則可以將 Cilium Ingress 和 Cilium Gateway 設定為可直接在主機網路上公開傳入和閘道資源。為傳入或閘道資源啟用主機網路模式時，會自動停用 LoadBalancer 類型和 NodePort 類型的服務模式，而主機網路模式會與每個傳入或閘道資源的這些替代模式互斥。相較於 NodePort 類型的服務模式，主機網路模式能擴增可使用的連接埠範圍 (不限於 30000-32767 NodePort 範圍)，並且您可以設定 Envoy 代理在主機網路上執行的節點子集。

### 先決條件
<a name="_prerequisites_6"></a>
+ 遵循 [安裝 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-install) 或 [安裝 Cilium Gateway](#hybrid-nodes-ingress-cilium-gateway-install) 中的指示安裝 Cilium Ingress 或 Gateway。

### 程序
<a name="_procedure_6"></a>

#### 閘道
<a name="_gateway"></a>

1. 建立名為 `cilium-gateway-host-network.yaml` 且具有下列內容的檔案。

   ```
   gatewayAPI:
     enabled: true
     hostNetwork:
       enabled: true
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: gateway
   ```

1. 將主機網路 Cilium Gateway 組態套用至您的叢集。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-gateway-host-network.yaml
   ```

   如果您尚未建立閘道資源，則可以將下列閘道定義套用至叢集，進而建立閘道資源。以下閘道定義會使用 [部署 Cilium Gateway](#hybrid-nodes-ingress-cilium-gateway-deploy) 中所述的 Istio Bookinfo 範例應用程式。在以下範例中，閘道資源會設定為使用 HTTP 接聽程式的 `8111` 連接埠，而這是主機網路上執行的 Envoy 代理程式的共用接聽程式連接埠。如果您為閘道資源使用了具有特殊權限的連接埠 (低於 1023)，請參閱 [Cilium 文件](https://docs.cilium.io/en/stable/network/servicemesh/gateway-api/gateway-api/#bind-to-privileged-port)以取得說明。

   ```
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway
   metadata:
     name: my-gateway
   spec:
     gatewayClassName: cilium
     listeners:
     - protocol: HTTP
       port: 8111
       name: web-gw
       allowedRoutes:
         namespaces:
           from: Same
   ---
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute
   metadata:
     name: http-app-1
   spec:
     parentRefs:
     - name: my-gateway
       namespace: default
     rules:
     - matches:
       - path:
           type: PathPrefix
           value: /details
       backendRefs:
       - name: details
         port: 9080
   ```

   您可以使用下列命令來觀測套用的 Cilium Envoy 組態。

   ```
   kubectl get cec cilium-gateway-my-gateway -o yaml
   ```

   您可以使用下列命令來取得 `cilium-gateway-my-gateway` 服務的 Envoy 接聽程式連接埠。在此範例中，共用接聽程式連接埠為 `8111`。

   ```
   kubectl get cec cilium-gateway-my-gateway -o jsonpath={.spec.services[0].ports[0]}
   ```

1. 獲取您叢集節點的 IP 位址。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. 使用節點的 IP 位址和 `cilium-gateway-my-gateway` 資源的接聽程式連接埠存取服務。在以下範例中，使用的節點 IP 位址是 `10.80.146.32`，而接聽程式連接埠是 `8111`。使用您環境的值取代這些值。

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

#### Ingress
<a name="_ingress"></a>

由於上游 Cilium 問題 ([\$134028](https://github.com/cilium/cilium/issues/34028))，主機網路模式中的 Cilium Ingress 需要使用 `loadbalancerMode: shared`，而這會為叢集中的所有傳入資源建立 ClusterIP 類型的單一服務。如果您為傳入資源使用了具有特殊權限的連接埠 (低於 1023)，請參閱 [Cilium 文件](https://docs.cilium.io/en/stable/network/servicemesh/ingress/#bind-to-privileged-port)以取得說明。

1. 建立名為 `cilium-ingress-host-network.yaml` 且具有下列內容的檔案。

   ```
   ingressController:
     enabled: true
     loadbalancerMode: shared
     # This is a workaround for the upstream Cilium issue
     service:
       externalTrafficPolicy: null
       type: ClusterIP
     hostNetwork:
       enabled: true
       # ensure the port does not conflict with other services on the node
       sharedListenerPort: 8111
       # uncomment to restrict nodes where Envoy proxies run on the host network
       # nodes:
       #   matchLabels:
       #     role: ingress
   ```

1. 將主機網路 Cilium Ingress 組態套用至您的叢集。

   ```
   helm upgrade cilium oci://public.ecr.aws/eks/cilium/cilium \
     --namespace kube-system \
     --reuse-values \
     --set operator.rollOutPods=true \
     -f cilium-ingress-host-network.yaml
   ```

   如果您尚未建立傳入資源，則可以將下列傳入定義套用至叢集，進而建立傳入資源。以下傳入定義會使用 [部署 Cilium Ingress](#hybrid-nodes-ingress-cilium-ingress-deploy) 中所述的 Istio Bookinfo 範例應用程式。

   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: my-ingress
     namespace: default
   spec:
     ingressClassName: cilium
     rules:
     - http:
         paths:
         - backend:
             service:
               name: details
               port:
                 number: 9080
           path: /details
           pathType: Prefix
   ```

   您可以使用下列命令來觀測套用的 Cilium Envoy 組態。

   ```
   kubectl get cec -n kube-system cilium-ingress -o yaml
   ```

   您可以使用下列命令來取得 `cilium-ingress` 服務的 Envoy 接聽程式連接埠。在此範例中，共用接聽程式連接埠為 `8111`。

   ```
   kubectl get cec -n kube-system cilium-ingress -o jsonpath={.spec.services[0].ports[0]}
   ```

1. 獲取您叢集節點的 IP 位址。

   ```
   kubectl get nodes -o wide
   ```

   ```
   NAME                   STATUS   ROLES    AGE   VERSION               INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   mi-026d6a261e355fba7   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.150   <none>        Ubuntu 22.04.5 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-082f73826a163626e   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.32    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-09183e8a3d755abf6   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.33    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0d78d815980ed202d   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.97    <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   mi-0daa253999fe92daa   Ready    <none>   23h   v1.32.3-eks-473151a   10.80.146.100   <none>        Ubuntu 22.04.4 LTS   5.15.0-142-generic   containerd://1.7.27
   ```

1. 使用節點的 IP 位址和 `cilium-ingress` 資源的 `sharedListenerPort` 存取服務。在以下範例中，使用的節點 IP 位址是 `10.80.146.32`，而接聽程式連接埠是 `8111`。使用您環境的值取代這些值。

   ```
   curl -s http://10.80.146.32:8111/details/1 | jq
   ```

   ```
   {
     "id": 1,
     "author": "William Shakespeare",
     "year": 1595,
     "type": "paperback",
     "pages": 200,
     "publisher": "PublisherA",
     "language": "English",
     "ISBN-10": "1234567890",
     "ISBN-13": "123-1234567890"
   }
   ```

# 為混合節點設定 LoadBalancer 類型的服務
<a name="hybrid-nodes-load-balancing"></a>

本主題會說明如何為在 Amazon EKS 混合節點上執行的應用程式設定第 4 層 (L4) 負載平衡。LoadBalancer 類型的 Kubernetes Service 可用於向叢集外部公開 Kubernetes 應用程式。LoadBalancer 類型的服務通常可與雲端或內部部署環境中的實體負載平衡器基礎結構搭配使用，進而提供工作負載的流量。此負載平衡器基礎結構通常使用環境特定的控制器進行佈建。

 AWS 支援針對 EKS 混合節點上執行的 LoadBalancer 類型的服務使用 AWS Network Load Balancer (NLB) 和 Cilium。使用 NLB 還是 Cilium 的決定取決於應用程式流量的來源。如果應用程式流量來自 AWS 區域，則 AWS 會建議使用 AWS NLB 和 AWS Load Balancer 控制器。如果應用程式流量來自本機內部部署或邊緣環境，則 AWS 會建議使用 Cilium 的內建負載平衡功能，而該功能可在您的環境中搭配或不搭配負載平衡器基礎結構使用。

如需第 7 層 (L7) 應用程式流量負載平衡，請參閱 [設定混合節點的 Kubernetes Ingress](hybrid-nodes-ingress.md)。如需使用 EKS 進行負載平衡的一般資訊，請參閱[負載平衡的最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html)。

## AWS Network Load Balancer
<a name="hybrid-nodes-service-lb-nlb"></a>

對於在混合節點上執行的工作負載，您可以搭配目標類型 `ip` 使用 [AWS Load Balancer 控制器](aws-load-balancer-controller.md)和 NLB。使用目標類型 `ip` 時，NLB 可繞過服務層網路路徑，將流量直接轉送至 Pod。若要讓 NLB 達到混合節點上的 Pod IP 目標，您的內部部署 Pod CIDR 必須在內部部署網路上可路由。此外，AWS Load Balancer 控制器使用 Webhook 並且需要從 EKS 控制平面直接通訊。如需詳細資訊，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。
+ 如需有關 AWS Network Load Balancer 和 AWS Load Balancer 控制器的其他資訊，請參閱 [透過 Network Load Balancer 路由 TCP 與 UDP 流量](network-load-balancing.md) 以取得子網路組態需求，並參閱 [搭配 Helm 的 Install AWS Load Balancer 控制器](lbc-helm.md) 和[負載平衡的最佳實務](https://docs.aws.amazon.com/eks/latest/best-practices/load-balancing.html)。
+ 請參閱 [AWS Load Balancer 控制器 NLB 組態](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/guide/service/nlb/)，了解可套用至具有 AWS Network Load Balancer 的 `LoadBalancer` 類型的服務的組態。

### 先決條件
<a name="_prerequisites"></a>
+ 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。
+ 遵循 [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md) 中的指示啟用 Cilium BGP 控制平面。如果您不想使用 BGP，則必須使用替代方法，以讓內部部署 Pod CIDR 在內部部署網路上可路由，如需詳細資訊，請參閱 [可路由的遠端 Pod CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)。
+ 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](helm.md)。
+ 已在命令列環境中安裝 eksctl，請參閱[安裝 eksctl 說明](install-kubectl.md#eksctl-install-update)。

### 程序
<a name="_procedure"></a>

1. 下載適用於 AWS Load Balancer 控制器的 IAM 政策，允許它代表您呼叫 AWS API。

   ```
   curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/refs/heads/main/docs/install/iam_policy.json
   ```

1. 使用上一個步驟中下載的政策，建立 IAM 政策。

   ```
   aws iam create-policy \
       --policy-name AWSLoadBalancerControllerIAMPolicy \
       --policy-document file://iam_policy.json
   ```

1. 使用您的設定取代下列值：叢集名稱 (`CLUSTER_NAME`)、AWS 區域 (`AWS_REGION`) 和 AWS 帳戶 ID (`AWS_ACCOUNT_ID`)，然後執行下列命令。

   ```
   eksctl create iamserviceaccount \
       --cluster=CLUSTER_NAME \
       --namespace=kube-system \
       --name=aws-load-balancer-controller \
       --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \
       --override-existing-serviceaccounts \
       --region AWS_REGION \
       --approve
   ```

1. 新增 eks-charts Helm Chart 儲存庫。AWS 會在 GitHub 上維護此儲存庫。

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. 更新您的本機 Helm 儲存庫，以確保您擁有最近的圖表。

   ```
   helm repo update eks
   ```

1. 安裝 AWS Load Balancer 控制器。使用您的設定取代下列值：叢集名稱 (`CLUSTER_NAME`)、AWS 區域 (`AWS_REGION`)、VPC ID (`VPC_ID`) 和 AWS Load Balancer 控制器 Helm Chart 版本 (`AWS_LBC_HELM_VERSION`)。您可以透過執行 `helm search repo eks/aws-load-balancer-controller --versions` 來尋找最新版本的 Helm Chart。如果您執行具有混合節點和 AWS 雲端中的節點的混合模式叢集，則您可以遵循 [AWS Load Balancer 控制器](hybrid-nodes-webhooks.md#hybrid-nodes-mixed-lbc) 中的指示，在雲端節點上執行 AWS Load Balancer 控制器。

   ```
   helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
     -n kube-system \
     --version AWS_LBC_HELM_VERSION \
     --set clusterName=CLUSTER_NAME \
     --set region=AWS_REGION \
     --set vpcId=VPC_ID \
     --set serviceAccount.create=false \
     --set serviceAccount.name=aws-load-balancer-controller
   ```

1. 驗證 AWS Load Balancer 控制器是否已成功安裝。

   ```
   kubectl get -n kube-system deployment aws-load-balancer-controller
   ```

   ```
   NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
   aws-load-balancer-controller   2/2     2            2           84s
   ```

1. 在名為 `tcp-sample-app.yaml` 的檔案中定義範例應用程式。以下範例使用具有 TCP 連接埠的簡單的 NGINX 部署。

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: tcp-sample-app
     namespace: default
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
               - name: tcp
                 containerPort: 80
   ```

1. 將部署套用至叢集。

   ```
   kubectl apply -f tcp-sample-app.yaml
   ```

1. 在名為 `tcp-sample-service.yaml` 的檔案中定義部署的 LoadBalancer 類型服務。

   ```
   apiVersion: v1
   kind: Service
   metadata:
     name: tcp-sample-service
     namespace: default
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: external
       service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
       service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
   spec:
     ports:
       - port: 80
         targetPort: 80
         protocol: TCP
     type: LoadBalancer
     selector:
       app: nginx
   ```

1. 將服務組態套用至叢集。

   ```
   kubectl apply -f tcp-sample-service.yaml
   ```

1. 為服務佈建 NLB 可能需要幾分鐘的時間。佈建 NLB 後，服務將會為其指派一個與 NLB 部署的 DNS 名稱對應的地址。

   ```
   kubectl get svc tcp-sample-service
   ```

   ```
   NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP                                                                    PORT(S)        AGE
   tcp-sample-service   LoadBalancer   172.16.115.212   k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com   80:30396/TCP   8s
   ```

1. 使用 NLB 的地址存取服務。

   ```
   curl k8s-default-tcpsampl-xxxxxxxxxx-xxxxxxxxxxxxxxxx.elb.<region>.amazonaws.com
   ```

   範例輸出如下。

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. 清除您建立的 資源。

   ```
   kubectl delete -f tcp-sample-service.yaml
   kubectl delete -f tcp-sample-app.yaml
   ```

## Cilium 叢集內負載平衡
<a name="hybrid-nodes-service-lb-cilium"></a>

Cilium 可用作在 EKS 混合節點上執行的工作負載的叢集內負載平衡器，而這對於沒有負載平衡器基礎結構的環境非常有用。Cilium 的負載平衡功能以 Cilium 功能的組合為建置基礎，包括 kube-proxy 取代、Load Balancer IP 位址管理 (IPAM) 和 BGP 控制平面。這些功能的責任詳述如下：
+  **Cilium kube-proxy 取代**：處理將服務流量路由到後端 Pod。
+  **Cilium Load Balancer IPAM**：管理可指派給 `LoadBalancer` 類型的服務的 IP 位址。
+  **Cilium BGP 控制平面**：將 Load Balancer IPAM 配置的 IP 位址公告至內部部署網路。

如果您沒有使用 Cilium 的 kube-proxy 取代，您仍然可以使用 Cilium Load Balancer IPAM 和 BGP 控制平面，以為 LoadBalancer 類型的服務配置和指派 IP 位址。如果您沒有使用 Cilium 的 kube-proxy 取代，則根據預設，EKS 中服務至後端 Pod 的負載平衡將由 kube-proxy 和 iptables 處理。

### 先決條件
<a name="_prerequisites_2"></a>
+ 在啟用或未啟用 kube-proxy 取代的情況下，遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。Cilium 的 kube-proxy 取代需要執行至少與 v4.19.57、v5.1.16 或 v5.2.0 相近的 Linux 核心作業系統。除了 Red Hat Enterprise Linux (RHEL) 8.x 外，所有支援與混合節點搭配使用的最新版作業系統皆符合此條件。
+ 遵循 [設定混合節點的 Cilium BGP](hybrid-nodes-cilium-bgp.md) 中的指示啟用 Cilium BGP 控制平面。如果您不想使用 BGP，則必須使用替代方法，以讓內部部署 Pod CIDR 在內部部署網路上可路由，如需詳細資訊，請參閱 [可路由的遠端 Pod CIDR](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-pod-cidrs)。
+ 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](helm.md)。

### 程序
<a name="_procedure_2"></a>

1. 使用 `CiliumLoadBalancerIPPool` 資源建立名為 `cilium-lbip-pool-loadbalancer.yaml` 的檔案，以為 Load Balancer 類型的服務設定 Load Balancer IP 位址範圍。
   + 使用用於 Load Balancer IP 位址的 IP 位址範圍取代 `LB_IP_CIDR`。若要選取單一 IP 位址，請使用 `/32` CIDR。如需詳細資訊，請參閱 Cilium 文件中的 [LoadBalancer IP 位址管理](https://docs.cilium.io/en/stable/network/lb-ipam/)。
   + `serviceSelector` 欄位設定為與您將在後續步驟中建立的服務名稱相符。使用此組態，此集區的 IP 將僅會配置給名稱為 `tcp-sample-service` 的服務。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumLoadBalancerIPPool
     metadata:
       name: tcp-service-pool
     spec:
       blocks:
       - cidr: "LB_IP_CIDR"
       serviceSelector:
         matchLabels:
           io.kubernetes.service.name: tcp-sample-service
     ```

1. 將 `CiliumLoadBalancerIPPool` 資源套用至您的叢集。

   ```
   kubectl apply -f cilium-lbip-pool-loadbalancer.yaml
   ```

1. 確認集區中至少有一個 IP 位址可用。

   ```
   kubectl get ciliumloadbalancerippools.cilium.io
   ```

   ```
   NAME               DISABLED   CONFLICTING   IPS AVAILABLE   AGE
   tcp-service-pool   false      False         1               24m
   ```

1. 使用 `CiliumBGPAdvertisement` 資源建立名為 `cilium-bgp-advertisement-loadbalancer.yaml` 的檔案，以公告您將在下一步驟中建立的服務的負載平衡器 IP 位址。如果您不使用 Cilium BGP，則可以略過此步驟。用於服務的負載平衡器 IP 位址必須在內部部署網路上可路由，這樣您才能在最後一個步驟中查詢服務。
   + `advertisementType` 欄位設定為 `Service`，而 `service.addresses` 則設定為 `LoadBalancerIP`，以便僅為 `LoadBalancer` 類型的服務公告 `LoadBalancerIP`。
   + `selector` 欄位設定為與您將在後續步驟中建立的服務名稱相符。使用此組態時，將僅會公告名稱為 `tcp-sample-service` 的服務的 `LoadBalancerIP`。

     ```
     apiVersion: cilium.io/v2alpha1
     kind: CiliumBGPAdvertisement
     metadata:
       name: bgp-advertisement-tcp-service
       labels:
         advertise: bgp
     spec:
       advertisements:
         - advertisementType: "Service"
           service:
             addresses:
               - LoadBalancerIP
           selector:
             matchLabels:
               io.kubernetes.service.name: tcp-sample-service
     ```

1. 將 `CiliumBGPAdvertisement` 資源套用至您的叢集。如果您不使用 Cilium BGP，則可以略過此步驟。

   ```
   kubectl apply -f cilium-bgp-advertisement-loadbalancer.yaml
   ```

1. 在名為 `tcp-sample-app.yaml` 的檔案中定義範例應用程式。以下範例使用具有 TCP 連接埠的簡單的 NGINX 部署。

   ```
   apiVersion: apps/v1
   kind: Deployment
   metadata:
     name: tcp-sample-app
     namespace: default
   spec:
     replicas: 3
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
               - name: tcp
                 containerPort: 80
   ```

1. 將部署套用至叢集。

   ```
   kubectl apply -f tcp-sample-app.yaml
   ```

1. 在名為 `tcp-sample-service.yaml` 的檔案中定義部署的 LoadBalancer 類型服務。
   + 您可以從負載平衡器 IP 集區請求特定的 IP 位址，並在服務物件上加上 `lbipam.cilium.io/ips` 註釋。如果您不想為服務請求特定的 IP 位址，則可移除此註釋。
   + 需要 `loadBalancerClass` 規格欄位，才能防止舊版 AWS 雲端提供者為服務建立 Classic Load Balancer。在以下範例中，這會設定為 `io.cilium/bgp-control-plane`，以使用 Cilium 的 BGP 控制平面作為負載平衡器類別。或者，此欄位可設定為 `io.cilium/l2-announcer`，以使用 Cilium 的 [L2 功能公告](https://docs.cilium.io/en/latest/network/l2-announcements/) (目前為 beta 版且未受 AWS 正式支援)。

     ```
     apiVersion: v1
     kind: Service
     metadata:
       name: tcp-sample-service
       namespace: default
       annotations:
         lbipam.cilium.io/ips: "LB_IP_ADDRESS"
     spec:
       loadBalancerClass: io.cilium/bgp-control-plane
       ports:
         - port: 80
           targetPort: 80
           protocol: TCP
       type: LoadBalancer
       selector:
         app: nginx
     ```

1. 將服務套用至叢集。服務將使用外部 IP 位址建立，而您可用其來存取應用程式。

   ```
   kubectl apply -f tcp-sample-service.yaml
   ```

1. 確認服務已成功建立，並從上一個步驟中建立的 `CiliumLoadBalancerIPPool` 為其指派 IP。

   ```
   kubectl get svc tcp-sample-service
   ```

   ```
   NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
   tcp-sample-service   LoadBalancer   172.16.117.76   LB_IP_ADDRESS   80:31129/TCP   14m
   ```

1. 如果您以 kube-proxy 取代模式使用 Cilium，您可以執行下列命令，以確認 Cilium 正在處理服務的負載平衡。在以下輸出中，`10.86.2.x` 位址是服務的後端 Pod 的 Pod IP 位址。

   ```
   kubectl -n kube-system exec ds/cilium -- cilium-dbg service list
   ```

   ```
   ID   Frontend               Service Type   Backend
   ...
   41   LB_IP_ADDRESS:80/TCP   LoadBalancer   1 => 10.86.2.76:80/TCP (active)
                                              2 => 10.86.2.130:80/TCP (active)
                                              3 => 10.86.2.141:80/TCP (active)
   ```

1. 確認 Cilium 正透過 BGP 將 IP 位址公告至內部部署網路。在以下範例中，有五個混合節點，並且每個節點都會向內部部署網路公告 `tcp-sample-service` 服務的 `LB_IP_ADDRESS`。

   ```
   Node                   VRouter      Prefix             NextHop   Age     Attrs
   mi-026d6a261e355fba7   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-082f73826a163626e   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-09183e8a3d755abf6   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0d78d815980ed202d   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   mi-0daa253999fe92daa   NODES_ASN
                     LB_IP_ADDRESS/32   0.0.0.0   12m3s   [{Origin: i} {Nexthop: 0.0.0.0}]
   ```

1. 使用指派的 load balancerIP 位址存取服務。

   ```
   curl LB_IP_ADDRESS
   ```

   範例輸出如下。

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. 清除您建立的 資源。

   ```
   kubectl delete -f tcp-sample-service.yaml
   kubectl delete -f tcp-sample-app.yaml
   kubectl delete -f cilium-lb-ip-pool.yaml
   kubectl delete -f cilium-bgp-advertisement.yaml
   ```

# 設定混合節點的 Kubernetes 網路政策
<a name="hybrid-nodes-network-policies"></a>

 當使用 Cilium 作為 CNI 搭配 EKS 混合節點時，AWS 支援適用於 Pod 輸入和輸出流量的 Kubernetes 網路政策 (第 3 層/第 4 層)。如果您使用 AWS 雲端中的節點執行 EKS 叢集，則 AWS 支援 [Kubernetes 專用 Amazon VPC CNI 網路政策](cni-network-policy.md)。

本主題涵蓋如何使用 EKS 混合節點設定 Cilium 和 Kubernetes 網路政策。如需 Kubernetes 網路政策的詳細資訊，請參閱 Kubernetes 文件中的 [Kubernetes 網路政策](https://kubernetes.io/docs/concepts/services-networking/network-policies/)。

## 設定網路政策
<a name="hybrid-nodes-configure-network-policies"></a>

### 考量事項
<a name="_considerations"></a>
+  AWS 支援上游 Kubernetes 網路政策和 Pod 輸入和輸出的規格。AWS 目前不支援 `CiliumNetworkPolicy` 或 `CiliumClusterwideNetworkPolicy`。
+ `policyEnforcementMode` Helm 值可用於控制預設的 Cilium 政策強制執行行為。預設行為允許所有輸出和輸入流量。當網路政策選取端點時，其會轉換為預設拒絕狀態，而該狀態僅允許明確允許的流量。如需[預設政策模式](https://docs.cilium.io/en/stable/security/policy/intro/#policy-mode-default)和[政策強制執行模式](https://docs.cilium.io/en/stable/security/policy/intro/#policy-enforcement-modes)的詳細資訊，請參閱 Cilium 文件。
+ 如果您要變更現有 Cilium 安裝的 `policyEnforcementMode`，則您必須重新啟動 Cilium 代理程式 DaemonSet，以套用新的政策強制執行模式。
+ 使用 `namespaceSelector` 和 `podSelector` 允許或拒絕往返具有相符標籤的命名空間和 Pod 之間的流量。`namespaceSelector` 和 `podSelector` 可與 `matchLabels` 或 `matchExpressions` 搭配使用，以根據其標籤選取命名空間和 Pod。
+ 使用 `ingress.ports` 和 `egress.ports` 允許或拒絕往返連接埠和通訊協定之間的流量。
+ `ipBlock` 欄位無法用於選擇性地允許或拒絕往返 Pod IP 位址 ([\$19209](https://github.com/cilium/cilium/issues/9209)) 的流量。針對節點 IP 使用 `ipBlock` 選取器是 Cilium 中的 Beta 版功能，且不受 AWS 支援。
+ 如需 Kubernetes 網路政策可用欄位的資訊，請參閱 Kubernetes 文件中的 [NetworkPolicy 資源](https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)。

### 先決條件
<a name="_prerequisites"></a>
+ 遵循 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示安裝 Cilium。
+ 已在命令列環境中安裝 Helm，請參閱[安裝 Helm 說明](helm.md)。

### 程序
<a name="_procedure"></a>

下列程序會為範例微服務應用程式設定網路政策，以便元件只能與應用程式運作所需的其他元件通訊。程序會使用 [Istio Bookinfo](https://istio.io/latest/docs/examples/bookinfo/) 範例微服務應用程式。

Bookinfo 應用程式由四個單獨的微服務組成，且其關係如下：
+  **productpage**。productpage 微服務會呼叫詳細資訊並檢閱微服務來填入頁面。
+  **詳細資訊** 詳細資訊微服務包含書籍資訊。
+  **檢閱**。檢閱微服務包含書籍檢閱。其還會呼叫評分微服務。
+  **評分**。評分微服務包含隨附書籍檢閱的書籍排名資訊。

  1. 建立範例應用程式。

     ```
     kubectl apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     ```

  1. 確認應用程式已成功執行，並記下 productpage 微服務的 Pod IP 位址。在後續步驟中，您將使用此 Pod IP 位址來查詢每個微服務。

     ```
     kubectl get pods -o wide
     ```

     ```
     NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE
     details-v1-766844796b-9wff2       1/1     Running   0          7s    10.86.3.7     mi-0daa253999fe92daa
     productpage-v1-54bb874995-lwfgg   1/1     Running   0          7s    10.86.2.193   mi-082f73826a163626e
     ratings-v1-5dc79b6bcd-59njm       1/1     Running   0          7s    10.86.2.232   mi-082f73826a163626e
     reviews-v1-598b896c9d-p2289       1/1     Running   0          7s    10.86.2.47    mi-026d6a261e355fba7
     reviews-v2-556d6457d-djktc        1/1     Running   0          7s    10.86.3.58    mi-0daa253999fe92daa
     reviews-v3-564544b4d6-g8hh4       1/1     Running   0          7s    10.86.2.69    mi-09183e8a3d755abf6
     ```

  1. 建立將用於測試網路政策的 Pod。請注意，Pod 是在具有標籤 `access: true` 的 `default` 命名空間中建立的。

     ```
     kubectl run curl-pod --image=curlimages/curl -i --tty --labels=access=true --namespace=default --overrides='{"spec": { "nodeSelector": {"eks.amazonaws.com/compute-type": "hybrid"}}}' -- /bin/sh
     ```

  1. 測試對 productpage 微服務的存取。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     ```

     ```
     <title>Simple Bookstore App</title>
     ```

  1. 您可以輸入 `exit` 來結束測試 curl Pod，並執行下列命令來重新連接至 Pod。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

  1. 為了在下列步驟中示範網路政策的效果，我們會先建立一個網路政策，其中該政策會拒絕 BookInfo 微服務的所有流量。建立稱為 `network-policy-deny-bookinfo.yaml` 的檔案，其中會定義拒絕網路政策。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: deny-bookinfo
       namespace: default
     spec:
       podSelector:
         matchExpressions:
         - key: app
           operator: In
           values: ["productpage", "details", "reviews", "ratings"]
       policyTypes:
       - Ingress
       - Egress
     ```

  1. 將拒絕網路政策套用至您的叢集。

     ```
     kubectl apply -f network-policy-default-deny-bookinfo.yaml
     ```

  1. 測試對 BookInfo 應用程式的存取。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     curl http://10.86.2.193:9080/productpage --max-time 10
     ```

     ```
     curl: (28) Connection timed out after 10001 milliseconds
     ```

  1. 建立稱為 `network-policy-productpage.yaml` 的檔案，其中會定義 productpage 網路政策。政策具有下列規則：
     + 允許來自具有標籤 `access: true` 的 Pod 的輸入流量 (在上一個步驟中建立的 curl Pod)
     + 允許連接埠 `9080` 上的輸出 TCP 流量，以取得詳細資訊、檢閱和評分微服務
     + 允許在 `kube-system` 命名空間中執行的 CoreDNS 連接埠 `53` 上的輸出 TCP/UDP 流量

       ```
       apiVersion: networking.k8s.io/v1
       kind: NetworkPolicy
       metadata:
         name: productpage-policy
         namespace: default
       spec:
         podSelector:
           matchLabels:
             app: productpage
         policyTypes:
         - Ingress
         - Egress
         ingress:
         - from:
           - podSelector:
               matchLabels:
                 access: "true"
         egress:
         - to:
           - podSelector:
               matchExpressions:
               - key: app
                 operator: In
                 values: ["details", "reviews", "ratings"]
           ports:
           - port: 9080
             protocol: TCP
         - to:
           - namespaceSelector:
               matchLabels:
                 kubernetes.io/metadata.name: kube-system
             podSelector:
               matchLabels:
                 k8s-app: kube-dns
           ports:
           - port: 53
             protocol: UDP
           - port: 53
             protocol: TCP
       ```

  1. 將 productpage 網路政策套用至您的叢集。

     ```
     kubectl apply -f network-policy-productpage.yaml
     ```

  1. 連線至 curl Pod 並測試對 Bookinfo 應用程式的存取。現在允許存取 productpage 微服務，但其他微服務仍然被拒絕，因為它們仍須遵循拒絕網路政策。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     ```
     curl -s http://10.86.2.193:9080/productpage | grep -o "<title>.*</title>"
     <title>Simple Bookstore App</title>
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     {"error": "Sorry, product details are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     {"error": "Sorry, product reviews are currently unavailable for this book."}
     ```

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     {"error": "Sorry, product ratings are currently unavailable for this book."}
     ```

  1. 建立稱為 `network-policy-details.yaml` 的檔案，其中會定義詳細資訊網路政策。此政策僅允許來自 productpage 微服務的輸入流量。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: details-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: details
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
     ```

  1. 建立稱為 `network-policy-reviews.yaml` 的檔案，其中會定義檢閱網路政策。此政策僅允許來自 productpage 微服務輸入流量，且僅允許至評分微服務和 CoreDNS 的輸出流量。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: reviews-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: reviews
       policyTypes:
       - Ingress
       - Egress
       ingress:
       - from:
         - podSelector:
             matchLabels:
               app: productpage
       egress:
       - to:
         - podSelector:
             matchLabels:
               app: ratings
       - to:
         - namespaceSelector:
             matchLabels:
               kubernetes.io/metadata.name: kube-system
           podSelector:
             matchLabels:
               k8s-app: kube-dns
         ports:
         - port: 53
           protocol: UDP
         - port: 53
           protocol: TCP
     ```

  1. 建立稱為 `network-policy-ratings.yaml` 的檔案，其中會定義評分網路政策。此政策僅允許來自檢閱微服務的輸入流量。

     ```
     apiVersion: networking.k8s.io/v1
     kind: NetworkPolicy
     metadata:
       name: ratings-policy
       namespace: default
     spec:
       podSelector:
         matchLabels:
           app: ratings
       policyTypes:
       - Ingress
       ingress:
       - from:
         - podSelector:
             matchExpressions:
             - key: app
               operator: In
               values: ["productpage", "reviews"]
     ```

  1. 將詳細資訊、檢閱和評分網路政策套用至您的叢集。

     ```
     kubectl apply -f network-policy-details.yaml
     kubectl apply -f network-policy-reviews.yaml
     kubectl apply -f network-policy-ratings.yaml
     ```

  1. 連線至 curl Pod 並測試對 Bookinfo 應用程式的存取。在以下範例中，我們使用 productpage Pod (`10.86.2.193`) 的 Pod IP 位址來查詢微服務。將此取代為您環境中 productpage Pod 的 Pod IP 位址。

     ```
     kubectl attach curl-pod -c curl-pod -i -t
     ```

     測試詳細資訊微服務。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1
     ```

     ```
     {"id": 1, "author": "William Shakespeare", "year": 1595, "type": "paperback", "pages": 200, "publisher": "PublisherA", "language": "English", "ISBN-10": "1234567890", "ISBN-13": "123-1234567890"}
     ```

     測試檢閱微服務。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/reviews
     ```

     ```
     {"id": "1", "podname": "reviews-v1-598b896c9d-p2289", "clustername": "null", "reviews": [{"reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!"}, {"reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare."}]}
     ```

     測試評分微服務。

     ```
     curl -s http://10.86.2.193:9080/api/v1/products/1/ratings
     ```

     ```
     {"id": 1, "ratings": {"Reviewer1": 5, "Reviewer2": 4}}
     ```

  1. 清除您在本程序中建立的資源。

     ```
     kubectl delete -f network-policy-deny-bookinfo.yaml
     kubectl delete -f network-policy-productpage.yaml
     kubectl delete -f network-policy-details.yaml
     kubectl delete -f network-policy-reviews.yaml
     kubectl delete -f network-policy-ratings.yaml
     kubectl delete -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml
     kubectl delete pod curl-pod
     ```

# 混合節點的概念
<a name="hybrid-nodes-concepts"></a>

使用 *Amazon EKS 混合節點*，您可以將內部部署或邊緣環境中執行的實體或虛擬機器加入 AWS 雲端中執行的 Amazon EKS 叢集。這種方法可帶來許多好處，但同時也會為熟悉在單一網路環境中執行 Kubernetes 叢集的使用者引進新的聯網概念和架構。

以下章節將深入探討 EKS 混合節點的 Kubernetes 和聯網概念，並詳細說明流量如何流經混合式架構。這些章節會要求您熟悉基本的 Kubernetes 網路知識，例如 Pod、節點、服務、Kubernetes 控制平面、kubelet 和 kube-proxy 的概念。

我們建議您按照順序閱讀這些頁面，即從 [混合節點的聯網概念](hybrid-nodes-concepts-networking.md) 開始，接著是 [混合節點的 Kubernetes 概念](hybrid-nodes-concepts-kubernetes.md)，最後是 [混合節點的網路流量流程](hybrid-nodes-concepts-traffic-flows.md)。

**Topics**
+ [混合節點的聯網概念](hybrid-nodes-concepts-networking.md)
+ [混合節點的 Kubernetes 概念](hybrid-nodes-concepts-kubernetes.md)
+ [混合節點的網路流量流程](hybrid-nodes-concepts-traffic-flows.md)

# 混合節點的聯網概念
<a name="hybrid-nodes-concepts-networking"></a>

本節詳細說明設計 EKS 混合節點的網路拓撲時，必須考量的核心聯網概念和限制條件。

## EKS 混合節點的聯網概念
<a name="_networking_concepts_for_eks_hybrid_nodes"></a>

![\[高階混合節點網路圖\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-highlevel-network.png)


 **VPC 作為網路集線器** 

所有跨雲端邊界路由的流量都會通過您的 VPC。這包括在 中執行的 EKS 控制平面或 Pod AWS 與在其上執行的混合節點或 Pod 之間的流量。您可以將叢集的 VPC 視為混合節點與叢集其餘部分之間的網路集線器。此架構可讓您完全控制流量及其路由，但也可要求您須負責正確設定 VPC 的路由、安全群組和防火牆。

 **EKS 控制平面到 VPC** 

EKS 控制平面會將**彈性網路介面 (ENI)** 連接至您的 VPC。這些 ENI 會處理進出 EKS API 伺服器的流量。您可以在設定叢集時控制 EKS 控制平面 ENI 的置放，因為 EKS 會將 ENI 連接到您在叢集建立期間傳遞的子網路。

EKS 會將安全群組與 EKS 連接到子網路的 ENI 建立關聯。這些安全群組允許流量透過 ENI 進出 EKS 控制平面。這對 EKS 混合節點很重要，因為您必須允許流量從混合節點和在其上執行的 Pod 進入 EKS 控制平面 ENI。

 **遠端節點網路** 

遠端節點網路，特別是遠端節點 CIDR，是指派給您用作混合節點的機器的 IP 範圍。當您佈建混合節點時，它們位於您的內部部署資料中心或邊緣節點，這是與 EKS 控制平面和 VPC 不同的網路網域。每個混合節點都有來自遠端節點 CIDR 的 IP 位址或地址，而該 CIDR 與您 VPC 中的子網路不同。

您可以使用這些遠端節點 CIDR 設定 EKS 叢集，以便 EKS 知道透過叢集 VPC 路由所有以混合節點 IP 為目標的流量，例如請求到 kubelet API。API 的連線`kubelet`用於 `kubectl attach`、`kubectl cp`、`kubectl logs`、 `kubectl exec`和 `kubectl port-forward`命令。

 **遠端 Pod 網路** 

遠端 Pod 網路是指派給在混合節點上執行的 Pod 的 IP 範圍。一般而言，您可以使用這些範圍設定 CNI，而 CNI 的 IP 位址管理 (IPAM) 功能會負責將這些範圍的配量指派給每個混合節點。當您建立 Pod 時，CNI 會從配置給已排程 Pod 的節點的配量，將 IP 指派給 Pod。

您可以使用這些遠端 Pod CIDR 設定 EKS 叢集，因此 EKS 控制平面知道透過叢集的 VPC 路由所有以混合節點上執行的 Pod 為目標的流量，例如與 Webhook 的通訊。

![\[遠端 Pod 網路\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-remote-pod-cidrs.png)


 **內部部署到 VPC** 

您用於混合節點的內部部署網路必須路由到您用於 EKS 叢集的 VPC。若要將內部部署網路連接到 VPC，有數個[網路到 Amazon VPC 連線選項](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/network-to-amazon-vpc-connectivity-options.html)可用。您也可以使用自己的 VPN 解決方案。

請務必在 VPC 和內部部署網路的 AWS 雲端端正確設定路由，以便兩個網路透過兩個網路的連線路由正確的流量。

在 VPC 中，所有流向遠端節點和遠端 Pod 網路的流量都必須透過連線路由至內部部署網路 (稱為「閘道」)。如果您的部分子網路具有不同的路由表，則您必須使用混合節點的路由和在其上執行的 Pod 來設定每個路由表。對於連接 EKS 控制平面 ENI 的子網路，以及包含必須與混合節點通訊的 EC2 節點或 Pod 的子網路而言，都是如此。

在內部部署網路中，您必須設定網路，以允許進出 EKS 叢集 VPC 的流量，以及混合節點 AWS 所需的其他服務。EKS 叢集的流量可雙向周遊閘道。

## 聯網限制條件
<a name="_networking_constraints"></a>

 **完全路由的網路** 

主要限制條件是 EKS 控制平面和所有節點 (雲端或混合節點) 需要形成一個**完全路由的**網路。這表示所有節點都必須能夠透過 IP 位址在第三層彼此連接。

由於 EKS 控制平面和雲端節點位於平面網路 (VPC) 中，因此它們可以彼此連接。不過，混合節點會位於不同的網路網域中。因此，您需要在 VPC 和內部部署網路中設定額外的路由，以在混合節點和叢集的其餘部分之間路由流量。如果混合節點可從彼此和 VPC 連接，則您的混合節點可以位於單一平面網路或多個分段網路中。

 **可路由的遠端 Pod CIDR** 

若要讓 EKS 控制平面與在混合節點 (例如 Webhook 或指標伺服器) 上執行的 Pod 通訊，或讓在雲端節點上執行的 Pod 與在混合節點上執行的 Pod 通訊 (工作負載東西通訊)，您的遠端 Pod CIDR 必須可從 VPC 路由。這表示 VPC 必須能夠透過閘道將流量路由至內部部署網路的 Pod CIDR，並且您的內部部署網路必須能夠將 Pod 的流量路由至正確的節點。

請務必注意 VPC 和內部部署中 Pod 路由要求之間的差異。VPC 只需要知道任何流向遠端 Pod 的流量均應通過閘道。如果您只有一個遠端 Pod CIDR，則僅需一個路由。

此要求適用於您內部部署網路中的所有躍點，直到與您的混合節點位於相同子網路的本機路由器為止。這是唯一需要了解指派給每個節點的 Pod CIDR 配量的路由器，從而確保特定 Pod 的流量會交付至已排程 Pod 的節點。

您可以選擇將這些內部部署 Pod CIDR 的路由從本機內部部署路由器傳播到 VPC 路由表，但這並非必要。如果您的內部部署 Pod CIDR 經常變更，且您的 VPC 路由表需要更新以反映不斷變化的 Pod CIDR，我們建議您將內部部署 Pod CIDR 傳播至 VPC 路由表，不過這並不常見。

請注意，將內部部署 Pod CIDR 設為可路由的限制條件為選用項。如果您不需要在混合節點上執行 Webhook，或讓雲端節點上的 Pod 與混合節點上的 Pod 通訊，則您無需為內部部署網路上的 Pod CIDR 設定路由。

 *為什麼內部部署 Pod CIDR 需要使用混合節點進行路由？* 

將 EKS 與雲端節點的 VPC CNI 搭配使用時，VPC CNI 會將 IP 直接從 VPC 指派給 Pod。這表示不需要任何特殊路由，因為雲端 Pod 和 EKS 控制平面都可以直接連接 Pod IP。

當在內部部署執行 (以及與雲端中的其他 CNI 一起執行) 時，Pod 通常會在隔離的覆蓋網路中執行，而 CNI 則負責在 Pod 之間交付流量。這通常透過封裝來完成：CNI 會將 pod 至 pod 流量轉換為節點至節點流量，並負責兩端的封裝和解封裝。如此一來，就節點和路由器上就不需要額外的組態。

與混合節點的聯網是唯一的，因為它會提供兩種拓撲的組合：EKS 控制平面和雲端節點 (使用 VPC CNI) 預期包括節點和 Pod 的平坦網路，而混合節點上執行的 Pod 則位於覆蓋網路 (預設位於 Cilium)中，可透過使用 VXLAN 進行封裝。在混合節點上執行的 Pod 可以連接在雲端節點上執行的 EKS 控制平面和 Pod，前提是內部部署網路可路由到 VPC。不過，如果沒有內部部署網路上的 Pod CIDR 的路由，而且網路不知道如何連接至覆蓋網路以及路由到正確的節點，則最終會捨棄任何返回內部部署 Pod IP 的流量。

# 混合節點的 Kubernetes 概念
<a name="hybrid-nodes-concepts-kubernetes"></a>

此頁面詳細說明支援 EKS 混合節點系統架構的重要 Kubernetes 概念。

## VPC 中的 EKS 控制平面
<a name="hybrid-nodes-concepts-k8s-api"></a>

EKS 控制平面 ENI 的 IP 會存放在 `default` 命名空間的 `kubernetes` `Endpoints` 物件中。當 EKS 建立新的 ENI 或移除較舊的 ENI 時，EKS 會更新此物件，以便 IP 清單永遠是保持最新。

您可以透過 `kubernetes` 服務使用這些端點，也可以在 `default` 命名空間中使用這些端點。此服務為 `ClusterIP` 類型，且一律會獲指派叢集服務 CIDR 的第一個 IP。例如，對於服務 CIDR `172.16.0.0/16`，服務 IP 將為 `172.16.0.1`。

一般而言，這就是 Pod (無論是在雲端還是在混合節點中執行) 存取 EKS Kubernetes API 伺服器的方式。Pod 使用服務 IP 最為目的地 IP，且其會轉譯為其中一個 EKS 控制平面 ENI 的實際 IP。主要例外狀況是 `kube-proxy`，因為它會設定轉譯。

## EKS API 伺服器端點
<a name="hybrid-nodes-concepts-k8s-eks-api"></a>

`kubernetes` 服務 IP 並非存取 EKS API 伺服器的唯一方式。當您建立叢集時，EKS 也會建立一個 Route53 DNS 名稱。這是呼叫 EKS `DescribeCluster` API 動作時 EKS 叢集的 `endpoint` 欄位。

```
{
    "cluster": {
        "endpoint": "https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com",
        "name": "my-cluster",
        "status": "ACTIVE"
    }
}
```

在公有端點存取或公有和私有端點存取叢集中，根據預設，您的混合節點會將此 DNS 名稱解析為公有 IP，且可透過網際網路路由。在私有端點存取叢集中，DNS 名稱會解析為 EKS 控制平面 ENI 的私有 IP。

這是 `kubelet` 和 `kube-proxy` 存取 Kubernetes API 伺服器的方式。如果您希望所有 Kubernetes 叢集流量流經 VPC，您需要以私有存取模式設定叢集，或修改內部部署 DNS 伺服器，以將 EKS 叢集端點解析為 EKS 控制平面 ENI 的私有 IP。

## `kubelet` 端點
<a name="hybrid-nodes-concepts-k8s-kubelet-api"></a>

`kubelet` 會公開數個 REST 端點，從而允許系統的其他部分與每個節點互動並收集資訊。在大多數叢集中，前往 `kubelet` 伺服器的大多數流量都來自控制平面，但某些監控代理程式也可能會與其互動。

透過此介面，`kubelet` 會處理各種請求：擷取日誌 (`kubectl logs`)、在容器內執行命令 (`kubectl exec`) 以及連接埠轉送流量 (`kubectl port-forward`)。其中每個請求皆會透過 `kubelet` 與基礎容器執行時期互動，而對叢集管理員和開發人員來說，這似乎是無縫的。

此 API 最常見的取用者是 Kubernetes API 伺服器。當您使用上述任何 `kubectl` 命令時，`kubectl` 會向 API 伺服器發出 API 請求，然後呼叫執行 Pod 的節點的 `kubelet` API。這就是需要從 EKS 控制平面連接至節點 IP，以及即使您的 Pod 正在執行，如果節點路由設定錯誤，您也無法存取其日誌或 `exec` 的主要原因。

 **節點 IP** 

當 EKS 控制平面與節點通訊時，其會使用以 `Node` 物件狀態 (`status.addresses`) 回報的其中一個地址。

使用 EKS 雲端節點時，kubelet 通常會在節點註冊期間將 EC2 執行個體的私有 IP 報告為 `InternalIP`。然後，雲端控制器管理員 (CCM) 會驗證此 IP，進而確保其屬於 EC2 執行個體。此外，CCM 通常會將執行個體的公有 IP (例如 `ExternalIP`) 和 DNS 名稱 (`InternalDNS` 和 `ExternalDNS`) 新增至節點狀態。

不過，混合節點沒有 CCM。當您向 EKS 混合節點 CLI (`nodeadm`) 註冊混合節點時，它會將 kubelet 設定為在節點狀態中直接報告機器的 IP，且不需要 CCM。

```
apiVersion: v1
kind: Node
metadata:
  name: my-node-1
spec:
  providerID: eks-hybrid:///us-west-2/my-cluster/my-node-1
status:
  addresses:
  - address: 10.1.1.236
    type: InternalIP
  - address: my-node-1
    type: Hostname
```

如果您的機器具有多個 IP，則 kubelet 會依照其自己的邏輯選取其中一個 IP。您可以使用 `--node-ip` 旗標來控制選取的 IP，而您可以在 `spec.kubelet.flags` 中的 `nodeadm` 組態內傳遞該旗標。只有 `Node` 物件中報告的 IP 需要來自 VPC 的路由。您的機器可能擁有無法從雲端連線的其他 IP。

## `kube-proxy`
<a name="hybrid-nodes-concepts-k8s-kube-proxy"></a>

 `kube-proxy` 負責在每個節點的網路層實作服務抽象。它可作為通往 Kubernetes Services 的流量的網路代理和負載平衡器。透過持續監看 Kubernetes API 伺服器中是否存在與服務和端點相關的變更，`kube-proxy` 會動態更新基礎主機的聯網規則，進而確保流量導向正確無誤。

在 `iptables` 模式中，`kube-proxy` 會設定數個 `netfilter` 鏈結來處理服務流量。這些規則可組成下列階層：

1.  **KUBE-SERVICES 鏈結**：所有服務流量的進入點。它具有與每個服務的 `ClusterIP` 和連接埠相符的規則。

1.  **KUBE-SVC-XXX 鏈結**：服務特定鏈結針對每個服務都設有負載平衡規則。

1.  **KUBE-SEP-XXX 鏈結**：端點特定鏈結設有實際 `DNAT` 規則。

讓我們檢查 `default` 命名空間中服務 `test-server` 的情況：\$1 服務 ClusterIP：`172.16.31.14` \$1 服務連接埠：`80` \$1 支援 Pod：`10.2.0.110`、`10.2.1.39` 和 `10.2.2.254` 

當我們檢查 `iptables` 規則時 (使用 `iptables-save 0 grep -A10 KUBE-SERVICES`)：

1. 在 **KUBE-SERVICES** 鏈結中，我們可找到與服務相符的規則：

   ```
   -A KUBE-SERVICES -d 172.16.31.14/32 -p tcp -m comment --comment "default/test-server cluster IP" -m tcp --dport 80 -j KUBE-SVC-XYZABC123456
   ```
   + 此規則與目的地為 172.16.31.14:80 的封包相符
   + 該註解指出此規則的用途：`default/test-server cluster IP`
   + 相符的封包會跳至 `KUBE-SVC-XYZABC123456` 鏈結

1. **KUBE-SVC-XYZABC123456** 鏈結設有機率型負載平衡規則：

   ```
   -A KUBE-SVC-XYZABC123456 -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-POD1XYZABC
   -A KUBE-SVC-XYZABC123456 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-POD2XYZABC
   -A KUBE-SVC-XYZABC123456 -j KUBE-SEP-POD3XYZABC
   ```
   + 第一項規則：33.3% 的機會跳至 `KUBE-SEP-POD1XYZABC` 
   + 第二項規則：50% 的剩餘流量 (總計的 33.3%) 會跳至 `KUBE-SEP-POD2XYZABC` 
   + 最後一項規則：所有剩餘的流量 (總計的 33.3%) 會跳至 `KUBE-SEP-POD3XYZABC` 

1. 個別 **KUBE-SEP-XXX** 鏈結會執行 DNAT (目的地 NAT)：

   ```
   -A KUBE-SEP-POD1XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.0.110:80
   -A KUBE-SEP-POD2XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.1.39:80
   -A KUBE-SEP-POD3XYZABC -p tcp -m tcp -j DNAT --to-destination 10.2.2.254:80
   ```
   + 這些 DNAT 規則會重寫目的地 IP 和連接埠，以將流量導向特定的 Pod。
   + 每項規則可處理大約 33.3% 的流量，以便在 `10.2.0.110`、`10.2.1.39` 和 `10.2.2.254` 之間提供均勻的負載平衡。

此多層級鏈結結構讓 `kube-proxy` 能夠透過核心層級封包操作高效實作服務負載平衡和重新導向，而不需要資料路徑中的代理。

### 對 Kubernetes 操作的影響
<a name="hybrid-nodes-concepts-k8s-operations"></a>

節點上中斷的 `kube-proxy` 可防止該節點正常路由服務流量，進而導致依賴叢集服務的 Pod 逾時或連線失敗。首次註冊節點時，這尤其會造成干擾。在設定任何 Pod 聯網之前，CNI 需要與 Kubernetes API 伺服器通訊以取得資訊，例如節點的 Pod CIDR。為此，它會使用 `kubernetes` 服務 IP。不過，如果 `kube-proxy` 無法啟動或無法設定正確的 `iptables` 規則，則傳送至 `kubernetes` 服務 IP 的請求不會轉譯為 EKS 控制平面 ENI 的實際 IP。因此，CNI 將進入損毀循環，而且任何 Pod 都無法正常執行。

我們知道 Pod 會使用 `kubernetes` 服務 IP 與 Kubernetes API 伺服器通訊，但 `kube-proxy` 需要先設定 `iptables` 規則才能讓其運作。

`kube-proxy` 如何與 API 伺服器通訊？

必須將 `kube-proxy` 設定為使用 Kubernetes API 伺服器的實際 IP 或解析為它們的 DNS 名稱。若為 EKS，則 EKS 會將預設的 `kube-proxy` 設定為指向 EKS 在您建立叢集時建立的 Route53 DNS 名稱。您可以在 `kube-system` 命名空間的 `kube-proxy` ConfigMap 中看到此值。此 ConfigMap 的內容是注入 `kube-proxy` Pod 中的 `kubeconfig`，因此請尋找 `clusters0.cluster.server` 欄位。此值將與您 EKS 叢集的 `endpoint` 欄位相符 (呼叫 EKS `DescribeCluster` API 時)。

```
apiVersion: v1
data:
  kubeconfig: |-
    kind: Config
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        server: https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com
      name: default
    contexts:
    - context:
        cluster: default
        namespace: default
        user: default
      name: default
    current-context: default
    users:
    - name: default
      user:
        tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
kind: ConfigMap
metadata:
  name: kube-proxy
  namespace: kube-system
```

## 可路由的遠端 Pod CIDR
<a name="hybrid-nodes-concepts-k8s-pod-cidrs"></a>

此 [混合節點的聯網概念](hybrid-nodes-concepts-networking.md) 頁面會詳細說明在混合節點上執行 Webhook 或讓在雲端節點上執行的 Pod 與在混合節點上執行的 Pod 進行通訊的需求。關鍵要求是，內部部署路由器需要知道哪個節點負責特定的 Pod IP。有幾種方法可以實現這一點，包括邊界閘道協定 (BGP)、靜態路由和位址解析通訊協定 (ARP) 代理。詳細方法請參閱下列各節。

 **邊界閘道協定 (BGP)** 

如果您的 CNI 對其提供支援 (例如 Cilium 和 Calico)，您可以使用 CNI 的 BGP 模式，以將路由傳播到每個節點的 Pod CIDR (從節點到本機路由器)。使用 CNI 的 BGP 模式時，您的 CNI 可作為虛擬路由器，因此您的本機路由器會認為 Pod CIDR 屬於不同的子網路，而您的節點是該子網路的閘道。

![\[混合節點 BGP 路由\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-bgp.png)


 **靜態路由** 

或者，您可以在本機路由器中設定靜態路由。這是將內部部署 Pod CIDR 路由至 VPC 的最簡單方法，但這也是最容易出錯且難以維護的方法。您需要確保路由始終與現有節點及其指派的 Pod CIDR 保持同步。如果您的節點數量很小且基礎結構為靜態，則此方案可行，並且不需要路由器中的 BGP 支援。如果您選擇此方案，那麼建議您使用要指派給每個節點的 Pod CIDR 配量來設定 CNI，而不是讓其 IPAM 決定。

![\[混合節點靜態路由\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-static-routes.png)


 **位址解析通訊協定 (ARP) 代理** 

ARP 代理是讓內部部署 Pod IP 可路由的另一種方法，並且當您的混合節點與本機路由器位於相同的第 2 層網路上時，特別有用。啟用 ARP 代理後，節點會回應其託管的 Pod IP 的 ARP 請求，即使這些 IP 屬於不同的子網路。

當您本機網路上的裝置嘗試連接 Pod IP 時，會先傳送 ARP 請求，並詢問「誰有此 IP？」。託管該 Pod 的混合節點將以其自己的 MAC 位址回應，表示「我可以處理該 IP 的流量」。這會在本機網路上的裝置與 Pod 之間建立一條直接路徑，而無需路由器組態。

若要使其運作，您的 CNI 必須支援代理 ARP 功能。Cilium 內建對代理 ARP 的支援，並且您可以透過組態將其啟用。關鍵考量是，Pod CIDR 不得與您環境中的任何其他網路重疊，因為這可能會導致路由衝突。

此方法有多個優點：\$1 無需使用 BGP 設定路由器或維護靜態路由 \$1 適用於您無法控制路由器組態的環境

![\[混合節點 ARP 代理\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-arp-proxy.png)


## Pod 至 Pod 封裝
<a name="hybrid-nodes-concepts-k8s-pod-encapsulation"></a>

在內部部署環境中，CNI 通常會使用封裝通訊協定來建立可在實體網路上運行的覆蓋網路，而無需重新設定。本節說明此封裝如何運作。請注意，某些詳細資訊可能會因您使用的 CNI 而有所不同。

封裝會將原始 Pod 網路封包包裝在另一個可透過基礎實體網路路由的網路封包內。這可讓 Pod 跨執行相同 CNI 的節點進行通訊，而不需要實體網路知道如何路由這些 Pod CIDR。

與 Kubernetes 搭配使用的最常見封裝通訊協定是虛擬局域網擴展 (VXLAN)，但視您的 CNI 而定，也可使用其他通訊協定 (例如 `Geneve`)。

### VXLAN 封裝
<a name="_vxlan_encapsulation"></a>

VXLAN 將第 2 層乙太網路訊框封裝在 UDP 封包內。當 Pod 將流量傳送至不同節點上的另一個 Pod 時，CNI 會執行下列動作：

1. CNI 攔截來自 Pod A 的封包

1. CNI 將原始封包包裝在 VXLAN 標頭中

1. 然後，此已包裝的封包會透過節點的一般網路堆疊傳送至目的地節點

1. 目的地節點上的 CNI 會取消包裝封包並將其交付至 Pod B

以下是 VXLAN 封裝期間封包結構的相關情況：

原始 Pod 至 Pod 封包：

```
+-----------------+---------------+-------------+-----------------+
| Ethernet Header | IP Header     | TCP/UDP     | Payload         |
| Src: Pod A MAC  | Src: Pod A IP | Src Port    |                 |
| Dst: Pod B MAC  | Dst: Pod B IP | Dst Port    |                 |
+-----------------+---------------+-------------+-----------------+
```

VXLAN 封裝後：

```
+-----------------+-------------+--------------+------------+---------------------------+
| Outer Ethernet  | Outer IP    | Outer UDP    | VXLAN      | Original Pod-to-Pod       |
| Src: Node A MAC | Src: Node A | Src: Random  | VNI: xx    | Packet (unchanged         |
| Dst: Node B MAC | Dst: Node B | Dst: 4789    |            | from above)               |
+-----------------+-------------+--------------+------------+---------------------------+
```

VXLAN 網路識別符 (VNI) 可區分不同的覆蓋網路。

### Pod 通訊案例
<a name="_pod_communication_scenarios"></a>

 **相同混合節點上的 Pod** 

當相同混合節點上的 Pod 彼此通訊時，通常不需要封裝。CNI 會設定本機路由，而該路由可透過節點的內部虛擬介面來引導 Pod 之間的流量：

```
Pod A -> veth0 -> node's bridge/routing table -> veth1 -> Pod B
```

封包永遠不會離開節點，並且也不需要封裝。

 **不同混合節點上的 Pod** 

不同混合節點上的 Pod 之間的通訊需要封裝：

```
Pod A -> CNI -> [VXLAN encapsulation] -> Node A network -> router or gateway -> Node B network -> [VXLAN decapsulation] -> CNI -> Pod B
```

這可讓 Pod 流量周遊實體網路基礎結構，而無需實體網路來了解 Pod IP 路由。

# 混合節點的網路流量流程
<a name="hybrid-nodes-concepts-traffic-flows"></a>

此頁面詳細說明 EKS 混合節點的網路流量流程，其中各圖表會顯示不同流量類型的端到端網路路徑。

涵蓋下列流量流程：
+  [混合節點 `kubelet` 到 EKS 控制平面](#hybrid-nodes-concepts-traffic-flows-kubelet-to-cp) 
+  [EKS 控制平面到混合節點 (`kubelet` 伺服器)](#hybrid-nodes-concepts-traffic-flows-cp-to-kubelet) 
+  [在混合節點上執行的 Pod 到 EKS 控制平面](#hybrid-nodes-concepts-traffic-flows-pods-to-cp) 
+  [EKS 控制平面到混合節點上執行的 Pod (Webhook)](#hybrid-nodes-concepts-traffic-flows-cp-to-pod) 
+  [在混合節點上執行的 Pod 到 Pod](#hybrid-nodes-concepts-traffic-flows-pod-to-pod) 
+  [雲端節點上的 Pod 到混合節點上的 Pod (東西流量)](#hybrid-nodes-concepts-traffic-flows-east-west) 

## 混合節點 `kubelet` 到 EKS 控制平面
<a name="hybrid-nodes-concepts-traffic-flows-kubelet-to-cp"></a>

![\[混合節點 kubelet 到 EKS 控制平面\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-kubelet-to-cp-public.png)


### 請求
<a name="_request"></a>

 **1`kubelet`. 啟動請求** 

當混合節點上的 `kubelet` 需要與 EKS 控制平面進行通訊時 (例如，報告節點狀態或取得 Pod 規格)，它會使用節點註冊期間提供的 `kubeconfig` 檔案。該 `kubeconfig` 具有 API 伺服器端點 URL (Route53 DNS 名稱)，而不是直接 IP 位址。

`kubelet` 會執行端點的 DNS 查詢 (例如，`https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gr7.us-west-2.eks.amazonaws.com`)。在公有存取叢集中，這會解析為屬於在 AWS中執行的 EKS 服務的公有 IP 位址 (例如 `54.239.118.52`)。然後，`kubelet` 會為此端點建立安全的 HTTPS 請求。初始封包如下所示：

```
+--------------------+---------------------+-----------------+
| IP Header          | TCP Header          | Payload         |
| Src: 10.80.0.2     | Src: 52390 (random) |                 |
| Dst: 54.239.118.52 | Dst: 443            |                 |
+--------------------+---------------------+-----------------+
```

 **2. 本機路由器路由** 

由於目的地 IP 是公有 IP 位址並且不屬於本機網路，因此 `kubelet` 會將此封包傳送至其預設閘道 (本機內部部署路由器)。路由器會檢查目的地 IP，並判定其是否為公有 IP 位址。

對於公有流量，路由器通常會將封包轉送至網際網路閘道或邊界路由器，而它們可處理向網際網路的傳出流量。此內容未在圖表中顯示，且具體取決於內部部署網路的設定方式。封包會在您的內部部署網路基礎結構上傳輸，最終連接網際網路服務提供商的網路。

 **3. 交付至 EKS 控制平面** 

封包會通過公有網際網路和傳輸網路，直到到達 AWS網路。 AWS的網路會將封包路由到適當區域中的 EKS 服務端點。當該封包連接 EKS 服務時，它會轉送到叢集的實際 EKS 控制平面。

透過公有網際網路的路由不同於我們在其他流量流程中看到的私有 VPC 路由路徑。主要差異在於，使用公有存取模式時，從內部部署 `kubelet` (儘管並非從 Pod) 到 EKS 控制平面的流量不會經過您的 VPC，而是會使用全球網際網路基礎結構。

### 回應
<a name="_response"></a>

在 EKS 控制平面處理 `kubelet` 請求後，它會傳送回應：

 **3. EKS 控制平面傳送回應** 

EKS 控制平面會建立回應封包。此封包將公有 IP 作為來源，並將混合節點的 IP 作為目的地：

```
+--------------------+---------------------+-----------------+
| IP Header          | TCP Header          | Payload         |
| Src: 54.239.118.52 | Src: 443            |                 |
| Dst: 10.80.0.2     | Dst: 52390          |                 |
+--------------------+---------------------+-----------------+
```

 **2. 網際網路路由** 

回應封包會透過網際網路傳回，並遵循網際網路服務提供商確定的路由路徑，直到連接您的內部部署網路邊緣路由器為止。

 **1。本機交付** 

您的內部部署路由器會接收封包，並將目的地 IP (`10.80.0.2`) 識別為屬於您的本機網路。它會透過您的本機網路基礎結構轉送封包，直到它連接目標混合節點為止，其中 `kubelet` 會接收和處理回應。

## 混合節點 `kube-proxy` 到 EKS 控制平面
<a name="_hybrid_node_kube_proxy_to_eks_control_plane"></a>

如果您啟用叢集的公有端點存取，則傳回流量會使用公有網際網路。此流量源自混合節點上的 `kube-proxy` 且通往 EKS 控制平面，因此須遵循與從 `kubelet` 到 EKS 控制平面的流量相同的路徑。

## EKS 控制平面到混合節點 (`kubelet` 伺服器)
<a name="hybrid-nodes-concepts-traffic-flows-cp-to-kubelet"></a>

![\[EKS 控制平面到混合節點\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-cp-to-kubelet.png)


### 請求
<a name="_request_2"></a>

 **1。EKS Kubernetes API 伺服器啟動請求** 

EKS Kubernetes API 伺服器會從節點物件的狀態擷取節點的 IP 位址 (`10.80.0.2`)。然後，它會透過 VPC 中的 ENI 路由此請求，因為目的地 IP 屬於已設定的遠端節點 CIDR (`10.80.0.0/16`)。初始封包如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 67493 (random) |                 |
| Dst: 10.80.0.2  | Dst: 10250          |                 |
+-----------------+---------------------+-----------------+
```

 **2. VPC 網路處理** 

該封包會離開 ENI 並進入 VPC 網路層，而其會導向子網路的閘道，以便進行進一步路由。

 **3. VPC 路由表查詢** 

包含 EKS 控制平面 ENI 的子網路的 VPC 路由表具有適用於遠端節點 CIDR 的特定路由 (圖表中的第二個路由)。根據此路由規則，該封包會導向至 VPC-to-onprem 閘道。

 **4. 跨邊界傳輸** 

閘道會透過您已建立的連線 (例如 Direct Connect 或 VPN)，將封包跨雲端邊界傳輸到您的內部部署網路。

 **5. 內部部署網路接收** 

該封包會抵達本機內部部署路由器，以處理混合節點所在的子網路的流量。

 **6. 最終交付** 

本機路由器會識別目的地 IP (`10.80.0.2`) 位址屬於其直接連接的網路，並將封包直接轉送至目標混合節點，而 `kubelet` 會在其中接收和處理請求。

### 回應
<a name="_response_2"></a>

在混合節點的 `kubelet` 處理請求後，它會遵循相同路徑反向傳回回應：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 10250          |                 |
| Dst: 10.0.0.132 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **6. `kubelet` 傳送回應** 

混合節點 (`10.80.0.2`) 上的 `kubelet` 會使用原始來源 IP 作為目的地來建立回應封包。該目的地不屬於本機網路，因此其會傳送到主機的預設閘道，也就是本機路由器。

 **5. 本機路由器路由** 

該路由器會判定目的地 IP (`10.0.0.132`) 屬於 `10.0.0.0/16`，並且其具有會指向連接到 AWS的閘道的路由。

 **4. 跨邊界傳回** 

該封包會傳回相同的內部部署至 VPC 連線 (例如 Direct Connect 或 VPN)，並以相反方向跨越雲端邊界。

 **3. VPC 路由** 

當該封包抵達 VPC 時，路由表會識別目的地 IP 屬於 VPC CIDR。該封包會在 VPC 內路由。

 **2. VPC 網路交付** 

VPC 網路層會使用 EKS 控制平面 ENI (`10.0.0.132`) 將封包轉送至子網路。

 **1。ENI 接收** 

該封包會到達連接到 Kubernetes API 伺服器的 EKS 控制平面 ENI，以便完成往返。

## 在混合節點上執行的 Pod 到 EKS 控制平面
<a name="hybrid-nodes-concepts-traffic-flows-pods-to-cp"></a>

![\[在混合節點上執行的 Pod 到 EKS 控制平面\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-pod-to-cp.png)


### 不使用 CNI NAT
<a name="_without_cni_nat"></a>

### 請求
<a name="_request_3"></a>

Pod 通常會透過 `kubernetes` 服務與 Kubernetes API 伺服器進行通訊。服務 IP 是叢集的服務 CIDR 的第一個 IP。此慣例允許需要在 CoreDNS 可用之前執行的 Pod，以便連接 API 伺服器，例如 CNI。請求以服務 IP 作為目的地離開 Pod。例如，如果服務 CIDR 為 `172.16.0.0/16`，則服務 IP 將為 `172.16.0.1`。

 **1。Pod 啟動請求** 

Pod 會從隨機來源連接埠傳送請求至 API 伺服器連接埠 (443) 上的 `kubernetes` 服務 IP (`172.16.0.1`)。封包如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

 **2. CNI 處理** 

CNI 偵測到目的地 IP 不屬於其管理的任何 Pod CIDR。由於**傳出 NAT 已停用**，CNI 會將該封包傳遞至主機網路堆疊，而且不會進行修改。

 **3. 節點網路處理** 

該封包會進入節點的網路堆疊，其中 `netfilter` 勾點會觸發由 kube-proxy 設定的 `iptables` 規則。按下列順序依次適用數條規則：

1. 該封包會先命中 `KUBE-SERVICES` 鏈結，其中包含與每個服務的 ClusterIP 和連接埠相符的規則。

1. 該相符規則會跳至 `kubernetes` 服務的 `KUBE-SVC-XXX` 鏈結 (以 `172.16.0.1:443` 為目的地的封包)，其中包含負載平衡規則。

1. 該負載平衡規則會隨機選取控制平面 ENI IP (`10.0.0.132` 或 `10.0.1.23`) 的其中一個 `KUBE-SEP-XXX` 鏈結。

1. 選取的 `KUBE-SEP-XXX` 鏈結具有實際規則，可將目的地 IP 從服務 IP 變更為選取的 IP。這就是所謂的目的地網路位址轉譯 (DNAT)。

套用這些規則後，假設選取的 EKS 控制平面 ENI 的 IP 為 `10.0.0.132`，且封包會如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 10.0.0.132 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

節點會將封包轉送至其預設閘道，因為目的地 IP 不在本機網路中。

 **4. 本機路由器路由** 

本機路由器會判定目的地 IP (`10.0.0.132`) 屬於 VPC CIDR (`10.0.0.0/16`)，並將其轉送至與 AWS連接的閘道。

 **5. 跨邊界傳輸** 

封包會透過您已建立的連線 (例如 Direct Connect 或 VPN) 跨雲端邊界傳輸到 VPC。

 **6. VPC 網路交付** 

VPC 網路層會將封包路由至 EKS 控制平面 ENI (`10.0.0.132`) 所在的正確子網路。

 **7. ENI 接收** 

該封包會到達連接到 Kubernetes API 伺服器的 EKS 控制平面 ENI。

### 回應
<a name="_response_3"></a>

在 EKS 控制平面處理請求後，它會傳送回應至 Pod：

 **7. API 伺服器傳送回應** 

EKS Kubernetes API 伺服器會使用原始來源 IP 作為目的地，進而建立回應封包。封包如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

由於目的地 IP 屬於已設定的遠端 Pod CIDR (`10.85.0.0/16`)，因此它會透過其在 VPC 中的 ENI 傳送，並將子網路的路由器作為下一個躍點。

 **6. VPC 路由** 

VPC 路由表包含遠端 Pod CIDR (`10.85.0.0/16`) 的項目，並且會將此流量導向 VPC-to-onprem 閘道。

 **5. 跨邊界傳輸** 

閘道會透過您已建立的連線 (例如 Direct Connect 或 VPN)，將封包跨雲端邊界傳輸到您的內部部署網路。

 **4. 內部部署網路接收** 

封包送達本機內部部署路由器。

 **3. 交付至節點** 

路由器的資料表有一個 `10.85.1.0/24` 的項目，其中 `10.80.0.2` 將作為下一個躍點，負責將封包交付至我們的節點。

 **2. 節點網路處理** 

當封包由節點的網路堆疊處理時，`conntrack` (`netfilter` 的一部分) 會將封包與 Pod 最初建立的連線進行比對。由於最初套用了 DNAT，`conntrack` 透過將來源 IP 從 EKS 控制平面 ENI 的 IP 重寫到 `kubernetes` 服務 IP，進而反轉 DNAT：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **1。CNI 處理** 

CNI 會識別目的地 IP 屬於其網路中的 Pod，並將封包交付至正確的 Pod 網路命名空間。

此流程展示為什麼遠端 Pod CIDR 必須能夠從 VPC 一直正確路由到託管每個 Pod 的特定節點，整個傳回路徑取決於跨雲端和內部部署網路的適當 Pod IP 路由。

### 使用 CNI NAT
<a name="_with_cni_nat"></a>

此流程與*不使用 CNI NAT* 的流程非常相似，但有一個重要差異：CNI 會先將來源 NAT (SNAT) 套用至封包，然後再將其傳送至節點的網路堆疊。這樣一來，即會將封包的來源 IP 變更為節點的 IP，從而允許封包路由回節點，而不需要額外的路由組態。

### 請求
<a name="_request_4"></a>

 **1。Pod 啟動請求** 

Pod 會從隨機來源連接埠傳送請求至 EKS Kubernetes API 伺服器連接埠 (443) 上的 `kubernetes` 服務 IP (`172.16.0.1`)。封包如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

 **2. CNI 處理** 

CNI 偵測到目的地 IP 不屬於其管理的任何 Pod CIDR。由於**傳出 NAT 已啟用**，CNI 會將 SNAT 套用至封包，將來源 IP 變更為節點的 IP，然後再將其傳遞至節點的網路堆疊：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 67493 (random) |                 |
| Dst: 172.16.0.1 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

注意：為了清楚起見，在範例中，CNI 和 `iptables` 會顯示為獨立的區塊，但實際上，有些 CNI 可能會使用 `iptables` 來套用 NAT。

 **3. 節點網路處理** 

在這裡，由 `kube-proxy` 設定的 `iptables` 規則的行為與上一個範例中的行為相同，並且會將封包負載平衡到其中一個 EKS 控制平面 ENI。初始封包現如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.80.0.2  | Src: 67493 (random) |                 |
| Dst: 10.0.0.132 | Dst: 443            |                 |
+-----------------+---------------------+-----------------+
```

節點會將封包轉送至其預設閘道，因為目的地 IP 不在本機網路中。

 **4. 本機路由器路由** 

本機路由器會判定目的地 IP (`10.0.0.132`) 屬於 VPC CIDR (`10.0.0.0/16`)，並將其轉送至與 AWS連接的閘道。

 **5. 跨邊界傳輸** 

封包會透過您已建立的連線 (例如 Direct Connect 或 VPN) 跨雲端邊界傳輸到 VPC。

 **6. VPC 網路交付** 

VPC 網路層會將封包路由至 EKS 控制平面 ENI (`10.0.0.132`) 所在的正確子網路。

 **7. ENI 接收** 

該封包會到達連接到 Kubernetes API 伺服器的 EKS 控制平面 ENI。

### 回應
<a name="_response_4"></a>

在 EKS 控制平面處理請求後，它會傳送回應至 Pod：

 **7. API 伺服器傳送回應** 

EKS Kubernetes API 伺服器會使用原始來源 IP 作為目的地，進而建立回應封包。封包如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 443            |                 |
| Dst: 10.80.0.2  | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

由於目的地 IP 屬於已設定的遠端節點 CIDR (`10.80.0.0/16`)，因此它會透過其在 VPC 中的 ENI 傳送，並將子網路的路由器作為下一個躍點。

 **6. VPC 路由** 

VPC 路由表包含遠端節點 CIDR (`10.80.0.0/16`) 的項目，並且會將此流量導向 VPC-to-onprem 閘道。

 **5. 跨邊界傳輸** 

閘道會透過您已建立的連線 (例如 Direct Connect 或 VPN)，將封包跨雲端邊界傳輸到您的內部部署網路。

 **4. 內部部署網路接收** 

封包送達本機內部部署路由器。

 **3. 交付至節點** 

本機路由器會識別目的地 IP (`10.80.0.2`) 位址屬於其直接連接的網路，並將封包直接轉送至目標混合節點。

 **2. 節點網路處理** 

當封包由節點的網路堆疊處理時，`conntrack` (`netfilter` 的一部分) 會將封包與 Pod 最初建立的連線進行比對，而且由於最初套用了 DNAT，其透過將來源 IP 從 EKS 控制平面 ENI 的 IP 重寫到 `kubernetes` 服務 IP，進而實現反轉：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.80.0.2  | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

 **1。CNI 處理** 

CNI 會識別此封包屬於先前已套用 SNAT 的連線。其會反轉 SNAT，並將目的地 IP 變更回 Pod 的 IP：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 172.16.0.1 | Src: 443            |                 |
| Dst: 10.85.1.56 | Dst: 67493          |                 |
+-----------------+---------------------+-----------------+
```

CNI 偵測到目的地 IP 屬於其網路中的 Pod，並將封包交付至正確的 Pod 網路命名空間。

此流程會示範 CNI NAT-ing 可如何透過允許封包路由回節點來簡化組態，並且無需額外的 Pod CIDR 路由。

## EKS 控制平面到混合節點上執行的 Pod (Webhook)
<a name="hybrid-nodes-concepts-traffic-flows-cp-to-pod"></a>

![\[EKS 控制平面到混合節點上執行的 Pod\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-cp-to-pod.png)


此流量模式最常見於 Webhook 中，而 EKS 控制平面需要直接啟動與混合節點上 Pod 中執行的 Webhook 伺服器的連線。範例包括驗證和變換許可 Webhook，其中這些 Webhook 會在資源驗證或變換程序期間由 API 伺服器呼叫。

### 請求
<a name="_request_5"></a>

 **1。EKS Kubernetes API 伺服器啟動請求** 

在叢集中設定 Webhook 並且相關 API 操作將其觸發後，EKS Kubernetes API 伺服器需要直接連線至 Webhook 伺服器 Pod。API 伺服器會先從與 Webhook 相關聯的服務或端點資源中查詢 Pod 的 IP 位址。

假設 Webhook Pod 在具有 IP `10.85.1.23` 的混合節點上執行，EKS Kubernetes API 伺服器會建立對 Webhook 端點的 HTTPS 請求。初始封包會透過 VPC 中的 EKS 控制平面 ENI 傳送，因為目的地 IP `10.85.1.23` 屬於已設定的遠端 Pod CIDR (`10.85.0.0/16`)。封包如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.132 | Src: 41892 (random) |                 |
| Dst: 10.85.1.23 | Dst: 8443           |                 |
+-----------------+---------------------+-----------------+
```

 **2. VPC 網路處理** 

該封包會離開 EKS 控制平面 ENI 並進入 VPC 網路層，同時會將子網路的路由器作為下一個躍點。

 **3. VPC 路由表查詢** 

包含 EKS 控制平面 ENI 的子網路的 VPC 路由表包含適用於遠端 Pod CIDR 的特定路由 (`10.85.0.0/16`)。此路由規則會將封包導向 VPC-to-onprem 閘道 (例如，適用於 Direct Connect 的虛擬私有閘道或 VPN 連線)：

```
Destination     Target
10.0.0.0/16     local
10.85.0.0/16    vgw-id (VPC-to-onprem gateway)
```

 **4. 跨邊界傳輸** 

閘道會透過您已建立的連線 (例如 Direct Connect 或 VPN)，將封包跨雲端邊界傳輸到您的內部部署網路。該封包會在其於連線傳輸時，維護其原始來源和目的地 IP 位址。

 **5. 內部部署網路接收** 

封包送達本機內部部署路由器。路由器會參考其路由表，以判定連接 10.85.1.23 地址的方式。為此，您的內部部署網路必須具有將流量導向適當混合節點的 Pod CIDR 的路由。

在此情況下，路由器的路由表包含一個項目，其中會指出可透過具有 IP `10.80.0.2` 的混合節點來連接 `10.85.1.0/24` 子網路：

```
Destination     Next Hop
10.85.1.0/24    10.80.0.2
```

 **6. 交付至節點** 

根據路由表項目，路由器會將封包轉送到混合節點 (`10.80.0.2`)。當封包抵達節點時，它看起來與 EKS Kubernetes API 伺服器傳送它時相同，而目的地 IP 仍然是 Pod 的 IP。

 **7. CNI 處理** 

節點的網路堆疊會接收封包，並發現目的地 IP 不是節點的自有 IP，然後將其傳遞給 CNI 以進行處理。CNI 會識別目的地 IP 屬於在此節點上以本機執行的 Pod，並透過適當的虛擬介面將封包轉送至正確的 Pod：

```
Original packet -> node routing -> CNI -> Pod's network namespace
```

Pod 中的 Webhook 伺服器會接收請求並進行處理。

### 回應
<a name="_response_5"></a>

在 Webhook Pod 處理請求後，它會遵循相同路徑反向傳回回應：

 **7. Pod 傳送回應** 

Webhook Pod 會使用其自己的 IP 作為來源建立回應封包，並將原始請求者 (EKS 控制平面 ENI) 作為目的地：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.23 | Src: 8443           |                 |
| Dst: 10.0.0.132 | Dst: 41892          |                 |
+-----------------+---------------------+-----------------+
```

CNI 會識別此封包會移至外部網路 (而非本機 Pod)，並將封包傳遞至保留原始來源 IP 的節點的網路堆疊。

 **6. 節點網路處理** 

節點會判定目的地 IP (`10.0.0.132`) 不在本機網路中，並將封包轉送至其預設閘道 (本機路由器)。

 **5. 本機路由器路由** 

本機路由器會參考其路由表，並判定目的地 IP (`10.0.0.132`) 屬於 VPC CIDR (`10.0.0.0/16`)。它會將封包轉送到連接至 AWS的閘道。

 **4. 跨邊界傳輸** 

該封包會傳回相同的內部部署至 VPC 連線，並以相反方向跨越雲端邊界。

 **3. VPC 路由** 

當該封包抵達 VPC 時，路由表會識別目的地 IP 屬於 VPC 內的子網路。封包會在 VPC 中進行相應路由。

 **2. 和 1. EKS 控制平面 ENI 接收** 

該封包會到達連接到 EKS Kubernetes API 伺服器的 ENI，以便完成往返。API 伺服器會接收 Webhook 回應，並繼續根據此回應處理原始 API 請求。

此流量流程示範為什麼遠端 Pod CIDR 必須正確進行設定和路由：
+ VPC 必須具有指向內部部署閘道的遠端 Pod CIDR 的路由
+ 您的內部部署網路必須具有 Pod CIDR 的路由，並將流量導向託管這些 Pod 的特定節點
+ 如果沒有此路由組態，將無法從 EKS 控制平面連接混合節點上 Pod 中執行的 Webhook 和其他類似服務。

## 在混合節點上執行的 Pod 到 Pod
<a name="hybrid-nodes-concepts-traffic-flows-pod-to-pod"></a>

![\[在混合節點上執行的 Pod 到 Pod\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-pod-to-pod.png)


本節說明在不同混合節點上執行的 Pod 會如何彼此進行通訊。此範例假設您的 CNI 使用 VXLAN 進行封裝，而這在 Cilium 或 Calico 等 CNI 中很常見。整體程序與其他封裝通訊協定，例如 Geneve 或 IP-in-IP。

### 請求
<a name="_request_6"></a>

 **1。Pod A 啟動通訊** 

節點 1 上的 Pod A (`10.85.1.56`) 想要將流量傳送至節點 2 上的 Pod B (`10.85.2.67`)。初始封包如下所示：

```
+------------------+-----------------+-------------+-----------------+
| Ethernet Header  | IP Header       | TCP/UDP     | Payload         |
| Src: Pod A MAC   | Src: 10.85.1.56 | Src: 43721  |                 |
| Dst: Gateway MAC | Dst: 10.85.2.67 | Dst: 8080   |                 |
+------------------+-----------------+-------------+-----------------+
```

 **2. CNI 攔截和處理封包** 

當 Pod A 的封包離開其網路命名空間時，CNI 會將其攔截。CNI 會參考其路由表並判定： - 目的地 IP (`10.85.2.67`) 屬於 Pod CIDR - 此 IP 不在本機節點上，但屬於節點 2 (`10.80.0.3`) - 該封包需要使用 VXLAN 進行封裝。

封裝的決策至關重要，因為底層實體網路不知道如何直接路由 Pod CIDR，它只知道如何在節點 IP 之間路由流量。

CNI 會將整個原始封包封裝在 VXLAN 架構內。這實際上建立了有效地具有新標頭的「封包內封包」：

```
+-----------------+----------------+--------------+------------+---------------------------+
| Outer Ethernet  | Outer IP       | Outer UDP    | VXLAN      | Original Pod-to-Pod       |
| Src: Node1 MAC  | Src: 10.80.0.2 | Src: Random  | VNI: 42    | Packet (unchanged         |
| Dst: Router MAC | Dst: 10.80.0.3 | Dst: 8472    |            | from above)               |
+-----------------+----------------+--------------+------------+---------------------------+
```

此封裝的要點：- 將外部封包從節點 1 (`10.80.0.2`) 傳送至節點 2 (`10.80.0.3`) - 根據預設，UDP 連接埠 `8472` 是 Cilium 使用的 VXLAN 連接埠 - VXLAN 網路識別符 (VNI) 可識別此封包所屬的覆蓋網路 - 整個原始封包 (將 Pod A 的 IP 作為來源，將 Pod B 的 IP 作為目的地) 可在內部完整保留

已封裝的封包現在會進入節點 1 的常規網路堆疊，並以與任何其他封包相同的方式進行處理：

1.  **節點網路處理**：節點 1 的網路堆疊會根據其目的地 (`10.80.0.3`) 路由封包

1.  **本機網路交付**：
   + 如果兩個節點位於相同的第 2 層網路上，則該封包會直接傳送至節點 2
   + 如果封包位於不同的子網路上，則會先將該封包轉送至本機路由器

1.  **路由器處理**：路由器會根據其路由表轉送封包，並將其交付至節點 2

 **3. 接收節點處理** 

當封裝的封包抵達節點 2 (`10.80.0.3`) 時：

1. 節點的網路堆疊會接收此封包並將其識別為 VXLAN 封包 (UDP 連接埠 `4789`)

1. 該封包會傳遞至 CNI 的 VXLAN 介面，以進行處理

 **4. VXLAN 解封裝** 

節點 2 上的 CNI 會處理 VXLAN 封包：

1. 它會移除外部標頭 (乙太網路、IP、UDP 和 VXLAN)

1. 它會擷取原始內部封包

1. 該封包現恢復為其原始格式：

```
+------------------+-----------------+-------------+-----------------+
| Ethernet Header  | IP Header       | TCP/UDP     | Payload         |
| Src: Pod A MAC   | Src: 10.85.1.56 | Src: 43721  |                 |
| Dst: Gateway MAC | Dst: 10.85.2.67 | Dst: 8080   |                 |
+------------------+-----------------+-------------+-----------------+
```

節點 2 上的 CNI 會檢查目的地 IP (`10.85.2.67`) 和：

1. 識別此 IP 屬於本機 Pod

1. 透過適當的虛擬介面路由封包

1. 將封包交付至 Pod B 的網路命名空間

### 回應
<a name="_response_6"></a>

當 Pod B 回應 Pod A 時，整個程序會發生反轉，即以相反順序執行：

1. Pod B 會將封包傳送至 Pod A (`10.85.1.56`)

1. 節點 2 的 CNI 會使用 VXLAN 進行封裝，並將目的地設定為節點 1 (`10.80.0.2`)

1. 封裝的封包會交付至節點 1

1. 節點 1 的 CNI 會將其解封裝，並將原始回應交付給 Pod A

## 雲端節點上的 Pod 到混合節點上的 Pod (東西流量)
<a name="hybrid-nodes-concepts-traffic-flows-east-west"></a>

![\[雲端節點上的 Pod 到混合節點上的 Pod\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/images/hybrid-nodes-east-west.png)


### 請求
<a name="_request_7"></a>

 **1。Pod A 啟動通訊** 

EC2 節點上的 Pod A (`10.0.0.56`) 想要將流量傳送至混合節點上的 Pod B (`10.85.1.56`)。初始封包如下所示：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.0.0.56  | Src: 52390 (random) |                 |
| Dst: 10.85.1.56 | Dst: 8080           |                 |
+-----------------+---------------------+-----------------+
```

使用 VPC CNI 時，Pod A 具有來自 VPC CIDR 的 IP，並會直接連接到 EC2 執行個體上的 ENI。Pod 的網路命名空間已連接至 VPC 網路，因此該封包會直接進入 VPC 路由基礎結構。

 **2. VPC 路由** 

VPC 路由表包含遠端 Pod CIDR (`10.85.0.0/16`) 的特定路由，並且會將此流量導向 VPC-to-onprem 閘道：

```
Destination     Target
10.0.0.0/16     local
10.85.0.0/16    vgw-id (VPC-to-onprem gateway)
```

根據此路由規則，該封包會導向至連接到內部部署網路的閘道。

 **3. 跨邊界傳輸** 

閘道會透過您已建立的連線 (例如 Direct Connect 或 VPN)，將封包跨雲端邊界傳輸到您的內部部署網路。該封包會在其傳輸過程中，維護其原始來源和目的地 IP 位址。

 **4. 內部部署網路接收** 

封包送達本機內部部署路由器。路由器會參考其路由表，以判定連接 10.85.1.56 地址的下一個躍點。您的內部部署路由器必須具有將流量導向適當混合節點的 Pod CIDR 的路由。

該路由器的資料表包含一個項目，其中會指出可透過具有 IP `10.80.0.2` 的混合節點來連接 `10.85.1.0/24` 子網路：

```
Destination     Next Hop
10.85.1.0/24    10.80.0.2
```

 **5. 節點網路處理** 

路由器會將封包轉送至混合節點 (`10.80.0.2`)。當封包抵達節點時，它仍然將 Pod A 的 IP 作為來源，並將 Pod B 的 IP 作為目的地。

 **6. CNI 處理** 

節點的網路堆疊會接收封包，並發現目的地 IP 不是其自有 IP，然後將其傳遞給 CNI 以進行處理。CNI 會識別目的地 IP 屬於在此節點上以本機執行的 Pod，並透過適當的虛擬介面將封包轉送至正確的 Pod：

```
Original packet -> node routing -> CNI -> Pod B's network namespace
```

Pod B 會接收封包並視需要進行處理。

### 回應
<a name="_response_7"></a>

 **6. Pod B 傳送回應** 

Pod B 會以其自有 IP 作為來源建立回應封包，而會將 Pod A 的 IP 作為目的地：

```
+-----------------+---------------------+-----------------+
| IP Header       | TCP Header          | Payload         |
| Src: 10.85.1.56 | Src: 8080           |                 |
| Dst: 10.0.0.56  | Dst: 52390          |                 |
+-----------------+---------------------+-----------------+
```

CNI 會識別此封包以外部網路為目的地，並將其傳遞至節點的網路堆疊。

 **5. 節點網路處理** 

節點會判定目的地 IP (`10.0.0.56`) 不屬於本機網路，並將封包轉送至其預設閘道 (本機路由器)。

 **4. 本機路由器路由** 

本機路由器會參考其路由表，並判定目的地 IP (`10.0.0.56`) 屬於 VPC CIDR (`10.0.0.0/16`)。它會將封包轉送到連接至 AWS的閘道。

 **3. 跨邊界傳輸** 

該封包會傳回相同的內部部署至 VPC 連線，並以相反方向跨越雲端邊界。

 **2. VPC 路由** 

當該封包抵達 VPC 時，路由系統會識別目的地 IP 屬於 VPC 內的子網路。該封包會透過 VPC 網路路由至託管 Pod A 的 EC2 執行個體。

 **1。Pod A 接收回應** 

該封包抵達 EC2 執行個體，並透過其連接的 ENI 直接交付至 Pod A。由於 VPC CNI 不會為 VPC 中的 Pod 使用覆蓋網路，因此不需要額外的解封裝 - 封包送達時，其原始標題會完整保留。

此東西流量流程示範為什麼遠端 Pod CIDR 必須正確設定並可從雙向路由：
+ VPC 必須具有指向內部部署閘道的遠端 Pod CIDR 的路由
+ 您的內部部署網路必須具有 Pod CIDR 的路由，並將流量導向託管這些 Pod 的特定節點。

# 混合節點 `nodeadm` 參考
<a name="hybrid-nodes-nodeadm"></a>

Amazon EKS 混合節點 CLI (`nodeadm`) 可簡化混合節點元件的安裝、組態、註冊和解除安裝。您可以在作業系統映像中包含 `nodeadm`，以自動化混合節點引導，如需詳細資訊，請參閱 [準備混合節點的作業系統](hybrid-nodes-os.md)。

混合節點的 `nodeadm` 版本與用於將 Amazon EC2 執行個體引導為 Amazon EKS 叢集中節點的 `nodeadm` 版本不同。遵循相應 `nodeadm` 版本的文件和參考。本文件頁面適用於混合節點 `nodeadm` 版本。

混合節點的原始程式碼`nodeadm`會發佈在 https://github.com/aws/eks-hybrid GitHub 儲存庫中。

**重要**  
您必須與擁有 root/sudo 權限的使用者一同執行 `nodeadm`。

## 下載 `nodeadm`
<a name="_download_nodeadm"></a>

`nodeadm` 的混合節點版本託管於前端為 Amazon CloudFront 的 Amazon S3 中。若要在每個內部部署主機上安裝 `nodeadm`，您可以從內部部署主機執行下列命令。

 **對於 x86\$164 主機** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/amd64/nodeadm'
```

 **對於 ARM 主機** 

```
curl -OL 'https://hybrid-assets.eks.amazonaws.com/releases/latest/bin/linux/arm64/nodeadm'
```

在每個主機上，為下載的二進位檔新增可執行檔許可。

```
chmod +x nodeadm
```

## `nodeadm install`
<a name="_nodeadm_install"></a>

`nodeadm install` 命令可用於安裝執行混合節點並將其加入 Amazon EKS 叢集所需的成品和相依性。`nodeadm install` 命令可在每個混合節點上分別執行，也可以在映像建置管道期間執行，進而在作業系統映像中預先安裝混合節點相依性。

 **用途** 

```
nodeadm install [KUBERNETES_VERSION] [flags]
```

 **位置引數** 

(必要) `KUBERNETES_VERSION` 要安裝的 EKS Kubernetes major.minor 版本，例如 `1.32` 

 **Flags** 


| 名稱 | 必要 | Description | 
| --- | --- | --- | 
|   `-p`,  `--credential-provider`   |  TRUE  |  要安裝的憑證提供者。支援的值為 `iam-ra` 和 `ssm`。如需詳細資訊，請參閱[準備混合節點的憑證](hybrid-nodes-creds.md)。  | 
|   `-s`,  `--containerd-source`   |  FALSE  |  `containerd` 的來源。`nodeadm` 支援從 OS distro、Docker 套件安裝 `containerd`，並略過 `containerd` 安裝。  **Values (數值)**   `distro` - 這是預設值。 `nodeadm`將安裝由與 EKS Kubernetes 版本相容的節點作業系統分發的最新`containerd`套件。 `distro` 不是 Red Hat Enterprise Linux (RHEL) 作業系統支援的值。  `docker` - `nodeadm`將安裝由 Docker 建置和分發且與 EKS Kubernetes 版本相容的最新`containerd`套件。 `docker` 不是 Amazon Linux 2023 支援的值。  `none` - `nodeadm` 不會安裝 `containerd` 套件。您必須先手動安裝 `containerd`，然後才能執行 `nodeadm init`。  | 
|   `-r`,  `--region`   |  FALSE  |  指定下載成品 AWS 的區域，例如 SSM Agent。預設為 `us-west-2`。  | 
|   `-t`,  `--timeout`   |  FALSE  |  安裝命令持續時間上限。輸入遵循持續時間格式。例如 `1h23m`。安裝命令的預設下載逾時設定為 20 分鐘。  | 
|   `-h`, `--help`   |  FALSE  |  顯示說明訊息，其中包含可用的旗標、子命令和定位值參數。  | 

 **範例** 

`1.32` 使用 AWS Systems Manager (SSM) 做為登入資料提供者來安裝 Kubernetes 版本

```
nodeadm install 1.32 --credential-provider ssm
```

`1.32` 使用 AWS Systems Manager (SSM) 作為登入資料提供者安裝 Kubernetes 版本，Docker 作為容器化來源，下載逾時為 20 分鐘。

```
nodeadm install 1.32 --credential-provider ssm --containerd-source docker --timeout 20m
```

`1.32` 使用 AWS IAM Roles Anywhere 做為登入資料提供者來安裝 Kubernetes 版本

```
nodeadm install 1.32 --credential-provider iam-ra
```

## `nodeadm config check`
<a name="_nodeadm_config_check"></a>

`nodeadm config check` 命令會檢查提供的節點組態是否存在錯誤。此命令可用於確認和驗證混合節點組態檔案的正確性。

 **用途** 

```
nodeadm config check [flags]
```

 **Flags** 


| 名稱 | 必要 | Description | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  TRUE  |  nodeadm 組態的來源。對於混合節點，輸入應該遵循具有檔案結構描述的 URI。  | 
|   `-h`, `--help`   |  FALSE  |  顯示說明訊息，其中包含可用的旗標、子命令和定位值參數。  | 

 **範例** 

```
nodeadm config check -c file://nodeConfig.yaml
```

## `nodeadm init`
<a name="_nodeadm_init"></a>

`nodeadm init` 命令會啟動混合節點並將其與設定的 Amazon EKS 叢集進行連接。如需如何設定 `nodeConfig.yaml` 檔案的詳細資訊，請參閱 [SSM 混合啟用的節點組態](#hybrid-nodes-node-config-ssm) 或 [IAM Roles Anywhere 的節點組態](#hybrid-nodes-node-config-iamra)。

 **用途** 

```
nodeadm init [flags]
```

 **Flags** 


| 名稱 | 必要 | Description | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  TRUE  |  `nodeadm` 組態的來源。對於混合節點，輸入應該遵循具有檔案結構描述的 URI。  | 
|   `-s`,  `--skip`   |  FALSE  |  要略過的 `init` 階段。除非有助於修正問題，否則不建議略過任何階段。  **Values (數值)**   `install-validation` 會略過檢查上述安裝命令是否已成功執行。  如果節點上已啟用防火牆，則 `cni-validation` 會略過檢查 Cilium 或 Calico CNI 的 VXLAN 連接埠是否已開啟  `node-ip-validation` 會略過檢查節點 IP 是否落在遠端節點網路中的 CIDR 內  | 
|   `-h`, `--help`   |  FALSE  |  顯示說明訊息，其中包含可用的旗標、子命令和定位值參數。  | 

 **範例** 

```
nodeadm init -c file://nodeConfig.yaml
```

## `nodeadm upgrade`
<a name="_nodeadm_upgrade"></a>

`nodeadm upgrade` 命令會將所有已安裝的成品升級到最新版本，並引導節點來設定升級的成品，並在 AWS上加入 EKS 叢集。升級是對節點上執行的工作負載的干擾命令。請先將工作負載移至另一個節點，然後再執行升級。

 **用途** 

```
nodeadm upgrade [KUBERNETES_VERSION] [flags]
```

 **位置引數** 

(必要) `KUBERNETES_VERSION` 要安裝的 EKS Kubernetes major.minor 版本，例如 `1.32` 

 **Flags** 


| 名稱 | 必要 | Description | 
| --- | --- | --- | 
|   `-c`,  `--config-source`   |  TRUE  |  `nodeadm` 組態的來源。對於混合節點，輸入應該遵循具有檔案結構描述的 URI。  | 
|   `-t`,  `--timeout`   |  FALSE  |  下載成品逾時。輸入遵循持續時間格式。例如 1h23m。升級命令的預設下載逾時設定為 10 分鐘。  | 
|   `-s`,  `--skip`   |  FALSE  |  要略過的升級階段。除非有助於修正問題，否則不建議略過任意階段。  **Values (數值)**   `pod-validation` 會略過檢查節點上是否所有 Pod 都在執行，但常駐程式集和靜態 Pod 除外。  `node-validation` 會略過檢查是否已包圍隔離節點。  `init-validation` 會略過檢查節點是否在執行升級之前已成功初始化。  `containerd-major-version-upgrade` 可防止在節點升級期間進行容器主要版本升級。  | 
|   `-h`, `--help`   |  FALSE  |  顯示說明訊息，其中包含可用的旗標、子命令和定位值參數。  | 

 **範例** 

```
nodeadm upgrade 1.32 -c file://nodeConfig.yaml
```

```
nodeadm upgrade 1.32 -c file://nodeConfig.yaml --timeout 20m
```

## `nodeadm uninstall`
<a name="_nodeadm_uninstall"></a>

`nodeadm uninstall` 命令會停止並移除 `nodeadm` 在 `nodeadm install` 期間安裝的成品，包括 kubelet 和 containerd。請注意，解除安裝命令不會耗盡或刪除叢集中的混合節點。您必須分別執行耗盡和刪除操作，如需詳細資訊，請參閱 [移除混合節點](hybrid-nodes-remove.md)。根據預設，如果節點上還有剩餘的 Pod，則 `nodeadm uninstall` 不會繼續。同樣地，`nodeadm uninstall` 不會移除 CNI 相依性或您在叢集上執行的其他 Kubernetes 附加元件的相依性。若要從主機完全移除 CNI 安裝，請參閱 [設定混合節點的 CNI](hybrid-nodes-cni.md) 中的指示。如果您使用 AWS SSM 混合啟用做為內部部署憑證提供者，`nodeadm uninstall`命令會將您的主機取消註冊為 AWS SSM 受管執行個體。

 **用途** 

```
nodeadm uninstall [flags]
```

 **Flags** 


| 名稱 | 必要 | Description | 
| --- | --- | --- | 
|   `-s`,  `--skip`   |  FALSE  |  要略過的解除安裝階段。除非有助於修正問題，否則不建議略過任何階段。  **Values (數值)**   `pod-validation` 會略過檢查節點上是否所有 Pod 都在執行，但常駐程式集和靜態 Pod 除外。  `node-validation` 會略過檢查是否已包圍隔離節點。  `init-validation` 會略過檢查節點是否在執行解除安裝之前已成功初始化。  | 
|   `-h`,  `--help`   |  FALSE  |  顯示說明訊息，其中包含可用的旗標、子命令和定位值參數。  | 
|   `-f`,  `--force`   |  FALSE  |  強制刪除可能包含 Kubernetes 和 CNI 元件剩餘檔案的其他目錄。  **WARNING**  這將刪除預設 Kubernetes 和 CNI 目錄中的所有內容 (`/var/lib/cni`、`/etc/cni/net.d` 等等)。如果您在這些位置存放您自己的資料，則請勿使用此旗標。 從 nodeadm `v1.0.9` 開始，`./nodeadm uninstall --skip node-validation,pod-validation --force` 命令不會再刪除 `/var/lib/kubelet` 目錄。這是因為它可能包含 Pod 磁碟區和磁碟區子路徑目錄，而這些目錄有時會包含掛載的節點檔案系統。  **安全處理秘訣**  - 刪除掛載的路徑可能會導致意外刪除實際掛載的節點檔案系統。在手動刪除 `/var/lib/kubelet` 目錄之前，請仔細檢查所有作用中的掛載並安全地卸載磁碟區，以避免資料遺失。  | 

 **範例** 

```
nodeadm uninstall
```

```
nodeadm uninstall --skip node-validation,pod-validation
```

## `nodeadm debug`
<a name="_nodeadm_debug"></a>

`nodeadm debug` 命令可用於對運作狀態不佳或設定錯誤的混合節點進行故障診斷。它會驗證下列需求是否已就位。
+ 節點具有必要 AWS APIs的網路存取權，以取得登入資料，
+ 節點可以取得所設定混合節點 IAM 角色的 AWS 登入資料，
+ 節點具有對 EKS Kubernetes API 端點的網路存取權以及 EKS Kubernetes API 端點憑證的有效性，
+ 節點能夠使用 EKS 叢集進行身分驗證，其在叢集中的身分有效，而且該節點可以透過為 EKS 叢集設定的 VPC 存取 EKS 叢集。

如果發現錯誤，命令的輸出會建議故障診斷步驟。某些驗證步驟會顯示子程序。如果失敗，輸出會顯示在驗證錯誤下的 stderr 區段中。

 **用途** 

```
nodeadm debug [flags]
```

 **Flags** 


| 名稱 | 必要 | Description | 
| --- | --- | --- | 
|   `-c`, `--config-source`   |  TRUE  |  `nodeadm` 組態的來源。對於混合節點，輸入應該遵循具有檔案結構描述的 URI。  | 
|   `--no-color`   |  FALSE  |  停用顏色輸出。適用於自動化。  | 
|   `-h`, `--help`   |  FALSE  |  顯示說明訊息，其中包含可用的旗標、子命令和定位值參數。  | 

 **範例** 

```
nodeadm debug -c file://nodeConfig.yaml
```

## Nodeadm 檔案位置
<a name="_nodeadm_file_locations"></a>

### nodeadm 安裝
<a name="_nodeadm_install_2"></a>

執行 `nodeadm install` 時，會設定下列檔案和檔案位置。


| Artifact | 路徑 | 
| --- | --- | 
|  IAM Roles Anywhere CLI  |  /usr/local/bin/aws\$1signing\$1helper  | 
|  Kubelet 二進位檔  |  /usr/bin/kubelet  | 
|  Kubectl 二進位檔  |  usr/local/bin/kubectl  | 
|  ECR 憑證提供者  |  /etc/eks/image-credential-provider/ecr-credential-provider  | 
|   AWS IAM 驗證器  |  /usr/local/bin/aws-iam-authenticator  | 
|  SSM Setup CLI  |  /opt/ssm/ssm-setup-cli  | 
|  SSM Agent  |  在 Ubuntu 上 - /snap/amazon-ssm-agent/current/amazon-ssm-agent 在 RHEL 和 AL2023 上 - /usr/bin/amazon-ssm-agent  | 
|  containerd  |  在 Ubuntu 和 AL2023 上 - /usr/bin/containerd 在 RHEL 上 - /bin/containerd  | 
|  Iptables  |  在 Ubuntu 和 AL2023 上 - /usr/sbin/iptables 在 RHEL 上 - /sbin/iptables  | 
|  CNI 外掛程式  |  /opt/cni/bin  | 
|  已安裝的成品追蹤器  |  /opt/nodeadm/tracker  | 

### nodeadm init
<a name="_nodeadm_init_2"></a>

執行 `nodeadm init` 時，會設定下列檔案和檔案位置。


| 名稱 | 路徑 | 
| --- | --- | 
|  Kubelet kubeconfig  |  /var/lib/kubelet/kubeconfig  | 
|  Kubelet 組態  |  /etc/kubernetes/kubelet/config.json  | 
|  Kubelet systemd 單位  |  /etc/systemd/system/kubelet.service  | 
|  映像憑證提供者組態  |  /etc/eks/image-credential-provider/config.json  | 
|  Kubelet env 檔案  |  /etc/eks/kubelet/environment  | 
|  Kubelet 憑證  |  /etc/kubernetes/pki/ca.crt  | 
|  Containerd 組態  |  /etc/containerd/config.toml  | 
|  Containerd 核心模組組態  |  /etc/modules-load.d/containerd.conf  | 
|   AWS 組態檔案  |  /etc/aws/hybrid/config  | 
|   AWS 登入資料檔案 （如果啟用登入資料檔案）  |  /eks-hybrid/.aws/credentials  | 
|   AWS 簽署協助程式系統單位  |  /etc/systemd/system/aws\$1signing\$1helper\$1update.service  | 
|  Sysctl conf 檔案  |  /etc/sysctl.d/99-nodeadm.conf  | 
|  Ca-certificates  |  /etc/ssl/certs/ca-certificates.crt  | 
|  Gpg 金鑰檔案  |  /etc/apt/keyrings/docker.asc  | 
|  Docker 儲存庫來源檔案  |  /etc/apt/sources.list.d/docker.list  | 

## SSM 混合啟用的節點組態
<a name="hybrid-nodes-node-config-ssm"></a>

以下是針對混合節點登入資料使用 AWS SSM 混合啟用`nodeConfig.yaml`的範例。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

## IAM Roles Anywhere 的節點組態
<a name="hybrid-nodes-node-config-iamra"></a>

以下是混合節點登入`nodeConfig.yaml`資料 AWS IAM Roles Anywhere 的範例。

使用 AWS IAM Roles Anywhere 做為內部部署憑證提供者時，`nodeName`您在`nodeadm`組態中使用的 必須符合您為混合節點 IAM 角色設定範圍的許可。例如，如果您的混合節點 IAM 角色許可僅允許 AWS IAM Roles Anywhere 在角色工作階段名稱等於主機憑證的 CN 時擔任角色，則`nodeadm`組態`nodeName`中的 必須與您憑證的 CN 相同。您使用的 `nodeName` 不可超過 64 個字元。如需詳細資訊，請參閱[準備混合節點的憑證](hybrid-nodes-creds.md)。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:              # Name of the EKS cluster
    region:            # AWS Region where the EKS cluster resides
  hybrid:
    iamRolesAnywhere:
      nodeName:        # Name of the node
      trustAnchorArn:  # ARN of the IAM Roles Anywhere trust anchor
      profileArn:      # ARN of the IAM Roles Anywhere profile
      roleArn:         # ARN of the Hybrid Nodes IAM role
      certificatePath: # Path to the certificate file to authenticate with the IAM Roles Anywhere trust anchor
      privateKeyPath:  # Path to the private key file for the certificate
```

## 用於自訂 kubelet 的節點組態 (選用)
<a name="hybrid-nodes-nodeadm-kubelet"></a>

您可以在 `nodeadm` 組態中傳遞 kubelet 組態和旗標。請參閱以下範例，了解如何新增額外的節點標籤 `abc.amazonaws.com/test-label` 以及將 `shutdownGracePeriod` 設定為 30 秒的組態。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  kubelet:
    config:           # Map of kubelet config and values
       shutdownGracePeriod: 30s
    flags:            # List of kubelet flags
       - --node-labels=abc.company.com/test-label=true
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

## 用於自訂 containerd 的節點組態 (選用)
<a name="_node_config_for_customizing_containerd_optional"></a>

您可以在 `nodeadm` 組態中傳遞自訂 containerd 組態。`nodeadm` 的 containerd 組態接受內嵌 TOML。請參閱以下範例，了解如何設定 containerd 以停用刪除 containerd 內容存放區中已解壓縮的映像層。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  containerd:
    config: |         # Inline TOML containerd additional configuration
       [plugins."io.containerd.grpc.v1.cri".containerd]
       discard_unpacked_layers = false
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

**注意**  
容器版本 1.x 和 2.x 使用不同的組態格式。Containerd 1.x 使用組態版本 2，而 Containerd 2.x 使用組態版本 3。雖然 containerd 2.x 仍與組態第 2 版回溯相容，但建議使用組態第 3 版，以獲得最佳效能。使用 檢查您的容器版本`containerd --version`或檢閱`nodeadm`安裝日誌。如需組態版本控制的詳細資訊，請參閱 https：//https://containerd.io/releases/

您也可以使用 containerd 組態來啟用 SELinux 支援。在 containerd 上啟用 SELinux 後，請確保在節點上排程的 Pod 已啟用適當的 securityContext 和 seLinuxOptions。如需設定安全性內容的詳細資訊，請參閱 [Kubernetes 文件](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)。

**注意**  
根據預設，Red Hat Enterprise Linux (RHEL) 8 和 RHEL 9 已啟用 SELinux，並在主機上設定為嚴格。根據預設，Amazon Linux 2023 已啟用 SELinux，並設定為寬容模式。在主機上將 SELinux 設定為寬容模式時，在 containerd 上啟用它不會封鎖請求，但會根據主機上的 SELinux 組態進行記錄。

```
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    name:             # Name of the EKS cluster
    region:           # AWS Region where the EKS cluster resides
  containerd:
    config: |         # Inline TOML containerd additional configuration
       [plugins."io.containerd.grpc.v1.cri"]
       enable_selinux = true
  hybrid:
    ssm:
      activationCode: # SSM hybrid activation code
      activationId:   # SSM hybrid activation id
```

# 故障診斷混合節點
<a name="hybrid-nodes-troubleshooting"></a>

本主題涵蓋一些使用 Amazon EKS 混合節點時可能遇到的常見錯誤與修正這些錯誤的方法。如需其他疑難排解資訊，請參閱 * AWS re：Post* 上的 [排解 Amazon EKS 叢集和節點問題](troubleshooting.md)和 [Amazon EKS 知識中心標籤](https://repost.aws/tags/knowledge-center/TA4IvCeWI1TE66q4jEj4Z9zg/amazon-elastic-kubernetes-service)。如果您無法解決問題，請聯絡 AWS Support。

 **使用 `nodeadm debug` 進行節點故障診斷** 您可以從混合節點執行 `nodeadm debug` 命令，以驗證是否符合聯網和憑證要求。如需有關 `nodeadm debug` 命令的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

 **使用叢集洞察偵測混合節點的問題** Amazon EKS 叢集洞察包括*洞察檢查*，可偵測叢集中 EKS 混合節點組態的常見問題。您可以從 AWS 管理主控台、 AWS CLI 和 AWS SDKs 檢視所有洞見檢查的結果。如需有關叢集洞察的詳細資訊，請參閱 [利用叢集洞見為 Kubernetes 版本升級做好準備，並為錯誤組態進行故障診斷](cluster-insights.md)。

## 安裝混合節點故障診斷
<a name="hybrid-nodes-troubleshooting-install"></a>

下列故障診斷主題與使用 `nodeadm install` 命令在主機上安裝混合節點相依性相關。

 ** `nodeadm` 命令失敗 `must run as root` ** 

`nodeadm install` 命令必須由主機上具有 root 或 `sudo` 權限的使用者執行。如果您利用沒有 root 或 `sudo` 權限的使用者執行 `nodeadm install`，則會在 `nodeadm` 輸出中看到下列錯誤。

```
"msg":"Command failed","error":"must run as root"
```

 **無法連接至相依性** 

`nodeadm install` 命令可安裝混合節點所需的相依性。混合節點相依性包括 `containerd`、`kubectl`、 `kubelet`和 AWS SSM 或 AWS IAM Roles Anywhere 元件。您必須擁有從執行 `nodeadm install` 的位置的存取權，才能下載這些相依性。如需您必須能夠存取的位置清單的詳細資訊，請參閱 [準備混合節點的聯網](hybrid-nodes-networking.md)。如果您沒有存取權，則會在 `nodeadm install` 輸出中看到類似以下錯誤。

```
"msg":"Command failed","error":"failed reading file from url: ...: max retries achieved for http request"
```

 **無法更新套件管理工具** 

在安裝混合節點相依性之前，`nodeadm install` 命令會執行 `apt update` 或 `yum update` 或 `dnf update`。如果此步驟不成功，您可能會看到類似以下錯誤。若要修復，您可以在執行 `nodeadm install` 之前執行 `apt update`、`yum update` 或 `dnf update`，也可以嘗試重新執行 `nodeadm install`。

```
failed to run update using package manager
```

 **逾時或超過內容截止日期** 

執行 `nodeadm install` 時，如果您在安裝程序的各個階段看到錯誤，其中指出逾時或超過內容截止日期，則可能是連接速度緩慢，進而導致在逾時之前無法安裝混合節點相依性。若要解決這些問題，您可以嘗試使用 `nodeadm` 中的 `--timeout` 旗標來延長下載相依性的逾時持續時間。

```
nodeadm install K8S_VERSION --credential-provider CREDS_PROVIDER --timeout 20m0s
```

## 連接混合節點故障診斷
<a name="hybrid-nodes-troubleshooting-connect"></a>

本節中的故障診斷主題與使用 `nodeadm init` 命令將混合節點連接至 EKS 叢集的程序有關。

 **操作錯誤或不支援的結構描述** 

執行 `nodeadm init` 時，如果您看到與 `operation error` 或 `unsupported scheme` 相關的錯誤，請檢查您的 `nodeConfig.yaml`，以確保其格式正確並傳遞給 `nodeadm`。如需有關 `nodeConfig.yaml` 的格式和選項的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

```
"msg":"Command failed","error":"operation error ec2imds: GetRegion, request canceled, context deadline exceeded"
```

 **混合節點 IAM 角色缺少對 `eks:DescribeCluster` 動作的許可** 

執行 時`nodeadm init`， 會呼叫 EKS `DescribeCluster`動作，`nodeadm`嘗試收集 EKS 叢集的相關資訊。如果您的混合節點 IAM 角色沒有 `eks:DescribeCluster`動作的許可，則您必須在執行 `nodeadm`時傳遞節點組態中的 Kubernetes API 端點、叢集 CA 套件和服務 IPv4 CIDR`nodeadm init`。如需有關混合節點 IAM 角色所需許可的詳細資訊，請參閱 [準備混合節點的憑證](hybrid-nodes-creds.md)。

```
"msg":"Command failed","error":"operation error EKS: DescribeCluster, https response error StatusCode: 403 ... AccessDeniedException"
```

 **混合節點 IAM 角色缺少對 `eks:ListAccessEntries` 動作的許可** 

執行 時`nodeadm init`， 會呼叫 EKS `ListAccessEntries`動作，`nodeadm`嘗試驗證 EKS 叢集是否具有與混合節點 IAM 角色`HYBRID_LINUX`相關聯的 類型存取項目。如果您的混合節點 IAM 角色沒有 `eks:ListAccessEntries`動作的許可，則您必須在執行 `nodeadm init`命令時傳遞 `--skip cluster-access-validation`旗標。如需有關混合節點 IAM 角色所需許可的詳細資訊，請參閱 [準備混合節點的憑證](hybrid-nodes-creds.md)。

```
"msg":"Command failed","error":"operation error EKS: ListAccessEntries, https response error StatusCode: 403 ... AccessDeniedException"
```

 **節點 IP 不在遠端節點網路 CIDR 中** 

執行 `nodeadm init` 時，如果節點的 IP 位址不在指定的遠端節點網路 CIDR 內，則您可能會遇到錯誤。錯誤看起來與下列範例類似：

```
node IP 10.18.0.1 is not in any of the remote network CIDR blocks [10.0.0.0/16 192.168.0.0/16]
```

此範例顯示 IP 10.18.0.1 的節點嘗試加入具有遠端網路 CIDR 10.0.0.0/16 和 192.168.0.0/16 的叢集。發生錯誤，因為 10.18.0.1 不在任一範圍內。

確認您已正確設定 `RemoteNodeNetworks` 以包含所有節點 IP 位址。如需有關聯網組態的詳細資訊，請參閱 [準備混合節點的聯網](hybrid-nodes-networking.md)。
+ 在叢集所在的區域中執行下列命令，以檢查您的 `RemoteNodeNetwork` 組態。確認輸出中列出的 CIDR 區塊包含節點的 IP 範圍，並且與錯誤訊息中列出的 CIDR 區塊相同。如果它們不相符，請確認您 `nodeConfig.yaml` 中的叢集名稱和區域與您預期的叢集相符。

```
aws eks describe-cluster --name CLUSTER_NAME --region REGION_NAME --query cluster.remoteNetworkConfig.remoteNodeNetworks
```
+ 驗證您正在處理的是預期節點：
  + 檢查其主機名稱和 IP 位址是否與您要向叢集註冊的 IP 位址相符，以確認您使用正確的節點。
  + 確認此節點位於正確的內部部署網路中 (在叢集設定期間，其 CIDR 範圍已註冊為 `RemoteNodeNetwork` 的網路)。

如果您的節點 IP 仍然不符合預期，請檢查下列項目：
+ 如果您使用的是 IAM Roles Anywhere，`kubelet` 會在 IAM Roles Anywhere `nodeName` 上執行 DNS 查詢，並在可用時使用與節點名稱相關聯的 IP。如果您維護節點的 DNS 項目，請確認這些項目會指向遠端節點網路 CIDR 內的 IP。
+ 如果您的節點有多個網路介面，`kubelet` 可能會預設選取遠端節點網路 CIDR 外部的 IP 位址的介面。若要使用不同的介面，請使用 `nodeConfig.yaml` 中的 `--node-ip` `kubelet` 旗標指定其 IP 位址。如需詳細資訊，請參閱[混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。您可以透過在節點上執行下列命令，來檢視節點的網路介面及其 IP 位址：

```
ip addr show
```

 **混合節點未出現在 EKS 叢集中** 

如果您執行 `nodeadm init` 且已完成，但您的混合節點未出現在叢集中，混合節點與 EKS 控制平面之間的網路連線可能會發生問題，您可能並未設定必要的安全群組許可，或者您可能沒有混合節點 IAM 角色與 Kubernetes 角色型存取控制 (RBAC) 的必要映射。您可以使用下列命令檢查 `kubelet` 和 `kubelet` 日誌的狀態，進而開始偵錯程序。從無法加入叢集的混合節點執行下列命令。

```
systemctl status kubelet
```

```
journalctl -u kubelet -f
```

 **無法與叢集通訊** 

如果您的混合節點無法與叢集控制平面通訊，您可能會看到類似如下的日誌。

```
"Failed to ensure lease exists, will retry" err="Get ..."
```

```
"Unable to register node with API server" err="Post ..."
```

```
Failed to contact API server when waiting for CSINode publishing ... dial tcp <ip address>: i/o timeout
```

如果您看到這些訊息，請檢查下列項目，以確保其符合 [準備混合節點的聯網](hybrid-nodes-networking.md) 中詳述的混合節點要求。
+ 確認傳遞給 EKS 叢集的 VPC 已設定為可路由到適用於內部部署節點或選用的 Pod CIDR 的傳輸閘道 (TGW) 或虛擬私有閘道 (VGW)。
+ 確認您的 EKS 叢集具有其他安全群組，且該安全群組包含適用於內部部署節點 CIDR 的傳入規則，也選擇性地包含適用於 Pod CIDR 的傳入規則。
+ 確認您的內部部署路由器已設定為允許流量往返 EKS 控制平面。

 **未授權** 

如果您的混合節點能夠與 EKS 控制平面通訊但無法註冊，您可能會看到類似如下的日誌。請注意，以下日誌訊息中的主要差異是 `Unauthorized` 錯誤。這表明該節點無法執行其任務，因為它沒有必要許可。

```
"Failed to ensure lease exists, will retry" err="Unauthorized"
```

```
"Unable to register node with API server" err="Unauthorized"
```

```
Failed to contact API server when waiting for CSINode publishing: Unauthorized
```

如果您看到這些訊息，請檢查下列項目，以確保其符合 [準備混合節點的憑證](hybrid-nodes-creds.md) 和 [準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md) 中詳述的混合節點要求。
+ 確認混合節點的身分與您預期的混合節點 IAM 角色相符。為此，可以從混合節點執行 `sudo aws sts get-caller-identity`。
+ 確認您的混合節點 IAM 角色具有必要許可。
+ 確認您的叢集中具有適用於混合節點 IAM 角色的 EKS 存取項目，或確認您的 `aws-auth` ConfigMap 具有適用於混合節點 IAM 角色的項目。如果您使用的是 EKS 存取項目，則請確認適用於混合節點 IAM 角色的存取項目具有 `HYBRID_LINUX` 存取類型。如果您使用的是 `aws-auth` ConfigMap，則請確認適用於混合節點 IAM 角色的項目符合 [準備混合節點的叢集存取](hybrid-nodes-cluster-prep.md) 中詳述的要求和格式。

### 向 EKS 叢集註冊但顯示狀態為 `Not Ready` 的混合節點
<a name="hybrid-nodes-troubleshooting-not-ready"></a>

如果您的混合節點已成功向 EKS 叢集註冊，但混合節點顯示狀態為 `Not Ready`，則首先要檢查的是容器聯網介面 (CNI) 狀態。如果您尚未安裝 CNI，則預期您的混合節點的狀態為 `Not Ready`。成功安裝並執行 CNI 後，節點狀態會更新為 `Ready`。如果您嘗試安裝 CNI，但未成功執行，請參閱此頁面上的 [混合節點 CNI 故障診斷](#hybrid-nodes-troubleshooting-cni)。

 **憑證簽署請求 (CSR) 卡在待定狀態** 

將混合節點連接到 EKS 叢集後，如果您看到混合節點有待定的 CSR，則您的混合節點不符合自動核准的要求。如果混合節點的 CSR 是由具有 `eks.amazonaws.com/compute-type: hybrid` 標籤的節點建立，且 CSR 具有下列主體替代名稱 (SAN)，則會自動核准及核發混合節點的 CSR：至少一個 DNS SAN 等於節點名稱且 IP SAN 屬於遠端節點網路 CIDR。

 **混合設定檔已存在** 

如果您變更 `nodeadm` 組態並嘗試使用新組態重新註冊節點，您可能會發現錯誤，其中會指出混合設定檔已存在，但其內容已變更。不要在組態變更之間執行 `nodeadm init`，而是要先執行 `nodeadm uninstall`，然後再執行 `nodeadm install` 和 `nodeadm init`。如此可確保正確清除組態中的變更。

```
"msg":"Command failed","error":"hybrid profile already exists at /etc/aws/hybrid/config but its contents do not align with the expected configuration"
```

 **混合節點無法解析私有 API** 

執行 `nodeadm init` 後，如果您在 `kubelet` 日誌中發現錯誤，其中顯示由於存在 `no such host` 的情況而無法聯絡 EKS Kubernetes API 伺服器，您可能需要變更內部部署網路或主機層級的 EKS Kubernetes API 端點的 DNS 項目。請參閱 * AWS Route53 文件*中的[轉送傳入 DNS 查詢到您的 VPC](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-forwarding-inbound-queries.html)。

```
Failed to contact API server when waiting for CSINode publishing: Get ... no such host
```

 **無法在 EKS 主控台中檢視混合節點** 

如果您已註冊混合節點，但無法在 EKS 主控台中進行檢視，請檢查您用來檢視主控台的 IAM 主體的許可。您使用的 IAM 主體必須具有特定的最低 IAM 和 Kubernetes 許可，才能在主控台中檢視資源。如需詳細資訊，請參閱[在 中檢視 Kubernetes 資源 AWS 管理主控台](view-kubernetes-resources.md)。

## 執行混合節點故障診斷
<a name="_running_hybrid_nodes_troubleshooting"></a>

如果您的混合節點已向 EKS 叢集註冊，狀態為 `Ready`，然後轉換為狀態 `Not Ready`，則可能存在各種問題會導致運作狀態不佳，例如節點缺少充足的 CPU、記憶體或可用磁碟空間資源，或節點與 EKS 控制平面中斷連線。您可以使用下列步驟對節點進行故障診斷，如果無法解決問題，請聯絡 AWS Support。

從混合節點執行 `nodeadm debug`，以驗證是否符合聯網和憑證要求。如需有關 `nodeadm debug` 命令的詳細資訊，請參閱 [混合節點 `nodeadm` 參考](hybrid-nodes-nodeadm.md)。

 **取得節點狀態** 

```
kubectl get nodes -o wide
```

 **檢查節點條件和事件** 

```
kubectl describe node NODE_NAME
```

 **取得 Pod 狀態** 

```
kubectl get pods -A -o wide
```

 **檢查 Pod 條件和事件** 

```
kubectl describe pod POD_NAME
```

 **檢查 Pod 日誌** 

```
kubectl logs POD_NAME
```

 **檢查 `kubectl` 日誌** 

```
systemctl status kubelet
```

```
journalctl -u kubelet -f
```

 **Pod 即時性探查失敗或 Webhook 無法運作** 

如果混合節點上執行的應用程式、附加元件或 Webhook 未正確啟動，您可能會遇到封鎖與 Pod 的通訊的聯網問題。若要讓 EKS 控制平面聯絡在混合節點上執行的 Webhook，您必須使用遠端 Pod 網路設定 EKS 叢集，並將 VPC 路由表中的現場部署 Pod CIDR 路由，目標為 Transit Gateway (TGW)、虛擬私有閘道 (VGW) 或您用來連接 VPC 與現場部署網路的其他閘道。如需有關混合節點的聯網需求的詳細資訊，請參閱 [準備混合節點的聯網](hybrid-nodes-networking.md)。此外，您還必須在內部部署防火牆中允許此流量，並確保您的路由器可正確路由到您的 Pod。如需有關在混合節點上執行 Webhook 的需求的詳細資訊，請參閱 [設定混合節點的 Webhook](hybrid-nodes-webhooks.md)。

此案例的常見 Pod 日誌訊息如下所示，其中 ip-address 是 Kubernetes Service 的叢集 IP。

```
dial tcp <ip-address>:443: connect: no route to host
```

 ** `kubectl logs` 或 `kubectl exec` 命令無法運作 (`kubelet` API 命令）** 

如果 `kubectl attach`、`kubectl cp`、`kubectl logs`、 和 `kubectl exec``kubectl port-forward`命令在其他`kubectl`命令成功時逾時，問題可能與遠端網路組態有關。這些命令會透過叢集連接至節點上的 `kubelet` 端點。如需更多資訊，請參閱[`kubelet` 端點](hybrid-nodes-concepts-kubernetes.md#hybrid-nodes-concepts-k8s-kubelet-api)。

確認您的節點 IP 和 Pod IP 位於為叢集設定的遠端節點網路和遠端 Pod 網路 CIDR 內。使用以下命令來檢查 IP 指派。

```
kubectl get nodes -o wide
```

```
kubectl get pods -A -o wide
```

將這些 IP 與您設定的遠端網路 CIDR 進行比較，以確保正確路由。有關網路組態需求，請參閱 [準備混合節點的聯網](hybrid-nodes-networking.md)。

## 混合節點 CNI 故障診斷
<a name="hybrid-nodes-troubleshooting-cni"></a>

如果您一開始使用混合節點啟動 Cilium 或 Calico 時就遇到問題，最常見的原因是混合節點或混合節點上執行的 CNI Pod 與 EKS 控制平面之間存在聯網問題。請確保您的環境符合準備混合節點的聯網要求。將問題分成幾個部分非常實用。

EKS 叢集組態  
RemoteNodeNetwork 和 RemotePodNetwork 組態是否正確無誤？

VPC 組態  
VPC 路由表中是否有以傳輸閘道或虛擬私有閘道為目標的 RemoteNodeNetwork and RemotePodNetwork 的路由？

安全群組組態  
RemoteNodeNetwork 和 RemotePodNetwork 是否設有傳入和傳出規則？

現場部署網路  
是否有往返 EKS 控制平面以及往返混合節點和混合節點上執行的 Pod 的路由和存取權？

CNI 組態  
如果使用覆蓋網路，CNI 的 IP 集區組態是否會與使用 Webhook 時為 EKS 叢集設定的 RemotePodNetwork 相符？

 **混合節點的狀態為 `Ready` 且 CNI 未安裝** 

如果您的混合節點顯示狀態為 `Ready`，但您尚未在叢集上安裝 CNI，則混合節點上可能存在舊的 CNI 成品。根據預設，當您使用 Helm 等工具解除安裝 Cilium 和 Calico 時，不會從實體或虛擬機器中移除磁碟上的資源。此外，這些 CNI 的自訂資源定義 (CRD) 仍可能存在於舊安裝的叢集上。如需詳細資訊，請參閱 [設定混合節點的 CNI](hybrid-nodes-cni.md) 的「刪除 Cilium」和「刪除 Calico」章節。

 **Cilium 故障診斷** 

如果您在混合節點上執行 Cilium 時遇到問題，請參閱 Cilium 文件中的[故障診斷步驟](https://docs.cilium.io/en/stable/operations/troubleshooting/)。以下各節涵蓋在混合節點上部署 Cilium 時可能特有的問題。

 **Cilium 未啟動** 

如果每個混合節點上執行的 Cilium 代理程式未啟動，請檢查 Cilium 代理程式 Pod 的日誌是否存在錯誤。Cilium 代理程式需要連線到 EKS Kubernetes API 端點才能啟動。如果未正確設定此連線，則 Cilium 代理程式啟動會失敗。在此情況下，您會在 Cilium 代理程式 Pod 日誌中看到類似如下的日誌訊息。

```
msg="Unable to contact k8s api-server"
level=fatal msg="failed to start: Get \"https://<k8s-cluster-ip>:443/api/v1/namespaces/kube-system\": dial tcp <k8s-cluster-ip>:443: i/o timeout"
```

Cilium 代理程式會在主機網路上執行。您的 EKS 叢集必須使用 `RemoteNodeNetwork` 進行設定，如此才能實現 Cilium 連線。確認您的 EKS 叢集具有其他安全群組，且該安全群組包含適用於 `RemoteNodeNetwork` 的傳入規則，您的 VPC 中為您的 `RemoteNodeNetwork` 設定了路由，並且您的內部部署網路已正確設定為允許連線至 EKS 控制平面。

如果 Cilium 運算子正在執行，且部分 Cilium 代理程式也正在執行 (並非全部)，則請確認您有可用的 Pod IP 可配置給叢集中的所有節點。您可以在 Cilium 組態中搭配使用叢集集區 IPAM 和 `clusterPoolIPv4PodCIDRList` 時，設定可配置的 Pod CIDR 大小。每個節點 CIDR 大小是使用 Cilium 組態中的 `clusterPoolIPv4MaskSize` 設定進行設定的。如需詳細資訊，請參閱 Cilium 文件中的[展開叢集集區](https://docs.cilium.io/en/stable/network/concepts/ipam/cluster-pool/#expanding-the-cluster-pool)。

 **Cilium BGP 無法運作** 

如果您使用 Cilium BGP 控制平面向內部部署網路公告您的 Pod 或服務地址，則您可以使用下列 Cilium CLI 命令來檢查 BGP 是否會向資源公告路由。有關安裝 Cilium CLI 的步驟，請參閱 Cilium 文件中的[安裝 Cilium CLI](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-cilium-cli)。

如果 BGP 正常運作，您應該在輸出中看到工作階段狀態為 `established` 的混合節點。您可能需要與聯網團隊合作，以便為環境的本機 AS、對等 AS 和對等地址確定正確的值。

```
cilium bgp peers
```

```
cilium bgp routes
```

如果您使用 Cilium BGP 來公告類型為 `LoadBalancer` 的 服務 IP，則您的 `CiliumLoadBalancerIPPool` 和 服務必須具有相同的標籤，而該標籤應該在您的 `CiliumBGPAdvertisement` 選取器中使用。以下所示為範例。請注意，如果您使用 Cilium BGP 來公告 LoadBalancer 類型的服務 IP，則 BGP 路由可能會在 Cilium 代理程式重新啟動期間中斷。如需詳細資訊，請參閱 Cilium 文件中的[失敗案例](https://docs.cilium.io/en/latest/network/bgp-control-plane/bgp-control-plane-operation/#failure-scenarios)。

 **服務** 

```
kind: Service
apiVersion: v1
metadata:
  name: guestbook
  labels:
    app: guestbook
spec:
  ports:
  - port: 3000
    targetPort: http-server
  selector:
    app: guestbook
  type: LoadBalancer
```

 **CiliumLoadBalancerIPPool** 

```
apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
  name: guestbook-pool
  labels:
    app: guestbook
spec:
  blocks:
  - cidr: <CIDR to advertise>
  serviceSelector:
    matchExpressions:
      - { key: app, operator: In, values: [ guestbook ] }
```

 **CiliumBGPAdvertisement** 

```
apiVersion: cilium.io/v2alpha1
kind: CiliumBGPAdvertisement
metadata:
  name: bgp-advertisements-guestbook
  labels:
    advertise: bgp
spec:
  advertisements:
    - advertisementType: "Service"
      service:
        addresses:
          - ExternalIP
          - LoadBalancerIP
      selector:
        matchExpressions:
          - { key: app, operator: In, values: [ guestbook ] }
```

 **Calico 故障診斷** 

如果您在混合節點上執行 Calico 時遇到問題，請參閱 Calico 文件中的[故障診斷步驟](https://docs.tigera.io/calico/latest/operations/troubleshoot/)。以下各節涵蓋在混合節點上部署 Calico 時可能特有的問題。

下表摘要說明了 Calico 元件以及它們是否會依預設在節點或 Pod 網路上執行。如果您將 Calico 設定為使用 NAT 傳出 Pod 流量，則必須將內部部署網路設定為將流量路由到內部部署節點 CIDR，而您的 VPC 路由表必須設定有為內部部署節點 CIDR 的路由，且這些路由會以傳輸閘道 (TGW) 或虛擬私有閘道 (VGW) 為目標。如果您未將 Calico 設定為使用 NAT 傳出 Pod 流量，則必須將內部部署網路設定為將流量路由到內部部署 Pod CIDR，而您的 VPC 路由表必須設定有為內部部署 Pod CIDR 的路由，且這些路由會以傳輸閘道 (TGW) 或虛擬私有閘道 (VGW) 為目標。


| 元件 | 網路 | 
| --- | --- | 
|  Calico API 伺服器  |  節點  | 
|  Kubernetes 專用 Calico 控制器  |  Pod  | 
|  Calico 節點代理程式  |  節點  | 
|  Calico `typha`   |  節點  | 
|  Calico CSI 節點驅動程式  |  Pod  | 
|  Calico 運算子  |  節點  | 

 **Calico 資源已在封鎖節點上排程或執行** 

根據預設，Calico 資源未以 DaemonSet 執行並且具有靈活的容錯能力，可在尚未準備好排程或執行 Pod 的封鎖節點上排程這些資源。您可以變更您的運算子安裝以包含下列內容，進而限制非 DaemonSet Calico 資源的容錯。

```
installation:
  ...
  controlPlaneTolerations:
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  calicoKubeControllersDeployment:
    spec:
      template:
        spec:
          tolerations:
          - effect: NoExecute
            key: node.kubernetes.io/unreachable
            operator: Exists
            tolerationSeconds: 300
          - effect: NoExecute
            key: node.kubernetes.io/not-ready
            operator: Exists
            tolerationSeconds: 300
  typhaDeployment:
    spec:
      template:
        spec:
          tolerations:
          - effect: NoExecute
            key: node.kubernetes.io/unreachable
            operator: Exists
            tolerationSeconds: 300
          - effect: NoExecute
            key: node.kubernetes.io/not-ready
            operator: Exists
            tolerationSeconds: 300
```

## 憑證故障診斷
<a name="hybrid-nodes-troubleshooting-creds"></a>

對於 AWS SSM 混合啟用和 AWS IAM Roles Anywhere，您可以從混合節點執行下列命令，驗證混合節點 IAM 角色的登入資料是否已在您的混合節點上正確設定。確認節點名稱和混合節點 IAM 角色名稱與您的預期相符。

```
sudo aws sts get-caller-identity
```

```
{
    "UserId": "ABCDEFGHIJKLM12345678910:<node-name>",
    "Account": "<aws-account-id>",
    "Arn": "arn:aws: sts::<aws-account-id>:assumed-role/<hybrid-nodes-iam-role/<node-name>"
}
```

 ** AWS Systems Manager (SSM) 故障診斷** 

如果您針對混合節點登入資料使用 AWS SSM 混合啟用，請注意 安裝在混合節點上的下列 SSM 目錄和成品`nodeadm`。如需 SSM 代理程式的詳細資訊，請參閱 * AWS Systems Manager 使用者指南*中的[使用 SSM 代理程式](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)。


| Description | Location | 
| --- | --- | 
|  SSM 代理程式  |  Ubuntu - `/snap/amazon-ssm-agent/current/amazon-ssm-agent` RHEL 和 AL2023 - `/usr/bin/amazon-ssm-agent`   | 
|  SSM 代理程式日誌  |   `/var/log/amazon/ssm`   | 
|   AWS 登入資料  |   `/root/.aws/credentials`   | 
|  SSM Setup CLI  |   `/opt/ssm/ssm-setup-cli`   | 

 **重新啟動 SSM 代理程式** 

重新啟動 SSM 代理程式即可解決某些問題。您可以使用以下命令來重新啟動。

 **AL2023 和其他作業系統** 

```
systemctl restart amazon-ssm-agent
```

 **Ubuntu** 

```
systemctl restart snap.amazon-ssm-agent.amazon-ssm-agent
```

 **檢查 SSM 端點的連線** 

確認您可以從混合節點連接至 SSM 端點。如需 SSM 端點的清單，請參閱 [AWS Systems Manager 端點和配額](https://docs.aws.amazon.com/general/latest/gr/ssm.html)。將以下命令`us-west-2`中的 取代為 AWS SSM 混合啟用 AWS 的區域。

```
ping ssm.us-west-2.amazonaws.com
```

 **檢視已註冊的 SSM 執行個體的連線狀態** 

您可以使用下列 CLI 命令，檢查已向 SSM AWS 混合啟用註冊之執行個體的連線狀態。使用您執行個體的機器 ID 取代機器 ID。

```
aws ssm get-connection-status --target mi-012345678abcdefgh
```

 **SSM Setup CLI 檢查總和不相符** 

執行 `nodeadm install` 時，如果您看到 `ssm-setup-cli` 檢查總和不相符的問題，則您應該確認主機上的現有 SSM 安裝並非較舊版本。如果您的主機上有較舊的 SSM 安裝，則請將其移除並重新執行 `nodeadm install`，以解決問題。

```
Failed to perform agent-installation/on-prem registration: error while verifying installed ssm-setup-cli checksum: checksum mismatch with latest ssm-setup-cli.
```

 **SSM `InvalidActivation` ** 

如果您看到向 AWS SSM 註冊執行個體時發生錯誤，請確認 `activationId`中的 `activationCode`、 `region`和 `nodeConfig.yaml` 正確無誤。EKS 叢集 AWS 的區域必須符合 SSM 混合啟用的區域。如果這些值設定錯誤，您可能會看到類似如下的錯誤。

```
ERROR Registration failed due to error registering the instance with AWS SSM. InvalidActivation
```

 **SSM `ExpiredTokenException`：包含在​請求中的安全性權杖已過期** 

如果 SSM 代理程式無法重新整理憑證，您可能會看到 `ExpiredTokenException`。在這種情況下，如果您能夠從混合節點連接至 SSM 端點，您可能需要重新啟動 SSM 代理程式，以強制執行憑證重新整理。

```
"msg":"Command failed","error":"operation error SSM: DescribeInstanceInformation, https response error StatusCode: 400, RequestID: eee03a9e-f7cc-470a-9647-73d47e4cf0be, api error ExpiredTokenException: The security token included in the request is expired"
```

 **執行 register machine 命令時發生 SSM 錯誤** 

如果您發現向 SSM 註冊機器時出現錯誤，您可能需要重新執行 `nodeadm install`，以確保已正確安裝所有 SSM 相依性。

```
"error":"running register machine command: , error: fork/exec /opt/aws/ssm-setup-cli: no such file or directory"
```

 **SSM `ActivationExpired` ** 

執行 `nodeadm init` 時，如果您發現因為過期的啟用而向 SSM 註冊執行個體發生錯誤，您需要建立新的 SSM 混合啟用、使用新的 SSM 混合啟用的 `activationCode` 和 `activationId` 更新 `nodeConfig.yaml`，並重新執行 `nodeadm init`。

```
"msg":"Command failed","error":"SSM activation expired. Please use a valid activation"
```

```
ERROR Registration failed due to error registering the instance with AWS SSM. ActivationExpired
```

 **SSM 無法重新整理快取的憑證** 

如果您發現重新整理快取的憑證失敗，`/root/.aws/credentials` 檔案可能已從您的主機上刪除。首先檢查您的 SSM 混合啟用，並確保其處於作用中狀態，且您的混合節點已正確設定為使用啟用。檢查位於 `/var/log/amazon/ssm` 的 SSM 代理程式日誌，並在 SSM 端解決問題後重新執行 `nodeadm init` 命令。

```
"Command failed","error":"operation error SSM: DescribeInstanceInformation, get identity: get credentials: failed to refresh cached credentials"
```

 **清除 SSM** 

若要從主機移除 SSM 代理程式，您可以執行下列命令。

```
dnf remove -y amazon-ssm-agent
sudo apt remove --purge amazon-ssm-agent
snap remove amazon-ssm-agent
rm -rf /var/lib/amazon/ssm/Vault/Store/RegistrationKey
```

 ** AWS IAM Roles Anywhere 故障診斷** 

如果您將 AWS IAM Roles Anywhere 用於混合節點憑證，請注意 安裝在混合節點上的下列目錄和成品`nodeadm`。如需故障診斷 IAM Roles Anywhere 的詳細資訊，請參閱《[IAM Roles Anywhere AWS 使用者指南》中的故障診斷 IAM Roles Anywhere 身分和存取權](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/security_iam_troubleshoot.html)。 * AWS *


| Description | Location | 
| --- | --- | 
|  IAM Roles Anywhere CLI  |   `/usr/local/bin/aws_signing_helper`   | 
|  預設憑證位置和名稱  |   `/etc/iam/pki/server.pem`   | 
|  預設金鑰位置和名稱  |   `/etc/iam/pki/server.key`   | 

 **IAM Roles Anywhere 無法重新整理快取的憑證** 

如果您發現重新整理快取的憑證失敗，請檢閱 `/etc/aws/hybrid/config` 的內容，並確認已正確設定 `nodeadm` 組態中的 IAM Roles Anywhere。確認存在 `/etc/iam/pki`。每個節點都必須有唯一的憑證和金鑰。根據預設，使用 IAM Roles Anywhere 作為憑證提供者時，`nodeadm` 會將 `/etc/iam/pki/server.pem` 用於憑證位置和名稱，以及將 `/etc/iam/pki/server.key` 用於私有金鑰。您可能需要先建立目錄，然後再將憑證和金鑰放入具有 `sudo mkdir -p /etc/iam/pki` 的目錄中。您可以使用以下命令來驗證憑證的內容。

```
openssl x509 -text -noout -in server.pem
```

```
open /etc/iam/pki/server.pem: no such file or directory
could not parse PEM data
Command failed {"error": "... get identity: get credentials: failed to refresh cached credentials, process provider error: error in credential_process: exit status 1"}
```

 **IAM Roles Anywhere 未獲授權執行 `sts:AssumeRole` ** 

在 `kubelet` 日誌中，如果您在使用 IAM Roles Anywhere 時發現 `sts:AssumeRole` 操作的存取遭拒問題，請檢查混合節點 IAM 角色的信任政策，以確認允許 IAM Roles Anywhere 服務主體擔任混合節點 IAM 角色。此外，請確認您的混合節點 IAM 角色信任政策中已正確設定信任錨 ARN，並且您的混合節點 IAM 角色已新增至您的 IAM Roles Anywhere 設定檔。

```
could not get token: AccessDenied: User: ... is not authorized to perform: sts:AssumeRole on resource: ...
```

 **IAM Roles Anywhere 未獲授權設定 `roleSessionName` ** 

在 `kubelet` 日誌中，如果您發現設定 `roleSessionName` 時出現存取遭拒問題，請確認您已為 IAM Roles Anywhere 設定檔將 `acceptRoleSessionName` 設為 true。

```
AccessDeniedException: Not authorized to set roleSessionName
```

## 作業系統故障診斷
<a name="hybrid-nodes-troubleshooting-os"></a>

### RHEL
<a name="_rhel"></a>

 **權利或訂閱管理員註冊失敗** 

如果您正在執行 `nodeadm install`，且由於權利註冊問題而無法安裝混合節點相依性，則請確保您已在主機上正確設定您的 Red Hat 使用者名稱和密碼。

```
This system is not registered with an entitlement server
```

### Ubuntu
<a name="_ubuntu"></a>

 **找不到 GLIBC** 

如果您將 Ubuntu 用於作業系統，並將 IAM Roles Anywhere 用作具有混合節點的憑證提供者，同時還發現找不到 GLIBC 的問題，則您可以手動安裝該相依性，進而解決問題。

```
GLIBC_2.32 not found (required by /usr/local/bin/aws_signing_helper)
```

執行下列命令以安裝相依性：

```
ldd --version
sudo apt update && apt install libc6
sudo apt install glibc-source
```

### Bottlerocket
<a name="_bottlerocket"></a>

如果您已啟用 Bottlerocket 管理員容器，則可使用 SSH 來進行存取，以利用更高的權限進行進階偵錯和故障診斷。下列各節包含需要在 Bottlerocket 主機環境中執行的命令。進入管理員容器後，您可以執行 `sheltie`，以取得 Bottlerocket 主機中的完整根 shell。

```
sheltie
```

您也可以在每個命令前加上字首 `sudo chroot /.bottlerocket/rootfs`，進而從管理員容器 Shell 的下列區段中執行命令。

```
sudo chroot /.bottlerocket/rootfs <command>
```

 **使用 logdog 進行日誌收集** 

Bottlerocket 提供 `logdog` 公用程式來高效收集日誌和系統資訊，進而供故障診斷之用。

```
logdog
```

`logdog` 公用程式會從 Bottlerocket 主機上的不同位置收集日誌，並將其合併為 tarball。根據預設，tarball 會在 `/var/log/support/bottlerocket-logs.tar.gz` 中建立，並且可從 `/.bottlerocket/support/bottlerocket-logs.tar.gz` 的託管容器存取。

 **使用 journalctl 存取系統日誌** 

您可以使用下列命令檢查各種系統服務的狀態 (例如 `kubelet`、`containerd` 等等)，並檢視其日誌。`-f` 旗標會即時追蹤日誌。

若要檢查 `kubelet` 服務狀態並擷取 `kubelet` 日誌，您可以執行：

```
systemctl status kubelet
journalctl -u kubelet -f
```

若要檢查 `containerd` 服務狀態並擷取協調的 `containerd` 執行個體的日誌，您可以執行：

```
systemctl status containerd
journalctl -u containerd -f
```

若要檢查 `host-containerd` 服務狀態並擷取主體 `containerd` 執行個體的日誌，您可以執行：

```
systemctl status host-containerd
journalctl -u host-containerd -f
```

如需擷取引導容器和託管容器的日誌，您可以執行：

```
journalctl _COMM=host-ctr -f
```