中间件云原生利器:Operator,Operator是什么?

原创 吴就业 173 0 2023-06-03

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/5c6ef5da03b546729bf2fdacb7444ccf

作者:吴就业
链接:https://wujiuye.com/article/5c6ef5da03b546729bf2fdacb7444ccf
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

现在已经涌现一批新的在云原生背景下重新架构设计的中间件,即云原生中间件。这类中间件充分利用了云的特性,采用微服务架构设计,并且计算存储分离,支持容器化部署,可实现自动化运维。计算层和数据层都提供水平弹性扩缩容的支持。云原生中间件能很好的结合Serverless提供自动弹性扩缩容。

但是这些新的云原生中间件很难短时间内覆盖到企业项目中,企业走云原生这条道路,还需要考虑传统中间件如何上云的问题。最需要解决的是如何容器化部署,以及自动化运维。这就不得不借助Operator了。

Operator简介以及学习方法

简单概括,Kubernetes Operator实际就是自定义资源(CRD)+ 自定义资源控制器(Controller)。

那么Operator是如何做到的呢?这需要我们对Kubernetes的架构和工作原理有所理解。

例如,我们部署一个微服务,需要我们先编写Deployment.yml,然后执行kubectl命令apply一下,实际就是kubectl工具调用API创建Deployment资源,然后Kubernetes的Deployment资源控制器会监听到Deployment资源的创建,然后调度和创建Pod。

这里要说到client-go,client-go实际也是Kubernetes内置的资源控制器的底层sdk。可以获取、监听、创建、删除Kubernetes上的Pod、Service、Ingress等内置资源,以及自定义资源。

控制器通常是基于监听机制实现调谐逻辑,例如通过监听Pod资源删除,查询当前Pod数量,可以创建新的Pod保持期望的Pod数量。

常见的Operator-SDK,Kubebuilder工具,其底层都是对controller-runtime的封装,更底层就是基于client-go实现API操作资源。而controller-runtime框架是社区基于client-go之上封装的一个控制器处理的框架,方便我们开发Operator。

总结就是,Operator-SDK和Kubebuilder是开发Kubernetes Operator的脚手架工具,controller-runtime是开发Operator的框架,client-go则是框架的底层。

对于入门者,屏蔽低层不谈反而容易让人蒙圈,建议初学者在学习Operator-SDK或Kubebuilder之前,应该先学习了解Kubernetes的整个架构、工作原理,学习了解Kubernetes的API,然后学习了解client-go、controller-runtime。

为什么中间件云原生需要Operator

中间件的部署往往很复杂,不像业务服务大多数是无状态服务,不需要过多的运维操作。

例如部署Redis Cluster,不同节点不同配置,且启动有顺序要求,然后配置集群节点之间相互发现,为master节点分配槽位,配置主从节点交叉复制等。当然还有后续的运维操作,例如添加新的节点,移除一个节点,故障节点的恢复等。

以往我们的做法是将这一系列运维操作记录到文档,每次都根据这个文档去重复做这些操作,过程越复杂,过程中就越容易遗漏步骤或是出错。

想要实现将这类中间件部署到k8s上,并不能只靠StatefulSet就能实现,而Operator就能让我们将这些运维操作都用代码来实现,让这类中间件也能部署到k8s上。

中间件云原生改造一定需要Operator吗?

中间件容器化部署的几种形式:

  1. Operator通过自定义CR维护中间件的Deployment、Service等,并维护自定义CR的Status。(有状态应用)
  2. Operator与中间件部署在同一个容器中,同一个Deployment,但存在自定义CR。例如网关可能存在路由配置CR,Operator将路由配置CR转为网关可读取的json/yaml配置文件,并放到网关进程读取配置文件的目录下。(无状态应用)
  3. 直接将中间件部署打包Helm Chart,不需要Operator,不存在自定义CR。(无状态应用)

中间件容器化部署几种形式的优缺点:

  1. 需要额外部署Operator本身,有资源开销。
  2. 不需要额外资源部署Operator,Operator和中间件共用资源。
  3. 不存在Operator。

我们需要根据中间件具体架构和人工部署流程决定使用何种方式,建议:

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

Operator实战3:Operator开发过程遇到的问题

kubebuilder使用helm代替kustomize;代码改了但似乎没生效-镜像拉取问题; 使用ConfigMap替代Apollo配置中心的最少改动方案;环境变量的注入以及传递;Kubebuilder单测跑不起来;Helm chart和finalizer特性冲突问题。

Operator实战2:实现webhook修改Job的最大重试次数

terraform-controller默认Job会一直重试,导致重复申请资源。

Operator实战1:使用kubebuilder开发一个部署web服务的Operator

举一个非常简单的需求场景,仅用于介绍如何使用kubebuilder开发一个Operator,非真实需求场景。

中间件容器化部署实现方案的前期调研

中间件容器化部署是为了实现GitOps模式的持续交付,实现部署即代码。痛点在于大多数中间件都是有状态的,本篇介绍如何实现有状态中间件的容器化部署。

从2023年北京站全球架构师峰会看云原生发展趋势

Serverless、ServiceMesh是2023年全球架构师峰会(北京站)出现频率最高的词,本篇将从这两个方面分享笔者参会了解到的一些信息。

云原生企业级实战笔记专栏开篇介绍

在实战的过程中,我自己做了很多笔记,从模糊到清晰,逐渐了解云原生架构,不仅参与了中间件容器化架构改造与自动化部署Operator开发,还参与了IaC基础设施即代码的开发,kubevela terraform Addon插件开发,从应用层到中间件到基础设施都有参与,整条链路的一些核心原理都非常清晰。