启动自行管理的 Amazon Linux 节点 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

启动自行管理的 Amazon Linux 节点

本主题介绍如何启动向 Amazon EKS 集群注册的 Linux 节点的自动扩缩组。在这些节点加入集群后,您可以向其部署 Kubernetes 应用程序。您可以使用 eksctl 或 Amazon Web Services Management Console 启动自行管理的 Amazon Linux 2 节点。如果您需要在 Amazon Outposts 上启动节点,请参阅 在 Outpost 上启动自行管理的 Amazon Linux 节点

先决条件
  • 现有 Amazon EKS 集群。要部署一个角色,请参阅 创建 Amazon EKS 集群。如果您在启用了 Amazon Outposts、Amazon Wavelength 或 Amazon 本地区域的Amazon Web Services 区域中拥有子网,则这些子网不得在您创建集群时就已传入。

  • 供节点使用的现有 IAM 角色。要创建该文件,请参阅 Amazon EKS 节点 IAM 角色。如果此角色没有 VPC CNI 的任一策略,则需要为 VPC CNI Pod 使用随后的单独角色。

  • (可选,但建议设置)Amazon VPC CNI plugin for Kubernetes 附加组件已配置自己的 IAM 角色,并附加了必要的 IAM policy。有关更多信息,请参阅配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户

  • 熟悉 选择 Amazon EC2 实例类型 中所列出的注意事项。根据您选择的实例类型,您的集群和 VPC 可能还有其他先决条件。

eksctl
先决条件

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

要使用 eksctl 启动自行管理的 Linux 节点
  1. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM policy 附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes aws-node 服务账户关联的 IAM 角色。有关更多信息,请参阅配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户

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

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

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

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

    重要

    如果要将节点组部署到 Amazon 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 需要出于其他原因(例如检索当前 Amazon Web Services 区域)访问 Amazon EC2 实例元数据服务(IMDS)。

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

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

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

  3. 打开 Amazon 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(下一步):

    • 堆栈名称:为 Amazon CloudFormation 堆栈选择堆栈名称。例如,您可以将其命名为 my-cluster-nodes。名称只能包含字母数字字符(区分大小写)和连字符。该名称必须以字母字符开头,且不得超过 100 个字符。

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

    • ClusterControlPlaneSecurityGroup:从您在创建 VPC 时生成的 Amazon 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 版本。

      要使用 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 2。您可以在 Amazon Linux 安全中心跟踪 Amazon Linux 2 的安全和隐私事件,或订阅关联的 RSS 源。安全和隐私事件包括问题的概述、受影响的程序包以及如何更新实例以解决问题。

    • NodeImageId:(可选)如果您使用自定义 AMI(而不是 Amazon EKS 优化版 AMI),则输入 Amazon Web Services 区域的节点 AMI ID。如果您在此处指定值,它会覆盖 NodeImageIdSSMParam 字段中的任意值。

    • NodeVolumeSize:指定您的节点的根卷大小(以 GiB 为单位)。

    • NodeVolumeType:指定您的节点的根卷类型。

    • KeyName:输入 Amazon EC2 SSH 密钥对的名称,您可使用该密钥对来在节点启动后使用 SSH 连接到这些节点。如果还没有 Amazon EC2 密钥对,可以在 Amazon Web Services Management Console 中创建一个。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的 Amazon EC2 密钥对

      注意

      如果此处不提供密钥对,Amazon CloudFormation 堆栈创建将失败。

    • BootstrapArguments:指定要传递给节点引导脚本的任何可选参数,如额外的 kubelet 实际参数。有关更多信息,请查看 GitHub 上的引导脚本使用信息

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

    • DisableIMDSv1:预设情况下,每个节点支持实例元数据服务版本 1 (IMDSv1) 和 IMDSv2。您可以禁用 IMDSv1。要防止节点组中的未来节点和 Pods 使用 MDSv1,请将 DisableIMDSv1 设置为 true(真)。有关 IMDS 的更多信息,请参阅配置实例元数据服务。有关限制在节点上访问的更多信息,请参阅限制对分配给工作节点的实例配置文件的访问

    • VpcId:输入您创建的 VPC 的 ID。

    • Subnets(子网):选择您为 VPC 创建的子网。如果您使用 为 Amazon EKS 集群创建 VPC 中描述的步骤创建了 VPC,则在 VPC 中仅指定私有子网以供您的节点启动到其中。您可以通过从集群的 Networking(联网)选项卡中打开每个子网链接来查看哪些子网是私有的。

      重要
      • 如果其中的任何子网是公有子网,则其必须启用自动公有 IP 地址分配设置。如果没有为该公有子网启用该设置,则您部署到该公有子网的任何节点都不会分配到公有 IP 地址,也无法与集群或其他 Amazon 服务进行通信。如果子网是在 2020 年 3 月 26 日之前使用任一 Amazon EKS Amazon CloudFormation VPC 模板部署的,或者是使用 eksctl 部署的,则会为这些公有子网禁用自动公有 IP 地址分配。有关如何为子网启用公有 IP 地址分配的信息,请参阅修改子网的公有 IPv4 寻址属性。如果节点部署到私有子网,则可以通过 NAT 网关与集群和其他 Amazon 服务进行通信。

      • 如果子网没有 Internet 访问权限,请确保您了解 私有集群要求 中的注意事项和额外步骤。

      • 如果您选择 Amazon Outposts、Wavelength 或本地区域子网,则这些子网不得在您创建集群时就已传入。

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

  10. 选择 I acknowledge that Amazon 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.cn-north-1.amazonaws.com.cn/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/nvidia-device-plugin.yml
第 3 步:其他操作
  1. (可选)部署示例应用程序以测试集群和 Linux 节点。

  2. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM policy(如果您拥有 IPv4 集群)或 AmazonEKS_CNI_IPv6_Policy(如果您拥有 IPv6 集群时自行创建)附加到 Amazon EKS 节点 IAM 角色,我们建议将其分配到关联到 Kubernetes aws-node 服务账户的 IAM 角色。有关更多信息,请参阅配置 Amazon VPC CNI plugin for Kubernetes 将 IAM 角色用于服务账户

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

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

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

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