启动自行管理的 Amazon Linux 节点 - Amazon EKS

启动自行管理的 Amazon Linux 节点

本主题帮助您启动向 Amazon EKS 集群注册的 Linux 节点的 Auto Scaling 组。在这些节点加入集群后,您可以向其部署 Kubernetes 应用程序。您可以使用 eksctl 或 AWS Management Console 启动自行管理的 Amazon Linux 2 节点。

eksctl

Prerequisites

  • 使用 eksctl 创建的一个现有 Amazon EKS 集群。

  • eksctl 版本 0.58.0 或更高版本。有关安装或升级 eksctl 的更多信息,请参阅安装或升级 eksctl

使用 eksctl 启动自行管理的 Linux 节点

  1. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes aws-node 服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以将 IAM 角色用于服务账户

  2. 以下命令在现有集群中创建节点组。将 <example values>(包括 <>)替换为您自己的值。预设情况下,将使用与控制层面相同的 Kubernetes 版本创建节点。

    如果您想在 Amazon EC2 Arm 实例上部署,请将 t3.medium 替换为 Arm 实例类型。如果指定了 Arm Amazon EC2 实例类型,请在部署前查看 Amazon EKS 优化 Arm Amazon Linux AMI 中的注意事项。有关 --node-type 支持的值的完整列表,请参阅 GitHub 上的 amazon-eks-nodegroup.yaml

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

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

    重要

    如果您想将节点组部署到 AWS Outposts、AWS Wavelength 或 AWS Local Zones 子网中,AWS Outposts、AWS Wavelength 或 AWS Local Zones 子网不得在您创建集群时就已传入。您必须使用配置文件创建节点组,指定 AWS Outposts、AWS Wavelength 或 AWS Local Zones 子网。有关更多信息,请参阅 eksctl 文档中的从配置文件创建节点组配置文件架构

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

    要部署一个节点组,使之允许您的实例为 Pod 分配更多 IP 地址,将 IP 地址分配给与实例不同的 CIDR 块中的 Pod,并启用 containerd 运行时,您必须使用配置文件部署节点组。有关更多信息,请参阅 提高 Amazon EC2 节点的可用 IP 地址数量CNI 自定义网络启用 containerd 运行时引导标记。要在没有出站 Internet 访问的情况下部署私有节点组,请参阅私有集群。要查看所有可用选项和默认设置的完整列表,请输入以下命令。

    eksctl create nodegroup --help

    如果节点无法加入集群,请参阅《故障排除指南》中的 节点未能加入集群

    输出:

    创建节点时,您将看到几行输出。输出的最后几行类似于以下示例行。

    [✔] created 1 nodegroup(s) in cluster "<my-cluster>"
  3. (可选)如果您计划将 IAM 角色分配给您的所有 Kubernetes 服务账户,以便 Pod 只具有所需的最低权限,并且集群中没有 Pod 因其他原因(如检索当前区域)而需要访问 Amazon EC2 实例元数据服务 (IMDS),那么我们建议阻止 Pod 对 IMDS 的访问。有关更多信息,请参阅 服务账户的 IAM 角色限制对 IMDS 和 Amazon EC2 实例配置文件凭证的访问

AWS Management Console

Prerequisites

使用AWS Management Console启动自行管理 Linux 节点

  1. 等待集群状态显示为 ACTIVE。如果在集群处于活动状态之前启动节点,则节点将无法向集群注册,您必须重新启动节点。

  2. 下载最新版本的 AWS CloudFormation 模板。

    curl -o amazon-eks-nodegroup.yaml https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/amazon-eks-nodegroup.yaml
  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(选择文件) 。选择您在第 2 步中下载的 amazon-eks-nodegroup.yaml 文件,然后选择 Next(下一步)

  6. Specify stack details (指定堆栈详细信息) 页面上,相应填写以下参数:

    • 堆栈名称:为 AWS CloudFormation 堆栈选择堆栈名称。例如,您可以将其称为 cluster-name-worker-nodes

    • ClusterName:输入您在创建 Amazon EKS 集群时使用的名称。

      重要

      此名称必须与您在 第 1 步:创建 Amazon EKS 集群 中使用的名称完全匹配;否则,您的节点无法加入该集群。

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

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

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

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

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

    • NodeInstanceType:选择节点的实例类型。您也可以在 GitHub 上的 amazon-eks-nodegroup.yaml 文件中查看列表。在选择 Arm 实例类型之前,请确保查看 Amazon EKS 优化 Arm Amazon Linux AMI 中的注意事项。

      注意

      最新版本的 Kubernetes 的 Amazon VPC CNI 插件支持的实例类型在此处显示。您可能需要更新 CNI 版本来利用最新的受支持的实例类型。有关更多信息,请参阅 手动更新 Amazon VPC CNI 附加组件

      重要

      并非所有实例类型在所有区域中都可用。

    • NodeImageIdSSMParam:使用用于某个 Kubernetes 版本最近 Amazon EKS 优化 Amazon Linux AMI ID 的 Amazon EC2 Systems Manager 参数进行预填充。如果您想使用 Amazon EKS 支持的不同的 Kubernetes 次要版本,则可以将 1.x 替换为不同的支持版本。我们建议您指定与您的集群相同的 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),则输入您区域的节点 AMI ID。如果您在此处指定值,它会覆盖 NodeImageIdSSMParam 字段中的任意值。

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

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

      注意

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

    • BootstrapArguments:指定要传递给节点引导脚本的任何可选参数,如额外的 kubelet 参数。有关更多信息,请查看 GitHub 上的引导脚本使用信息。要部署这样一个节点组:允许您的实例为 Pod 分配更多 IP 地址,将 IP 地址分配给其他 CIDR 块(而不是实例的 CIDR 块)中的 Pod,启用 containerd 运行时,或部署无出站 Internet 访问的私有集群,请参阅 提高 Amazon EC2 节点的可用 IP 地址数量CNI 自定义网络启用 containerd 运行时引导标记私有集群 了解要在这里添加的参数。

    • DisableIMDSv1:预设情况下,每个节点都支持实例元数据服务版本 1 (IMDSv1) 和 IMDSv2,但您可以禁用 IMDSv1。如果您不希望节点组中的任何节点或节点组中节点上计划的任何 Pod 使用 IMDSv1,请选择 true。有关 IMDS 的更多信息,请参阅配置实例元数据服务。有关在您的节点上限制对它的访问的更多信息,请参阅 限制对 IMDS 和 Amazon EC2 实例配置文件凭证的访问

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

    • Subnets:选择您为 VPC 创建的子网。如果您使用 为 Amazon EKS 集群创建 VPC 中描述的步骤创建了 VPC,则在 VPC 中仅指定私有子网以供您的节点启动到其中。

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

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

      • 如果要在 1.18 或更早版本的集群中部署节点,请确保您选择的子网标记了集群名称。将 my-cluster(包括 <>)替换为您的集群的名称,然后运行以下命令以查看当前使用您的集群名称标记的子网的列表。

        aws ec2 describe-subnets --filters Name=tag:kubernetes.io/cluster/<my-cluster>,Values=shared | grep SubnetId

        如果要选择的子网未在上一个命令的输出中返回,则必须手动将标签添加到子网。有关更多信息,请参阅 为子网添加标签

      • 如果您选择 AWS Outposts、AWS Wavelength 或 AWS Local Zones 子网,则这些子网不应已在创建集群时传入。

  7. 确认堆栈可创建 IAM 资源,然后选择 Create stack(创建堆栈)

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

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

使节点能够加入集群

注意

如果您在没有出站 Internet 访问的私有 VPC 内启动了节点,则您必须使节点能够从 VPC 中加入您的集群。

  1. 下载、编辑和应用 AWS IAM 身份验证器配置映射。

    1. 下载配置映射:

      curl -o aws-auth-cm.yaml https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. 使用文本编辑器打开该文件。将 <ARN of instance role (not instance profile)> 代码段替换为您在上一程序中记录的 NodeInstanceRole 值,然后保存该文件。

      重要

      请勿修改此文件中的任何其他行。

      apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
    3. 应用配置。此命令可能需要几分钟才能完成。

      kubectl apply -f aws-auth-cm.yaml
      注意

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

      如果节点无法加入集群,请参阅《故障排除指南》中的 节点未能加入集群

  2. 查看节点的状态并等待它们达到 Ready 状态。

    kubectl get nodes --watch
  3. (仅限 GPU 工作线程)如果选择 GPU 实例类型和经 Amazon EKS 优化的加速 AMI,则必须使用以下命令在集群上将适用于 Kubernetes 的 NVIDIA 设备插件用作 DaemonSet。

    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.8.0/nvidia-device-plugin.yml
  4. (可选)部署示例应用程序以测试集群和 Linux 节点。

  5. (可选)如果 AmazonEKS_CNI_Policy 托管 IAM 策略附加到您的 Amazon EKS 节点 IAM 角色,我们建议将其分配给您与 Kubernetes aws-node 服务账户关联的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以将 IAM 角色用于服务账户

  6. (可选)如果您计划将 IAM 角色分配给您的所有 Kubernetes 服务账户,以便 Pod 只具有所需的最低权限,并且集群中没有 Pod 因其他原因(如检索当前区域)而需要访问 Amazon EC2 实例元数据服务 (IMDS),那么我们建议阻止 Pod 对 IMDS 的访问。有关更多信息,请参阅 服务账户的 IAM 角色限制对 IMDS 和 Amazon EC2 实例配置文件凭证的访问