在 Amazon Outpost 上创建 Amazon Linux 节点 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在 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 节点

  1. 在您的设备或 Amazon CloudShell 上安装 0.194.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅 eksctl 文档中的 Installation

  2. 如果您的集群位于 Amazon 云上,并且 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes aws-node 服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。如果您的集群位于 Outpost 上,则必须将该策略附加到您的节点角色。

  3. 以下命令在现有集群中创建节点组。必须已经使用 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 云上:

    有关所有可用选项和默认设置的完整列表,请参阅 eksctl 文档中的 Amazon Outposts 支持

  4. (可选)部署示例应用程序以测试集群和 Linux 节点。

Amazon Web Services Management Console

步骤 1:使用 Amazon Web Services Management Console启动自行管理 Linux 节点

  1. 下载最新版本的 Amazon CloudFormation 模板。

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
  2. 打开 Amazon CloudFormation 控制台

  3. 选择 Create stack(创建堆栈),然后选择 With new resources (standard)(使用新资源(标准))

  4. 对于 Specify template(指定模板),选择 Upload a template file(上传模板文件),然后选择Choose file(选择文件) 。选择您在上一步中下载的 amazon-eks-nodegroup.yaml 文件,然后选择 Next(下一步)。

  5. Specify stack details(指定堆栈详细信息)页面上,相应填写以下参数,然后选择 Next(下一步):

    • 堆栈名称:为 Amazon CloudFormation 堆栈选择堆栈名称。例如,您可以将其命名为 al-nodes。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 Amazon 区域和 Amazon 账户,该名称必须在其内具有唯一性。

    • ClusterName:输入您的集群的名称。如果此名称与您的集群名称不匹配,则您的节点将无法加入该集群。

    • ClusterControlPlaneSecurityGroup:从您在创建 VPC 时生成的 Amazon CloudFormation 输出中,选择 SecurityGroups 值。

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

      1. 打开 Amazon EKS console 控制台

      2. 选择集群的名称。

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

      4. 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(联网)选项卡中打开每个子网链接来查看哪些子网是私有的。

  6. Configure stack options(配置堆栈选项)页面上选择所需选项,然后选择 Next(下一步)。

  7. 选择我了解 Amazon CloudFormation 可能会创建 IAM 资源。左侧的复选框,然后选择创建堆栈

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

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

步骤 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 instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes [...]
    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.yaml
    2. 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
    3. 应用配置。此命令可能需要几分钟才能完成。

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

    kubectl get nodes --watch

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

    注意

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

    如果节点无法加入集群,请参阅排查 Amazon EKS 集群和节点问题中的节点未能加入集群排查 Amazon Outposts 上的本地 Amazon EKS 集群问题中的无法将节点加入集群

  5. 安装 Amazon EBS CSI 驱动程序。有关更多信息,请参阅 GitHub 上的安装。在设置驱动程序权限部分中,确保按照 Using IAM instance profile(使用 IAM 实例配置文件)选项的说明进行操作。您必须使用 gp2 存储类。不支持 gp3 存储类。

    要在您的集群上创建 gp2 存储类,请完成以下步骤。

    1. 运行以下命令以创建 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
    2. 将清单应用于集群。

      kubectl apply -f gp2-storage-class.yaml
  6. (仅限 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 步:其它操作

  1. (可选)部署示例应用程序以测试集群和 Linux 节点。

  2. 如果您的集群部署在 Outpost 上,则请跳过此步骤。如果您的集群部署在 Amazon 云上,以下信息是可选的。如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes aws-node 服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA