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

阅读数:2 2020 年 3 月 19 日 21:41

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

前言

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

Amazon EKS 在 Kubernetes 用户中收到了极大的欢迎。据第三方统计机构 nuclearsearch 的统计,全球公有云上的容器数量,有 80% 运行在 AWS 上。如果只统计 Kubernetes 的应用,那么在 AmazonEKS 上运行的应用数量更是占到了总数的 82%。

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

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

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

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

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

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

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

接下来我们看下数据平面。数据平面给了用户充足的自主权。用户可以按照需求,选择 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 集群

这里简单介绍下 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 来创建用来演示的集群:

SQL

复制代码
eksctl create cluster --name=eksngdemo --region=cn-north-1

备注:这里用的是 eksctl 的版本 0.15.0,从 0.15.0 起,加入了对中国 region 的支持, 推荐使用最新的版本。

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

打开 AWS 控制台,进入 EKS 服务的页面,点击左侧导航栏的 Clusters,可以看到创建好的 EKS 集群,以及集群中的 Managed Node Group , 这里的 Managed Node Group 为空。

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

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

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

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

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

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

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

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

如何利用 Managed Node Group 高效管理 Amazon EKS 集群
稍等片刻,在 Managed Node Group 创建成功后,进入到 EKS 集群的页面,可以查看到创建好的 Node Group:

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

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

通过 AWS CLI 来创建管理 Managed Node

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

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

  • 查看 Node Group 列表:

SQL

复制代码
aws eks list-nodegroups --cluster-name=eksngdemo
{
"nodegroups": [
"ng1-by-console"
]
}
  • 新建 Node Group:

SQL

复制代码
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

SQL

复制代码
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 的健康状况。

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

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

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

总结

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

Amazon EKS 的 roadmap 可参看。

参考:

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

本文转载自 AWS 技术博客。

原文链接: https://amazonaws-china.com/cn/blogs/china/how-to-manage-amazon-eks-clusters-with-managed-node-group-preface/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布