创建自行管理的 Microsoft Windows 节点 - Amazon EKS

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

创建自行管理的 Microsoft Windows 节点

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

重要
  • Amazon EKS 节点是标准的 Amazon EC2 实例,您需要基于常规的 Amazon EC2 实例价格为其付费。有关更多信息,请参阅 Amazon EC2 定价

  • 您可以在 AWS Outpost 上的 Amazon EKS 扩展集群中启动 Windows 节点,但您无法在 AWS Outpost 上的本地集群中启动它们。有关更多信息,请参阅 使用 AWS Outposts 在本地部署 Amazon EKS

为集群启用 Windows 支持。我们建议您在启动 Windows 节点组之前查看重要的注意事项。有关更多信息,请参阅 启用 Windows 支持

您可以通过 eksctl 或 AWS Management Console 启动自行管理的 Windows 节点。

eksctl
要使用 eksctl 启动自行管理的 Windows 节点

此过程要求您已安装 eksctl,且您的 eksctl 版本至少为 0.191.0。可以使用以下命令来查看您的版本。

eksctl version

有关安装或升级 eksctl 的说明,请参阅 eksctl 文档中的 Installation

注意

此过程仅适用于使用 eksctl 创建的集群。

  1. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略(如果您拥有 IPv4 集群)或 AmazonEKS_CNI_IPv6_Policy(如果您拥有 IPv6 集群时自行创建)附加到 Amazon EKS 节点 IAM 角色,我们建议将其分配到关联到 Kubernetes aws-node 服务账户的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA

  2. 此过程假设您已经有一个现有集群。如果您还没有要将 Windows 节点组添加到的 Amazon EKS 集群和 Amazon Linux 节点组,则建议您遵循 开始使用 Amazon EKS – eksctl 指南操作。指南提供使用 Amazon Linux 节点创建 Amazon EKS 集群的完整演练。

    使用以下命令创建您的节点组。region-code 替换为集群所在的 AWS 区域。my-cluster 替换为您的集群名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域 和 AWS 账户,该名称必须在其内具有唯一性。将 ng-windows 替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。对于 Kubernetes 1.24 版本或更高版本,您可以将 2019 替换为 2022 以使用 Windows Server 2022。将剩余的 example values 替换为您自己的值。

    重要

    要将节点组部署到 AWS Outposts、AWS Wavelength 或 AWS 本地区域子网,在创建集群时不要传递 AWS Outposts、Wavelength 或本地区域子网。使用配置文件创建节点组,指定 AWS Outposts、Wavelength 或本地区域子网。有关更多信息,请参阅 eksctl 文档中的从配置文件创建节点组Config 文件架构

    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
    注意
    • 如果节点无法加入集群,请参阅《故障排除指南》中的 节点未能加入集群

    • 要查看 eksctl 命令可用选项,请输入以下命令。

      eksctl command -help

    示例输出如下。创建节点时会输出几行。输出的最后几行类似于以下示例行。

    [✔] created 1 nodegroup(s) in cluster "my-cluster"
  3. (可选)部署示例应用程序以测试集群和 Windows 节点。

  4. 如果满足以下条件,我们建议阻止 Pod 访问 IMDS:

    • 您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。

    • 集群中没有任何 Pods 需要出于其他原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。

    有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问

AWS Management Console
先决条件
步骤 1:要使用 AWS Management Console 启动自行管理 Windows 节点
  1. 等待集群状态显示为 ACTIVE。如果在集群处于活动状态之前启动节点,则节点将无法向集群注册,您需要重新启动节点。

  2. 打开 AWS CloudFormation 控制台:https://console.aws.amazon.com/cloudformation

  3. 选择创建堆栈

  4. 对于 Specify template(指定模板),选择 Amazon S3 URL

  5. 复制以下 URL 并将其粘贴到 Amazon S3 URL 中。

    https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2023-02-09/amazon-eks-windows-nodegroup.yaml
  6. 选择 Next(下一步)两次。

  7. Quick create stack(快速创建堆栈)页面上,相应地填写以下参数:

    • 堆栈名称:为 AWS CloudFormation 堆栈选择堆栈名称。例如,您可以将其命名为 my-cluster-nodes

    • ClusterName:输入您在创建 Amazon EKS 集群时使用的名称。

      重要

      此名称必须与 第 1 步:创建 Amazon EKS 集群 中使用的名称完全匹配。否则,您的节点无法加入群集。

    • ClusterControlPlaneSecurityGroup:从您在创建 VPC 时生成的 AWS CloudFormation 输出中,选择安全组。

      以下步骤显示了检索适用组的一种方法。

      1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

      2. 选择集群的名称。

      3. 选择 Networking(联网)选项卡。

      4. ClusterControlPlaneSecurityGroup 下拉列表中选择时使用 Additional security groups(其他安全组)值作为参考。

    • NodeGroupName:输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的弹性伸缩节点组。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。

    • NodeAutoScalingGroupMinSize:输入您的节点 Auto Scaling 组可缩减到的最小节点数。

    • NodeAutoScalingGroupDesiredCapacity:输入创建堆栈时要扩展到的所需节点数目。

    • NodeAutoScalingGroupMaxSize:输入您的节点 Auto Scaling 组可横向扩展到的最大节点数。

    • NodeInstanceType:选择节点的实例类型。有关更多信息,请参阅 选择最优的 Amazon EC2 节点实例类型

      注意

      GitHub 上的 vpc_ip_resource_limit.go 中列出了 Amazon VPC CNI plugin for Kubernetes 最新版本支持的实例类型。您可能需要更新 CNI 版本以使用最新的受支持实例类型。有关更多信息,请参阅 使用 Amazon VPC CNI 将 IP 分配给 Pods

    • 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 Management Console 中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对

      注意

      如果您不在此处提供密钥对,AWS CloudFormation 堆栈创建将失败。

    • BootstrapArguments:指定要传递给节点引导脚本的所有可选参数,如使用 -KubeletExtraArgs 的其他 kubelet 实际参数。

    • DisableIMDSv1:预设情况下,每个节点支持实例元数据服务版本 1 (IMDSv1) 和 IMDSv2。您可以禁用 IMDSv1。要防止节点组中的未来节点和 Pods 使用 MDSv1,请将 DisableIMDSv1 设置为 true(真)。有关 IMDS 的更多信息,请参阅配置实例元数据服务

    • VpcId:选择创建的 VPC 的 ID。

    • NodeSecurityGroups:选择在您创建 VPC 时为您的 Linux 节点组创建的安全组。如果您的 Linux 节点附加了多个安全组,请指定所有安全组。例如,如果 Linux 节点组是使用创建的 eksctl

    • 子网:选择创建的子网。如果您使用 为您的 Amazon EKS 集群创建 Amazon VPC 中的步骤创建了 VPC,则在 VPC 中仅指定私有子网以供您的节点启动到其中。

      重要
      • 如果其中的任何子网是公有子网,则其必须启用自动公有 IP 地址分配设置。如果没有为该公有子网启用该设置,则您部署到该公有子网的任何节点都不会分配到公有 IP 地址,也无法与集群或其他 AWS 服务进行通信。如果子网是在 2020 年 3 月 26 日之前使用任一 Amazon EKS AWS CloudFormation VPC 模板部署的,或者是使用 eksctl 部署的,则会为这些公有子网禁用自动公有 IP 地址分配。有关如何为子网启用公有 IP 地址分配的信息,请参阅修改子网的公有 IPv4 寻址属性。如果节点部署到私有子网,则可以通过 NAT 网关与集群和其他 AWS 服务进行通信。

      • 如果子网没有 Internet 访问权限,请确保您了解 部署具有有限互联网访问权限的私有集群 中的注意事项和额外步骤。

      • 如果您选择 AWS Outposts、Wavelength 或本地区域子网,则这些子网不得在您创建集群时就已传入。

  8. 确认堆栈可创建 IAM 资源,然后选择 Create stack(创建堆栈)

  9. 完成创建堆栈后,在控制台中选中它,然后选择 Outputs(输出)

  10. 记录已创建的节点组的 NodeInstanceRole。您在配置 Amazon EKS Windows 节点时需要此值。

步骤 2:使节点能够加入集群
  1. 检查您是否已经应用拥有 aws-auth ConfigMap

    kubectl describe configmap -n kube-system aws-auth
  2. 如果您看到的是 aws-auth ConfigMap,则请根据需要对其进行更新。

    1. 打开 ConfigMap 文件进行编辑。

      kubectl edit -n kube-system configmap/aws-auth
    2. 根据需要添加新的 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 [...]
    3. 保存文件并退出文本编辑器。

  3. 如果您收到错误提示 "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
    2. 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 角色。

    3. 应用配置。此命令可能需要几分钟才能完成。

      kubectl apply -f aws-auth-cm-windows.yaml
  4. 查看节点的状态并等待它们达到 Ready 状态。

    kubectl get nodes --watch

    输入 Ctrl+C 以返回到 Shell 提示符。

    注意

    如果您收到任何授权或资源类型错误,请参阅故障排除主题中的 未经授权或访问被拒绝 (kubectl)

    如果节点无法加入集群,则请参阅故障排除一章中的 节点未能加入集群

第 3 步:其他操作
  1. (可选)部署示例应用程序以测试集群和 Windows 节点。

  2. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略(如果您拥有 IPv4 集群)或 AmazonEKS_CNI_IPv6_Policy(如果您拥有 IPv6 集群时自行创建)附加到 Amazon EKS 节点 IAM 角色,我们建议将其分配到关联到 Kubernetes aws-node 服务账户的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA

  3. 如果满足以下条件,我们建议阻止 Pod 访问 IMDS:

    • 您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。

    • 集群中没有任何 Pods 需要出于其他原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。

    有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问