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

启动自行管理的 Amazon Linux 节点

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

先决条件

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

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

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

eksctl

先决条件

计算机或 Amazon CloudShell 上已安装 0.84.0 版或更高版本的 eksctl 命令行工具。要安装或更新 eksctl,请参阅安装 eksctl

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

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

  2. 以下命令在现有集群中创建节点组。请将每个 example-value 替换为您自己的值。预设情况下,将使用与控制层面相同的 Kubernetes 版本创建节点。

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

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

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

    重要

    如果要将节点组部署到 Amazon Outposts、Amazon Wavelength 或 Amazon Local Zones 子网,还有其他注意事项:

    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 服务账户,以便容器只具有所需的最低权限,并且集群中没有容器因其他原因(如检索当前 Amazon Web Services 区域)而需要访问 Amazon EC2 实例元数据服务 (IMDS),那么我们建议阻止容器对 IMDS 的访问。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问

Amazon Web Services Management Console

步骤 1:使用 Amazon Web Services Management Console 启动自行管理 Linux 节点

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

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

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

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

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

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

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

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

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

      2. 选择集群的名称。

      3. 选择 Configuration 选项卡。

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

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

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

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

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

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

    • NodeInstanceType:选择节点的实例类型。

    • 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),则输入 Amazon Web Services 区域的节点 AMI ID。如果您在此处指定值,它会覆盖 NodeImageIdSSMParam 字段中的任意值。

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

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

      注意

      如果此处不提供密钥对,Amazon 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 的更多信息,请参阅配置实例元数据服务。有关限制在节点上访问的更多信息,请参阅限制对分配给工作节点的实例配置文件的访问.

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

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

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

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

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

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

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

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

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

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

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

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

注意

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

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

    1. 下载配置映射:

      curl -o aws-auth-cm.yaml https://amazon-eks.s3.cn-north-1.amazonaws.com.cn/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 策略(如果您拥有 IPv4 集群)或 AmazonEKS_CNI_IPv6_Policy(如果您拥有 IPv6 集群时自行创建)附加到 Amazon EKS 节点 IAM 角色,我们建议将其分配给关联到 Kubernetes aws-node 服务账户的 IAM 角色。有关更多信息,请参阅 配置 Amazon VPC CNI 插件以将 IAM 角色用于服务账户

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