operator开发
operator开发
kubebuilder
kubebuilder 2.3.1
k3d v3.2.1
k3s v1.19.3-k3s2
1 | # crd |
初始化项目
kubebuilder init –domain ydzs.io –owner cnych –repo github.com/cnych/etcd-operator
创建API
kubebuilder create api –group etcd –version v1alpha1 –kind EtcdCluster
编辑 Operator 的结构体
修改文件 api/v1alpha1/etcdcluster_types.go 中的 EtcdClusterSpec 结构体
1 | type EtcdClusterSpec struct { |
在项目目录运行make命令生成相关代码
编写业务逻辑
resource文件
在目录 controllers 下面创建一个 resource.go 文件,用来根据我们定义的 EtcdCluster 对象生成对应的 StatefulSet 和 Headless SVC 对象
1 | // controllers/resource.go |
Reconcile函数
修改controllers/etcdcluster_controller.go 文件Reconcile 函数,进行逻辑处理
1 | // +kubebuilder:rbac:groups=etcd.ydzs.io,resources=etcdclusters,verbs=get;list;watch;create;update;patch;delete |
验证
创建CRD定义 make install
本地运行控制器 make run
创建CR资源
kubectl create -f etcd_v1alpha1_etcdcluster.yaml
观察集群资sts和svc源创建情况
operator-sdk
基于v1.0.0 版本
采用Kind新建集群
kubectl
kustomize
安装
下载operator-sdk 程序
$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.0.0/operator-sdk-v1.0.0-x86_64-linux-gnu
$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.0.0/ansible-operator-v1.0.0-x86_64-linux-gnu
$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/v1.0.0/helm-operator-v1.0.0-x86_64-linux-gnu
移动到/usr/local/bin 目录
$ chmod +x operator-sdk-v1.0.0-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp operator-sdk-v1.0.0-x86_64-linux-gnu /usr/local/bin/operator-sdk && rm operator-sdk-v1.0.0-x86_64-linux-gnu
$ chmod +x ansible-operator-v1.0.0-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp ansible-operator-v1.0.0-x86_64-linux-gnu /usr/local/bin/ansible-operator && rm ansible-operator-v1.0.0-x86_64-linux-gnu
$ chmod +x helm-operator-v1.0.0-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp helm-operator-v1.0.0-x86_64-linux-gnu /usr/local/bin/helm-operator && rm helm-operator-v1.0.0-x86_64-linux-gnu
Demo示例
新建目录
$ mkdir -p $HOME/projects/memcached-operator
$ cd $HOME/projects/memcached-operator
在目录中初始化memcached-operator示例项目
$ operator-sdk init –domain=example.com –repo=github.com/example-inc/memcached-operator
初始化项目API
$ operator-sdk create api –group=cache –version=v1alpha1 –kind=Memcached
修改API
修改 api/v1alpha1/memcached_types.go 文件更新声明API
1 | // MemcachedSpec defines the desired state of Memcached |
替换controller
替换 controllers/memcached_controller.go 文件,更新controller
https://github.com/operator-framework/operator-sdk/blob/master/example/memcached-operator/memcached_controller.go.tmpl
主要方法解析
1 | // 每个控制器都有一个Reconciler对象,运行过程中不断执行Reconcile循环 |
编译
$ make manifests
$ make install
运行
在集群外运行
需要提前在本地构建部署kubernetes集群,推荐使用kind快速在本地构建集群
$ make run ENABLE_WEBHOOKS=false
1 | go run ./main.go |
在集群内运行
首先构建应用镜像
$ make docker-build IMG=registry.cn-shenzhen.aliyuncs.com/mutoulazy/memcached:v1.2
构建时可以修改Dockerfile新增 go代理 加速镜像构建
ENV GOPROXY https://goproxy.cn,direct
推到镜像到镜像仓库,推送前需要docker login登陆仓库
$ make docker-push IMG=registry.cn-shenzhen.aliyuncs.com/mutoulazy/memcached:v1.2
注意kind集群需要使用 kind load docker-image <镜像名称> 加载本地镜像到kind节点内部去
测试
使用kustomize构建对应部署的yaml文件
$ cd config/default/ && kustomize edit set namespace “default” && cd ../..
部署镜像
$ make deploy IMG=registry.cn-shenzhen.aliyuncs.com/mutoulazy/memcached:v1.2
1 | /usr/local/bin/kustomize build config/default | kubectl apply -f - |
创建一个Memcached资源
1 | apiVersion: cache.example.com/v1alpha1 |
$ kubectl apply -f config/samples/cache_v1alpha1_memcached.yaml
观察应用Pod
size 定义的是3
1 | NAME READY STATUS RESTARTS AGE |
修改size为5
1 | NAME READY STATUS RESTARTS AGE |
清理应用
$ kubectl delete -f config/samples/cache_v1alpha1_memcached.yaml
$ kubectl delete deployments,service -l control-plane=controller-manager
$ kubectl delete role,rolebinding –all