在 AWS Outpost 上创建 Amazon Linux 节点 - Amazon EKS

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 GitHub 上编辑此页面。您的贡献有助于我们的用户指南为每个人提供更充分的参考。

在 AWS Outpost 上创建 Amazon Linux 节点

本主题介绍如何在向您的 Amazon EKS 集群的 Outpost 上启动 Amazon Linux 节点的自动扩缩组。集群可以位于 AWS Cloud 上,也可以位于 Outpost 上。

先决条件
  • 一个现有的 Outpost。有关更多信息,请参阅什么是 AWS Outposts

  • 现有 Amazon EKS 集群。要在 AWS Cloud 上部署集群,请参阅 创建 Amazon EKS 集群。。要在 Outpost 上部署集群,请参阅 在 AWS Outposts 上创建本地 Amazon EKS 集群以实现高可用性

  • 假设您正在 AWS Cloud 上的集群中创建节点,并在已启用 AWS Outposts、AWS Wavelength 或 AWS Local Zones 的 AWS 区域 中拥有子网。接下来,当您创建集群时,不得传入这些子网。如果您要在 Outpost 上的集群中创建节点,则在创建集群时必须已传入 Outpost 子网。

  • (建议用于 AWS Cloud 上的集群)– Amazon VPC CNI plugin for Kubernetes 附加组件已配置自己的 IAM 角色,并附加了必要的 IAM 策略。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA。本地集群不支持服务账户的 IAM 角色。

您可以使用 eksctl 或 AWS Management Console(带有 AWS CloudFormation 模板)创建自行管理的 Amazon Linux 节点组。您还可以使用 Terraform

eksctl
先决条件

您的设备或 AWS CloudShell 上安装了 0.191.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅 eksctl 文档中的 Installation

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

  2. 以下命令在现有集群中创建节点组。必须已经使用 eksctl 创建了集群。将 al-nodes 替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。将 my-cluster 替换为您的集群名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域 和 AWS 账户,该名称必须在其内具有唯一性。如果您的集群存在于 Outpost 上,请将 id 替换为 Outpost 子网的 ID。如果您的集群存在于 AWS Cloud 上,请将 id 替换为您在创建集群时未指定的子网的 ID。将 instance-type 替换为您的 Outpost 支持的实例类型。将剩余的 example values 替换为您自己的值。预设情况下,将使用与控制面板相同的 Kubernetes 版本创建节点。

    instance-type 替换为您的 Outpost 上可用的实例类型。

    my-key 替换为您的 Amazon EC2 密钥对或公有密钥的名称。此密钥用于在节点启动后通过 SSH 进入节点。如果还没有 Amazon EC2 密钥对,可以在 AWS 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

    如果您的集群部署在 AWS Cloud 上:

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

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

    示例输出如下。创建节点时会输出几行。输出的最后几行类似于以下示例行。

    [✔] created 1 nodegroup(s) in cluster "my-cluster"
  3. (可选)部署示例应用程序以测试集群和 Linux 节点。

AWS Management Console
步骤 1:使用 AWS Management Console 启动自行管理的 Amazon Linux 节点
  1. 下载最新版本的 AWS CloudFormation 模板。

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
  2. 打开 AWS CloudFormation 控制台,地址:https://console.aws.amazon.com/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(下一步):

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

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

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

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

      1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

      2. 选择集群的名称。

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

      4. ClusterControlPlaneSecurityGroup 下拉列表中选择时使用 Additional security groups(其他安全组)值作为参考。

    • NodeGroupName:输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的弹性伸缩节点组。

    • NodeAutoScalingGroupMinSize:输入您的节点 Auto Scaling 组可缩减到的最小节点数。

    • NodeAutoScalingGroupDesiredCapacity:输入创建堆栈时要扩展到的所需节点数目。

    • NodeAutoScalingGroupMaxSize:输入您的节点 Auto Scaling 组可横向扩展到的最大节点数。

    • NodeInstanceType:选择节点的实例类型。如果您的集群在 AWS Cloud 上运行,则有关更多信息,请参阅 选择最优的 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 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:有几个可选参数可以传递给您的节点。有关更多信息,请查看 GitHub 上的引导脚本使用信息。如果要将节点添加到 AWS Outposts 上的 Amazon EKS 本地集群(其中 Kubernetes 控制面板实例在 AWS 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. 选择 I acknowledge that AWS CloudFormation might create IAM resources.(我了解可能会创建 IAM 资源。)左侧的复选框,然后选择 Create stack(创建堆栈)。

  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 集群和节点问题 中的 节点未能加入集群排查 AWS 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 上,则请跳过此步骤。如果您的集群部署在 AWS Cloud 上,以下信息是可选的。如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes aws-node 服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA