亚马逊AWS官方博客

如何利用 Managed Node Group 高效管理 Amazon EKS 集群

前言

Amazon Elastic Kubernetes Service (EKS) 是AWS上托管的 Kubernetes 服务。2月28日已在由光环新网运营的AWS中国(北京)区域和由西云数据运营的AWS(宁夏)区域上线。

Amazon EKS在Kubernetes用户中收到了极大的欢迎。据第三方统计机构 nuclearsearch 的统计( https://nucleusresearch.com/research/single/guidebook-containers-and-kubernetes-on-aws/),全球公有云上的容器数量,有80% 运行在AWS上。如果只统计Kubernetes的应用,那么在AmazonEKS上运行的应用数量更是占到了总数的82%。

Amazon EKS使用起来非常方便。用户可以通过AWS Console、AWS SDK、AWS CLI、CloudFormation 等方法,调用 Amazon EKS的EndPoints,就可以轻松的创建自己的Kubernetes集群,而无需要安装、操作和维护自己的 Kubernetes 控制平面。

 

Amazon EKS创建的Kubernetes与上游完全兼容,因此运行在标准Kubernetes集群上的应用程序可以轻松迁移,并且可以很方便的与AWS的服务集成,比如用于负载分发的 Application Load Balancer、用于基于角色的访问控制的 IAM 和用于 Pod 联网的 VPC。用户能够充分利用 AWS 平台的卓越性能、可扩展性、可靠性和可用性来构建自己的应用。

Amazon EKS集群主要有两部分构成:由AWS托管的控制平面和由用户自己管理的工作节点,这里简称数据平面,如下图所示:

 

Amazon EKS 的控制平面由AWS托管,跨越多个可用区,可扩展且高度可用。其中etcd持久层的Auto Scaling Group Minimum Size是3,跨三个可用区,能够在某个可用区不可用的情况下(虽然概率极低)保证etcd 可读可写,无状态的 Kubernetes API Auto Scaling Group Minimum Size是2,跨越两个可用区, 用户可以根据Amazon EKS集群的压力为控制面板扩容。 Amazon EKS会自动检测和替换运行状况不佳的主节点,以确保Kubernetes控制平面的高可用性。控制平面的架构如下图所示:

 

接下来我们看下数据平面。数据平面给了用户充足的自主权。用户可以按照需求,选择EC2的实例类型,选择自定义的AMI,选择不同的计费方式,可选择使用按需实例,预留实例或者竞价实例,用户还可以按需划分自己的网段,选择是否允许可以通过SSH登陆等。

然而,用户在使用Amazon EKS来管理自己的Kubernetes集群的时候,还是需要自己去管理Kubernetes集群中的EC2的生命周期。需要自行去创建EC2,注册EC2到Kubernetes的集群,用户还需要自行去维护EC2的AMI,给AMI打各种补丁等。

这个问题有什么好的办法吗? Amazon EKS在的Managed Node Group的特性很好的解决了这个问题。

 

Managed Node Group 概述

为了能够进一步简化用户在管理Kubernetes集群的工作, Amazon EKS在Data Plane的管理上推出了Managed Node Group的服务。这使得用户可以只用一条简单的命令完成创建、更新、扩容或终止工作节点(EC2实例)的工作。

在加入Managed Node Group之后,Amazon EKS的架构如下图所示:

这里简单介绍下Managed Node Group的核心概念:

  • Amazon EKS 负责node groups的创建,负责node group中EC2实例的创建
  • Managed Node Group中的托管的节点被创建于Auto Scaling Group中,由Amazon EKS管理。Auto Scaling Group和EC2实例都运行在用户的账号内;
  • 在创建Managed Node Group时,用户指定节点运行在哪些子网内;
  • 只要有公网访问的权限,无论公有子网还是私有子网之内,都可以创建Managed Node Group ;
  • 托管节点组中的实例使用最新版本 Amazon EKS 优化的 Amazon Linux 2 AMI ,用户可以在标准版AMI 或者GPU优化版 AMI之间按需选择。
  • Amazon EKS 在托管节点组上遵循 CVE 和安全补丁的责任共担模式。由于托管节点运行 Amazon EKS 优化的 AMI,因此在遇到,Amazon EKS 负责构建这些 AMI 的修补版本,用户负责将这些修补的 AMI 版本部署到托管节点组;
  • EKS集群内可以创建多个Managed Node Group。比如,用户可以为某些工作负载使用标准的 Amazon EKS 优化 Amazon Linux 2 AMI 创建一个节点组,为需要 GPU 支持的工作负载使用 GPU优化AMI创建另一个节点组。
  • 如果Managed Node Group运行异常,则 Amazon EKS 返回错误消息以帮助诊断问题;
  • Amazon EKS 会给Managed Node Group内的节点打上前缀为eks.amazon.com的Kubernetes标签;
  • 在Amazon EKS终止或更新节点之前,会调用Kubernetes 的API来驱逐节点(drain node),保持整个集群的高可用;
  • 使用 Amazon EKS Managed Node Group没有额外的费用,用户只需为预配置的 EC2 等资源付费

接下来给大家演示如何通过控制面板和AWS CLI 管理Managed Node Group。

在开始之前,需要先创建一个Kubernetes的集群。在Amazon EKS中,创建集群,有诸多办法,比如通过控制台,AWS CLI, AWS SDK,Cloudformation等。

这里通过 eksctl (https://eksctl.io/) 来创建用来演示的集群:

eksctl create cluster --name=eksngdemo --region=cn-north-1

备注:这里用的是eksctl的版本0.15.0,从0.15.0起,加入了对中国region的支持, 推荐使用最新的版本, 见:https://github.com/weaveworks/eksctl/releases

 

通过AWS控制台来创建管理Managed Node Group

打开AWS控制台,进入EKS服务的页面(https://console.amazonaws.cn/eks/home ),点击左侧导航栏的 Clusters,可以看到创建好的EKS集群,以及集群中的Managed Node Group , 这里的Managed Node Group为空。

点击 Add Node Group按钮,进入新建Managed Node Group配置页面:

点击 Next, 配置Node的AMI,实例类型以及磁盘的大小:

点击Next,配置Group的弹性扩展参数,包括最多多少个Node,最少多少个Node,以及默认启动多少个Node:

点击Next,进入Review界面,在确认无误后,点击Create按钮,就可完成Managed Node Group的创建。


稍等片刻,在Managed Node Group创建成功后,进入到EKS集群的页面,可以查看到创建好的Node Group:

可以看到,利用Managed Node Group的特性,在控制台上只需要简单的几步操作,就可以完成EKS集群的扩容。

 

通过AWS CLI来创建管理Managed Node

除了通过控制台之外,用户也可以利用AWS CLI 或者 AWS SDK等方法来创建管理 Managed Node Group。

通过AWS CLI来创建管理 Managed Node Group方法如下:

  • 查看 Node Group 列表:
aws eks list-nodegroups --cluster-name=eksngdemo
{
 "nodegroups": [
     "ng1-by-console"
 ]
}
  • 新建 Node Group:
aws eks create-nodegroup \
>        --cluster-name "eksngdemo" \
>        --nodegroup-name "ng2-by-cli" \
>        --subnets "subnet-048e5fe91337a699c" "subnet-0237837c3956660b0" "subnet-0a6aca88ae3d42344" "subnet-05704b2e5bea4cc19" \
>        --node-role "arn:aws-cn:iam::464600099053:role/eksctl-eksngdemo-nodegroup-ng-34d-NodeInstanceRole-172ZU91D5PDDP"

{
    "nodegroup": {
        "status": "CREATING",
        "scalingConfig": {
            "minSize": 1,
            "maxSize": 2,
            "desiredSize": 2
        },
        "diskSize": 20,
        "subnets": [
            "subnet-048e5fe91337a699c",
            "subnet-0237837c3956660b0",
            "subnet-0a6aca88ae3d42344",
            "subnet-05704b2e5bea4cc19"
        ],
        "clusterName": "eksngdemo",
        "releaseVersion": "1.14.9-20200122",
        "amiType": "AL2_x86_64",
        "instanceTypes": [
            "t3.medium"
        ],
        "tags": {},
        "version": "1.14",
        "modifiedAt": 1583641877.485,
        "nodeRole": "arn:aws-cn:iam::464600099053:role/eksctl-eksngdemo-nodegroup-ng-34d-NodeInstanceRole-172ZU91D5PDDP",
        "nodegroupName": "ng2-by-cli",
        "nodegroupArn": "arn:aws-cn:eks:cn-north-1:464600099053:nodegroup/eksngdemo/ng2-by-cli/6ab85c34-ac53-4cde-1061-5ec4e5dc5e4f",
        "health": {
            "issues": []
        },
        "createdAt": 1583641877.485
    }
}
  • 查看创建好的 Node Group
  aws eks list-nodegroups --cluster-name=eksngdemo
  {
      "nodegroups": [
          "ng1-by-console",
          "ng2-by-cli"
      ]
  }

Managed Node Group版本升级

当有新版本的Amazon EKS 优化过的 Linux AMI 可用时,在AWS的控制台的Node Group列表,用户可以看到“Update Now“的提示。用户可以按需选择将Managed Node Group中节点的AMI进行升级。

有以下两点需要注意:

  • 只有当有新版本AMI可用时,AWS的控制台才会出现“Update Now”的提示,如果没有“Update Now”的提示,说明Node Group中所采用的AMI的版本已经为最新;
  • 一旦升级AMI后,将不能再回滚到以前的版本;

更新节点的AMI,会导致节点重启。Amazon EKS在重启节点之前,会调用Kubernetes 的API来驱逐节点(drain node)。如果驱逐节点(drain node)的时间在15分钟内不能完成,那么如果用户选择的是强制更新,被更新的节点会被强制终止,如果用户选择的是非强制更新,则会停止更新,向用户显示更新失败。

 

Managed Node Group健康检测

Amazon EKS会自动监控Managed Node Group的健康状况。用户可以通过AWS控制台或者API来查询Managed Node Group的健康状况。

健康检测的内容主要包含如下几个方面:

  • 集群运行必需的资源被删除或者不可用,比如:“Ec2LaunchTemplateNotFound” 或 “InsufficientFreeAddresses” ;
  • 更新过程中遇到的错误,比如:“PodEvictionFailure” 、 “PodDeletionFailure” 或者“InstanceLimitExceeded”;
  • 节点创建或者删除时的错误,比如:“NodeCreationFailure”;

 

总结

AWS始终坚持以客户为中心,致力于为客户提供云上最好的Kubernetes管理平台。当Amazon EKS刚刚发布的时候,AWS提供了托管的控制平面,后又在数据平面加入了Managed Node Groups的功能,这大大简化了用户在AWS上创建、管理一个生产级别的高可用的Kubernetes集群的工作。接下来AWS将继续提供更多的功能,进一步提升客户创建、管理、使用Kubernetes集群的体验。

Amazon EKS的roadmap可参看: https://github.com/aws/containers-roadmap/projects/1

 

参考:

 

 

本篇作者

韩医徽

AWS 解决方案架构师,负责 AWS 合作伙伴生态系统的云计算方案架构咨询和设计,同时致力于 AWS 云服务在国内的应用和推广。