一、API资源对象CRD
CustomResourceDefinition(CRD) 允许自定义创建资源类型,Kubernetes API接口可以管理CRD资源。CRD已成为扩展Kubernetes的流行机制,在Kubernetes生态系统中的各种项目和框架中广泛使用,如Prometheus、Istio和Knative。
CRD基于OpenAPI v3 schem 进行规范:
-
apiVersion:指定所使用的 CRD API 的版本,此示例使用了 apiextensions.k8s.io/v1 版本。
-
kind:定义资源类型为 CustomResourceDefinition。
-
metadata:定义元数据,其中 name 字段指定了 CRD 的名称为 myresources.example.com。
-
spec:定义了 CRD 的规范。
-
group:指定 CRD 所属的 API 组,此示例中为 example.com。
-
versions:定义 CRD 的版本列表。
-
name:指定版本的名称,此示例中为 v1。
-
served:指定此版本是否由 API 服务器提供服务,设为 true 表示提供服务。
-
storage:指定此版本是否持久化存储数据,设为 true 表示持久化存储。
-
openAPIV3Schema: 指定自定义资源的 OpenAPI v3 架构定义
-
type:定义类型
-
properties:定义对象属性
-
name/age:自定义具体属性的名字
-
scope:指定资源的作用域,此示例中为 Namespaced,表示资源在命名空间级别进行管理。
-
names:定义了资源的名称相关信息。
-
plural:指定资源的复数形式名称,此示例中为 myresources。
-
singular:指定资源的单数形式名称,此示例中为 myresource。
-
kind:指定资源的类型名称,此示例中为 MyResource。
-
shortNames:指定资源的缩略名称列表,此示例中只包含一个缩略名称 mr。
二、认识Operator-理论知识
7.2.1 Operator 理论知识
1)Operator是什么
Operator:CRD+自定义Controller的实践应用。
Kubernetes Operator由CoreOS公司开发,它是一种自定义控制器,它扩展了 Kubernetes API 的功能,用于管理和自动化应用程序、服务或资源的生命周期。Operator 可以将复杂的操作封装到 Kubernetes 中,以便在集群中创建、配置、部署和管理特定类型的应用程序或服务。
2)Operator用来做什么
最基本的 Operator 用于部署,使用 kubectl apply 就可以创建一个用于响应 API 资源的数据库,但这比内置的 Kubernetes 资源(如 StatefulSets 或 Deployments)好不了多少。复杂的 Operator 将提供更大的价值。如果你想要对数据库进行伸缩该怎么办?
如果是 StatefulSet,你可以执行 kubectl scale statefulset my-db --replicas 3,这样就可以得到 3 个实例。但如果这些实例需要不同的配置呢?是否需要指定一个实例为主实例,其他实例为副本?如果在添加新副本之前需要执行设置步骤,那该怎么办?在这种情况下,可以使用 Operator。
-
按需部署一个应用程序,并自动配置,比如Prometheus
-
需要备份和恢复应用程序的状态,如MySQL数据库
-
处理应用程序代码的升级以及相关更改,例如数据库架构或额外的配置设置
-
发布一个服务,要让不支持Kubernetes API的应用程序能够发现
-
模拟整个或部分集群中的故障以测试其弹性
-
在没有内部成员选举程序的情况下为分布式应用程序选择领导者
三、认识Operator-初次上手
目前主流的Operator开发框架有两个:kubebuilder和Operator-sdk,核心都是使用官方的 controller-tools 和 controller-runtime。比如 kubebuilder 有着更为完善的测试与部署以及代码生成的脚手架等;而 operator-sdk 对 ansible operator 这类上层操作的支持更好一些。
下面基于kubebuilder,讲解如何开发Operator
3.1环境准备
Kubebuilder工作依赖go环境,所以需要安装go。
1)安装go
yum install -y golang.x86_64
#检查版本
go version
#设置代理
go env -w GOPROXY=https://goproxy.cn,direct
2)安装docker
配置yum仓库,安装docker
yum install -y docker-ce
启动服务
systemctl start docker
3)在K8S master 节点访问k8s集群
kubectl get node
4)安装kubebuilder
curl -k -L -o kubebuilder https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH)
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
测试:
kubebuilder version