701-703 API资源对象CustomResourceDefinition Operator 7.1-7.3

发布时间 2023-10-26 21:29:36作者: zhan0

一、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