更新时间:2023-07-14 GMT+08:00
分享

创建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
  • 参数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
})

在修改了Operator作用域后,需同时修改RBAC(config/rbac/... 路径下相关yaml文件),以授权Operator操作该namespace下的资源。

相关文档