为了理解什么是Operator,让我们先复习一下Kubernetes。Kubernetes实际是期望状态管理器。先在Kubernetes中指定应用程序期望状态(实例数,磁盘空间,镜像等),然后它会尝试把应用维持在这种状态。Kubernetes的控制平面运行在Master节点上,它包含数个controller以调和应用达到期望状态:
- 检查当前的实际状态(Pod、Deployment等)
- 将实际状态与spec期望状态进行比较
- 如果实际状态与期望状态不一致,controller将会尝试协调实际状态以达到一致
比如,通过RS定义Pod拥有3个副本。当其中一个Pod down掉时,Kubernetes controller通过wacth API发现期望运行3个副本,而实际只有2个副本在运行。于是它新创建出一个Pod实例。
- 通过Kubectl命令发送对象spec定义(Pod,Deployment等)到Kubernetes Master节点的API服务
- Master节点调度对象运行
- 一旦对象运行,controller会持续检查对象并根据spec协调实际情况
举一个有状态应用的例子。假如一个数据库应用运行在多个节点上。如果超过半数的节点出现故障,则需要按照特定步骤从特定快照中加载数据。使用原生Kubernetes对象类型和controller则难以实现。或者为有状态应用程序扩展节点,升级到新版本或灾难恢复。这些类型的操作通常需要非常具体的步骤,并且通常需要手动干预。
使用 CRD 定制资源后,仅仅是让 Kubernetes 能够识别定制资源的身份。创建定制资源实例后,Kubernetes 只会将创建的实例存储到数据库中,并不会触发任何业务逻辑。在 数据库保存定制资源实例是没有意义的,如果需要进行业务逻辑控制,就需要创建控制器。

Operator 其实就是图中除了 API Server 和 etcd 的剩余部分。由于 Client、Informer 和 WorkQueue 是高度相似的,所以有很多项目可以自动化生成 Controller 之外的业务逻辑(如 Client、Informer、Lister),因此用户只需要专注于 Controller 中的业务逻辑即可。

Operator通过Custom Controller协调应用spec。虽然API服务知道Custom Controller,但Operator可以独立运行在集群内部或外部。
为了创建自定义Operator,我们需要如下资源:
- Custom Resource(CR)spec,定义我们要观测的应用对象,以及为CR定义的API
- Custom Controller,用来观测CR
- Custom code,决定Custom Controller如何协调CR
- Operator,管理Custom Controller
- Deployment,定义Operator和自定义资源
所有上述内容都可以通过手工编写Go代码和spec,或通过kubebuilder等工具生成Kubernetes API。但最简单的方式(也是我们在这里使用的方法)是使用CoreOS operator-sdk为这些组件生成模版。它允许您通过CLI命令生成spec、controller以及Operator框架。一旦生成后,您可以在spec中定义自定义字段并编写协调的自定义代码。我们将在本教程的下一部分中展开介绍。
如果生态系统中没可以实现你目标的 Operator,你可以自己编写代码。
你还可以使用任何支持 Kubernetes API 客户端 的语言或运行时来实现 Operator(即控制器)。
以下是一些库和工具,你可用于编写自己的云原生 Operator。
- 高级API和抽象,更直观地编写操作逻辑
- 用于脚手架和代码生成的工具,可以快速引导新项目
- 扩展以涵盖常见的操作员用例
SDK提供以下工作流程来开发新的Operator:
- 使用SDK命令行界面(CLI)创建新的Operator项目
- 通过添加自定义资源定义(CRD)定义新资源API
- 使用SDK API监控指定的资源
- 在指定的处理程序中定义Operator协调逻辑(对比期望状态与实际状态),并使用SDK API与资源进行交互
- 使用SDK CLI构建并生成Operator部署manifests
Operator使用SDK在用户自定义的处理程序中以高级API处理监视资源的事件,并采取措施来reconcile(对比期望状态与实际状态)应用程序的状态。
先给出我的环境,注意operator-sdk支持通过代码安装,在window上通过idea等工具搭配golang开发,有环境的可直接使用macos。
前置安装
- 安装gcc和make。
- 安装golang1.17以上版本。
- 一个可进入的公共的docker registry服务,并且准备一个域名作为registry服务的域名。
安装gcc和make
window下直接安装cygwin,选择gcc和make等组件即可,我已经提前安装,如果不知道怎么安装可参考:。
golang
安装 golang 17以上版本
我这直接解压在/root下,/etc/profile添加环境变量
让配置生效 并修改golang的私服
检测是否安装成功
安装docker
安装docker registry
这里为了简单,就不设置账号密码权限了。
检测存在的镜像
在开发的window和k8s的worker节点 linux(/etc/docker/daemon.json)设置,改后重启;
在开发的本地机器和k8s的worker节点绑定hosts
测试上传一个镜像
安装kubectl
让开发的机器可以通过kubectl访问集群,一般用window开发的 话,新版的docker desktop都带上内置的k8s,自然自带kubectl命令,可将远程k8s集群的初始化时生成的config文件拷贝到出来
一般就是/etc/kubernetes/admin.conf,放到window的 %USERPROFILE%/.kube/config文件即可

安装operator-sdk
window下升级go go get golang.org/dl/go && go download 下载完成后,window下直接安装在,%USERPROFILE%sdk 目录下,可直接修改path到 %USERPROFILE%sdkgobin目录下。
安装完成后

执行命令
该命令会执行controller-gen 工具更新 api/v1alpha1/zz_generated.deepcopy.go
执行命令
将执行 controller-gen生成 CRD文件: config/crd/bases/test.jiaozi.com_helloworlds.yaml
生成的crd文件和定义的go代码是一致的
实现controller
开发过程中使用的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等等。
实现controller代码
运行operator
运行operator支持以下三种方式。
- controller作为一个go应用运行在集群之外方式运行。
- 作为一个deployment直接将程序打包成镜像运行在集群内部。
- 使用oolm方式部署。
注意这里运行operator实际上是有3步
- 将crd的定义安装到集群。
- 运行controller监控cr的资源创建/删除/修改等,实际运行的程序就是运行controller,controller可以运行在集群外和集群内均可。
- 创建一个cr,触发controller。
修改配置
修改为你自己的registry私服
将基础镜像
替换为:
为
执行命令,构建镜像,推送到私服
打印日志
HelloWorldReconciler结构体定义添加Log
可在方法中使用
- r.Log.Info(“crd资源已经被删除”) 打印info日志
- r.Log.Error(“异常信息”) 打印error日志
安装crd
查看安装
查看定义
运行controller
运行controller watch cr的创建/删除/修改
在项目根目录创建一个cr 使用命令执行
查看deploy和pod的个数
调试controller
首先生成exe文件
打开idea help-edit custom properties,新增dlv参数位置(该步骤省略):执行dlv命令开放2345端口





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/198543.html