Operator Framework是一个开源工具包,用于以有效,自动化和可扩展的方式管理Kubernetes本机应用程序,其称为operator。运营商利用Kubernetes的可扩展性来提供云服务的自动化优势,如配置,扩展,备份和恢复,同时能够运行Kubernetes可以运行的任何地方。
operators主要包含两个关键内容
- operator SDK: 帮助开发人员自身的专业知识使用operator而无需了解复杂的 Kubernetes API
- Operator Lifecycle Manager (OLM):帮助开发者安装更新operator以及管理所有operator和相关服务的整个生命周期
Operator SDK
operator SDK是为了方便使用operator而设计的框架,为此它提供了以下功能:
- 可以更直观的编写操作逻辑的高级API和抽象
- 用于生成手脚架和代码的工具,可以快速引导新项目
- 拓展常用用例
SDK工作流程
- 使用SDK命令行界面(CLI)创建新的Operator项目。
- 通过添加自定义资源定义(CRD)来定义新资源API。
- 指定要使用SDK API查看的资源。
- 在指定的处理程序中定义Operator协调逻辑,并使用SDK API与资源进行交互。
- 使用SDK CLI构建并生成Operator部署清单。
安装SDK
使用operator之前,需要先安装sdk,安装过程可以查看官方安装教程
安装前需要满足以下条件:
- dep v0.5.0+
- Git
- Go v1.10+
- Docker v17.03+
kubectl
v1.11.3+- Access to a cluster based on Kubernetes v1.11.3+
- Access to a container registry
安装步骤:
克隆operator-sdk仓库
1
2
3
4$ mkdir -p $GOPATH/src/github.com/operator-framework
$ cd $GOPATH/src/github.com/operator-framework
$ git clone https://github.com/operator-framework/operator-sdk
$ cd operator-sdk选择master分支
1
$ git checkout master
安装SDK(官网上给的第一条指令是
make dep
但安装的时候发现会报错,重新查看了官方仓库的安装指南发现最新版的指令发生了变化)1
2$ make tidy
$ make install如果上面步骤发生了错误,可能是官方要求的一些软件工具没有安装或版本过低
检查是否安装成功
1
$ operator-sdk -h
使用SDK创建memcached operator
创建新项目
使用以下命令创建一个新项目
1 | $ cd $GOPATH/src/github.com/example-inc/ |
- 在默认情况下,
operator new
会自动使用go modules生成go.mod,如果要使用dep,需要使用参数--dep-manager=dep
- 在
$GOPATH/src
路径以外创建项目时,需要使用--repo=<path>
参数,因为scaffolded文件需要有效的模块路径。
运行operator-sdk new
后,会在当前目录下生成包含以下文件的文件夹
1 | . |
添加自定义资源声明(CRD)
使用CLI添加一个名为Memcached的新CRD API,其中APIVersion设置为cache.example.com/v1apha1,Kind设置为Memcached:
1 | $ operator-sdk add api \ |
该Memcached资源API的脚手架位于pkg/apis/cache/v1alpha1/
在pkg/apis/cache/v1alpha1/memcached_types.go
文件中修改Memcached自定义资源(CR)的规格和状态:
1 | type MemcachedSpec struct { |
所有需要用到的资源的属性都在结构体中定义
修改* _types.go文件后,都要运行以下命令以更新该资源类型的生成代码:
1 | $ operator-sdk generate k8s |
运行以下命令来更新CRDdeploy / crds / cache_v1alpha1_memcached_crd.yaml中的OpenAPI验证部分
1 | $ operator-sdk generate openapi |
添加控制器
将新Controller添加到项目中以监视和协调Memcached资源:
1 | $ operator-sdk add controller \ |
这将在pkg / controller / memcached /
下构建一个新的Controller实现。
我们用示例来替代pkg/controller/memcached/memcached_controller.go
示例controller为每个Memcached CR执行以下协调逻辑:
如果Memcached不存在,则创建Memcached部署。
确保实际部署大小与Memcached CR规格指定的大小相同。
使用Memcached Pod的名称更新Memcached CR状态。
构建并运行operator
在运行Operator之前,必须在Kubernetes API服务器上注册CRD:
1 | $ kubectl create \ |
注意:执行这一步之前,需要先执行oc cluster up
开启k8s,且必须使用oc login -u system:admin
以管理员账户登录,
注册CRD后,这里有两种方法运行operator:部署在集群内部和在集群外作为go程序运行
在集群内部部署运行
构建memcached-operator映像并将其推送到registry
1 | $ operator-sdk build quay.io/example/memcached-operator:v0.0.1 |
部署清单在deploy / operator.yaml
中生成。更新部署镜像,如下所示,因为默认值只是占位符:
1 | $ sed -i 's|REPLACE_IMAGE|quay.io/example/memcached-operator:v0.0.1|g' deploy/operator.yaml |
将镜像推送到dockhub
1 | $ docker push quay.io/example/memcached-operator:v0.0.1 |
设置RBAC并部署memcached-operator:
1 | $ kubectl create -f deploy/role.yaml |
验证memcached-operator是否已启动并正在运行:
1 | $ kubectl get deployment |
在群集外的本地运行
在开发周期期间,此方法是首选,以便更快地部署和测试。 使用$ HOME / .kube / config中的默认Kubernetes配置文件在本地运行Operator:
1 | $ operator-sdk up local --namespace=default |
清除资源
1 | $ kubectl delete -f deploy/crds/cache_v1alpha1_memcached_cr.yaml |
报错信息
kubectl create
执行失败
报错信息
Error from server (Forbidden): error when creating “deploy/crds/app_v1_appservice_cr.yaml”: appservices.app.example.com “nginx-app” is forbidden: caches not synchronized
解决方案
需要使用管理员账号登录k8s,使用oc login -u system:admin
即可登录管理员账号
参考链接
https://zhuanlan.zhihu.com/p/67567555
官方链接:
https://docs.okd.io/latest/operators/osdk-getting-started.html