本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
EKS 托管的节点组
Amazon EKS 托管节点组是一项功能,可自动为 Amazon EKS Kubernetes 集群配置节点(EC2 实例)进行配置和生命周期管理。客户可以为其集群配置优化的节点组,EKS 将使用最新的 Kubernetes 和主机操作系统版本使其节点保持最新状态。
EKS 托管节点组是一个自动扩缩组和由 AWS 为 Amazon EKS 集群管理的关联 EC2 实例。每个节点组都使用亚马逊 EKS 优化的亚马逊 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
全新 Support 支持自定义 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
升级托管节点组
您可以随时将节点组更新到适用于您正在使用的 AMI 类型的最新 EKS 优化的 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
注意
如果托管节点是使用自定义部署的 AMIs,则必须遵循以下工作流程才能部署新版本的自定义 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
处理节点的并行升级
可以同时升级多个托管节点。要配置并行升级,请在创建节点组时定义节点组的。updateConfig
updateConfig
可以在这里
为避免由于一次升级多个节点而导致工作负载停机,您可以通过在maxUnavailable
字段中指定此项来限制升级期间可能不可用的节点数量updateConfig
。或者maxUnavailablePercentage
,使用,它将不可用节点的最大数量定义为节点总数的百分比。
请注意,该值maxUnavailable
不能高于maxSize
。此外,maxUnavailable
和maxUnavailablePercentage
不能同时使用。
此功能仅适用于托管节点。
更新托管节点组
eksctl
允许更新托管节点组的UpdateConfig部分。本节定义了两个字段。 MaxUnavailable
和MaxUnavailablePercentage
。更新期间,您的节点组不会受到影响,因此预计不会出现停机时间。
该命令update nodegroup
应与使用该--config-file
标志的配置文件一起使用。节点组应包含一个部分。nodeGroup.updateConfig
更多信息可以在这里
Nodegroup Health 问题
EKS Managed Nodegroups 会自动检查您的节点组和节点的配置是否存在运行状况问题,并通过 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