亚马逊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的版本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 列表:
- 新建 Node Group:
- 查看创建好的 Node Group
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
参考:
- https://eksctl.io/
- https://nucleusresearch.com/research/single/guidebook-containers-and-kubernetes-on-aws/
- https://amazonaws-china.com/cn/blogs/containers/eks-managed-node-groups/
- https://docs.thinkwithwp.com/eks/latest/userguide/managed-node-groups.html