亚马逊AWS官方博客

通过Rancher 管理Amazon EKS集群与应用

先决条件

本指南假定您对亚马逊云平台虚机EC2、安全组以及Kubernetes有了一定的使用经验,并且拥有:

  • 亚马逊云科技中国区的账号,并且拥有相应权限的IAM用户
  • 已经启动一台EC2或者本地笔记本,并且已经安装了Docker
  • 已有一个Amazon EKS 集群

Rancher和亚马逊云科技Amazon EKS

Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。

Rancher提供的的功能基础设施编排、容器编排与调度、应用商店、企业级权限管理。可以参照Rancher官方网站:https://rancher.com/docs/rancher/latest/zh/

Rancher现在是亚马逊云科技的合作伙伴,通过Rancher,可以解决管理多个 Amazon Elastic Kubernetes Service (Amazon EKS) 集群的操作和安全挑战,同时为开发运维团队提供运行容器化工作负载的集成工具。

对于习惯使用Rancher的用户,既可以保持在Rancher 中养成的使用习惯,也可以借助亚马逊的托管 Kubernetes 解决方案Amazon EKS,用户可以在云中快速创建、管理可扩展的 Kubernetes 集群。

部署Rancher

Rancher 部署可以多种方式。

首先,亚马逊云科技提供Rancher的快速启动模版,客户可以将 Rancher 部署到新的 VPC和新的Amazon EKS 集群、现有 VPC和新的 EKS 集群,或现有VPC和现有 EKS 集群中。具体参照:https://aws.amazon.com/cn/quickstart/architecture/eks-rancher/

其次,用户也可以自己通过Helm Chart自行安装

https://rancher.com/docs/rancher/v2.5/en/installation/install-rancher-on-k8s/#install-the-rancher-helm-chart

helm install rancher rancher-latest/rancher \
  --namespace cattle-system \
  --version 2.5.12 \
  --set hostname=myrelease.rancher.com \
  --set replicas=3

最简单的方式,在学习或者测试中,可以通过在安装过docker的本地机器、虚拟机或者亚马逊云平台的EC2上启动一个Rancher容器的方式,启动Rancher。本指南使用这种方式在EC2上启动Rancher。

首先启动一台EC2(Amazon Linux 2镜像),并且安全组放行本地IP以及端口22,80,443.

在EC2上安装docker,

$ sudo amazon-linux-extras install docker
$ sudo service docker start
$ sudo usermod -a -G docker ec2-user
$ sudo chkconfig docker on
$ sudo reboot

执行下面的docker命令,拉取Rancher镜像,启动docker服务.

可以指定版本,也可以拉起最新版本。

$ docker pull rancher/rancher:latest
$ docker run -d --restart=unless-stopped -p 80:80 -p 443:443 \
--privileged \
-v ~/docker_volume/rancher_home/rancher:/var/lib/rancher \
-v ~/docker_volume/rancher_home/auditlog:/var/log/auditlog \
--name rancher rancher/rancher:latest

当前使用的最新版本为2.6.3。

在EC2详情页面,获取EC2的Public IP地址,并在浏览器访问链接:

https://{ec2-public-ip}

设置密码后,即可登录Rancher管理控制台页面。

Rancher管理EKS

Rancher既可以导入一个已有的EKS集群,也可以通过Rancher创建一个新的EKS集群,并通过Rancher实现EKS集群上的应用的部署管理操作。

创建AWS Credential

登陆以后,首先导航至管理集群->Cloud Credential页面,配置管理集群的Access Key和SecretKey。这里的AK SK最好是创建集群的用户的AK SK。否则需要在EKS中配置aws-auth ,进行身份映射,允许其他用户拥有Kubernetes集群的管理权限。

导入已有集群

进入管理集群->集群页面,点击右上角导入已有集群按钮,选择Amazon EKS,进入导入EKS界面,如下:

输入集群名称,为Rancher中的显示名称,可以自定义,

选择集群所在区域,以及上一步中创建的凭证,

选择需要导入的EKS集群,

输入完上面的信息后,可以通过注册集群按钮完成集群注册操作。

创建新的EKS集群

创建新的集群,首先输入集群名称,选定区域和Credential,如下图所示

选择一个已经存在的VPC,并选择私有访问,私有子网,安全组。

注意:

为了保证应用的安全,您的EKS集群的节点应该运行在私有网络;

API Server的Endpoint访问模式设为私有网络;

VPC的Public 子网创建一个Nat Gateway。EKS集群创建过程中需要通过NAT Gateway拉取相关镜像。

最后,设置需要启动的节点类型和节点组个数:,

注意: 通过Rancher创建的节点组是用户自管理的节点组。在EKS的控制台中,集群的计算配置中没有显示自管理的节点组的信息。

场景案例

在一个实际的客户案例中,客户开始的开发环境在本地机房构建,

  • 首先,通过Rancher在本地机房构建了一个小规模的Kubernetes集群
  • 客户在本地的Kubernetes集群中除了部署了自己的微服务应用外,还部署了有状态的中间件服务,包括Redis, Kafka, MySQL
  • 所有的有状态的中间件都是通过Rancher的应用商店安装,存储使用的是本地磁盘

在生产环境迁移AWS的过程中,客户找到我们协助设计亚马逊云平台上的架构设计评估和部署实施支持。在沟通过程中,客户开始的想法是,为了快速完成上线,希望保持数据中心的架构不变,通过Rancher基于虚拟机EC2自建Kubernetes集群,并在集群中自建Redis、 Kafka以及MySQL。由于自建Kubernetes集群的升级、管理、安全等各方面的运维是一个复杂的工作;需要大量的运维资源投入;并且在Kubernetes集群中运行有状态的应用,特别是业务数据库,也是一个很大的潜在风险。经过反复讨论,在保持客户基于Rancher管理集群的使用习惯前提下,对部署架构做了调整:

  • 自建Kubernetes调整为托管的Amazon EKS服务
  • 从Kubernetes集群中移除关系数据库MySQL,替换为托管的RDS Aurora服务
  • Redis和Kafka仍然在EKS集群中部署
  • 采用Amazon EFS作为共享存储,实现存储的安全高可用
  • 用于通过服务名称+端口的形式访问Redis、Kafka以及RDS等中间件,服务参数配置到ConfigMap中,并以存储卷到形式挂载到应用的Pod中

应用通过NodePort的形式暴露服务,并在应用负载均衡器上配置基于路径的转发规则,转发路径到不同的端口。

调整后的架构如下图所示:

 

这样调整的好处:

  • Amazon EKS 的安全、弹性、高可用,保证了应用稳定的运行,同时降低了运维的复杂性,节省了运维成本
  • Amazon RDS Aurora 是一个稳定的、高性能的兼容MySQL的数据库,可以按需扩充存储容量,经济高效
  • Amazon EFS作为Redis、Kafka的持久存,保证了数据的安全性和可用性
  • 继续使用Rancher管理集群,延续了用户使用习惯,提升了运维效率

注意: 在实际的重要业务的生产环境,仍然建议使用托管的Ealsticache for Redis以及托管的Kafka服务MSK,以提升业务运行的稳定性,并降低运维复杂度和资源投入。

接下来介绍下这个架构的部署过程:

准备工作:EKS集群和EFS CSI

首先根据上面的介绍,部署Rancher, 导入一个已有的EKS集群。

接下来,部署Redis, Kafka中间件需要用到的共享存储EFS CSI。在EKS中部署EFS CSI的步骤可以参照官方文档,这里不再赘述。官方文档链接如下:

https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/efs-csi.html

部署完成后,进入Rancher的存储->StorageClass,看到有两个存储分类,可以设置efs-sc为默认存储分类。这样在Helm部署Redis和Kafka时会使用efs-sc默认采用EFS作为存储。

由于EFS和EBS不同,EFS是弹性存储,不需要指定具体的存储大小。但是Kubernetes创建PVC对象时需要指定Capacity大小。在Helm安装时可以无需指定Capacity值,Rancher执行Helm安装时会使用8G创建PVC,但是实际EFS会根据使用的实际容量进行动按需扩容。

Redis和Kafka的部署

首先,在进入集群->应用市场->chart仓库页面,添加bitnami仓库(https://charts.bitnami.com/bitnami

进入集群->应用市场->chart页面,在搜索框输入Redis, 根据需求,选择Redis或者Redis-Cluster部署Redis服务,根据向导,选择namespace执行安装即可。

同样的步骤,搜索Kafka,执行安装。

安装完成后,进入已安装的Apps,选择Redis, 点击发布说明,就可以看到部署的Redis的访问域名以及获取认证信息等。这些信息记录下来后可以配置到ConfigMap中。

另外,Rancher也支持命令行执行,可以通过命令行直接执行Helm安装的方式安装:

helm install redis-prod -n redis bitnami/redis --set global.storageClass=efs-sc --set replica.persistence.size=100Gi --set master.persistence.size=100Gi

应用部署

  • 首先创建应用名称空间hello

进入集群-项目名称空页面,点击创建按钮,进入下面的创建名称空间页面,输入hello。

  • 创建ConfigMap

进入存储->ConfigMaps页面,点击创建按钮,输入名称,数据的Key->Value,在Value中输入redis和Kafka的服务域名和端口等访问信息。

  • 创建应用Deployment

进入工作负载->Deployment页面, 点击创建按钮,

在General中输入容器名称和镜像,这里使用的镜像是作者托管在Amazon镜像服务ECR中的个人私有镜像。您可以使用自己构建的任意镜像,也可以选择Docker Hub上任何公开的镜像来进行测试验证。

添加存储:输入卷名称,选择上一步创建的ConfigMap,以及容器挂载路径

验证部署

在工作负载->Pod列表中,选择刚才部署的helloworld,在右边的操作列表中选择Execute Shell,会进入Pod的shell执行界面,进入/etc/config,目录,可以看到上面配置的属性已经挂载成功,这样应用就可以通过在代码中读取配置文件获取相关配置信息。

总结

对于已经习惯使用Rancher的用户来说,可以通过用户界面的方式,管理EKS集群以及进行EKS集群中的应用部署,还可以导入多个集群,同时进行多集群部署。这样,对于用户来说,既可以利用托管的Amazon EKS集群的弹性、高可用、安全,保证了应用的稳定性和高可用,也延续了自身的kubernetes集群的管理习惯。通过Rancher管理界面,用户可以很方便的进行应用部署、监控等各种运维操作,Rancher还支持命令行执行helm、kubectl命令行方式管理集群,实际操作中可以结合界面、命令行灵活的实现多集群的管理部署工作。

参考

https://aws.amazon.com/cn/quickstart/architecture/eks-rancher/

https://rancher.com/docs/rancher/v1.6/zh/environments/registries/

https://artifacthub.io/packages/helm/bitnami/redis-cluster

https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/efs-csi.htmlhttps://docs.aws.amazon.com/zh_cn/eks/latest/userguide/efs-csi.html

本篇作者

琚小龙

亚马逊云科技金融行业解决方案架构师,负责基于亚马逊的云计算方案架构咨询和设计,擅长微服务、DevOps和容器领域。加入 AWS 之前,曾任职互联网创业公司以及HPE,拥有多年移动互联网、大型企业复杂应用的系统架构和设计经验。