共计 2842 个字符,预计需要花费 8 分钟才能阅读完成。
一、应用背景
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
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 包名。
生成的目录构造如下:
其中,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 的定义。
同时减少了一些配置文件和 Controller:
其中,CRD 目录下的文件是对 CRD 的定义,rbac 目录下的文件是新增的角色定义,samples 目录下的文件是创立 CR 的示例文件。
在新生成的 controllers 文件夹下,kaiwucluster_controller.go 中定义了次要的业务逻辑,次要实现在 Reconcile 函数中:
开发过程中应用的 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 0 12m