本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
EKS 管理的节点组
亚马逊 EKS 托管节点组是一项功能,可自动为亚马逊 EKS Kubernetes 集群配置节点(EC2 实例)和生命周期管理。客户可以为其集群配置优化的节点组,EKS 将使用最新的 Kubernetes 和主机操作系统版本保持其节点处于最新状态。
EKS 托管节点组是由 AWS 为亚马逊 EKS 集群管理的自动扩展组和关联的 EC2 实例。每个节点组都使用 Amazon A EKS-optimized mazon Linux 2 AMI。Amazon EKS 使您可以轻松地将错误修复和安全补丁应用到节点,并将其更新到最新的 Kubernetes 版本。每个节点组都会为您的集群启动一个自动扩展组,该组可以跨越多个 AWS VPC 可用区和子网,以实现高可用性。
新增对托管节点组的启动模板支持
注意
术语 “非托管节点组” 被用来指eksctl从一开始就支持的节点组(通过字段表示)。nodeGroups该ClusterConfig文件继续使用该nodeGroups字段来定义非托管节点组,托管节点组是使用该字段定义的。managedNodeGroups
创建托管节点组
$ eksctl create nodegroup
新集群
要使用托管节点组创建新集群,请运行
eksctl create cluster
要创建多个托管节点组并更好地控制配置,可以使用配置文件。
注意
托管节点组的功能与非托管节点组的功能不完全相同。
# cluster.yaml # A cluster with two managed nodegroups --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: managed-cluster region: us-west-2 managedNodeGroups: - name: managed-ng-1 minSize: 2 maxSize: 4 desiredCapacity: 3 volumeSize: 20 ssh: allow: true publicKeyPath: ~/.ssh/ec2_id_rsa.pub # new feature for restricting SSH access to certain AWS security group IDs sourceSecurityGroupIds: ["sg-00241fbb12c607007"] labels: {role: worker} tags: nodegroup-role: worker iam: withAddonPolicies: externalDNS: true certManager: true - name: managed-ng-2 instanceType: t2.large minSize: 2 maxSize: 3
可以在此处找到用于创建托管节点组的配置文件的另一个示例。
集群可能同时包含托管和非托管节点组。非托管节点组不会显示在 AWS EKS 控制台中,但eksctl get nodegroup会列出两种类型的节点组。
# cluster.yaml # A cluster with an unmanaged nodegroup and two managed nodegroups. --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: managed-cluster region: us-west-2 nodeGroups: - name: ng-1 minSize: 2 managedNodeGroups: - name: managed-ng-1 minSize: 2 maxSize: 4 desiredCapacity: 3 volumeSize: 20 ssh: allow: true publicKeyPath: ~/.ssh/ec2_id_rsa.pub # new feature for restricting SSH access to certain AWS security group IDs sourceSecurityGroupIds: ["sg-00241fbb12c607007"] labels: {role: worker} tags: nodegroup-role: worker iam: withAddonPolicies: externalDNS: true certManager: true - name: managed-ng-2 instanceType: t2.large privateNetworking: true minSize: 2 maxSize: 3
新增对自定义 AMI、安全组instancePrefix、instanceName、ebsOptimized、volumeType、volumeName、volumeEncrypted、volumeKmsKeyID、volumeIOPS、maxPodsPerNode、preBootstrapCommands、overrideBootstrapCommand、和 disableIMDSv1
# cluster.yaml # A cluster with a managed nodegroup with customization. --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: managed-cluster region: us-west-2 managedNodeGroups: - name: custom-ng ami: ami-0e124de4755b2734d securityGroups: attachIDs: ["sg-1234"] maxPodsPerNode: 80 ssh: allow: true volumeSize: 100 volumeName: /dev/xvda volumeEncrypted: true # defaults to true, which enforces the use of IMDSv2 tokens disableIMDSv1: false overrideBootstrapCommand: | #!/bin/bash /etc/eks/bootstrap.sh managed-cluster --kubelet-extra-args '--node-labels=eks.amazonaws.com/nodegroup=custom-ng,eks.amazonaws.com/nodegroup-image=ami-0e124de4755b2734d'
如果您请求的实例类型仅在一个区域中可用(并且 eksctl 配置要求指定两个区域),请确保将可用区添加到您的节点组请求中:
# cluster.yaml # A cluster with a managed nodegroup with "availabilityZones" --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: flux-cluster region: us-east-2 version: "1.23" availabilityZones: ["us-east-2b", "us-east-2c"] managedNodeGroups: - name: workers instanceType: hpc6a.48xlarge minSize: 64 maxSize: 64 labels: { "fluxoperator": "true" } availabilityZones: ["us-east-2b"] efaEnabled: true placement: groupName: eks-efa-testing
对于像 Hpc6 系列这样仅在一个区域中可用的实例类型
现有集群
eksctl create nodegroup --managed
提示:如果您使用ClusterConfig文件来描述整个集群,请在managedNodeGroups字段中描述新的托管节点组并运行:
eksctl create nodegroup --config-file=YOUR_CLUSTER.yaml
升级托管节点组
您可以随时将节点组更新到您使用的 EKS-optimized AMI 类型的最新 AMI 发行版本。
如果您的节点组与集群的 Kubernetes 版本相同,则可以将您正在使用的 AMI 类型的 Kubernetes 版本更新到最新的 AMI 发布版本。如果您的节点组是集群 Kubernetes 版本之前的 Kubernetes 版本,则可以将节点组更新到与节点组的 Kubernetes 版本相匹配的最新 AMI 发布版本,或者更新到与集群 Kubernetes 版本匹配的最新 AMI 发行版本。您无法将节点组回滚到早期的 Kubernetes 版本。
要将托管节点组升级到最新的 AMI 发行版本,请执行以下操作:
eksctl upgrade nodegroup --name=managed-ng-1 --cluster=managed-cluster
可以使用以下方法将节点组升级到指定 Kubernetes 版本的最新 AMI 版本:
eksctl upgrade nodegroup --name=managed-ng-1 --cluster=managed-cluster --kubernetes-version=<kubernetes-version>
要升级到特定的 AMI 发行版本而不是最新版本,请传递--release-version:
eksctl upgrade nodegroup --name=managed-ng-1 --cluster=managed-cluster --release-version=1.19.6-20210310
注意
如果使用自定义 AMI 部署托管节点,则必须遵循以下工作流程才能部署新版本的自定义 AMI。
-
节点组的初始部署必须使用启动模板完成。例如
managedNodeGroups: - name: launch-template-ng launchTemplate: id: lt-1234 version: "2" #optional (uses the default version of the launch template if unspecified) -
创建自定义 AMI 的新版本(使用 AWS EKS 控制台)。
-
使用新的 AMI ID 创建新的启动模板版本(使用 AWS EKS 控制台)。
-
将节点升级到新版本的启动模板。例如
eksctl upgrade nodegroup --name nodegroup-name --cluster cluster-name --launch-template-version new-template-version
处理节点的并行升级
可以同时升级多个托管节点。要配置并行升级,请在创建节点组时定义节点组的。updateConfigupdateConfig可以在这里找到一个例子
为了避免由于一次升级多个节点而导致工作负载停机,您可以通过在maxUnavailable字段中指定来限制升级期间可能不可用的节点数量updateConfig。或者maxUnavailablePercentage,使用,它将不可用节点的最大数量定义为节点总数的百分比。
请注意,maxUnavailable不能高于maxSize。另外maxUnavailable,maxUnavailablePercentage不能同时使用。
此功能仅适用于托管节点。
更新托管节点组
eksctl允许更新托管节点组的UpdateConfig部分。本节定义了两个字段。MaxUnavailable和MaxUnavailablePercentage。更新期间您的节点组不受影响,因此不应出现停机时间。
该命令update nodegroup应与使用--config-file标志的配置文件一起使用。节点组应包含一个部分。nodeGroup.updateConfig更多信息可以在这里找到
节点组运行状况问题
EKS 托管节点组会自动检查您的节点组和节点的配置是否存在运行状况问题,并通过 EKS API 和控制台报告这些问题。要查看节点组的运行状况问题,请执行以下操作:
eksctl utils nodegroup-health --name=managed-ng-1 --cluster=managed-cluster
管理标签
EKS 托管节点组支持附加应用于节点组中 Kubernetes 节点的标签。这是在创建集群或节点组期间通过 eksctl 中的labels字段指定的。
要在节点组上设置新标签或更新现有标签,请执行以下操作:
eksctl set labels --cluster managed-cluster --nodegroup managed-ng-1 --labels kubernetes.io/managed-by=eks,kubernetes.io/role=worker
要取消设置或移除节点组中的标签,请执行以下操作:
eksctl unset labels --cluster managed-cluster --nodegroup managed-ng-1 --labels kubernetes.io/managed-by,kubernetes.io/role
要查看在节点组上设置的所有标签,请执行以下操作:
eksctl get labels --cluster managed-cluster --nodegroup managed-ng-1
扩展托管节点组
eksctl scale nodegroup还支持托管节点组。扩展托管或非托管节点组的语法是相同的。
eksctl scale nodegroup --name=managed-ng-1 --cluster=managed-cluster --nodes=4 --nodes-min=3 --nodes-max=5