帮助改进此页面
想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。
创建自行管理的 Amazon Linux 节点
本主题介绍如何启动向 Amazon EKS 集群注册的 Linux 节点的自动扩缩组。在这些节点加入集群后,您可以向其部署 Kubernetes 应用程序。您可以使用 eksctl
或 AWS Management Console 启动自行管理的 Amazon Linux 节点。如果您需要在 AWS Outposts 上启动节点,请参阅 在 AWS Outpost 上创建 Amazon Linux 节点。
先决条件
-
现有 Amazon EKS 集群。要部署一个角色,请参阅 创建 Amazon EKS 集群。。如果您在启用了 AWS Outposts、AWS Wavelength 或 AWS 本地区域的AWS 区域中拥有子网,则这些子网不得在您创建集群时就已传入。
-
供节点使用的现有 IAM 角色。要创建该文件,请参阅 Amazon EKS 节点 IAM 角色。如果此角色没有 VPC CNI 的任一策略,则需要为 VPC CNI Pod 使用随后的单独角色。
-
(可选,但建议设置)Amazon VPC CNI plugin for Kubernetes 附加组件已配置自己的 IAM 角色,并附加了必要的 IAM 策略。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。
-
熟悉 选择最优的 Amazon EC2 节点实例类型 中所列出的注意事项。根据您选择的实例类型,您的集群和 VPC 可能还有其他先决条件。
- eksctl
-
注意
eksctl
目前不支持 Amazon Linux 2023。先决条件
您的设备或 AWS CloudShell 上安装了
0.191.0
版或更高版本的eksctl
命令行工具。要安装或更新eksctl
,请参阅eksctl
文档中的 Installation。 要使用
eksctl
启动自行管理的 Linux 节点-
(可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes
aws-node
服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。 -
以下命令在现有集群中创建节点组。将
替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。将al-nodes
替换为您的集群名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域 和 AWS 账户,该名称必须在其内具有唯一性。将剩余的my-cluster
替换为您自己的值。预设情况下,将使用与控制面板相同的 Kubernetes 版本创建节点。example value
在为
--node-type
选择一个值之前,请查看 选择最优的 Amazon EC2 节点实例类型。将
替换为您的 Amazon EC2 密钥对或公有密钥的名称。此密钥用于在节点启动后通过 SSH 进入节点。如果还没有 Amazon EC2 密钥对,可以在 AWS Management Console 中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对。my-key
使用以下命令创建您的节点组。
重要
如果要将节点组部署到 AWS Outposts、Wavelength 或本地区域子网,还有其他注意事项:
-
创建集群时,不得传入子网。
-
您必须使用配置文件创建节点组,指定子网和
volumeType
。有关更多信息,请参阅: gp2 eksctl
文档中的从配置文件创建节点组和 Config 文件架构 。
eksctl create nodegroup \ --cluster
my-cluster
\ --nameal-nodes
\ --node-typet3.medium
\ --nodes3
\ --nodes-min1
\ --nodes-max4
\ --ssh-access \ --managed=false \ --ssh-public-keymy-key
部署符合以下条件的节点组:
-
可以将明显高出默认配置数量的 IP 地址分配给 Pods,请参阅 为带前缀的 Amazon EKS 节点分配更多 IP 地址。
-
可以将
IPv4
地址分配给来自与实例不同的 CIDR 块的 Pods,请参阅 使用自定义网络在备用子网中部署 pods。 -
可以将
IPv6
地址分配给 Pods 和服务,请参阅 将 IPv6 地址分配给您的集群、pods 和服务。 -
使用
containerd
运行时,您必须使用config
文件部署节点组。有关更多信息,请参阅 测试将 Amazon Linux 2 从 Docker 迁移到 containerd。 -
没有出站互联网访问权限,请参阅 部署具有有限互联网访问权限的私有集群。
要查看所有可用选项和默认设置的完整列表,请输入以下命令。
eksctl create nodegroup --help
如果节点无法加入集群,则请参阅故障排除一章中的 节点未能加入集群。
示例输出如下。创建节点时会输出几行。输出的最后几行类似于以下示例行。
[✔] created 1 nodegroup(s) in cluster "
my-cluster
" -
-
(可选)部署示例应用程序以测试集群和 Linux 节点。
如果满足以下条件,我们建议阻止 Pod 访问 IMDS:
您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。
集群中没有任何 Pods 需要出于其他原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。
有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。
-
- AWS Management Console
-
步骤 1:要使用 AWS Management Console 启动自行管理 Linux 节点
-
下载最新版本的 AWS CloudFormation 模板。
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
-
等待集群状态显示为
ACTIVE
。如果在集群处于活动状态之前启动节点,则节点将无法向集群注册,您必须重新启动节点。 -
打开 AWS CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation
。 -
选择 Create stack(创建堆栈),然后选择 With new resources (standard)(使用新资源(标准))。
-
对于 Specify template(指定模板),选择 Upload a template file(上传模板文件),然后选择Choose file(选择文件) 。
-
选择您下载的
文件。amazon-eks-nodegroup.yaml
-
选择下一步。
-
在 Specify stack details(指定堆栈详细信息)页面上,相应填写以下参数,然后选择 Next(下一步):
-
堆栈名称:为 AWS CloudFormation 堆栈选择堆栈名称。例如,您可以将其命名为
。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域 和 AWS 账户,该名称必须在其内具有唯一性。my-cluster-nodes
-
ClusterName:输入您在创建 Amazon EKS 集群时使用的名称。此名称必须与集群名称完全匹配,否则您的节点无法加入该集群。
-
ClusterControlPlaneSecurityGroup:从您在创建 VPC 时生成的 AWS CloudFormation 输出中,选择 SecurityGroups 值。
以下步骤显示了检索适用组的一种操作。
从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters
。 -
选择集群的名称。
-
选择 Networking(联网)选项卡。
-
从 ClusterControlPlaneSecurityGroup 下拉列表中选择时使用 Additional security groups(其他安全组)值作为参考。
-
NodeGroupName:输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的弹性伸缩节点组。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。
-
NodeAutoScalingGroupMinSize:输入您的节点 Auto Scaling 组可缩减到的最小节点数。
-
NodeAutoScalingGroupDesiredCapacity:输入创建堆栈时要扩展到的所需节点数目。
-
NodeAutoScalingGroupMaxSize:输入您的节点 Auto Scaling 组可横向扩展到的最大节点数。
-
NodeInstanceType:选择节点的实例类型。有关更多信息,请参阅 选择最优的 Amazon EC2 节点实例类型。
-
NodeImageIdSSMParam:使用用于某个变量 Kubernetes 版本最近的 Amazon EKS 优化版 AMI 的 Amazon EC2 Systems Manager 参数进行预填充。要使用 Amazon EKS 支持的其他 Kubernetes 次要版本,请将
替换为不同的支持版本。我们建议您指定与您的集群相同的 Kubernetes 版本。1.XX
您也可以使用其他 AMI 类型替换
。有关更多信息,请参阅 检索建议的 Amazon Linux AMI ID。amazon-linux-2
注意
Amazon EKS 节点 AMI 基于 Amazon Linux。您可以在 Amazon Linux 安全中心
跟踪 Amazon Linux 2 的安全和隐私事件,或订阅关联的 RSS 源 。安全和隐私事件包括问题的概述、受影响的程序包以及如何更新实例以解决问题。 -
NodeImageId:(可选)如果您使用自定义 AMI(而不是 Amazon EKS 优化版 AMI),则输入 AWS 区域的节点 AMI ID。如果您在此处指定值,它会覆盖 NodeImageIdSSMParam 字段中的任意值。
-
NodeVolumeSize:指定您的节点的根卷大小(以 GiB 为单位)。
-
NodeVolumeType:指定您的节点的根卷类型。
-
KeyName:输入 Amazon EC2 SSH 密钥对的名称,您可使用该密钥对来在节点启动后使用 SSH 连接到这些节点。如果还没有 Amazon EC2 密钥对,可以在 AWS Management Console 中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对。
注意
如果此处不提供密钥对,AWS CloudFormation 堆栈创建将失败。
-
BootstrapArguments:指定要传递给节点引导脚本的任何可选参数,如额外的
kubelet
实际参数。有关更多信息,请查看 GitHub 上的引导脚本使用信息。 部署符合以下条件的节点组:
-
可以将明显高出默认配置数量的 IP 地址分配给 Pods,请参阅 为带前缀的 Amazon EKS 节点分配更多 IP 地址。
-
可以将
IPv4
地址分配给来自与实例不同的 CIDR 块的 Pods,请参阅 使用自定义网络在备用子网中部署 pods。 -
可以将
IPv6
地址分配给 Pods 和服务,请参阅 将 IPv6 地址分配给您的集群、pods 和服务。 -
使用
containerd
运行时,您必须使用config
文件部署节点组。有关更多信息,请参阅 测试将 Amazon Linux 2 从 Docker 迁移到 containerd。 -
没有出站互联网访问权限,请参阅 部署具有有限互联网访问权限的私有集群。
-
-
DisableIMDSv1:预设情况下,每个节点支持实例元数据服务版本 1 (IMDSv1) 和 IMDSv2。您可以禁用 IMDSv1。要防止节点组中的未来节点和 Pods 使用 MDSv1,请将 DisableIMDSv1 设置为 true(真)。有关 IMDS 的更多信息,请参阅配置实例元数据服务。有关限制在节点上访问的更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。 -
VpcId:输入您创建的 VPC 的 ID。
-
Subnets(子网):选择您为 VPC 创建的子网。如果您使用 为您的 Amazon EKS 集群创建 Amazon VPC 中描述的步骤创建了 VPC,则在 VPC 中仅指定私有子网以供您的节点启动到其中。您可以通过从集群的 Networking(联网)选项卡中打开每个子网链接来查看哪些子网是私有的。
重要
-
如果其中的任何子网是公有子网,则其必须启用自动公有 IP 地址分配设置。如果没有为该公有子网启用该设置,则您部署到该公有子网的任何节点都不会分配到公有 IP 地址,也无法与集群或其他 AWS 服务进行通信。如果子网是在 2020 年 3 月 26 日之前使用任一 Amazon EKS AWS CloudFormation VPC 模板部署的,或者是使用
eksctl
部署的,则会为这些公有子网禁用自动公有 IP 地址分配。有关如何为子网启用公有 IP 地址分配的信息,请参阅修改子网的公有IPv4
寻址属性。如果节点部署到私有子网,则可以通过 NAT 网关与集群和其他 AWS 服务进行通信。 -
如果子网没有 Internet 访问权限,请确保您了解 部署具有有限互联网访问权限的私有集群 中的注意事项和额外步骤。
-
如果您选择 AWS Outposts、Wavelength 或本地区域子网,则这些子网不得在您创建集群时就已传入。
-
-
-
在 Configure stack options(配置堆栈选项)页面上选择所需选项,然后选择 Next(下一步)。
-
选择 I acknowledge that AWS CloudFormation might create IAM resources.(我了解可能会创建 IAM 资源。)左侧的复选框,然后选择 Create stack(创建堆栈)。
-
完成创建堆栈后,在控制台中选中它,然后选择 Outputs(输出)。
-
记录已创建的节点组的 NodeInstanceRole。您在配置 Amazon EKS 节点时需要此值。
步骤 2:使节点能够加入集群
注意
如果您在没有出站 Internet 访问的情况下在私有 VPC 内启动了节点,请确保使节点能够从 VPC 中加入您的集群。
-
检查您是否已经应用拥有
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 instance role (not instance profile)>
username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes -
保存文件并退出文本编辑器。
-
-
如果您收到错误提示 "
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.yaml
-
在
文件中,将aws-auth-cm.yaml
rolearn
值设置为您在上一个步骤中记录的 NodeInstanceRole 值。您可以使用文本编辑器或者通过替换
和运行以下命令来执行此操作:my-node-instance-role
sed -i.bak -e 's|<ARN of instance role (not instance profile)>|
my-node-instance-role
|' aws-auth-cm.yaml -
应用配置。此命令可能需要几分钟才能完成。
kubectl apply -f aws-auth-cm.yaml
-
-
查看节点的状态并等待它们达到
Ready
状态。kubectl get nodes --watch
输入
Ctrl
+C
以返回到 Shell 提示符。注意
如果您收到任何授权或资源类型错误,请参阅故障排除主题中的 未经授权或访问被拒绝 (kubectl)。
如果节点无法加入集群,则请参阅故障排除一章中的 节点未能加入集群。
-
(仅限 GPU 节点)如果选择 GPU 实例类型和 Amazon EKS 优化加速型 AMI,则必须在集群上将 适用于 Kubernetes 的 NVIDIA 设备插件
用作 DaemonSet。将
替换为您需要的 NVIDIA/k8s-device-pluginvX.X.X
版本,然后运行以下命令。 kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/
vX.X.X
/deployments/static/nvidia-device-plugin.yml
第 3 步:其他操作
-
(可选)部署示例应用程序以测试集群和 Linux 节点。
-
(可选)如果 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 需要出于其他原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。
有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。
-