
# 创建Operator项目
#### 背景
Operator是Kubernetes的扩展软件，通过定制资源管理应用和其他组件，实现一定自动运维能力。可以在不改动Kubernetes源码的情况下，通过一个或多个Operator来扩展集群能力，遵照自身业务需求、场景等灵活开发，节省运维成本。流程包括安装Kubernetes、构建Operator和实现Operator。
#### 创建Operator
本章节以应用名称为hwfka、取项目名称为hwfka-operator为例，说明如何创建Operator。
```
# 在 GOPATH 下新建工程目录
$ mkdir -p $GOPATH/src/hwfka-operator
$ cd $GOPATH/src/hwfka-operator
# 使用kubebuilder初始化脚手架框架，并设定域名为huawei.com
$ kubebuilder init --domain huawei.com
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
Get controller runtime:
# 检查如果环境所需要的依赖包不满足kubebuilder要求，kubebuilder会下载相关依赖包，开发者可根据实际情况在项目的go.mod中更改依赖包
go get sigs.k8s.io/controller-runtime@v0.10.0
go: downloading sigs.k8s.io/controller-runtime v0.10.0
go: downloading k8s.io/client-go v0.22.1
go: downloading k8s.io/utils v0.0.0-20210802155522-efc7438f0176
go: downloading k8s.io/component-base v0.22.1
go: downloading k8s.io/apiextensions-apiserver v0.22.1
Update dependencies:
go mod tidy
go: downloading github.com/benbjohnson/clock v1.1.0
Next: define a resource with:
kubebuilder create api
```
创建Operator脚手架工程，目录结构如下：
```
hwfka-operator/
├── Dockerfile
├── Makefile
├── PROJECT
├── config
│   ├── default
│   │   └── ...
│   ├── manager
│   │   └── ...
│   ├── prometheus
│   │   └── monitor.yaml
│   └── rbac
│       └── ...
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
└── main.go
```
![](https://support.huaweicloud.com/devg-osc/public_sys-resources/note_3.0-zh-cn.png)
- 参数domain一般为公司域名，如：huawei.com。
- main.go作为程序入口，初始化了Manager，由Manager来管理API和Controller。
- 初始化Manager时，可以指定参数，限制该Operator中所有Controller监听资源的namespace。
 
#### Operator作用域
Operator的作用域分namespace级和cluster级，cluster级的operator可以监听和管理任意namespace的资源。使用**kubebuilder init**命令默认初始化cluster级的operator，仅支持cluster级的operator管理同级别的CRD。监听多个namespace，main.go修改代码如下：
```
// namespace 列表
namespaces := []string{"foo", "bar"}
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
    Scheme:             scheme,
    MetricsBindAddress: metricsAddr,
    Port:               9443,
    LeaderElection:     enableLeaderElection,
    LeaderElectionID:   "f1c5ece8.huawei.com",
    NewCache:           cache.MultiNamespacedCacheBuilder(namespaces),  // 指定多个 namespace
})
```
![](https://support.huaweicloud.com/devg-osc/public_sys-resources/note_3.0-zh-cn.png)
在修改了Operator作用域后，需同时修改RBAC（config/rbac/... 路径下相关yaml文件），以授权Operator操作该namespace下的资源。
