创建自行管理的 Amazon Linux 节点 - Amazon EKS

帮助改进此页面

想为本用户指南做出贡献? 滚动到页面底部,然后选择在 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 节点
  1. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes aws-node 服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA

  2. 以下命令在现有集群中创建节点组。将 al-nodes 替换为您的节点组名称。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。将 my-cluster 替换为您的集群名称。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母数字字符开头,且不得超过 100 个字符。对于您在其中创建集群的 AWS 区域 和 AWS 账户,该名称必须在其内具有唯一性。将剩余的 example value 替换为您自己的值。预设情况下,将使用与控制面板相同的 Kubernetes 版本创建节点。

    在为 --node-type 选择一个值之前,请查看 选择最优的 Amazon EC2 节点实例类型

    my-key 替换为您的 Amazon EC2 密钥对或公有密钥的名称。此密钥用于在节点启动后通过 SSH 进入节点。如果还没有 Amazon EC2 密钥对,可以在 AWS Management Console 中创建一个。有关更多信息,请参阅《Amazon EC2 用户指南》中的 Amazon EC2 密钥对

    使用以下命令创建您的节点组。

    重要

    如果要将节点组部署到 AWS Outposts、Wavelength 或本地区域子网,还有其他注意事项:

    eksctl create nodegroup \ --cluster my-cluster \ --name al-nodes \ --node-type t3.medium \ --nodes 3 \ --nodes-min 1 \ --nodes-max 4 \ --ssh-access \ --managed=false \ --ssh-public-key my-key

    部署符合以下条件的节点组:

    要查看所有可用选项和默认设置的完整列表,请输入以下命令。

    eksctl create nodegroup --help

    如果节点无法加入集群,则请参阅故障排除一章中的 节点未能加入集群

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

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

  4. 如果满足以下条件,我们建议阻止 Pod 访问 IMDS:

    • 您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。

    • 集群中没有任何 Pods 需要出于其他原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。

    有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问

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

    curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
  2. 等待集群状态显示为 ACTIVE。如果在集群处于活动状态之前启动节点,则节点将无法向集群注册,您必须重新启动节点。

  3. 打开 AWS CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

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

  5. 对于 Specify template(指定模板),选择 Upload a template file(上传模板文件),然后选择Choose file(选择文件)

  6. 选择您下载的 amazon-eks-nodegroup.yaml 文件。

  7. 选择下一步

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

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

    • ClusterName:输入您在创建 Amazon EKS 集群时使用的名称。此名称必须与集群名称完全匹配,否则您的节点无法加入该集群。

    • 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:输入节点组的名称。稍后您可以使用此名称来标识为您的节点创建的弹性伸缩节点组。节点组名称的长度不能超过 63 个字符。它必须以字母或数字开头,但也可以包括其余字符的连字符和下划线。

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

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

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

    • NodeInstanceType:选择节点的实例类型。有关更多信息,请参阅 选择最优的 Amazon EC2 节点实例类型

    • NodeImageIdSSMParam:使用用于某个变量 Kubernetes 版本最近的 Amazon EKS 优化版 AMI 的 Amazon EC2 Systems Manager 参数进行预填充。要使用 Amazon EKS 支持的其他 Kubernetes 次要版本,请将 1.XX 替换为不同的支持版本。我们建议您指定与您的集群相同的 Kubernetes 版本。

      您也可以使用其他 AMI 类型替换 amazon-linux-2。有关更多信息,请参阅 检索建议的 Amazon Linux AMI ID

      注意

      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 上的引导脚本使用信息

      部署符合以下条件的节点组:

    • 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 或本地区域子网,则这些子网不得在您创建集群时就已传入。

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

  10. 选择 I acknowledge that AWS CloudFormation might create IAM resources.(我了解可能会创建 IAM 资源。)左侧的复选框,然后选择 Create stack(创建堆栈)。

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

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

步骤 2:使节点能够加入集群
注意

如果您在没有出站 Internet 访问的情况下在私有 VPC 内启动了节点,请确保使节点能够从 VPC 中加入您的集群。

  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)

    如果节点无法加入集群,则请参阅故障排除一章中的 节点未能加入集群

  5. (仅限 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. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略(如果您拥有 IPv4 集群)或 AmazonEKS_CNI_IPv6_Policy(如果您拥有 IPv6 集群时自行创建)附加到 Amazon EKS 节点 IAM 角色,我们建议将其分配到关联到 Kubernetes aws-node 服务账户的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以使用 IRSA

  3. 如果满足以下条件,我们建议阻止 Pod 访问 IMDS:

    • 您计划将 IAM 角色分配到所有 Kubernetes 服务账户,以便 Pods 只具有所需的最低权限。

    • 集群中没有任何 Pods 需要出于其他原因(例如检索当前 AWS 区域)访问 Amazon EC2 实例元数据服务(IMDS)。

    有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问