作者|匡大虎、阚俊宝
基于Kubernetes平台,我们可以轻松的搭建一些简单的无状态应用,例如对于一些常见的webapps或是联通端后台程序,开发者甚至不用非常了解Kubernetes就可以借助Deployment,Service这种基本单元模型建立出自己的应用拓扑并曝露相应的服务。因为无状态应用的特点支持其在任意时刻进行布署、迁移、升级等操作,Kubernetes现有的ReplicaSets,ReplicationControllers,Services等元素已然足够支撑起无状态应用对于手动扩缩容、实例间负载均衡等基本需求。
在管理简单的有状态应用时,我们可以借助社区原生的StatefulSet和PV模型来建立基础的应用拓扑,帮助实现相应的持久化储存,按次序布署、顺序扩容、顺序滚动更新等特点。
而随着Kubernetes的蓬勃发展,在数据剖析,机器学习等领域陆续出现了一些场景更为复杂的分布式应用系统,也给社区和相关应用的开发运维人员提出了新的挑战:
而所有的那些正是Operator希望解决的问题,本文我们将首先了解到Operator是哪些redhat linux 9.0安装firefox浏览器详解,然后逐渐了解到Operator的生态建设,Operator的关键组件及其基本的工作原理,下边让我们来一探究竟吧。
初遇Operator
首先让我们一上去看下哪些是Operator以及它的诞生和发展历程。
1.哪些是Operator
CoreOS在2016年末提出了Operator的概念,当时的一段官方定义如下:
“AnOperatorrepresentshumanoperationalknowledgeinsoftware,toreliablymanageanapplication.”
对于普通的应用开发者或是大多数的应用SRE人员,在她们的日常开发运维工作中,都须要基于自身的应用背景和领域知识建立出相应的手动化任务满足业务应用的管理、监控、运维等需求。在这个过程中,Kubernetes自身的基础模型元素已然难以支撑不同业务领域下复杂的手动化场景。
与此同时,在云原生的大背景下,生态系统是评判一个平台成功与否的重要标准,而广大的应用开发者作为Kubernetes的最直接用户和服务推广者,她们的业务需求更是Kubernetes的生命线。于是,微软率先提出了ThirdPartyResource的概念,容许开发者依照业务需求以插件化方式扩充出相应的K8sAPI对象模型,同时提出了自定义controller的概念用于编撰面向领域知识的业务控制逻辑,基于ThirdPartyResource,Kubernetes社区在1.7版本中提出了customresourcesandcontrollers的概念,这正是Operator的核心概念。
基于customresources和相应的自定义资源控制器,我们可以自定义扩充Kubernetes原生的模型元素,这样的自定义模型可以犹如原生模型一样被KubernetesAPI管理,支持kubectl命令行;同时Operator开发者可以像使用原生API进行应用管理一样,通过申明式的形式定义一组业务应用的期望终态,但是依据业务应用的自身特性进行相应控制器逻辑编撰,借此完成对应用运行时刻生命周期的管理并持续维护与期望终态的一致性。这样的设计范式促使应用布署者只须要专注于配置自身应用的期望运行状态,而无需再投入大量的精力在手工布署或是业务在运行时刻的冗长运维操作中。
简单来看,Operator定义了一组在Kubernetes集群中打包和布署复杂业务应用的方式,它可以便捷地在不同集群中布署并在不同的顾客间传播共享;同时Operator还提供了一套应用在运行时刻的监控管理方式,应用领域专家通过将业务关联的运维逻辑编撰融入到operator自身控制器中,而一个运行中的Operator如同一个7*24不间断工作的优秀运维团队linux系统好用吗,它可以时刻监控应用自身状态和该应用在Kubernetes集群中的关注风波,并在微秒级别基于期望终态作出对窃听风波的处理,例如对应用的手动化容灾响应或是滚动升级等中级运维操作。
进一步讲,Operator的设计和实现并不是千篇一律的,开发者可以按照自身业务需求,不断变迁应用的自定义模型,同时面向具体的手动化场景在控制器中扩充相应的业务逻辑。好多Operator的出现都是起源于一些相对简单的布署和配置需求,并在后续演变中不断建立补充对复杂运维需求的手动化处理。
2.Operator的发展
时至今日,Kubernetes早已确立了自己在云原生领域平台层开源软件中的绝对地位,我们可以说Kubernetes就是现今容器编排的事实标准;而在Kubernetes项目强悍的影响力下,越来越多的企业级分布式应用选择拥抱云原生并开始了自己的容器化公路,而Operator的出现无疑极大的加速了这种传统的复杂分布式应用的上云过程。无论在生态还是生产领域,Operator都是容器应用布署上云过程中广受欢迎的实现规范,本小节就让我们来一起回顾下Operator的诞生和发展历史。
2014到2015年,Docker无疑是容器领域的绝对霸主,容器技术自身敏捷、弹性和可移植性等优势使其迅速成为了当时炙手可热的焦点。在这个过程中,尽管市场上涌现了大量应用镜像和技术分享,我们却很难在企业生产级别的分布式系统中找寻到容器应用的成功案例。容器技术的本质是提供了主机虚拟层之上的隔离,这样的隔离其实带来了敏捷和弹性的优势,但同时也给容器和外部世界的交互带来了多一层的障碍;尤其是面向复杂分布式系统中,在处理自身以及不同容器间状态的依赖和维护问题上,常常须要大量的额外工作和依赖组件。这也成为了容器技术在云原生应用生产化公路上的一个瓶颈。
与此同时,微软于2014年基于其内部的分布式底层框架Borg推出了Kubernetes并完成了第一次代码递交。
2015年,Kubernetesv1.0版本即将发布,同时云原生估算基金会CloudNativeComputingFoundation,简称CNCF)即将组建,基于云原生这个大背景,CNCF旨在于维护和集成优秀开源技术以支撑编排容器化微服务构架应用。
2016年是Kubernetes步入主干道redhat linux 9.0安装firefox浏览器详解,开始蓬勃发展的一年。这一年的社区,开发者们从最初的种种顾虑转为对Kubernetes的大力青睐,无论从commit数目到个人贡献者数目都有了明显下降;同时越来越多的企业选择Kubernetes作为生产系统容器集群的编排引擎,而以Kubernetes为核心建立企业内部的容器生态早已开始逐步成为云原生大背景下业界的共识。也正是在这一年,CoreOS即将推出了Operator,借以通过扩充Kubernetes原生API的形式为Kubernetes应用提供创建、配置以及运行时刻生命周期管理能力,与此同时用户可以借助Operator便捷的对应用模型进行更新、备份、扩缩容及监控等多种复杂运维操作。
在Kubernetes实现容器编排的核心思想中,会使用控制器(Controller)模式对etcd里的API模型对象变化保持不断的窃听(Watch),并在控制器中对指定风波进行响应处理,针对不同的API模型可以在对应的控制器中添加相应的业务逻辑,通过这些方法完成应用编排中各阶段的风波处理。而Operator正是基于控制器模式,容许应用开发者通过扩充KubernetesAPI对象的方法,将复杂的分布式应用集群具象为一个自定义的API对象,通过对自定义API模型的恳求可以实现基本的运维操作,而在Controller中开发者可以专注实现应用在运行时刻管理中遇见的相关复杂逻辑。
在当时,率先提出这些扩充原生API对象进行应用集群定义框架的并不是CoreOS,而是当时还在微软的Kubernetes创始人BrendanBurns;正是Brendan早在1.0版本发布前就意识到了KubernetesAPI可扩充性对Kubernetes生态系统及其平台自身的重要性,并建立了相应的API扩充框架,微软将其命名为ThirdPartyResource,简称“TPR”。
CoreOS是最早的一批基于Kubernetes平台提供企业级容器服务解决方案的厂商之一,她们很敏锐地捕捉到了TPR和控制器模式对企业级应用开发者的重要价值;并很快由邓洪超等人基于TPR实现了历史上第一个Operator:etcd-operator。它可以让用户通过短短的几条命令就快速的布署一个etcd集群,但是基于kubectl命令行一个普通的开发者就可以实现etcd集群滚动更新、灾备、备份恢复等复杂的运维操作,极大的增加了etcd集群的使用门槛,在很短的时间就成为当时K8s社区关注的焦点项目。
与此同时,Operator以其插件化、自由化的模式特点,迅速吸引了大批的应用开发者,一时间好多市场上主流的分布式应用均出现了对应的Operator开源项目;而好多云厂商也迅速跟进,纷纷提出基于Operator进行应用上云的解决方案。Operator在Kubernetes应用开发者中的热度大有星火燎原之势。
尽管Operator的出现遭到了大量应用开发者的热捧,而且它的发展之路并不是一帆风顺的。对于微软团队而言,Controller和控制器模式仍然以来是作为其API体系内部实现的核心,未曾曝露给终端应用开发者,Kubernetes社区关注的焦点也更多的是集中在PaaS平台层面的核心能力。而Operator的出现打破了社区传统意义上的格局,对于微软团队而言,Controller作为Kubernetes原生API的核心机制,应当交由系统内部的ControllerManager组件进行管理,而且遵照统一的设计开发模式,而不是像Operator那样交由应用开发者自由地进行Controller代码的编撰。
另外Operator作为Kubernetes生态系统中与终端用户构建联接的桥梁,作为Kubernetes项目的设计和捐助者,微软其实也不希望错失其中的主导权。同时BrendanBurns忽然宣布加盟谷歌的消息,也进一步激化了微软团队与Operator项目之间的矛盾。
于是,2017年开始微软和RedHat开始在社区推广Aggregatedapiserver,应用开发者须要根据标准的社区规范编撰一个自定义的apiserver,同时定义自身应用的API模型;通过原生apiserver的配置更改,扩充apiserver会随着原生组件一齐布署,但是限制自定义API在系统管理组件下进行统一管理。以后,微软和RedHat开始在社区大力推广使用聚合层扩充KubernetesAPI,同时建议废弃TPR相关功能。
但是,巨大的压力并没有让Operator昙花一现,就此消失。相反,社区大量的Operator开发和使用者依旧拥护着Operator清晰自由的设计理念,继续维护演变着自己的应用项目;同时好多云服务提供商也并没有舍弃Operator,Operator简约的布署方法和易复制,自由开放的代码实现方法使其维护住了大量忠实粉丝。在用户的选择面前,强如微软,红帽这样的大鳄也不得不作出忍让。最终,TPR并没有被彻底废弃,而是由CustomResourceDefinition(简称CRD)这个现在早已广为人知的资源模型范式取代。
CoreOS官方博客也第一时间发出了回应文章指导用户尽早从TPR迁移到CRD:
2018年初,RedHat完成了对CoreOS的竞购,并在几个月后发布了OperatorFramework,通过提供SDK等管理工具的方法进一步增加了应用开发与Kubernetes底层API知识体系之间的依赖。至此,Operator进一步巩固了其在Kubernetes应用开发领域的重要地位。
3.Operator的社区与生态
Operator开放式的设计模式使开发者可以依照自身业务自由的定义服务模型和相应的控制逻辑,可以说一经推出就在社区造成了巨大的反响。
一时间,基于不同种类的业务应用涌现了一大批优秀的开源Operator项目,我们可以在这儿找到其中好多的典型案例,比如对于运维要求较高的数据库集群,我们可以找到像etcd、Mysql、PostgreSQL、Redis、Cassandra等好多主流数据库应用对应的Operator项目,这种Operator的推出有效的简化了数据库应用在Kubernetes集群上的布署和运维工作;在监控方向,CoreOS开发的prometheus-operator尽快成为社区里的名星项目linux命令行,Jaeger、FluentD、Grafana等主流监控应用也或由官方或由开发者迅速推出相应的Operator并持续演化;在安全领域,Aqua、Twistlock、Sisdig等各大容器安全厂商也不甘落后,通过Operator的方式简化了相对门槛较高的容器安全应用配置,另外社区中像cert-manager、vault-operator这种热门项目也在好多生产环境上得到了广泛应用。
可以说operator在很短的时间就成为了分布式应用在Kubernetes集群中布署的事实标准,同时Operator应用这么广泛的覆盖面也使它超过了分布式应用这个原始的范畴,成为了整个Kubernetes云原生应用下一个重要存在。
随着Operator的持续发展,已有的社区共享模式早已逐渐不能满足广大开发者和K8s集群管理员的需求,怎么快速找寻到业务须要的可用Operator?怎样给生态中大量的Operator定义一个统一的质量标准?那些都成为了刚才完成竞购的RedHat大鳄们眼里亟待解决的问题。
于是我们看见RedHat在年初联合AWS、谷歌、微软等大厂推出了OperatorHub.io,希望其作为Kubernetes社区的延展,向广大operator用户提供一个集中式的公共库房,用户可以在库房网站上轻松的搜索到自己业务应用对应的Operator并在向导页的指导下完成实例安装;同时,开发者还可以基于OperatorFramework开发自己的Operator并上传分享至库房中。
右图为一个Operator项目从开发到开源到被使用的全生命周期流程:
(Operator开源生命周期流程图)
主要流程包括:
小结
本文主要介绍了Operator的基本概念,让您了解Operator的应用场景和发展历程。
Operator早已成为Kubernetes生态的一个重要设计模式,Kubernetes从PaaS层面提供整套集群、应用编排的框架,而用户通过Operator的形式扩充自己的应用,并实现与Kubernetes的融合。文章同时也介绍了使用Operator的生命周期流程,您可以结合自己的业务场景实现自己的Operator组件。
作者简介
匡大虎阿里云中级技术专家,从事Kubernetes和容器相关产品的开发。尤其关注云原生安全,是阿里云容器服务云原生安全核心成员。
阚俊宝阿里云容器服务技术专家,专注Kubernetes、Docker、云储存领域,是阿里云CSI项目的核心维护者。
“阿里巴巴云原生关注微服务、Serverless、容器、ServiceMesh等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”