Operator-sdk 在 KaiwuDB 容器云中的使用

Operator-sdk 在 KaiwuDB 容器云中的使用_第1张图片

一、使用背景

KaiwuDB Operator 是一个自动运维部署工具,可以在 Kubernetes 环境上部署 KaiwuDB集群,借助 Operator 可实现无缝运行在公有云厂商提供的 Kubernetes 平台上,让 KaiwuDB 成为真正的 Cloud-Native 数据库。

使用传统的自动化工具会带来了很高的部署和运维成本,部分自动化部署和运维工具如 Puppet/Chef/SaltStack/Ansible,由于缺乏全局状态管理,不能及时对各种异常情况做自动故障转移,并且很难发挥分布式系统的弹性伸缩能力。除外还需要写大量的 DSL ,甚至出现与 Shell 脚本一起混合使用的情况,这将带来可移植性较差,维护成本比较高等问题。

在云时代,各大厂商都会提供托管的 Kubernets 集群,越来越多的应用跑在了 Kubernetes 管理的容器中,传统部署在 Kubernetes 平台的应用可以不用绑定在特定云平台,也能轻松实现在各种云平台之间的迁移,其容器化打包和发布方式也避免了对操作系统环境的依赖。

二、什么是 Operator

Operator 是由 CoreOS 开发的,用来扩展 Kubernetes api,是一个特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。Operator 基于 Kubernetes 的资源和控制器的概念构建,但同时又涵盖了应用程序特定的领域知识。在 Kubernetes 官方文档中,对 Operator 的定义如下:

Operators are software extensions to Kubernetes that make use of custom resources to manage applications and their components. Operators follow Kubernetes principles, notably the control loop.

简单来说:Operator = 定制资源(CRD) + 控制器。

1. 定制资源(CRD)

Kubernetes 提供了一系列的资源,包括 Statefulset、Service、Configmap 等。但是这些资源并不能完全满足使用需求,例如在 K8s 中部署 Kaiwu 应用时,需定制一个 Kaiwu 应用资源,CRD(Custom Resource Definition)就承担了一个说明书的角色,让 Kubernetes 来认识这个自定义资源 CR。有了 CRD 之后,我们可以自由地增加各种与 Pod 平级的资源。

2. Controller

Controller 的作用就是监听指定对象的新增、删除、修改等变化,并针对这些变化做出相应的响应。

Operator-sdk 在 KaiwuDB 容器云中的使用_第2张图片

三、如何使用Operator-sdk

Operator-sdk 由 CoreOS 开源,它是用于构建 Kubernetes 原生应用的 SDK,它提供更高级别的 api、抽象和项目脚手架。使用 Kubernetes 中原生的对象来部署和管理复杂的应用程序不是那么容易,尤其是要管理整个应用的生命周期、组件的扩缩容,我们之前通常是编写各种脚本,通过调用 Kubernetes 的命令行工具来管理 Kubernetes 上的应用。

现在可以通过 CRD(CustomResourceDefinition)来自定义这些复杂操作,通过将运维的知识封装在自定义 api 里来减轻运维人员的负担。同时,我们还可以像操作 Kubernetes 的原生资源对象一样,使用 kubectl 来操作 CRD。

1. 初始化项目

operator-sdk init --domain inspur.com --repo github.com/inspur/kaiwu-operator

--domain 表示 api 组的后缀;

--repo 表示本工程的 golang 包名。

生成的目录结构如下:

Operator-sdk 在 KaiwuDB 容器云中的使用_第3张图片

其中,config 目录下是所有的 yaml 配置文件,Dockerfile 用于生成 docker 镜像,Makefile 是编译控制文件,main.go 是程序入口文件。

2. 添加 CRD 和 Controller

operator-sdk create api --group kaiwu --version v1 --kind KaiwuCluster --resource=true --controller=true

通过脚手架生成一个 CRD 和 Controller 的 api, 生成了一个目录包含 api 的结构体定义和 Controller 代码。在 api/v1 目录下新增了 3 个 go 文件,其中最主要文件是 kaiwucluster_types.go,是对新增 CRD 的定义。

Operator-sdk 在 KaiwuDB 容器云中的使用_第4张图片

同时增加了一些配置文件和 Controller:

Operator-sdk 在 KaiwuDB 容器云中的使用_第5张图片

其中,CRD 目录下的文件是对 CRD 的定义,rbac 目录下的文件是新增的角色定义,samples目录下的文件是创建 CR 的示例文件。

在新生成的 controllers 文件夹下,kaiwucluster_controller.go 中定义了主要的业务逻辑,主要实现在 Reconcile 函数中:

Operator-sdk 在 KaiwuDB 容器云中的使用_第6张图片

开发过程中使用的 api 接口包:

· corev1 “k8s.io/api/core/v1” 核心api,提供核心结构和接口,yaml中常用的 Spec 定义在此。

· metav1 “k8s.io/apimachinery/pkg/apis/meta/v1” yaml 中常用的 metadata 定义,ObjectMeta,LabelSelector 等基本在此。

· appsv1 “k8s.io/api/apps/v1” 常用的创建的 CRD 或者已经存在的rd等都在此,比如 Deployments,Pod,Service 等等。

3. 部署运行

方式一:本地运行,主要用于研发和测试阶段,在项目根目录运行:

make generate && make manifests && make install && make run

方式二:集群部署:

(1)make

$ make generate && make manifests && make install

(2)构建镜像

$ make docker-build IMG=inspur/kaiwu-operator:v1$ docker images |grep kaiwuinspur/kaiwu-operator v1 d15d88ddd113 About a minute ago 965MB

(3)运行

$ make deploy IMG = inspur/kaiwu-operator:v1

(4)CRD 确认

$ kubectl get crdNAME CREATED ATkaiwuclusters.kaiwu.inspur.com 2022-10-25T08:49:35Z

(5)查看状态

$ kubectl get po –n kaiwu-operator-systemNAME READY STATUS RESTARTS AGEkaiwu-operator-controller-manager-6bb7b666f-2v4nq 1/1 Running 012m

你可能感兴趣的:(kaiwudb,Operator-sdk)