使用节点组 - Eksctl 用户指南

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用节点组

创建节点组

除了与集群一起创建的初始节点组外,您还可以添加一个或多个节点组。

要创建其他节点组,请使用:

eksctl create nodegroup --cluster=<clusterName> [--name=<nodegroupName>]
注意

--version托管节点组不支持标志。它总是从控制平面继承版本。

默认情况下,新的非托管节点组从控制平面继承版本 (--version=auto),但您可以指定其他版本,也可以使用--version=latest强制使用最新版本。

此外,你可以使用与以下内容相同的配置文件eksctl create cluster

eksctl create nodegroup --config-file=<path>

从配置文件创建节点组

也可以通过集群定义或配置文件创建节点组。给出以下示例配置文件和一个名为dev-cluster

# dev-cluster.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: dev-cluster region: eu-north-1 managedNodeGroups: - name: ng-1-workers labels: { role: workers } instanceType: m5.xlarge desiredCapacity: 10 volumeSize: 80 privateNetworking: true - name: ng-2-builders labels: { role: builders } instanceType: m5.2xlarge desiredCapacity: 2 volumeSize: 100 privateNetworking: true

ng-2-builders可以使用以下命令创建节点组ng-1-workers和:

eksctl create nodegroup --config-file=dev-cluster.yaml

负载均衡

如果您已经准备好将现有的经典负载均衡器 or/and 目标组附加到节点组,则可以在配置文件中指定这些目标组。创建节点组时,经典负载均衡器 or/and 目标组会自动与 ASG 关联。只有通过该字段定义的自我管理节点组才支持此功能。nodeGroups

# dev-cluster-with-lb.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: dev-cluster region: eu-north-1 nodeGroups: - name: ng-1-web labels: { role: web } instanceType: m5.xlarge desiredCapacity: 10 privateNetworking: true classicLoadBalancerNames: - dev-clb-1 - dev-clb-2 asgMetricsCollection: - granularity: 1Minute metrics: - GroupMinSize - GroupMaxSize - GroupDesiredCapacity - GroupInServiceInstances - GroupPendingInstances - GroupStandbyInstances - GroupTerminatingInstances - GroupTotalInstances - name: ng-2-api labels: { role: api } instanceType: m5.2xlarge desiredCapacity: 2 privateNetworking: true targetGroupARNs: - arn:aws:elasticloadbalancing:eu-north-1:01234567890:targetgroup/dev-target-group-1/abcdef0123456789

配置文件中的节点组选择

要仅对配置文件中指定的节点组的子集执行createdelete操作,有两个接受全局列表的 CLI 标志–0—–1—例如:

eksctl create nodegroup --config-file=<path> --include='ng-prod-*-??' --exclude='ng-test-1-ml-a,ng-test-2-?'

使用上面的示例配置文件,可以使用以下命令创建除工作节点组之外的所有工作节点组:

eksctl create nodegroup --config-file=dev-cluster.yaml --exclude=ng-1-workers

或者可以通过以下方式删除构建器节点组:

eksctl delete nodegroup --config-file=dev-cluster.yaml --include=ng-2-builders --approve

在这种情况下,我们还需要提供--approve命令来实际删除节点组。

包含和排除规则

  • 如果未指定--include--exclude,则包含所有内容

  • 如果仅指定,--include则仅包含与这些全局匹配的节点组

  • 如果只指定--exclude了,则包括所有与这些全局不匹配的节点组

  • 如果同时指定了两者,则--exclude规则优先于--include(即两个组中与规则匹配的节点组将被排除在外)

列出节点组

要列出有关一个节点组或所有节点组的详细信息,请使用:

eksctl get nodegroup --cluster=<clusterName> [--name=<nodegroupName>]

要以 YAML 或 JSON 格式列出一个或多个节点组,这些节点组输出比默认日志表更多的信息,请使用:

# YAML format eksctl get nodegroup --cluster=<clusterName> [--name=<nodegroupName>] --output=yaml # JSON format eksctl get nodegroup --cluster=<clusterName> [--name=<nodegroupName>] --output=json

节点组不可变性

从设计上讲,节点组是不可变的。这意味着,如果您需要更改诸如 AMI 或节点组的实例类型之类的内容(扩展除外),则需要创建一个具有所需更改的新节点组,移动负载并删除旧的节点组。请参阅 “删除和清空节点组” 部分。

缩放节点组

节点组扩展的过程最多可能需要几分钟。如果未指定该--wait标志,则eksctl乐观地期望节点组能够扩展,并在发送 AWS API 请求后立即返回。要eksctl等到节点可用,请添加一个--wait标志,如下例所示。

注意

扩展节点组 down/in (即减少节点数量)可能会导致错误,因为我们完全依赖于对 ASG 的更改。这意味着被清空的节点并 removed/terminated 未被显式耗尽。这可能是 future 需要改进的领域。

扩展托管节点组是通过直接调用更新托管节点组配置的 EKS API 来实现的。

缩放单个节点组

可以使用以下命令缩放节点组:eksctl scale nodegroup

eksctl scale nodegroup --cluster=<clusterName> --nodes=<desiredCount> --name=<nodegroupName> [ --nodes-min=<minSize> ] [ --nodes-max=<maxSize> ] --wait

例如,要将节点组ng-a345f4e1扩展cluster-1到 5 个节点,请运行:

eksctl scale nodegroup --cluster=cluster-1 --nodes=5 ng-a345f4e1

也可以使用传递给的配置文件来缩放节点组,--config-file并指定应使用其进行缩放的节点组的名称。--nameEksctl 将搜索配置文件并发现该节点组及其缩放配置值。

如果所需的节点数在当前最小和当前最大节点数的范围NOT内,则会显示一个特定的错误。这些值也可以--nodes-max分别与标志--nodes-min和一起传递。

扩展多个节点组

Eksctl 可以发现和缩放随传递的配置文件中找到的所有节点组。--config-file

与扩展单个节点组类似,同一组验证适用于每个节点组。例如,所需的节点数必须在最小和最大节点数的范围内。

删除和清空节点组

要删除节点组,请运行:

eksctl delete nodegroup --cluster=<clusterName> --name=<nodegroupName>

包含和排除规则也可以与该命令一起使用。

注意

这将在删除实例之前耗尽该节点组中的所有 Pod。

要在排空过程中跳过驱逐规则,请运行:

eksctl delete nodegroup --cluster=<clusterName> --name=<nodegroupName> --disable-eviction

所有节点都被封锁,所有的 pod 在删除时都会被逐出节点组,但是如果你需要在不删除节点组的情况下将其清空,请运行:

eksctl drain nodegroup --cluster=<clusterName> --name=<nodegroupName>

要解除对节点组的封锁,请运行:

eksctl drain nodegroup --cluster=<clusterName> --name=<nodegroupName> --undo

要忽略诸如 PodDisruptionBudget 设置之类的驱逐规则,请运行:

eksctl drain nodegroup --cluster=<clusterName> --name=<nodegroupName> --disable-eviction

为了加快排水过程,您可以指定要--parallel <value>并行排出的节点数。

其他功能

您还可以为节点组启用 SSH、ASG 访问和其他功能,例如:

eksctl create nodegroup --cluster=cluster-1 --node-labels="autoscaling=enabled,purpose=ci-worker" --asg-access --full-ecr-access --ssh-access

更新标签

eksctl没有用于更新节点组标签的特定命令,但可以使用以下方法轻松实现kubectl,例如:

kubectl label nodes -l alpha.eksctl.io/nodegroup-name=ng-1 new-label=foo

SSH 访问权限

您可以通过在节点组配置publicKeyPath中配置publicKeyName和来为节点组启用 SSH 访问。publicKey或者,您可以使用 AWS Systems Manager (SSM) 通过 SSH 连接到节点,方法是为节点组配置以下内容:enableSsm

managedNodeGroups: - name: ng-1 instanceType: m5.large desiredCapacity: 1 ssh: # import public key from file publicKeyPath: ~/.ssh/id_rsa_tests.pub - name: ng-2 instanceType: m5.large desiredCapacity: 1 ssh: # use existing EC2 key publicKeyName: ec2_dev_key - name: ng-3 instanceType: m5.large desiredCapacity: 1 ssh: # import inline public key publicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDqZEdzvHnK/GVP8nLngRHu/GDi/3PeES7+Bx6l3koXn/Oi/UmM9/jcW5XGziZ/oe1cPJ777eZV7muEvXg5ZMQBrYxUtYCdvd8Rt6DIoSqDLsIPqbuuNlQoBHq/PU2IjpWnp/wrJQXMk94IIrGjY8QHfCnpuMENCucVaifgAhwyeyuO5KiqUmD8E0RmcsotHKBV9X8H5eqLXd8zMQaPl+Ub7j5PG+9KftQu0F/QhdFvpSLsHaxvBzA5nhIltjkaFcwGQnD1rpCM3+UnQE7Izoa5Yt1xoUWRwnF+L2TKovW7+bYQ1kxsuuiX149jXTCJDVjkYCqi7HkrXYqcC1sbsror someuser@hostname" - name: ng-4 instanceType: m5.large desiredCapacity: 1 ssh: # enable SSH using SSM enableSsm: true