使用operator-sdk实现kubernetes operator
使用operator-sdk实现kubernetes operator
尝试使用 operator-sdk 实现了一个简单的 kubernetes operator :multi-tenancy-operator
简单控制和监控helm部署应用
为什么使用 kubernetes operator
在 kubernetes 当中,有一个十分重要的概念就是 CRD 模型,而 kubernetes operator 就是开发利用 CRD 模型实现自己需要的逻辑。事实上 kubernetes API 的很多思想也是基于使用 yaml 来管理环境状态, Kubernetes is the new database 。
而实时上就目前而言,很多数据库,中间件都在使用 operator 来实现管理集群状态。如 tidb-operator , mysql-operator , elasticsearch-operator (ECK) , 这样使部署复杂集群(如主从,备份,集群多节点通讯等)和更改集群配置变得简单,这是一种趋势,值得kubernetes 团队去实现。
主要实现
事实上使用operator-sdk编写operator很简单,主要就使用了以下几个命令
operator-sdk new <...>-operator # 在当前目录下生成一个 golang 基础项目
operator-sdk add ... # 生成一个类型的CRD对应的 go 文件,或者控制器
operator-sdk build <docker-registry>/<docker-name>:<tag> # 制作镜像
docker push <docker-registry>/<docker-name>:<tag> # 推送镜像
operator-sdk generated ... # 通过 code-generated 生成一些如 crd yaml 和 deepcopy go 文件
还有一些命令,可以去帮助里面查看
然后基本上就是主要实现一个 Reconcile 回调函数,一旦集群里面的 controller API 有更新,都会调用 这个函数,执行里面自己编写的逻辑,原理很简单。
然后就是 list & watch 机制。kubelet 的 podsync , kube-scheduler 的 informer (不太准确,事实上 informer 也可以说是属于 client-go 的)都有使用这种机制。当然最简单的是使用 client-go 的 clientSet , 其实就是调用 kube-apiserver 的 URL 请求,如果去看对应就是一个 builder 设计模式拼接的 URL ,然后如 informer 的一个核心构造体 cache.ListWatch 也是这两个方法。
新版本的 operator-sdk 使用了 olm 管理,命令如下
/root/data/git/operator/go/src/memcached-operator/bin/kustomize build config/crd | kubectl apply -f -
customresourcedefinition.apiextensions.k8s.io/memcacheds.cache.example.com created
mkdir demo-operator
cd demo-operator
operator-sdk init --domain <domain> --repo <domain>/demo/demo-operator --skip-go-version-check
operator-sdk create api --group <group> --version v1 --kind <Kind> --resource --controller
#修改类型,增加自己需要的字段
vim api/v1/<Kind>_types.go
#直接在当前环境把crd 创建好,如果已经有了,会更新
make install
#并且会生产对应的crd
vim config/crd/bases/<Kind>.<domain>_<Kind>s.yaml