在 Amazon Outpost 上创建 Amazon Linux 节点
本主题介绍如何在向您的 Amazon EKS 集群的 Outpost 上启动 Amazon Linux 节点的自动扩缩组。集群可以位于 Amazon 云上,也可以位于 Outpost 上。
-
一个现有的 Outpost。有关更多信息,请参阅什么是 Amazon Outposts。
-
现有 Amazon EKS 集群。要在 Amazon 云上部署集群,请参阅创建 Amazon EKS 集群。。要在 Outpost 上部署集群,请参阅 在 Amazon Outposts 上创建本地 Amazon EKS 集群以实现高可用性。
-
假设您正在 Amazon 云上的集群中创建节点,并在已启用 Amazon Outposts、Amazon Wavelength 或 Amazon Local Zones 的 Amazon 区域中拥有子网。接下来,当您创建集群时,不得传入这些子网。如果您要在 Outpost 上的集群中创建节点,则在创建集群时必须已传入 Outpost 子网。
-
(建议用于 Amazon 云上的集群)Amazon VPC CNI plugin for Kubernetes 附加组件已配置了自己的 IAM 角色,并附加了必要的 IAM 策略。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。本地集群不支持服务账户的 IAM 角色。
您可以使用 eksctl
或 Amazon Web Services Management Console(带有 Amazon CloudFormation 模板)创建自行管理的 Amazon Linux 节点组。您还可以使用 Terraform
您可以使用本页中描述的下列工具创建本地集群:
eksctl
使用 eksctl
启动自行管理的 Linux 节点
-
在您的设备或 Amazon CloudShell 上安装
0.194.0
版或更高版本的eksctl
命令行工具。要安装或更新eksctl
,请参阅eksctl
文档中的 Installation。 -
如果您的集群位于 Amazon 云上,并且 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes
aws-node
服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。如果您的集群位于 Outpost 上,则必须将该策略附加到您的节点角色。 -
以下命令在现有集群中创建节点组。必须已经使用
eksctl
创建了集群。将al-nodes
替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。将my-cluster
替换为您的集群的名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 Amazon 区域和 Amazon 账户,该名称必须在其内具有唯一性。如果您的集群存在于 Outpost 上,则将id
替换为 Outpost 子网的 ID。如果您的集群存在于 Amazon 云上,则将id
替换为您在创建集群时未指定的子网的 ID。将instance-type
替换为您的 Outpost 支持的实例类型。将其余的example values
替换为您自己的值。预设情况下,将使用与控制面板相同的 Kubernetes 版本创建节点。将
instance-type
替换为您的 Outpost 上可用的实例类型。将
my-key
替换为您的 Amazon EC2 密钥对或公有密钥的名称。此密钥用于在节点启动后通过 SSH 进入节点。如果还没有 Amazon EC2 密钥对,可以在 Amazon Web Services Management Console中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对。使用以下命令创建您的节点组。
eksctl create nodegroup --cluster my-cluster --name al-nodes --node-type instance-type \ --nodes 3 --nodes-min 1 --nodes-max 4 --managed=false --node-volume-type gp2 --subnet-ids subnet-id
如果您的集群部署在 Amazon 云上:
-
您部署的节点组可以将
IPv4
地址分配给来自不同 CIDR 块的 Pods,而非实例的。有关更多信息,请参阅 使用自定义网络在备用子网中部署 pods。 -
您部署的节点组不需要出站互联网访问权限。有关更多信息,请参阅 部署具有有限互联网访问权限的私有集群。
有关所有可用选项和默认设置的完整列表,请参阅
eksctl
文档中的 Amazon Outposts 支持。 -
如果节点无法加入集群,请参阅排查 Amazon EKS 集群和节点问题中的节点未能加入集群和排查 Amazon Outposts 上的本地 Amazon EKS 集群问题中的无法将节点加入集群。
-
示例输出如下。创建节点时会输出几行。输出的最后几行类似于以下示例行。
[✔] created 1 nodegroup(s) in cluster "my-cluster"
-
-
(可选)部署示例应用程序以测试集群和 Linux 节点。
Amazon Web Services Management Console
步骤 1:使用 Amazon Web Services Management Console启动自行管理 Linux 节点
-
下载最新版本的 Amazon CloudFormation 模板。
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
-
选择 Create stack(创建堆栈),然后选择 With new resources (standard)(使用新资源(标准))。
-
对于 Specify template(指定模板),选择 Upload a template file(上传模板文件),然后选择Choose file(选择文件) 。选择您在上一步中下载的
amazon-eks-nodegroup.yaml
文件,然后选择 Next(下一步)。 -
在 Specify stack details(指定堆栈详细信息)页面上,相应填写以下参数,然后选择 Next(下一步):
-
堆栈名称:为 Amazon CloudFormation 堆栈选择堆栈名称。例如,您可以将其命名为
al-nodes
。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 Amazon 区域和 Amazon 账户,该名称必须在其内具有唯一性。 -
ClusterName:输入您的集群的名称。如果此名称与您的集群名称不匹配,则您的节点将无法加入该集群。
-
ClusterControlPlaneSecurityGroup:从您在创建 VPC 时生成的 Amazon CloudFormation 输出中,选择 SecurityGroups 值。
以下步骤显示了检索适用组的一种操作。
-
选择集群的名称。
-
选择 Networking(联网)选项卡。
-
从 ClusterControlPlaneSecurityGroup 下拉列表中选择时使用 Additional security groups(其他安全组)值作为参考。
-
NodeGroupName:输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的自动扩缩节点组。
-
NodeAutoScalingGroupMinSize:输入您的节点 Auto Scaling 组可缩减到的最小节点数。
-
NodeAutoScalingGroupDesiredCapacity:输入创建堆栈时要扩展到的所需节点数目。
-
NodeAutoScalingGroupMaxSize:输入您的节点 Auto Scaling 组可横向扩展到的最大节点数。
-
NodeInstanceType:选择节点的实例类型。如果您的集群在 Amazon 云上运行,则有关更多信息,请参阅选择最优的 Amazon EC2 节点实例类型。如果您的集群在 Outpost 上运行,则您只能选择您的 Outpost 上可用的实例类型。
-
NodeImageIdSSMParam:使用用于某个变量 Kubernetes 版本最近的 Amazon EKS 优化版 AMI 的 Amazon EC2 Systems Manager 参数进行预填充。要使用 Amazon EKS 支持的其它 Kubernetes 次要版本,请将
1.XX
替换为不同的支持版本。我们建议您指定与您的集群相同的 Kubernetes 版本。要使用 Amazon EKS 优化版加速型 AMI,请将
amazon-linux-2
替换为amazon-linux-2-gpu
。要使用 Amazon EKS 优化版 Arm AMI,请将amazon-linux-2
替换为amazon-linux-2-arm64
。注意
Amazon EKS 节点 AMI 基于 Amazon Linux。您可以在 Amazon Linux 安全中心
通过选择所需版本的选项卡来跟踪 Amazon Linux 的安全和隐私事件。您也可以订阅相应的 RSS 源。安全和隐私事件包括问题的概述、受影响的程序包以及如何更新实例以解决问题。 -
NodeImageId:(可选)如果您使用自定义 AMI(而不是 Amazon EKS 优化版 AMI),则输入您 Amazon 区域的节点 AMI ID。如果您在此处指定值,它会覆盖 NodeImageIdSSMParam 字段中的任意值。
-
NodeVolumeSize:指定您的节点的根卷大小(以 GiB 为单位)。
-
NodeVolumeType:指定您的节点的根卷类型。
-
KeyName:输入 Amazon EC2 SSH 密钥对的名称,您可使用该密钥对来在节点启动后使用 SSH 连接到这些节点。如果还没有 Amazon EC2 密钥对,可以在 Amazon Web Services Management Console中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对。
注意
如果此处不提供密钥对,Amazon CloudFormation 堆栈创建将失败。
-
BootstrapArguments:有几个可选参数可以传递给您的节点。有关更多信息,请查看 GitHub 上的引导脚本使用信息
。如果要将节点添加到 Amazon Outposts 上的 Amazon EKS 本地集群(其中 Kubernetes 控制面板实例在 Amazon Outposts 上运行),并且该集群没有传入和传出互联网连接(也称为私有集群),则必须提供以下引导实际参数(以单行形式)。 --b64-cluster-ca ${CLUSTER_CA} --apiserver-endpoint https://${APISERVER_ENDPOINT} --enable-local-outpost true --cluster-id ${CLUSTER_ID}
-
DisableIMDSv1:预设情况下,每个节点支持实例元数据服务版本 1 (IMDSv1) 和 IMDSv2。您可以禁用 IMDSv1。要防止节点组中的未来节点和 Pods 使用 IMDSv1,请将 DisableIMDSv1 设置为 true(真)。有关 IMDS 的更多信息,请参阅配置实例元数据服务。有关限制在节点上访问的更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。 -
VpcId:输入您创建的 VPC 的 ID。选择 VPC 之前,请查看 VPC 要求和注意事项。
-
子网:如果您的集群位于 Outpost 上,则请在您的 VPC 中选择至少一个私有子网。选择子网之前,请查看子网要求和注意事项。您可以通过从集群的 Networking(联网)选项卡中打开每个子网链接来查看哪些子网是私有的。
-
-
在 Configure stack options(配置堆栈选项)页面上选择所需选项,然后选择 Next(下一步)。
-
选择我了解 Amazon CloudFormation 可能会创建 IAM 资源。左侧的复选框,然后选择创建堆栈。
-
完成创建堆栈后,在控制台中选中它,然后选择 Outputs(输出)。
-
记录已创建的节点组的 NodeInstanceRole。您在配置 Amazon EKS 节点时需要此值。
步骤 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 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)。
如果节点无法加入集群,请参阅排查 Amazon EKS 集群和节点问题中的节点未能加入集群和排查 Amazon Outposts 上的本地 Amazon EKS 集群问题中的无法将节点加入集群。
-
安装 Amazon EBS CSI 驱动程序。有关更多信息,请参阅 GitHub 上的安装
。在设置驱动程序权限部分中,确保按照 Using IAM instance profile(使用 IAM 实例配置文件)选项的说明进行操作。您必须使用 gp2
存储类。不支持gp3
存储类。要在您的集群上创建
gp2
存储类,请完成以下步骤。-
运行以下命令以创建
gp2-storage-class.yaml
文件。cat >gp2-storage-class.yaml <<EOF apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: annotations: storageclass.kubernetes.io/is-default-class: "true" name: ebs-sc provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer parameters: type: gp2 encrypted: "true" allowVolumeExpansion: true EOF
-
将清单应用于集群。
kubectl apply -f gp2-storage-class.yaml
-
-
(仅限 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
第 3 步:其它操作
-
(可选)部署示例应用程序以测试集群和 Linux 节点。
-
如果您的集群部署在 Outpost 上,则请跳过此步骤。如果您的集群部署在 Amazon 云上,以下信息是可选的。如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes
aws-node
服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。