KaiwuDBkaiwudb logo

KaiwuDB 技术博客专区

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

2023-03-28

标签: Operator-sdk


一、使用背景





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 的作用就是监听指定对象的新增、删除、修改等变化,并针对这些变化做出相应的响应。


1.png



三、如何使用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 包名。

生成的目录结构如下:

2.png

其中,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 的定义。

3.png

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

4.png

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

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

5.png

开发过程中使用的 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 kaiwu
inspur/kaiwu-operator v1 d15d88ddd113 About a minute ago 965MB

(3)运行
$ make deploy IMG = inspur/kaiwu-operator:v1

(4)CRD 确认

$ kubectl get crd
NAME CREATED AT
kaiwuclusters.kaiwu.inspur.com 2022-10-25T08:49:35Z

(5)查看状态

$ kubectl get po –n kaiwu-operator-system
NAME READY STATUS RESTARTS AGE
kaiwu-operator-controller-manager-6bb7b666f-2v4nq 1/1 Running 0 12m

免费体验 KaiwuDB 全新功能

立即体验

关于我们
联系我们

KaiwuDB B站

KaiwuDB
B站

KaiwuDB 微信公众号

KaiwuDB
微信公众号

© 上海沄熹科技有限公司 Shanghai Yunxi Technology Co., Ltd.    沪ICP备2023002175号-1
400-624-5688-7
1V1 方案咨询
marketing@kaiwudb.org.cn