创建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下的资源。