顾黄亮
作者顾黄亮2022-12-21 10:28
技术总监, 畅销书作者

容器云平台自动化引擎工具选型

字数 8466阅读 3868评论 1赞 4

本文为云原生应用创新实践联盟——容器云自动化运维课题组生产内容,相关专家如下所示,更多内容可 点击此处进入云原生应用创新实践联盟 进行查看。
① 已通过课题组专家审核
② 待课题用户组织评议(欢迎各位在下方评论区提出您的宝贵意见)

执笔专家:
顾黄亮 容器云自动化运维用户委员会委员
twt社区云原生应用创新实践联盟——容器云自动化运维方向课题组组长。 畅销书《DevOps权威指南》和《技术赋能 数字化转型的基石》作者,中国商联专家智库入库专家、国家互联网数据中心产业技术创新战略联盟(NIISA)智库专家委员会副主任委员、江苏银行业和保险业金融科技专家委员会候选专家、工信部企业数字化转型IOMM委员会特聘专家、财联社鲸平台智库入库专家、中国信通院可信云标准特聘专家、中国信通院低代码/无代码推进中心特聘专家,《研发运营一体化(DEVOPS)能力成熟度模型》和《企业IT运维发展白皮书》核心作者,容器云技能大赛课程出品人,多个技术峰会演讲嘉宾,拥有丰富的企业级DevOps实战经验,专注企业IT数字化的转型和落地,致力于企业智慧运维体系的打造。

顾问专家:
李志伟 课题组特邀外部专家
twt社区云原生应用创新实践联盟—— 容器云自动化运维方向课题组特邀外部专家。 拥有14年以上金融及贷款行业从业经验,精通Tomcat、Nginx、websphere等主流中间件,精通K8s、docker容器,精通shell、python、ansilbe等自动化运维。

前言:

在本文中,我们分别从三个方面进行阐述容器云自动化引擎的技术选型,其中包括自动化引擎的工具选型,主要针对开源领域拥有社区资源最为丰富的三个工具,分别为puppet、ansible、saltstack。就三个工具从推荐场景、技术特性、优缺点比较三个方面进行分析和比对,在此过程中我们选择了ansible作为容器云平台的自动化引擎组件。在第二个部分主要为ansible和docker的集成,主要分为两点,第一点为ansible针对docker的模块介绍和基本案例,第二点为通过蓝绿发布的案例来阐述ansible和docker的集成带来的优点。在第三部分主要为ansible和kubernetes的集成,主要为常见的k8s模块的使用,以案例的方式来描述ansible如何管理kubernetes的资源。更多的以示例的方式,代入感更强,同时还对目前市面上较为成熟三种自动化引擎技术进行分析,选择更适合我们的自动化引擎技术ansible。

一、 自动化引擎工具选型

在自动化引擎技术选择中,我们选择了开源领域拥有社区资源最为丰富的三个工具,分别为puppet、ansible、saltstack。下面分为就三个工具从推荐场景、技术特性、优缺点比较三个方面进行罗列。

1、推荐场景

puppet就可用操作、模块和用户界面而言,它相较于ansible和saltstack而言是最全面的。puppet呈现了数据中心协调的全貌,几乎涵盖每一个运行系统,为各大操作系统提供了深入的工具。初始设置比较简单,只需要在需要加以管理的每个系统上安装主服务器和客户端代理软件。命令行接口(cli)简单直观,允许通过puppet命令下载和安装模块。然后,需要对配置文件进行更改,好让模块适合所需的任务;应接到指令的客户端与主服务器联系时,会更改配置文件,或者客户端通过立即触发更改配置文件的推送(push)来进行更改。还有一些模块可以提供和配置云服务器实例和虚拟服务器实例。所有模块和配置都使用基于ruby的puppet专属语言或者ruby本身构建而成,因而除了系统管理技能外,还需要编程专业知识。puppet企业版拥有最全面的web用户界面,允许使用主服务器上的预制模块和菜谱(cookbook),实时控制被管理的节点。web用户界面很适合用于管理,但是不允许对模块进行诸多配置。报告工具非常完善,提供了详细信息,以便了解代理软件运行如何、已做出什么样的变更。

ansible极其类似salt,而不太类似puppet。ansible关注的重点是力求精简和快速,而且不需要在节点上安装代理软件。因此,ansible通过ssh执行所有功能。ansible基于python;相比之下,puppet基于ruby。ansible可以通过git软件库克隆,安装到ansible主服务器上。安装完毕后,需要管理的节点被添加到ansible配置环境,ssh授权密钥被附加到每个节点上,这与运行ansible的用户有关。一旦完成了这步,ansible主服务器可以通过ssh与节点进行通信,执行所有必要的任务。为了与默认情况下不允许根ssh访问的操作系统或发行版协同运行,ansible接受sudo登录信息,以便在那些系统上以根用户的身份运行命令。ansible可以使用paramiko(基于ssh2协议的python实现)或标准ssh用于通信,不过还有一种加速模式,允许更快速、更大规模的通信。针对确保服务在运行,或者触发更新和重新启动之类的简单任务,ansible可以从命令行来运行,不需要使用配置文件。至于比较复杂的任务,ansible配置通过名为playbook的配置文件中的yaml语法来加以处理。playbook还可以使用模板来扩展其功能。ansible有一大批模块,可用于管理各种系统以及亚马逊弹性计算云(ec2)和openstack等云计算基础设施。可以用几乎任何一种语言来编写自定义ansible模块,只要模块输出是有效的json。ansible的web用户界面以ansibleworks awx的形式出现,但awx与cli并不直接联系在一起。这意味着,除非进行了同步过程,否则cli里面的配置元素不会出现在web用户界面中。你可以使用那个内置的同步工具,让两者保持一致,但需要按照预定计划运行同步工具。

salt类似ansible,因为它也是基于cli的工具,采用了推送方法实现客户端通信。它可以通过git或通过程序包管理系统安装到主服务器和客户端上。客户端会向主服务器提出请求,请求在主服务器上得到接受后,就可以控制该客户端了。salt可以通过普通的ssh与客户端进行通信,但如果使用名为minion的客户端代理软件,可以大大增强可扩展性。此外,salt含有一个异步文件服务器,可以为客户端加快文件服务速度,这完全是salt注重高扩展性的一个体现。与ansible一样,你可以直接通过cli,向客户端发出命令,比如启动服务或安装程序包;你也可以使用名为state的yaml配置文件,处理比较复杂的任务。还有“pillar”,这些是放在集中地方的数据集,yaml配置文件可以在运行期间访问它们。你可以直接通过cli,向客户端请求配置信息,比如内核版本或网络接口方面的详细信息。只要使用名为“grain”的库存元素,就可以描述客户端;这样一来,管理员可以轻松向某一种类型的服务器发出命令,不需要依赖已配置群组。比如说,只要使用一个cli命令,你就可以向运行某个内核版本的每个客户端发送命令。与puppet和ansible一样,salt也提供了大量的模块,以处理特定的软件、操作系统和云服务。自定义模块可以用python或pydsl来编写。除了unix管理外,salt的确提供windows管理功能,但它还是更擅长管理unix和linux系统。salt的web用户界面halite非常新,功能不如其他系统的web用户界面来得全面。它提供了事件日志和客户端状态的视图,能够在客户端上运行命令,但除此之外乏善可陈。salt的较大优点在于可扩展性和弹性。你可以有多个级别的主服务器。上游主服务器可以控制下游主服务器及其客户端。另一个优点在于对等系统,让客户端可以向主服务器提出问题,然后主服务器从其他服务器得到答案,提供全面信息。如果需要在实时数据库中查询数据,以便完成客户端的配置,这个优点就很方便。

2、技术特性

3、优缺点

puppet的优势在于模块由ruby或ruby子集编写;push命令可以即可触发变更;web界面生成处理报表、资源清单、实时节点管理;代理运行端进行详细、深入的报告和对节点进行配置。缺点在于相对其他工具较复杂,需学习puppet的dsl或ruby;安装过程缺少错误校验和产生错误报表。

saltstack的优势在于状态文件可用简单yaml配置模块或复杂的python/pydsl脚本;与客户端可以基于ssh或在被管节点安装代理;web界面可看到运行的工作、minion状态、事件日志、可在客户端执行命令;扩展能力极强。其缺点在于web界面不稳定与相对不完善;缺乏生成深度报告的能力。

ansible的优势在于模块可以用任何语言开发;备管节点不需要安装代理软件;有web管理界面、可配置用户、组、资源清单和执行playbook;安装、运行极其简单。其缺点在于对备管理节点为windows有待加强;web管理界面是内置的ansible的一部分;需导入资源清单;执行效率较低。

基于三者的技术比较、优缺点比较和场景适配,ansible最为适合以docker+kubernetes为代表的的容器云平台,因此本章节的自动化引擎技术选型阐述均以ansible为例。

二、 ansible和docker的作用以及使用场景

docker和它的容器工作流可封装、共享和部署相应的应用程序环境。ansible提供了相应的功能与 docker高度兼容,anbile使用一个强大的接口来管理远程服务器上的容器。在本小节中,通过ansible自身的可扩展设计功能提升docker的应用场景。

在《容器云平台架构》内容中,我们了解到,docker之所以如此流行,是因为它创造了一种采用方便的命令行接口(cli)和http api工具来封装、运行和维护容器的独特方式。这种简化降低了此技术的入门门槛,使得将应用程序及其运行时环境封装到一个简单 dockerfile 中的独立镜像中变得可行。docker 能够开发更复杂的项目,但基于docker+kubernetes的通用型容器云平台在使用中,仍需要配置这些容器。在本小节中,将通过一定的场景案例来展示 ansible通过清晰的语法带来配置管理器的特性。

ansible提供管理基础架构的功能,可以获得服务器定义的控制权,比如要安装的包或要复制的文件,并将该配置扩展到数千个服务器。ansible playbook构成了集群的目标状态的一种安全表示。它的yaml语法和庞大的模块列表生成了任何开发人员都能快速理解的易读性配置文件。ansible还具备其他自动化引擎不具备的特性,那就是是无代理的方式,这意味着在远程主机上运行命令,只需一个 ssh 连接即可。可以看到,ansible 可轻松地处理 devops复杂性。

docker和ansible一起工作提供持续交付和持续部署。作为一种具有多节点软件部署、配置管理和临时任务执行的工具,ansible在软件开发中得到了广泛的应用。ansible通过json格式使用模块,可以使用任何编程语言来实现标准输出。下面通过一段脚本来描述如何将ansible搭配docker一起使用。下面这段ansible脚本的例子描述了5个主要的作用。

-hosts:all
remote_user:vagrant
sudu:yes
roles:
-etcd
-confd
-docker
-nginx
-bdd

在上述的脚本中,前四个roles,etcd、confd、docker、nginx,确保了支持蓝绿部署的工具,下面是关于docker roles的解释。

在此过程中,最后一步为bdd role,通过执行蓝绿部署,完成项目的无损上线,确保零停机时间并能确保运行正确的应用程序,相应的步骤分别为。获取应用程序容器的最新版本;将旧的应用程序和新的应用程序并行运行;运行部署后的测试;通知etcd关于新版本的要素,如端口和名称;将nginx配置转换成行的版本;最后去除新版本的发布。在这个过程中,有三个重要的任务,任务一:模板资源add.toml的作用,其中confd用于描述模板、路径和要执行的命令。任务二:确保confd模板,如bdd.conf.tmpl已完成准备,confd和add.tom将在部署期间准备行的版本。任务三:确保脚本部署deploy-bdd.sh是可用,最后开始执行。具备过程如下。

1、 准备蓝绿部署脚本

2、 停止并删除任何现存的容器,不过当前版本的容器还在继续运行。

docker stop bdd-$color
docker rm bdd-$color

3、 将带有新版本的容器和现有的容器一起启动并并排运行,同时bdd辅助容器vfarcic/bdd也将被部署。

docker pull vfarcic/bdd
docker run –d –name bdd-$color –p $port:9000 vfarcic/bdd

4、 对于bdd辅助容器来说,在单元测试和功能测试是为容器构建过程运行的,因此为了确保部署部署的应用程序实现预期的目的,运行集成和压力测试也是必须的。以下为bdd场景使用的一段无头浏览器phantomjs的内容。

5、 在所有测试通过之后,使用etcd存储关于新版本的信息,并运行confd来更新nginx配置。在此之前,nginx会处理所有对旧版本的请求,现在用户将被重定向到这个新部署的版本。

etcdctl set /bdd/color $color
etcdctl set /bdd/port $color
etcdctl set /bdd/$color/port $port
etcdctl set /bdd/$color/port running
confd –onetime –backend etcd –node 127.0.0.1:4001

6、 这个阶段,将正式结合docker和ansible一起进行蓝绿部署,首先创建一个vagrant文件,它将会有一个linux虚拟机。接下来,运行ansible playbook,这会安装和配置所需的依赖。确保安装了git、vagrant、virtualbox之后,就可以部署应用程序了。

7、 运行以下命令开始部署vagrant provision,下一步,ssh到vm,然后版本从蓝色(端口9001)改为绿色(端口9002)。

除此之外,ansible还提供相应的模块来管理docker,在《容器云平台自动化体系规划设计》章节中,我们介绍了将云平台管理能力嵌入至devops体系中,在此我们也可以通过ansible来实现,使用docker、docker_image、docker_network和docker_service这样的ansible模块来管理docker。

1、docker模块是用于运行docker容器生命周期的原生ansible模块,对python版本要求>=2.6、docker-py>=0.3.0、the docker server>=0.10.0。下图为模块使用范例,确认mycontainer容器存在,如不存在则脚本会通过指定的镜像来创建这个容器,但不是继续往下运行。

2、docker_image模块是用于管理docker镜像,容器镜像在创建的时候被获取,可以将镜像达成tag并push保存在镜像仓库中,或者保存在压缩文件。对python版本要求>=2.6、docker-py>=1.7.0、docker api>=1.20,下图为模块使用范例。

3、docker_network模块用于管理docker容器网络,通过使用docker_network模块,可以创建和删除docker网络,也可以将容器连接到网络,同样可以可以创建一个带选型的网络,断开容器的同时删除网络。对python版本要求>=2.6、docker-py>=1.7.0、the docker server>=1.9.0,下图为模块使用范例。

4、docker_server模块,用于管理docker服务和容器,该模块对应docker compose的功能,支持compose的版本包括version1和version2,具体参数和内容参照docker-compose.yml进行查看,因内容过多,在此不再阐述。对python版本要求>=2.6、docker-compose>=1.7.0、docker api>=1.9.0、pyyaml>=3.11,下图为模块使用范例。

三、 ansible和docker的作用以及使用场景

在ansible的版本演进中,从kubernetes进行大规模使用支出,ansible也推出相应的模块来支持kubernetes,一共有五个模块,分别是k8s, k8s_facts, k8s_scale, kubernetes和oc。在实际使用过程中,其中kubernetes和oc模块因为实现逻辑不好用,在ansible 2.6 版本中已经废弃掉,推荐使用前三个。其中,k8s_scale来自ansible 2.5, k8s来自ansible 2.6, k8s_facts 来自 ansible 2.7。使用这三个模块的话,还需要安装openshift的python包。以下案例全部基于 ansible 2.7 版本。

1、 k8s模块的使用
k8s模块主要用于管理kubernetes的各种资源,下列脚本为创建namespace的写法。

如果要创建一个 service, 也可以使用如下面的写法。

可以看到 definition 里面就是原生的kubernetes里面的写法,而k8s模块的参数也较少,有利于快速的上手和开发。如果k8s模块和ansible lookup插件合用的话,可以写出更加简洁的代码,如下:

可以看到 kubernetes service 文件可以完全从task里面独立出来,独立后的写法就是原生的kubernetes的格式,大致和charts 的结构类似。基于此,可以使用这种方式替换掉helm 的模板功能,而且没有引入任何额外的依赖,所使用的是ansible 生成相关文件,由 kubernetes api直接处理。部署完成后,也可以脱离 ansible 继续通过 kubelet 命令维护这些资源。也正是由于这么简洁的实现,k8s 模块可以管理 kubernetes 和 openshift, 也可以管理各种crd资源。相比于helm, 这种方法的缺点在于yaml文件都需要独立开发,缺少社区维护的 charts。和helm维护的相比而言比较困难,安装也比较困难,前期需要准备的工作比较多。但是从另外一个角度来说,社区维护的 charts 做一些 demo尚可使用,在生产上使用,还是要做大量工作,如测试、压测以及结果分析。基于以上的成本分析,使用 ansible 所带来的额外的工作量也可以相应覆盖到直接使用社区提供的charts。

2、 k8s_scale和k8s_facts模块
在ansible所提供的kubernetes的模块中,k8s_scale和k8s_facts模块所提供是一些辅助性的功能,k8s_scale模块可以动态调整deployment的replicas个数,基本上等同于kubectl scale命令,但是这个功能基本可以使用k8s模块通过改变replicas参数来调整。具体范例如下。

k8s_facts模块可以检查某个资源是否存在,如果存在的话,还可以获得这个资源的yaml 文件描述,在某些由 ansible 流程控制中会有一些作用,可以根据当前 kubernets 里面资源情况,有选择的做一些动作。具体范例如下:

四、 总结

通过ansible的相关模块对docker和kubernetes进行集成,可以相应的提升自动化能力。将docker与ansible结合,会简化部署工作。在传统it环境中安装如jdk、web服务器等,要确保配置文件被正确配置,docker正常工作。另一方面,通过容器也简化了ansible的操作,一旦所有组件都已ready,容器云过程将会变得较为简单。在实践方面, ansible和docker语法也很相近,熟悉docker的基础上也较容易上手ansible。在kubernetes方面,虽然ansible所提供的支持模块并不是很多,如管理kubernetes的各种资源。在ansible流程驱动的场景,也能通过自动化引擎提升kubernetes在容器云平台中的自动化能力。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

4

添加新评论1 条评论

menglunyangmenglunyang系统工程师, 中国银行
2022-12-21 18:01
随着企业数字化转型,利用云原生解决方案已成为主流趋势,容器、Kubernetes、微服务、DevOps 等热门技术逐渐兴起和成熟。但随着容器云平台建设规模的增长和使用场景的增多,容器云平台运维方面逐步显露出了很多全新的问题与挑战。本文首先对比了主流自动化引擎工具,随后以ansible为例介绍了具体的使用场景和方法,解决了容器云平台运维方面存在的诸多痛点,对我们选择工具提供了很全面的借鉴意义。
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广