

 **協助改進此頁面** 

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

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

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

# 建立自我管理的 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)。