启动自行管理的 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.70.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 版本创建节点。

    有关 --node-type 支持的值的完整列表,请参阅 GitHub 上的 amazon-eks-nodegroup.yaml。在为 --node-type 选择一个值之前,请查看 选择 Amazon EC2 实例类型

    <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 文档中的从配置文件创建节点组Config 文件架构

    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>

    要部署一个节点组,使之允许您的实例为 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

步骤 1:使用 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 集群时使用的名称。此名称必须与集群名称完全匹配,否则您的节点无法加入该集群。

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

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

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

      2. 选择集群的名称。

      3. 选择 Configuration 选项卡。

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

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

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

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

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

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

    • NodeInstanceType:选择节点的实例类型。您也可以在 GitHub 上的 amazon-eks-nodegroup.yaml 文件中查看列表。在选择实例类型之前,请查看 选择 Amazon EC2 实例类型

    • 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 节点时需要此值。

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

注意

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

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

    1. 下载配置映射:

      curl -o aws-auth-cm.yaml https://amazon-eks.s3.us-west-2.amazonaws.com/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.9.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 实例配置文件凭证的访问