为集群创建托管式节点组
本主题介绍了如何启动向 Amazon EKS 集群注册的节点的 Amazon EKS 托管节点组。在这些节点加入集群后,您可以向其部署 Kubernetes 应用程序。
如果这是您首次启动 Amazon EKS 托管节点组,建议您改为遵循开始使用 Amazon EKS中的指南之一。这些指南提供了有关创建包含节点的 Amazon EKS 集群的演练。
重要
-
Amazon EKS 节点是标准的 Amazon EC2 实例。将根据正常的 Amazon EC2 价格向您计费。有关更多信息,请参阅 Amazon EC2 定价
。 -
您无法在启用了 AWS Outposts 或 AWS Wavelength 的 AWS 区域创建托管节点。您可以创建自行管理的节点。有关更多信息,请参阅 创建自行管理的 Amazon Linux 节点、创建自行管理的 Microsoft Windows 节点 和 创建自行管理的 Bottlerocket 节点。您还可以在 Outpost 上创建自行管理的 Amazon Linux 节点组。有关更多信息,请参阅 在 AWS Outpost 上创建 Amazon Linux 节点。
-
如果您没有为包含在 Amazon EKS 优化版 Linux 或 Bottlerocket 中的
bootstrap.sh
文件指定 AMI ID,则托管节点组会对maxPods
的值强制实施最大数量。对于 vCPU 少于 30 个的实例,最大数量为110
。对于 vCPU 大于 30 个的实例,最大数量将跳至250
。这些数字基于 Kubernetes 可扩展性阈值以及内部 Amazon EKS 可扩展性团队测试的推荐设置。有关更多信息,请参阅博客文章 Amazon VPC CNI 插件提高每个节点的容器组限制 。
-
现有 Amazon EKS 集群。要部署一个角色,请参阅创建 Amazon EKS 集群。。
-
供节点使用的现有 IAM 角色。要创建该文件,请参阅 Amazon EKS 节点 IAM 角色。如果此角色没有 VPC CNI 的任一策略,则需要为 VPC CNI Pod 使用随后的单独角色。
-
(可选,但建议设置)Amazon VPC CNI plugin for Kubernetes 附加组件已配置自己的 IAM 角色,并附加了必要的 IAM 策略。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。
-
熟悉选择最优的 Amazon EC2 节点实例类型中列出的注意事项。根据您选择的实例类型,您的集群和 VPC 可能还有其他先决条件。
-
要添加 Windows 托管节点组,必须先启用对集群的 Windows 支持。有关更多信息,请参阅 在 EKS 集群上部署 Windows 节点。
您可以使用以下任一途径创建托管节点组:
eksctl
使用 eksctl 创建托管节点组
此过程需要 eksctl
版本 0.194.0
或更高版本。可以使用以下命令来查看您的版本:
eksctl version
有关安装或升级 eksctl
的说明,请参阅 eksctl
文档中的 Installation
-
(可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes
aws-node
服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。 -
使用或不使用自定义启动模板创建托管节点组。手动指定启动模板可允许对节点组进行更好的自定义。例如,它可以允许部署自定义 AMI 或向 Amazon EKS 优化的 AMI 中的
boostrap.sh
脚本提供参数。要查看所有可用选项和原定设置的完整列表,请输入以下命令。eksctl create nodegroup --help
在以下命令中,将
my-cluster
替换为您的集群名称,并将my-mng
替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。重要
如果首次创建托管节点组时没有使用自定义启动模板,则以后不要对节点组使用模板。如果没有指定自定义启动模板,系统会自动生成启动模板,我们不建议您手动修改该模板。手动修改此自动生成的启动模板可能会导致错误。
不使用启动模板
eksctl
在您的账户中创建默认的 Amazon EC2 启动模板,并使用它根据您指定的选项创建的启动模板来部署节点组。在为 --node-type
指定值之前,请参阅 选择最优的 Amazon EC2 节点实例类型。
将 ami-family
替换为允许的关键字。有关更多信息,请参阅 eksctl
文档中的 Setting the node AMI Familymy-key
替换为您的 Amazon EC2 密钥对或公有密钥的名称。此密钥用于在节点启动后通过 SSH 进入节点。
注意
对于 Windows,此命令不启用 SSH。反之,它会将 Amazon EC2 密钥对与实例关联,并允许您 RDP 到实例中。
如果还没有 Amazon EC2 密钥对,可以在 AWS Management Console 中创建一个。有关 Linux 信息,请参阅 Amazon EC2 用户指南中的 Amazon EC2 密钥对和 Linux 实例。有关 Windows 信息,请参阅 Amazon EC2 用户指南中的 Amazon EC2 密钥对和 Windows 实例。
如果满足以下条件,我们建议阻止 Pod 访问 IMDS:
-
您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。
-
集群中没有任何 Pods 需要出于其它原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。
有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
如果要阻止 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
您的实例可以选择性地为 Pods 分配更多的 IP 地址,为其它 CIDR 块(而不是实例的 CIDR 块)中的 Pods 分配 IP 地址,以及部署到没有网络访问权限的集群。有关更多信息,请参阅 为带前缀的 Amazon EKS 节点分配更多 IP 地址、使用自定义网络在备用子网中部署 pods 和 部署具有有限互联网访问权限的私有集群,以获取要添加到上一个命令中的其他选项。
托管节点组将根据实例类型计算并应用单个值,以作为可以在节点组的每个节点上运行的最大 Pods 数量。如果创建具有不同实例类型的节点组,则在所有实例类型中计算得出的最小值将应用为可以在节点组中每种实例类型上运行的最大 Pods 数量。托管节点组会使用 Amazon EKS 建议每种 Amazon EC2 实例类型的最大容器组数量中引用的脚本计算值。
使用启动模板
启动模板必须已存在,并且必须满足启动模板配置基础知识中指定的要求。如果满足以下条件,我们建议阻止 Pod 访问 IMDS:
-
您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。
-
集群中没有任何 Pods 需要出于其它原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。
有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
如果要阻止 Pod 访问 IMDS,请在启动模板中指定必要的设置。
-
将以下内容复制到您的设备。替换
示例值
,然后运行修改后的命令以创建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
文档中的配置文件架构。您的实例可以选择为 Pods 分配更多 IP 地址,为其它 CIDR 块(而不是实例的 CIDR 块)中的 Pods 分配 IP 地址,使用 containerd
运行时间,并将其部署到没有出站网络访问权限的集群。有关更多信息,请参阅 为带前缀的 Amazon EKS 节点分配更多 IP 地址、使用自定义网络在备用子网中部署 pods、测试将 Amazon Linux 2 从 Docker 迁移到 containerd 和 部署具有有限互联网访问权限的私有集群,以获取添加到配置文件中的其他选项。如果您没有在启动模板中指定 AMI ID,则托管节点组将根据实例类型计算并应用单个值,以作为可以在节点组的每个节点上运行的最大 Pods 数量。如果创建具有不同实例类型的节点组,则在所有实例类型中计算得出的最小值将应用为可以在节点组中每种实例类型上运行的最大 Pods 数量。托管节点组会使用 Amazon EKS 建议每种 Amazon EC2 实例类型的最大容器组数量中引用的脚本计算值。
如果您在启动模板中指定了 AMI ID,请指定可以在节点组的每个节点上运行的最大 Pods 数量(如果您使用自定义网络或者想要增加分配到实例的 IP 地址数量)。有关更多信息,请参阅 Amazon EKS 建议每种 Amazon EC2 实例类型的最大 Pods 数量。
-
使用以下命令部署节点组。
eksctl create nodegroup --config-file eks-nodegroup.yaml
AWS Management Console
使用 AWS Management Console创建托管节点组
-
等待集群状态显示为
ACTIVE
。无法为状态尚未处于ACTIVE
的集群创建托管节点组。 -
选择要在其中创建托管节点组的集群的名称。
-
选择 Compute(计算)选项卡。
-
请选择 Add node group(添加节点组)。
-
在 Configure node group (配置节点组) 页面上,填写相应参数,然后选择 Next (下一步)。
-
名称 – 为托管节点组输入唯一名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。
-
节点 IAM 角色 – 选择要与节点组一起使用的节点实例角色。有关更多信息,请参阅 Amazon EKS 节点 IAM 角色。
重要
-
您不能使用创建任何集群时使用的相同角色。
-
我们建议使用任何自行管理节点组当前未使用的角色。否则,计划与新的自行管理节点组配合使用。有关更多信息,请参阅 从集群中删除托管式节点组。
-
使用启动模板 -(可选)选择是否要使用现有启动模板。选择 Launch Template Name(启动模板名称)。然后,选择 Launch template version(启动模板版本)。如果您未选择版本,Amazon EKS 将使用模板的默认版本。启动模板允许您对节点组进行更多自定义,例如允许您部署自定义 AMI、为 Pods 分配更多的 IP 地址、将 IP 地址分配到其它 CIDR 块(而不是实例的 CIDR 块)中的 Pods、为实例启用
containerd
运行时间,并将节点部署到没有出站网络访问权限的集群。有关更多信息,请参阅 为带前缀的 Amazon EKS 节点分配更多 IP 地址、使用自定义网络在备用子网中部署 pods、测试将 Amazon Linux 2 从 Docker 迁移到 containerd 和 部署具有有限互联网访问权限的私有集群。启动模板必须满足中的使用启动模板自定义托管式节点中的要求。如果您不使用自己的启动模板,Amazon EKS API 会在您的账户中创建默认 Amazon EC2 启动模板,并使用默认启动模板部署节点组。
如果实施服务账户的 IAM 角色,请将必要的权限直接分配到需要访问 AWS 服务的所有Pod,如果集群中没有 Pods 因其它原因(例如检索当前 AWS 区域)而需要访问 IMDS,那么您还可以在启动模板中为不使用主机网络的 Pods 禁用对 IMDS 的访问。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。 -
Kubernetes 标签 –(可选)您可以选择对托管节点组中的节点应用 Kubernetes 标签。
-
Kubernetes 污点 –(可选)您可以选择对托管节点组中的节点应用 Kubernetes 污点。Effect(效果)菜单中的可用选项包括
NoSchedule
、NoExecute
和PreferNoSchedule
。有关更多信息,请参阅 防止在特定节点上调度 Pods。 -
标签 –(可选)您可以选择对 Amazon EKS 托管节点组进行标记。这些标签不会传播到节点组中的其它资源,例如自动扩缩组或实例。有关更多信息,请参阅 使用标签整理 Amazon EKS 资源。
-
-
在 Set compute and scaling configuration(设置计算和扩展配置)页面上,填写相应参数,然后选择 Next(下一步)。
-
AMI 类型 – 选择 AMI 类型。如果您要部署 Arm 实例,请务必在部署前查看 Amazon EKS 优化版 Arm Amazon Linux AMI 中的注意事项。
如果您在上一页指定了启动模板,并在启动模板中指定了 AMI,则无法选择值。此时将显示模板中的值。模板中指定的 AMI 必须满足指定 AMI 中的要求。
-
容量类型 – 选择容量类型。有关选择容量类型的更多信息,请参阅 托管节点组容量类型。不能在同一节点组中混合使用不同的容量类型。如果要同时使用这两种容量类型,请创建单独的节点组,每个节点组都有自己的容量和实例类型。有关预置和扩展由 GPU 加速的 Worker 节点的信息,请参阅创建带适用于机器学习的容量块的托管式节点组。
-
实例类型 – 默认指定一个或多个实例类型。要删除默认实例类型,请选择实例类型右侧的
X
。选择要在托管节点组中使用的实例类型。有关更多信息,请参阅 选择最优的 Amazon EC2 节点实例类型。控制台显示一组常用的实例类型。如果需要使用未显示的实例类型创建托管节点组,请使用
eksctl
、AWS CLI、AWS CloudFormation 或 SDK 创建节点组。如果在上一页指定了启动模板,则无法选择值,因为必须在启动模板中指定实例类型。将显示启动模板中的值。如果为容量类型选择了 Spot 实例,我们建议您指定多个实例类型以增强可用性。 -
磁盘大小 – 输入要用于节点根卷的磁盘大小(单位为 GiB)。
如果在上一页指定了启动模板,则无法选择值,因为必须在启动模板中指定该值。
-
所需大小 – 指定托管节点组在启动时应当维持的当前节点数量。
注意
Amazon EKS 不会自动扩展或缩减节点组。但是,您可以配置 Kubernetes Cluster Autoscaler 以为您执行此操作。有关更多信息,请参阅 AWS 上的 Cluster Autoscaler
。 -
最小大小 – 指定托管节点组可以横向缩减到的最小节点数量。
-
最大大小 – 指定托管节点组可以横向扩展到的最大节点数量。
-
节点组更新配置 –(可选)您可以选择要并行更新的节点的数量或百分比。这些节点在更新期间将不可用。对于最大不可用,选择下列选项之一,然后指定一个值:
-
Number(数字)– 选择并指定节点组中可以并行更新的节点数。
-
Percentage(百分比)– 选择并指定节点组中可并行更新的节点的百分比。如果您的节点组中有大量节点,这将非常有用。
-
-
-
在 Specify networking(指定联网)页面上,相应填写参数,然后选择 Next(下一步)。
-
子网 – 选择要在其中启动托管节点的子网。
重要
如果要使用 Kubernetes Cluster Autoscaler
在由 Amazon EBS 卷支持的多个可用区中运行有状态应用程序,则应该配置多个节点组,每个节点组的范围都限定为一个可用区。此外,您还应该启用 --balance-similar-node-groups
功能。重要
-
如果您选择公有子网,并且您的集群仅启用公有 API 服务器端点,则子网必须将
MapPublicIPOnLaunch
设置为true
,实例才能成功加入集群。如果子网是使用eksctl
或 Amazon EKS 发布的 AWS CloudFormation 模板在 2020 年 3 月 26 日或之后创建的,则此设置已设置为true
。如果子网是在 2020 年 3 月 26 日之前使用eksctl
或 AWS CloudFormation 模板创建的,则需要手动更改设置。有关更多信息,请参阅修改子网的公有 IPv4 寻址属性。 -
如果使用启动模板并指定多个网络接口,即使
MapPublicIpOnLaunch
设置true
,Amazon EC2 也不会自动分配公有IPv4
地址。在这种情况下,要让节点加入集群,您必须启用集群的私有 API 服务器端点,或者在具有出站 Internet 访问的私有子网中启动节点(Internet 访问通过如 NAT 网关等其它方法提供)。有关更多信息,请参阅 Amazon EC2 用户指南中的 Amazon EC2 实例 IP 寻址。
-
-
Configure SSH access to nodes(配置对节点的 SSH 访问)(可选)。启用 SSH 后,如果出现问题,您可以连接到实例并收集诊断信息。我们强烈建议您在创建节点组时启用远程访问。创建节点组后,将无法启用远程访问。
如果您选择使用启动模板,则不会显示此选项。要启用对节点的远程访问,请在启动模板中指定密钥对,并确保为您在启动模板中指定的安全组中的节点打开正确的端口。有关更多信息,请参阅 使用自定义安全组。
注意
对于 Windows,此命令不启用 SSH。反之,它会将 Amazon EC2 密钥对与实例关联,并允许您 RDP 到实例中。
-
对于 SSH 密钥对(可选),请选择要使用的 Amazon EC2 SSH 密钥。有关 Linux 信息,请参阅 Amazon EC2 用户指南中的 Amazon EC2 密钥对和 Linux 实例。有关 Windows 信息,请参阅 Amazon EC2 用户指南中的 Amazon EC2 密钥对和 Windows 实例。如果您选择使用启动模板,则无法选择密钥对。使用 Bottlerocket AMI 为节点组提供 Amazon EC2 SSH 密钥后,还启用管理容器。有关更多信息,请参阅 GitHub 上的 Admin 容器
。 -
对于 Allow SSH remote access from(允许来自以下的远程访问),如果要限制对特定实例的访问,请选择与这些实例关联的安全组。如果没有选择特定的安全组,则允许从 Internet 上的任何位置进行 SSH 访问(
0.0.0.0/0
)。
-
-
在 Review and create (审核并创建) 页面上,审核托管节点组配置并选择 Create (创建)。
如果节点无法加入集群,则请参阅故障排除一章中的 节点未能加入集群。
-
查看节点的状态并等待它们达到
Ready
状态。kubectl get nodes --watch
-
(仅限 GPU 节点)如果选择 GPU 实例类型和 Amazon EKS 优化版加速型 AMI,则必须在集群上将 适用于 Kubernetes 的 NVIDIA 设备插件
用作 DaemonSet。将 vX.X.X
替换为您需要的 NVIDIA/k8s-device-plugin版本,然后运行以下命令。 kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/vX.X.X/deployments/static/nvidia-device-plugin.yml
安装 Kubernetes 附加组件
现在,您已有使用节点运行的 Amazon EKS 集群,那么就可以准备开始安装 Kubernetes 附加组件并将应用程序部署到您的集群。以下文档主题可帮助您扩展集群的此功能。
-
创建集群的 IAM 主体是唯一可以使用
kubectl
或 AWS Management Console 调用 Kubernetes API 服务器的主体。如果您希望其他 IAM 主体拥有访问您的集群的权限,您需要添加它们。有关更多信息,请参阅向 IAM 用户和角色授予对 Kubernetes API 的访问权限 和所需的权限。 -
如果满足以下条件,我们建议阻止 Pod 访问 IMDS:
-
您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。
-
集群中没有任何 Pods 需要出于其它原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。
有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。 -
-
配置 Kubernetes Cluster Autoscaler
以自动调整节点组中的节点数。 -
将示例应用程序部署到您的集群。
-
使用管理集群的重要工具来组织和监控集群资源。