摘要:Nebula Operator 是 Nebula Graph 在 Kubernetes 系统上的自动化部署运维插件。在本文,你将了解到 Nebula Operator 的特性及它的工作原理。
Nebula Graph 是一个高性能的分布式开源图数据库,从架构上可以看出,一个完整的 Nebula Graph 集群由三类服务组成,即 Meta Service, Query Service ( Computation Layer )和 Storage Service ( Storage Layer )。
每类服务都是一个由多副本组件组成的集群,在 Nebula Operator 中,我们分别称这三类组件为: Metad / Graphd / Storaged 。
在了解了 Nebula Graph 核心组件的功能后,我们可以得出一些结论:
因此,为了充分发挥 Nebula Graph 原生具备的弹性扩缩、故障转移等能力,也为了降低对 Nebula Graph 集群的运维管理门槛,我们开发了 Nebula Operator 。
Nebula Operator 是 Nebula Graph 在 Kubernetes 系统上的自动化部署运维插件,依托于 Kubernetes 自身优秀的扩展机制,我们把 Nebula Graph 运维领域的知识,以 CRD + Controller
的形式全面注入到 Kubernetes 系统中,让 Nebula Graph 成为真正的云原生图数据库。
为了能够更好的理解 Nebula Operator 的工作原理,让我们先回顾一下什么是 Operator
Operator 并不是什么很新的概念,早在 2017 年,就有 CoreOS 公司推出了 Etcd Operator 。Operator 的初衷是为了扩展 Kubernetes 功能,以更好的管理有状态应用,这得益于 Kubernetes 的两大核心概念:声明式 API 和控制循环( Control Loop)。
我们可以用一段伪代码来描述这一过程。
在集群中声明对象 X 的期望状态并创建 X
for {
实际状态 := 获取集群中对象 X 的实际状态
期望状态 := 获取集群中对象 X 的期望状态
if 实际状态 == 期望状态 {
什么都不做
} else {
执行事先规定好的编排动作,将实际状态调协为期望状态
}
}
在 Kubernetes 系统内,每一种内置资源对象,都运行着一个特定的控制循环,将它的实际状态通过事先规定好的编排动作,逐步调整为最终的期望状态。
对于 Kubernetes 系统内不存在的资源类型,我们可以通过添加自定义 API 对象的方式注册。常见的方法是使用 CustomResourceDefinition ( CRD )和 Aggregation ApiServer ( AA )。Nebula Operator 就使用 CRD 注册了一个 "Nebula Cluster" 资源,和一个 "Advanced Statefulset" 资源。
在注册了上述自定义资源之后,我们就可以通过编写自定义控制器的方式来感知自定义资源的状态变化,并按照我们编写的策略和逻辑去自动地运维 Nebula Graph,让集群的实际状态朝着期望状态趋近。这也是 Nebula Operator 降低用户运维门槛的核心原理。
apiVersion: nebula.com/v1alpha1
kind: NebulaCluster
metadata:
name: nebulaclusters
namespace: default
spec:
graphd:
replicas: 1
baseImage: vesoft/nebula-graphd
imageVersion: v2-preview-nightly
service:
type: NodePort
externalTrafficPolicy: Cluster
storageClaim:
storageClassName: fast-disks
metad:
replicas: 3
baseImage: vesoft/nebula-metad
imageVersion: v2-preview-nightly
storageClaim:
storageClassName: fast-disks
storaged:
replicas: 3
baseImage: vesoft/nebula-storaged
imageVersion: v2-preview-nightly
storageClaim:
storageClassName: fast-disks
schedulerName: nebula-scheduler
imagePullPolicy: Always
我们在这里展示了一个简单的 Nebula Cluster 实例,如果你想要扩展 Storaged 的副本数量至 10,你只需要简单修改 .spec.storaged.replicas
参数为 10,剩下的运维操作则由 Nebula Operator 通过控制循环来完成。
至此,想必你已经对 Nebula Graph 和 Operator 有了一个初步的认知,接下来,让我们来列举目前 Nebula Operator 已经具备了哪些能力,让你能更加深刻的体会到使用 Nebula Operator 带来的一些实际好处。
作者有话说:Hi,我是刘鑫超,图数据库 Nebula Graph 的研发工程师,如果你对此文有疑问,欢迎来我们的 Nebula Graph 论坛交流下心得~~