This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.5.3. 创建基于 Go 的 Operator
Operator SDK 中的 Go 编程语言支持可以利用 Operator SDK 中的 Go 编程语言支持,为 Memcached 构建基于 Go 的 Operator 示例、分布式键值存储并管理其生命周期。
Kubebuilder 作为基于 Go 的 Operator 的构建解决方案嵌入 Operator SDK 中。
5.3.1. 使用 Operator SDK 创建基于 Go 的 Operator 复制链接链接已复制到粘贴板!
Operator SDK 可简化 Kubernetes 原生应用程序的构建,构建该应用程序原本需要深入掌握特定于应用程序的操作知识。SDK 不仅降低了这一障碍,而且有助于减少许多常见管理功能(如计量或监控)所需的样板代码量。
本流程介绍了使用 SDK 提供的工具和库创建简单 Memcached Operator 的示例。
先决条件
- 开发工作站上安装 operator SDK v0.19.4 CLI
-
基于 Kubernetes 的集群(v1.8 或更高版本,支持
apps/v1beta2
API 组,如 OpenShift Container Platform 4.6)上已安装 operator Lifecycle Manager(OLM) -
使用具有
cluster-admin
权限的账户访问该集群 -
已安装 OpenShift CLI(
oc
)v4.6+
流程
创建 Operator 项目:
为项目创建一个目录:
mkdir -p $HOME/projects/memcached-operator
$ mkdir -p $HOME/projects/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 进入该目录:
cd $HOME/projects/memcached-operator
$ cd $HOME/projects/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 激活对 Go 模块的支持:
export GO111MODULE=on
$ export GO111MODULE=on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
operator-sdk init
命令以初始化项目:operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operator
$ operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意operator-sdk init
命令默认使用go.kubebuilder.io/v2
插件。
更新 Operator 以使用支持的镜像:
在项目根级别 Dockerfile 中,更改默认运行程序镜像引用:
FROM gcr.io/distroless/static:nonroot
FROM gcr.io/distroless/static:nonroot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 改为:
FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
根据 Go 项目版本,您的 Dockerfile 可能包含
USER 65532:65532
或USER nonroot:nonroot
指令。在这两种情况下,删除该行,因为受支持的 runner 镜像不需要该行。 在
config/default/manager_auth_proxy_patch.yaml
文件中,修改image
值:gcr.io/kubebuilder/kube-rbac-proxy:<tag>
gcr.io/kubebuilder/kube-rbac-proxy:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用支持的镜像:
registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.6
registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.6
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
通过替换以下行,更新 Makefile 中的
test
目标,以安装后续构建过程中所需的依赖项:例 5.1. 现有
test
目标test: generate fmt vet manifests go test ./... -coverprofile cover.out
test: generate fmt vet manifests go test ./... -coverprofile cover.out
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下行:
例 5.2. 更新了
test
目标ENVTEST_ASSETS_DIR=$(shell pwd)/testbin test: manifests generate fmt vet ## Run tests. mkdir -p ${ENVTEST_ASSETS_DIR} test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.7.2/hack/setup-envtest.sh source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./... -coverprofile cover.out
ENVTEST_ASSETS_DIR=$(shell pwd)/testbin test: manifests generate fmt vet ## Run tests. mkdir -p ${ENVTEST_ASSETS_DIR} test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.7.2/hack/setup-envtest.sh source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./... -coverprofile cover.out
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建自定义资源定义(CRD)API 和控制器:
运行以下命令创建带有组
cache
、版本v1
和种类Memcached
的 API:operator-sdk create api \ --group=cache \ --version=v1 \ --kind=Memcached
$ operator-sdk create api \ --group=cache \ --version=v1 \ --kind=Memcached
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示时,输入
y
来创建资源和控制器:Create Resource [y/n] y Create Controller [y/n] y
Create Resource [y/n] y Create Controller [y/n] y
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Writing scaffold for you to edit... api/v1/memcached_types.go controllers/memcached_controller.go ...
Writing scaffold for you to edit... api/v1/memcached_types.go controllers/memcached_controller.go ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此过程在
api/v1/memcached_types.go
和controllers/memcached_controller.go
上生成 Memcached 资源 API。修改
api/v1/memcached_types.go
中的 Go 类型定义,使其具有以下spec
和status
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加
+kubebuilder:subresource:status
marker,将status
子资源添加到 CRD 清单中:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 添加这一行。
这可让控制器在不更改剩余的 CR 对象的情况下更新 CR 状态。
为资源类型更新生成的代码:
make generate
$ make generate
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示在修改了
*_types.go
文件后,您必须运行make generate
命令来更新该资源类型生成的代码。以上 Makefile 目标调用
controller-gen
程序来更新api/v1/zz_generated.deepcopy.go
文件。这样可确保您的 API Go 类型定义实现了runtime.Object
接口,所有Kind
类型都必须实现。
生成和更新 CRD 清单:
make manifests
$ make manifests
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此 Makefile 目标调用
controller-gen
实用程序在config/crd/bases/cache.example.com_memcacheds.yaml
文件中生成 CRD 清单。可选:将自定义验证添加到 CRD 中。
当生成清单时,OpenAPI v3.0 模式会添加到
spec.validation
块中的 CRD 清单中。此验证块允许 Kubernetes 在Memcached
自定义资源(CR)创建或更新时验证其中的属性。作为 Operator 作者,您可以使用类似于注解的单行注释(称为 Kubebuilder markers )来配置 API 的自定义验证。这些标记必须始终具有
+kubebuilder:validation
前缀。例如,可以通过添加以下标记来添加一个 enum-type 规格:// +kubebuilder:validation:Enum=Lion;Wolf;Dragon type Alias string
// +kubebuilder:validation:Enum=Lion;Wolf;Dragon type Alias string
Copy to Clipboard Copied! Toggle word wrap Toggle overflow API 代码中的标记用法会在 Kubebuilder 生成 CRD 和用于配置/代码生成的标记文档中讨论。Kubebuilder CRD 验证文档还提供了 OpenAPIv3 验证标记的完整列表。
如果添加任何自定义验证,请运行以下命令来更新 CRD 的 OpenAPI 验证部分:
make manifests
$ make manifests
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
在创建新 API 和控制器后,您可以实现控制器逻辑。在本例中,将生成的控制器文件
controllers/memcached_controller.go
替换为以下示例实现:例 5.3.
memcached_controller.go
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例控制器为每个
Memcached
CR 运行以下协调逻辑:- 如果尚无 Memcached 部署,创建一个。
-
确保部署大小与
Memcached
CR spec 指定的大小相同。 -
使用
memcached
Pod 的名称更新Memcached
CR 状态。
接下来的两个子步骤检查控制器如何监视资源以及协调循环的触发方式。您可跳过这些步骤,直接构建和运行 Operator。
检查
controllers/memcached_controller.go
文件中的控制器实施,以查看控制器如何监视资源。SetupWithManager()
函数指定如何构建控制器来监控 CR 以及由该控制器拥有和管理的其他资源:例 5.4.
SetupWithManager()
功能Copy to Clipboard Copied! Toggle word wrap Toggle overflow NewControllerManagedBy()
提供了一个控制器构建器,它允许各种控制器配置。for(&cachev1.Memcached{})
将Memcached
类型指定为要监视的主要资源。对于Memcached
类型的每个 Add、Update 或 Delete 事件,协调循环都会为该Memcached
对象发送一个协调Request
参数,其中包括命名空间和名称键。owns(&appsv1.Deployment{})
将Deployment
类型指定为要监视的辅助资源。对于Deployment
类型的每个 Add、Update 或 Delete 事件,事件处理程序会将每个事件映射到部署所有者的协调请求。在本例中,所有者是创建部署的Memcached
对象。每个控制器都有一个协调器对象,它带有实现了协调循环的
Reconcile()
方法。协调循环通过Request
参数传递,该参数是从缓存中查找主资源对象Memcached
的命名空间和名称键:例 5.5. 协调循环
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据
Reconcile()
函数的返回值,协调Request
可能会重新排队,且可能会再次触发循环:例 5.6. 重排队列的逻辑
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以将
Result.RequeueAfter
设置为在宽限期后重排队列请求:例 5.7. 宽限期后重排队列
import "time" // Reconcile for any reason other than an error after 5 seconds return ctrl.Result{RequeueAfter: time.Second*5}, nil
import "time" // Reconcile for any reason other than an error after 5 seconds return ctrl.Result{RequeueAfter: time.Second*5}, nil
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可以返回带有
RequeueAfter
设置的Result
来定期协调一个 CR。有关协调器、客户端并与资源事件交互的更多信息,请参阅 Controller Runtime Client API 文档。