本文我们将首先了解到 Operator 是什么,之后逐步了解到 Operator 的生态建设,Operator 的关键组件及其基本的工作原理。

介绍

基于 Kubernetes 平台,我们可以轻松的搭建一些简单的无状态应用,比如对于一些常见的 web apps 或是移动端后台程序,开发者甚至不用十分了解 Kubernetes 就可以利用 Deployment,Service 这些基本单元模型构建出自己的应用拓扑并暴露相应的服务。由于无状态应用的特性支持其在任意时刻进行部署、迁移、升级等操作,Kubernetes 现有的 ReplicaSets、Deployment、Services 等资源对象已经足够支撑起无状态应用对于自动扩缩容、实例间负载均衡等基本需求。

在管理简单的有状态应用时,我们可以利用社区原生的 StatefulSet 和 PV 模型来构建基础的应用拓扑,帮助实现相应的持久化存储,按顺序部署、顺序扩容、顺序滚动更新等特性。

而随着 Kubernetes 的蓬勃发展,在数据分析,机器学习等领域相继出现了一些场景更为复杂的分布式应用系统,也给社区和相关应用的开发运维人员提出了新的挑战:

而所有的这些正是 Operator 希望解决的问题,本文我们将首先了解到 Operator 是什么,之后逐步了解到 Operator 的生态建设,Operator 的关键组件及其基本的工作原理,下面让我们来一探究竟吧。

初识 Operator

首先让我们一起来看下什么是 Operator 以及它的诞生和发展历程。

1. 什么是 Operator

CoreOS 在 2016 年底提出了 Operator 的概念,当时的一段官方定义如下:

“An Operator represents human operational knowledge in software, to reliably manage an application.”

对于普通的应用开发者或是大多数的应用 SRE 人员,在他们的日常开发运维工作中,都需要基于自身的应用背景和领域知识构建出相应的自动化任务满足业务应用的管理、监控、运维等需求。在这个过程中,Kubernetes 自身的基础模型元素已经无法支撑不同业务领域下复杂的自动化场景。

与此同时,在云原生的大背景下,生态系统是衡量一个平台成功与否的重要标准,而广大的应用开发者作为 Kubernetes 的最直接用户和服务推广者,他们的业务需求更是 Kubernetes 的生命线。于是,谷歌率先提出了 Third Party Resource 的概念,允许开发者根据业务需求以插件化形式扩展出相应的 K8s API 对象模型,同时提出了自定义 controller 的概念用于编写面向领域知识的业务控制逻辑,基于 Third Party Resource,Kubernetes 社区在 1.7 版本中提出了custom resources and controllers 的概念,这正是 Operator 的核心概念。

基于 custom resources 和相应的自定义资源控制器,我们可以自定义扩展 Kubernetes 原生的模型元素,这样的自定义模型可以如同原生模型一样被 Kubernetes API 管理,支持 kubectl 命令行;同时 Operator 开发者可以像使用原生 API 进行应用管理一样,通过声明式的方式定义一组业务应用的期望终态,并且根据业务应用的自身特点进行相应控制器逻辑编写,以此完成对应用运行时刻生命周期的管理并持续维护与期望终态的一致性。这样的设计范式使得应用部署者只需要专注于配置自身应用的期望运行状态,而无需再投入大量的精力在手工部署或是业务在运行时刻的繁琐运维操作中。