基于 K8s & K3s 集群的 Operator 二次开发

Operator-Sdk 简介

Operators 使在Kubernetes中管理复杂的有状态的应用更为简单。但是,目前编写 operator 还是比较困难,因为需要与底层的APIs打交道,编写模版和模块化资源缺乏也导致重复的工作。
该 Operator SDK 是一个框架,使用 controller-runtime 库来使得编写 operators 更为容易,提供了:

  • 高阶APIs 和抽象,使编写运维逻辑更为直观;
  • Tools和启动模块,使创建新的工程时更快;
  • 覆盖常用的operator的扩展。

环境搭建

前提: windows 和 通用 Linux 操作系统进行完成。

1 Windows 环境适配

右击计算机->属性->高级系统设置->环境变量,在系统变量中找到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 由于发版很快,不同版本调整很大,所以使用开源软件,无论维护还是开发,第一要义确定版本。

posted @ 2021-02-17 14:50  流雨声  阅读(383)  评论(0编辑  收藏  举报