0%

openshift:operator

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工作流程

  1. 使用SDK命令行界面(CLI)创建新的Operator项目。
  2. 通过添加自定义资源定义(CRD)来定义新资源API。
  3. 指定要使用SDK API查看的资源。
  4. 在指定的处理程序中定义Operator协调逻辑,并使用SDK API与资源进行交互。
  5. 使用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

安装步骤:

  1. 克隆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
  2. 选择master分支

    1
    $ git checkout master
  3. 安装SDK(官网上给的第一条指令是make dep但安装的时候发现会报错,重新查看了官方仓库的安装指南发现最新版的指令发生了变化

    1
    2
    $ make tidy
    $ make install

    如果上面步骤发生了错误,可能是官方要求的一些软件工具没有安装或版本过低

  4. 检查是否安装成功

    1
    $ operator-sdk -h

使用SDK创建memcached operator

创建新项目

使用以下命令创建一个新项目

1
2
3
$ cd $GOPATH/src/github.com/example-inc/
$ operator-sdk new memcached-operator
$ cd memcached-operator
  • 在默认情况下,operator new会自动使用go modules生成go.mod,如果要使用dep,需要使用参数 --dep-manager=dep
  • $GOPATH/src路径以外创建项目时,需要使用--repo=<path>参数,因为scaffolded文件需要有效的模块路径。

运行operator-sdk new后,会在当前目录下生成包含以下文件的文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.
├── build # 包含用于构建operator的dockerfile和构建脚本
│   ├── bin
│   │   ├── entrypoint
│   │   └── user_setup
│   └── Dockerfile
├── cmd
│   └── manager
│   └── main.go # operator的main文件,它将实例化一个新的管理器,管理器在pkg / apis / ...下注册所有自定义资源定义,并在pkg / controllers / ...下启动所有控制器。
├── deploy #包含各种YAML清单,用于注册CRD,设置RBAC以及部署operator
│   ├── operator.yaml
│   ├── role_binding.yaml
│   ├── role.yaml
│   └── service_account.yaml
├── go.mod #Go mod清单,表示描述此运算符的外部依赖关系
├── go.sum #同上
├── pkg
│   ├── apis #包含定义自定义资源定义(CRD)的API的目录树。用户需要编辑pkg / apis / / / _types.go文件以定义每种资源类型的API
│   │   └── apis.go
│   └── controller #该pkg包含控制器实现。用户需要编辑pkg / controller / / _controller.go来定义控制器的协调逻辑,以处理指定类型的资源类型。
│   └── controller.go
├── tools.go
└── version
└── version.go

添加自定义资源声明(CRD)

使用CLI添加一个名为Memcached的新CRD API,其中APIVersion设置为cache.example.com/v1apha1,Kind设置为Memcached:

1
2
3
$ operator-sdk add api \
--api-version=cache.example.com/v1alpha1 \
--kind=Memcached

该Memcached资源API的脚手架位于pkg/apis/cache/v1alpha1/

pkg/apis/cache/v1alpha1/memcached_types.go文件中修改Memcached自定义资源(CR)的规格和状态:

1
2
3
4
5
6
7
8
type MemcachedSpec struct {
// Size is the size of the memcached deployment
Size int32 `json:"size"`
}
type MemcachedStatus struct {
// Nodes are the names of the memcached pods
Nodes []string `json:"nodes"`
}

所有需要用到的资源的属性都在结构体中定义

修改* _types.go文件后,都要运行以下命令以更新该资源类型的生成代码:

1
$ operator-sdk generate k8s

运行以下命令来更新CRDdeploy / crds / cache_v1alpha1_memcached_crd.yaml中的OpenAPI验证部分

1
$ operator-sdk generate openapi

添加控制器

将新Controller添加到项目中以监视和协调Memcached资源:

1
2
3
$ operator-sdk add controller \
--api-version=cache.example.com/v1alpha1 \
--kind=Memcached

这将在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
2
$ kubectl create \
-f deploy/crds/cache_v1alpha1_memcached_crd.yaml

注意:执行这一步之前,需要先执行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
2
3
4
$ kubectl create -f deploy/role.yaml
$ kubectl create -f deploy/role_binding.yaml
# TODO: $ kubectl create -f deploy/service_account.yaml
$ kubectl create -f deploy/operator.yaml

验证memcached-operator是否已启动并正在运行:

1
2
3
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
memcached-operator 1 1 1 1 1m

在群集外的本地运行

在开发周期期间,此方法是首选,以便更快地部署和测试。 使用$ HOME / .kube / config中的默认Kubernetes配置文件在本地运行Operator:

1
$ operator-sdk up local --namespace=default

清除资源

1
2
$ kubectl delete -f deploy/crds/cache_v1alpha1_memcached_cr.yaml
$ kubectl delete -f deploy/operator.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