创建自行管理的 Microsoft Windows 节点
本主题介绍了如何启动向 Amazon EKS 集群注册的 Windows 节点的自动扩缩组。在这些节点加入集群后,您可以向其部署 Kubernetes 应用程序。
重要
-
Amazon EKS 节点是标准的 Amazon EC2 实例,您需要基于常规的 Amazon EC2 实例价格为其付费。有关更多信息,请参阅 Amazon EC2 定价
。 -
您可以在 Amazon Outpost 上的 Amazon EKS 扩展集群中启动 Windows 节点,但您无法在 Amazon Outpost 上的本地集群中启动它们。有关更多信息,请参阅 使用 Amazon Outposts 在本地部署 Amazon EKS。
为集群启用 Windows 支持。我们建议您在启动 Windows 节点组之前查看重要的注意事项。有关更多信息,请参阅 启用 Windows 支持。
您可以通过以下任一方法启动自行管理的 Windows 节点:
eksctl
使用 eksctl
启动自行管理 Windows 节点
此过程要求您已安装 eksctl
,且您的 eksctl
版本至少为 0.194.0
。可以使用以下命令来查看您的版本。
eksctl version
有关安装或升级 eksctl
的说明,请参阅 eksctl
文档中的 Installation
注意
此过程仅适用于使用 eksctl
创建的集群。
-
(可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略(如果您拥有
IPv4
集群)或AmazonEKS_CNI_IPv6_Policy
(如果您拥有IPv6
集群时自行创建)附加到 Amazon EKS 节点 IAM 角色,我们建议将其分配给关联到 Kubernetesaws-node
服务账户的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。 -
此过程假设您已经有一个现有集群。如果您还没有要将 Windows 节点组添加到的 Amazon EKS 集群和 Amazon Linux 节点组,则建议您遵循开始使用 Amazon EKS – eksctl 操作。该指南提供使用 Amazon Linux 节点创建 Amazon EKS 集群的完整演练。
使用以下命令创建您的节点组。将
region-code
替换为您的集群所在的 Amazon 区域。将my-cluster
替换为您的集群名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 Amazon 区域和 Amazon 账户,该名称必须在其内具有唯一性。将ng-windows
替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。对于 Kubernetes1.24
版本或更高版本,您可以将2019
替换为2022
以使用 Windows Server 2022。将example values
的剩余部分替换为您自己的值。重要
要将节点组部署到 Amazon Outposts、Amazon Wavelength 或 Amazon 本地区域子网,在创建集群时不要传递 Amazon Outposts、Wavelength 或本地区域子网。使用配置文件创建节点组,指定 Amazon 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"
-
-
(可选)部署示例应用程序以测试集群和 Windows 节点。
-
如果满足以下条件,我们建议阻止 Pod 访问 IMDS:
-
您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。
-
集群中没有任何 Pods 需要出于其它原因(例如检索当前 Amazon 区域)访问 Amazon EC2 实例元数据服务(IMDS)。
有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。 -
Amazon Web Services Management Console
先决条件
-
现有 Amazon EKS 集群和 Linux 节点组。如果您没有这些资源,我们建议您按照我开始使用 Amazon EKS中的指南之一创建它们。这些指南介绍如何使用 Linux 节点创建 Amazon EKS 集群。
-
符合 Amazon EKS 集群要求的现有 VPC 和安全组。有关更多信息,请参阅 查看 Amazon EKS 对 VPC 和子网的联网要求 和 查看集群的 Amazon EKS 安全组要求。开始使用 Amazon EKS 中的指南创建符合要求的 VPC。或者,您可以按照为 Amazon EKS 集群创建一个 Amazon VPC 中的说明,手动创建一个。
-
现有 Amazon EKS 集群,它使用符合 Amazon EKS 集群要求的 VPC 和安全组。有关更多信息,请参阅 创建 Amazon EKS 集群。。如果您在启用了 Amazon Outposts、Amazon Wavelength 或 Amazon 本地区域的 Amazon 区域中拥有子网,则这些子网不得在您创建集群时就已传入。
步骤1:使用 Amazon Web Services Management Console 启动自行管理 Windows 节点
-
等待集群状态显示为
ACTIVE
。如果在集群处于活动状态之前启动节点,则节点将无法向集群注册,您需要重新启动节点。 -
选择创建堆栈。
-
对于 Specify template(指定模板),选择 Amazon S3 URL。
-
复制以下 URL 并将其粘贴到 Amazon S3 URL 中。
https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2023-02-09/amazon-eks-windows-nodegroup.yaml
-
选择 Next(下一步)两次。
-
在 Quick create stack(快速创建堆栈)页面上,相应地填写以下参数:
-
堆栈名称:为 Amazon CloudFormation 堆栈选择堆栈名称。例如,您可以将其称为
my-cluster
-nodes````。 -
ClusterName:输入您在创建 Amazon EKS 集群时使用的名称。
重要
此名称必须与在步骤 1:创建您的 Amazon EKS 集群中使用的名称完全匹配。否则,您的节点无法加入集群。
-
ClusterControlPlaneSecurityGroup:从您在创建 VPC 时生成的 Amazon CloudFormation 输出中,选择安全组。以下步骤显示了检索适用组的一种方法。
-
选择集群的名称。
-
选择 Networking(联网)选项卡。
-
从 ClusterControlPlaneSecurityGroup 下拉列表中选择时使用 Additional security groups(其他安全组)值作为参考。
-
NodeGroupName:输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的自动扩缩节点组。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。
-
NodeAutoScalingGroupMinSize:输入您的节点 Auto Scaling 组可缩减到的最小节点数。
-
NodeAutoScalingGroupDesiredCapacity:输入创建堆栈时要扩展到的所需节点数目。
-
NodeAutoScalingGroupMaxSize:输入您的节点 Auto Scaling 组可横向扩展到的最大节点数。
-
NodeInstanceType:选择节点的实例类型。有关更多信息,请参阅 选择最优的 Amazon EC2 节点实例类型。
注意
GitHub 的 vpc_ip_resource_limit.go
中列出适用于 Kubernetes 的 Amazon VPC CNI 插件 最新版本支持的实例类型。您可能需要更新 CNI 版本以使用最新的受支持实例类型。有关更多信息,请参阅 Amazon VPC CNI。 -
NodeImageIdSSMParam:预先填充了当前推荐的 Amazon EKS 优化版 Windows Core AMI ID 的 Amazon EC2 Systems Manager 参数。要使用完整版本的 Windows,请将
Core
替换为Full
。 -
NodeImageId:(可选)如果您使用自定义 AMI(而不是 Amazon EKS 优化版 AMI),则输入您 Amazon 区域的节点 AMI ID。如果您为此字段指定值,它会覆盖 NodeImageIdSSMParam 字段中的任意值。
-
NodeVolumeSize:指定您的节点的根卷大小(以 GiB 为单位)。
-
KeyName:输入 Amazon EC2 SSH 密钥对的名称,您可使用该密钥对来在节点启动后使用 SSH 连接到这些节点。如果还没有 Amazon EC2 密钥对,可以在 Amazon Web Services Management Console中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对。
注意
如果此处不提供密钥对,Amazon 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 地址,也无法与集群或其它 Amazon 服务进行通信。如果子网是在 2020 年 3 月 26 日之前使用任一 Amazon EKS Amazon CloudFormation VPC 模板部署的,或者是使用
eksctl
部署的,则会为这些公有子网禁用自动公有 IP 地址分配。有关如何为子网启用公有 IP 地址分配的信息,请参阅修改子网的公有 IPv4 寻址属性。如果节点部署到私有子网,则可以通过 NAT 网关与集群和其它 Amazon 服务进行通信。 -
如果子网没有 Internet 访问权限,请确保您了解部署具有有限互联网访问权限的私有集群中的注意事项和额外步骤。
-
如果您选择 Amazon Outposts、Wavelength 或本地区域子网,则这些子网不得在您创建集群时就已传入。
-
-
-
确认堆栈可创建 IAM 资源,然后选择 Create stack(创建堆栈)。
-
完成创建堆栈后,在控制台中选中它,然后选择 Outputs(输出)。
-
记录已创建的节点组的 NodeInstanceRole。您在配置 Amazon EKS Windows 节点时需要此值。
步骤 2:使节点能够加入集群
-
检查您是否已经应用拥有
aws-auth
ConfigMap
。kubectl describe configmap -n kube-system aws-auth
-
如果您看到的是
aws-auth
ConfigMap
,则请根据需要对其进行更新。-
打开
ConfigMap
文件进行编辑。kubectl edit -n kube-system configmap/aws-auth
-
根据需要添加新的
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 [...]
-
保存文件并退出文本编辑器。
-
-
如果您收到错误提示 "
Error from server (NotFound): configmaps "aws-auth" not found
,则请使用库存ConfigMap
。-
下载配置映射。
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm-windows.yaml
-
在
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 角色。
-
-
应用配置。此命令可能需要几分钟才能完成。
kubectl apply -f aws-auth-cm-windows.yaml
-
-
查看节点的状态并等待它们达到
Ready
状态。kubectl get nodes --watch
输入
Ctrl
+C
以返回到 Shell 提示符。注意
如果您收到任何授权或资源类型错误,请参阅故障排除主题中的 未经授权或访问被拒绝 (kubectl)。
如果节点无法加入集群,则请参阅故障排除一章中的 节点未能加入集群。
第 3 步:其它操作
-
(可选)部署示例应用程序以测试集群和 Windows 节点。
-
(可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略(如果您拥有
IPv4
集群)或AmazonEKS_CNI_IPv6_Policy
(如果您拥有IPv6
集群时自行创建)附加到 Amazon EKS 节点 IAM 角色,我们建议将其分配给关联到 Kubernetesaws-node
服务账户的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。 -
如果满足以下条件,我们建议阻止 Pod 访问 IMDS:
-
您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。
-
集群中没有任何 Pods 需要出于其它原因(例如检索当前 Amazon 区域)访问 Amazon EC2 实例元数据服务(IMDS)。
有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。 -