

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 创建自主管理型 Microsoft Windows 节点
<a name="launch-windows-workers"></a>

本主题介绍了如何启动向 Amazon EKS 集群注册的 Windows 节点的自动扩缩组。在这些节点加入集群后，您可以向其部署 Kubernetes 应用程序。

**重要**  
Amazon EKS 节点是标准的 Amazon EC2 实例，您需要基于常规的 Amazon EC2 实例价格为其付费。有关更多信息，请参阅 [Amazon EC2 定价](https://aws.amazon.com/ec2/pricing/)。
您可以在 AWS Outpost 上的 Amazon EKS 扩展集群中启动 Windows 节点，但您无法在 AWS Outpost 上的本地集群中启动它们。有关更多信息，请参阅 [使用 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*（如果您拥有 `IPv6` 集群时[自行创建](cni-iam-role.md#cni-iam-role-create-ipv6-policy)）附加到 [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。将 example values 的剩余部分替换为您自己的值。
**重要**  
要将节点组部署到 AWS Outposts、AWS Wavelength 或 AWS 本地区域子网，在创建集群时不要传递 AWS Outposts、Wavelength 或本地区域子网。使用配置文件创建节点组，指定 AWS Outposts、Wavelength 或本地区域子网。有关更多信息，请参阅 `eksctl` 文档中的[从配置文件创建节点组](https://eksctl.io/usage/nodegroups/#creating-a-nodegroup-from-a-config-file)和 [Config 文件架构](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）需要出于其他原因（例如检索当前 AWS 区域）访问 Amazon EC2 实例元数据服务（IMDS）。

   有关更多信息，请参阅[限制对分配给 Worker 节点的实例配置文件的访问](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 和安全组。有关更多信息，请参阅[查看 Amazon EKS 对 VPC 和子网的联网要求](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 Outposts、AWS Wavelength 或 AWS 本地区域的 AWS 区域中拥有子网，则这些子网不得在您创建集群时就已传入。

 **第 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 groups**（其他安全组）值作为参考。
   +  **NodeGroupName**：输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的自动扩缩节点组。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头，但也可以包括其余字符的连字符和下划线。
   +  **NodeAutoScalingGroupMinSize**：输入您的节点自动扩缩组可横向缩减到的最小节点数。
   +  **NodeAutoScalingGroupDesiredCapacity**：输入创建堆栈时要扩展到的所需节点数目。
   +  **NodeAutoScalingGroupMaxSize**：输入您的节点自动扩缩组可横向扩展到的最大节点数。
   +  **NodeInstanceType**：选择节点的实例类型。有关更多信息，请参阅 [选择最优的 Amazon EC2 节点实例类型](choosing-instance-type.md)。
**注意**  
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 插件](https://github.com/aws/amazon-vpc-cni-k8s)最新版本支持的实例类型。您可能需要更新 CNI 版本以使用最新的受支持实例类型。有关更多信息，请参阅 [使用 Amazon VPC CNI 将 IP 分配给容器组（pod）](managing-vpc-cni.md)。
   +  **NodeImageIdSSMParam**：预先填充了当前推荐的 Amazon EKS 优化版 Windows Core AMI ID 的 Amazon EC2 Systems Manager 参数。要使用完整版本的 Windows，请将 *Core* 替换为 `Full`。
   +  **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`。
   +  **子网**：选择创建的子网。如果您使用[为 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 服务进行通信。
如果子网没有 Internet 访问权限，请确保您了解[部署具有有限互联网访问权限的私有集群](private-clusters.md)中的注意事项和额外步骤。
如果您选择 AWS Outposts、Wavelength 或本地区域子网，则这些子网不得在您创建集群时就已传入。

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** 值。您可以使用文本编辑器或者通过替换 example values 和运行以下命令来执行此操作：

      ```
      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*（如果您拥有 `IPv6` 集群时[自行创建](cni-iam-role.md#cni-iam-role-create-ipv6-policy)）附加到 [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）需要出于其他原因（例如检索当前 AWS 区域）访问 Amazon EC2 实例元数据服务（IMDS）。

   有关更多信息，请参阅[限制对分配给工作节点的实例配置文件的访问](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)。