在2017云栖大会·深圳峰会上,来自阿里云的王升功分享了《Infrastructure as Code——Kubernetes一键编排实践》。他首先从开发者角度分析了基础设施在交互上面临的挑战,提出了基础设施即代码的解决方案。然后,它主要分享了资源编排服务——IaC运行平台以及Kubernetes一键编排的具体实践过程。最后通过实际应用场景分享了一键编排实践的效果。
以下内容根据直播视频整理而成。
从开发者视角看基础设施
我们经常拿IDC和云计算作对比,以此来衬托云计算的变化。IaaS、PaaS、SaaS都是从交付方面来阐述其所做的事情,IaaS是基础设施作为服务来交付,PaaS是把平台作为服务交付,SaaS是软件直接作为服务交付。对于开发人员来说,我们之前可能有专门的IDC,有专门的运维人员负责基础设施的维护(选IDC、网络、机器)。云计算的出现,尤其是基础设施作为服务的一个交付手段的时候,开发人员有时候也需要直接面对基础设施的维护。这就给我们带来了新的挑战:80%的关键系统或服务的异常中断是由人为原因引起;50%的系统异常是由变更、配置、发布、人工操作导致。解决上述问题的核心理念是,尽量减少人参与运维流程中所做的事情。我们的解决方案是自动化编排:取消手工操作让应用部署流程自动化;降低运维复杂度让系统自动对齐业务需求。
Infrastructure as Code–基础设施即代码
从开发人员的角度来说,最熟悉的流程是:写代码、编译、调试、部署、运行,整个流程会使开发人员的安全感比较高。对于基础设施来说,特别是像如今基础设施都是通过服务来交付的情况,而且这些服务都是由像阿里云这样的第三方云服务商交付的情况,我们的安全感可能会缺失。如果让基础设施也像代码一样在开发人员的掌握中,那么缺失的安全感就能够找回。阿里云提供的所有基础设施都提供了Open API方式,所以可以写代码去操作。就像可以写代码申请内存空间一样,我们也可以通过写代码申请一个ECS、SLB。上图中所示的流程也适用于基础设施。
资源编排服务–IaC运行平台
阿里云通过资源编排服务实现上述理念。上图中有三个核心概念:模板,JSON格式的文本文件,它其实对应上述流程中的代码部分,使基础设施变成可以编写的代码,编写时不需要关注资源如何调用Open API等事情;ROS,编排引擎,它本身也通过Open API的方式向外提供服务,它可以通过用户定义的模板创建一系列的资源;资源栈,即阿里云资源集合,未来对资源的管理都可以以资源栈为单位进行集中管理。整个编排过程是一个全自动的过程。
如何实施基础设施即服务的过程呢?如上图所示,首先我们需要对我们的系统进行架构设计,比如如果我们的架构是网站则会涉到负载均衡、RDS资源。接着是模板开发,将设计好的架构编程为模板,模板有足够的能力去表达架构,比如包含的资源,资源之间的关系。将创建好的模板提交给ROS,ROS会根据模板创建资源栈,其出口是一堆资源栈的集合,后期对资源的管理都可以基于资源栈来进行,包括更新、升级。
上图是ROS最简单的编排模板,第一行声明了编排模板的版本。Resources部分,定义了名为k8s_master的资源,类型为ECS实例,并且定义了实例的类型、镜像和安全组。当我们把上述代码提交给编排引擎之后,编排引擎就能根据上述代码创建出一台符合我们要求的ECS实例。
通过资源编排在云端交付开源软件
开源软件交付面临的新问题包括:大计算时代的大型分布式系统架构复杂,角色众多,如何部署?需要与云计算服务整合进行全局优化,如何获取和配置资源?敏捷和DevOps,如何应对快速频繁的部署与销毁?资源编排服务的解决方案:通过编排模板定义云资源的需求和配置;通过CloudInit、Chef进行软件部署;通过全自动的编排引擎进行无人值守的系统交付。
Kubernetes(k8s)
Kubernetes(k8s)的灵感来自于Google Borg,Borg这个系统在Google是做数据中心层面的管理,类似于阿里云的伏羲。而Kubernetes其目的是做容器化应用的自动部署、扩展和管理,社区成员包括Google、IBM、微软、VMWare、Docker等多家公司。如何通过阿里云的资源部署一个最简单的Kubernetes集群?
Kubernetes部署规划
上图是一个非常简单的集群,有三个角色:一个Kubernetes Master,两个Node节点。它们跑在三个ECS上,属于一个独立的VPC网络,只有一个子网VSwitch。
首先我们要规划我们的网络,所有的资源都放在VPC网络下面,VPC网络在安全性和可扩展性方面都比传统网络要好。最上方通过模板定义了一个VPC模板,类型为阿里云ECS VPC,设置了网段、名字。然后创建VSwitch,环境复杂时可以创建多个子网。最后创建SecurityGroup来管理网络规则。从上述流程可以看出,通过模板来创建VPC网络环境,会使问题变得简单、清晰。
紧接着,我们为K8sMaster创建ECS,类型为ECS实例,ImageId可以参数化,给一个子网地址,并指定系统盘类型是SSD。
我们需要在实例中部署Kubernetes的组件,最上方为创建实例时用户指定的数据。中间框中的脚本内容详细展示了部署的过程。
Node角色的创建如上图所示。Node的数量是不确定的,我们需要有一种方式能创建多台Node。ECS InstanceGroup的作用是通过MaxAmount和MinAmount两个值控制实例的个数,当需要确定数量资源的时候可以将这两个值设为一致。其余属性和创建Master时是基本一致的。
上图是Node节点上部署的脚本,作用是在Node节点启动后,在其上部署Node节点所需要的kubelet、docker,以及进行基础环境的配置。
执行编排
上文构建的模板已经实现了我们系统方方面面所需要的东西。上图是输入模板的页面,模板源除了直接输入之外还可以指定url文件。这样我们的模板开发完之后就可以放到一个OSS的地址上,其他人也可以通过这个地址创建、部署同样的系统。
前一个页面点击创建之后,就可以进入事件列表页面。通过模板部署应用的过程中,因为涉及到很多的资源,所以存在有很多事件。对于观察者来说,更希望看到过程中的一些细节,从事件列表就可以实时监控到每一步正在进行的事件是什么,并且可以获知其状态。
当所有的编排动作完成之后,可以进入到资源列表页面。这个页面可以看到整个应用被创建出来的资源细节。
上图是阿里云官方提供的一些样例模板,通过这些模板,我们可以部署Jenkins、docker_ddc等更复杂、更有用的系统。
应用场景:运行环境复制
模板除了有创建资源的用途、运维的用途、软件交互的用途,还可以用于其他场景。比如,当我们实施DevOps的时候,希望有很多靠谱的环境(开发环境、集成测试环境、线上生产环境)。为了让其保证一致,通过手工方式很难做到,但通过模板达到上述目的却比较简单。
类似的场景还有:在模板里定义很复杂的VPC子网结构,做子网规划;做DevOps流程实施;通过编排做资源的创建、删除、规划,做到系统自动扩容、缩容;以模板的形式向客户交付可部署的应用模板。
本文介绍的部署Kubernetes集群的编排模板和一个快捷的部署方法已经整理成云栖社区的文章,供参考:《10分钟自动部署Kubernetes1.6.1集群》