基于 K8s & K3s 集群的 Operator 二次开发
Operator-Sdk 简介Operators 使在Kubernetes中管理复杂的有状态的应用更为简单。但是,目前编写 operator 还是比较困难,因为需要与底层的APIs打交道,编写模版和模块化资源缺乏也导致重复的工作。该 Operator SDK 是一个框架,使用 controller-runtime 库来使得编写 operators 更为容易,提供了:高阶APIs 和抽象,使编写运维
Operator-Sdk 简介
Operators 使在Kubernetes中管理复杂的有状态的应用更为简单。但是,目前编写 operator 还是比较困难,因为需要与底层的APIs打交道,编写模版和模块化资源缺乏也导致重复的工作。
该 Operator SDK 是一个框架,使用 controller-runtime 库来使得编写 operators 更为容易,提供了:
- 高阶APIs 和抽象,使编写运维逻辑更为直观;
- Tools和启动模块,使创建新的工程时更快;
- 覆盖常用的operator的扩展。
环境搭建
前提: 本次操作的环境是 Windows ,目前感觉 IT 部门程序员总是爱用 MAC 电脑进行开发设计,不晓得是因为真的牛逼还是因为怎么个样子,实际上国内大多数用户使用的是 Windows ,生产服务器类的应用更多的是 Linux 操作系统,或许是因为中国阶级开始固化的一种隐喻吧!一切都是废话,互联网创业公司或者所谓的大厂,一般技术比较高的那部分同学都会配置 MAC 进行办公,其他人使用 Windows 办公操作,然后文档层面就出现了多种层次不同方式解读,我写文档一般涵盖两个层次,windows 和 通用 Linux 操作系统进行完成。
1 Windows 环境适配
- make 安装
下载地址: MinGW下载网页:http://sourceforge.net/projects/mingw/files/latest/download?source=files
右击计算机->属性->高级系统设置->环境变量,在系统变量中找到PATH,将MinGW安装目录里的bin文件夹的地址添加到PATH里面,(注意:PATH里两个目录之间以英文的;隔开)。打开MinGW的安装目录,打开bin文件夹,将mingw32-make.exe重命名为make.exe。
- 安装 operator-sdk
# 安装 godep
go get github.com/tools/godep
# 安装编译 operator-sdk
git clone https://github.com/operator-framework/operator-sdk
make install
# 安装依赖 kubernetes (将 kubernetes/staging/src/k8s.io 拷贝到 src/k8s.io 目录下)
git clone https://github.com/kubernetes/kubernetes.git
# 安装 controller-runtime (mkdir $GOPATH/src/sigs.k8s.io 在此目录下 clone controller-runtime)
git clone https://github.com/kubernetes-sigs/controller-runtime
- 搭建 docker registry
# 拉起镜像仓库
mkdir -p ~/docker-data/docker_registry
docker run -d -p 5000:5000 --restart always --name myRegistry -v ~/docker-data/docker_registry:/var/lib/registry registry:2
# 查看镜像信息
curl 127.0.0.1:5000/v2/_catalog
docker logs -f --tail 20 容器Id
- operator-sdk 检查
默认编译好的 operator-sdk 二进制会存放在 GOPATH/bin 目录中,如果想全局使用的话,需要配置下环境变量;
$ operator-sdk.exe version
operator-sdk version: "", commit: "", kubernetes version: "v1.19.4", go version: "go1.14.1", GOOS: "windows", GOARCH: "amd64"
2 operator-sdk 栗子
# 步骤一: init 操作(operator-sdk init --domain=example.com --repo=github.com/example-inc/memcached-operator)
mkdir op-test002
cd op-test002
operator-sdk init --domain=example.com --repo=github.com/example-inc/memcached-operator
# 步骤二: 创建 API(operator-sdk create api --group cache --version v1 --kind Memcached --resource=true --controller=true)
operator-sdk create api --group cache --version v1 --kind Memcached --resource=true --controller=true
# 步骤三: 构建镜像-需要本地存在 docker 环境(make docker-build IMG=liumiaocn/memcache:v1)
make docker-build IMG=liumiaocn/memcache:v1
# 步骤四: 运行Operator-需要环境具备 K8s/K3s(make install && make deploy IMG=liumiaocn/memcache:v1)
make install && make deploy IMG=liumiaocn/memcache:v1
# 步骤五:创建自定义资源
kubectl apply -f config/samples/cache_v1_memcached.yaml
# 步骤六:删除CR和相关资源(kubectl delete -f config/samples/cache_v1_memcached.yaml)
kubectl delete -f config/samples/cache_v1_memcached.yaml
执行完毕,整体目录结构如下所示
$ tree .
.
├── Dockerfile
├── Makefile
├── PROJECT
├── api
│ └── v1
│ ├── groupversion_info.go
│ ├── memcached_types.go
│ └── zz_generated.deepcopy.go
├── bin
│ └── manager
├── config
│ ├── certmanager
│ │ ├── certificate.yaml
│ │ ├── kustomization.yaml
│ │ └── kustomizeconfig.yaml
│ ├── crd
│ │ ├── bases
│ │ │ └── cache.example.com_memcacheds.yaml
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_memcacheds.yaml
│ │ └── webhook_in_memcacheds.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ ├── manager_webhook_patch.yaml
│ │ └── webhookcainjection_patch.yaml
│ ├── manager
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ ├── rbac
│ │ ├── auth_proxy_client_clusterrole.yaml
│ │ ├── auth_proxy_role.yaml
│ │ ├── auth_proxy_role_binding.yaml
│ │ ├── auth_proxy_service.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── memcached_editor_role.yaml
│ │ ├── memcached_viewer_role.yaml
│ │ ├── role.yaml
│ │ └── role_binding.yaml
│ ├── samples
│ │ ├── cache_v1_memcached.yaml
│ │ └── kustomization.yaml
│ ├── scorecard
│ │ ├── bases
│ │ │ └── config.yaml
│ │ ├── kustomization.yaml
│ │ └── patches
│ │ ├── basic.config.yaml
│ │ └── olm.config.yaml
│ └── webhook
│ ├── kustomization.yaml
│ ├── kustomizeconfig.yaml
│ └── service.yaml
├── controllers
│ ├── memcached_controller.go
│ └── suite_test.go
├── cover.out
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
└── testbin
├── bin
│ ├── etcd
│ ├── kube-apiserver
│ └── kubectl
└── setup-envtest.sh
21 directories, 54 files
3 自定义二次开发
开发环境:Linux
安装operator-sdk前提是go已经安装好了,并且需要用到dep安装依赖,所以我们需要先安装go和dep。其中gopath是go的工作目录,可以是任意目录,在配置中做相应的修改就行了。
# 步骤一: 安装go和dep
$ wget https://golang.google.cn/dl/go1.14.4.linux-amd64.tar.gz
$ tar zxf go1.14.4.linux-amd64.tar.gz
$ mv go /usr/local/
$ mkdir ~/gopath
$ vi /root/.bash_profile
GOPATH=/root/gopath
export GOPATH
GOROOT=/usr/local/go
export GOROOT
PATH=$PATH:$HOME/bin:$GOPATH/bin:$GOROOT/bin
$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
# 步骤二:安装 operator-sdk
$ yum -y install git
$ RELEASE_VERSION=v0.15.0
$ curl -OJL https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
$ chmod +x operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu && sudo cp operator-# sdk-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/operator-sdk && rm operator-# sdk-${RELEASE_VERSION}-x86_64-linux-gnu
$ mkdir -p $GOPATH/src/github.com/operator-framework
$ cd $GOPATH/src/github.com/operator-framework
$ git clone https://github.com/operator-framework/operator-sdk
$ cd operator-sdk
$ git checkout master
$ make dep
$ make install
创建app-operator
# 步骤一: 安装kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
# 步骤二: 配置git
git config --global user.email xxx@xxx.com
git config --global user.name "xxx"
# 步骤三: 创建app-operator
mkdir -p $GOPATH/src/github.com/example-inc/
cd $GOPATH/src/github.com/example-inc/
export GO111MODULE=on
operator-sdk new app-operator
cd app-operator
operator-sdk add api --api-version=app.example.com/v1alpha1 --kind=AppService
operator-sdk add controller --api-version=app.example.com/v1alpha1 --kind=AppService
go mod vendor
operator-sdk build <your own docker registry>:latest
docker push <your own docker registry>:latest
sed -i 's|REPLACE_IMAGE|<your own docker registry>|g' deploy/operator.yaml
配置~/.kube/config,之后创建app-operator
# kubectl create -f deploy/service_account.yaml
# kubectl create -f deploy/role.yaml
# kubectl create -f deploy/role_binding.yaml
# kubectl create -f deploy/crds/app_v1alpha1_appservice_crd.yaml
# kubectl create -f deploy/operator.yaml
# kubectl create -f deploy/crds/app_v1alpha1_appservice_cr.yaml
拓展阅读
operator-sdk 版本选用 v0.15.0
operator-sdk 由于发版很快,不同版本调整很大,所以使用开源软件,无论维护还是开发,第一要义确定版本。
更多推荐
所有评论(0)