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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流雨声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值