k8s operator从0到1实践
新建名为easyservice-sample的自定义资源实例,创建副本数量和对应的nodeport端口。对象结构(api)、控制器(controller)修改完毕后,需要更新crd的定义。使用脚手架工具,能生成项目模板,开发人员只需要关注核心逻辑和方法即可。当CR新建出来后,controller就会收到相应的事件变更。推荐使用docker-desktop,本地单机集群。1、制作推送controll
·
环境准备
一个k8s集群
推荐使用docker-desktop,本地单机集群
开发工具包
这里推荐使用脚手架工具kubebuilder
使用脚手架工具,能生成项目模板,开发人员只需要关注核心逻辑和方法即可
mac安装
brew install kubebuilder
实践
初始化operator项目
# 新建项目文件夹
$ mkdir webapp-operator
# 切入到项目文件夹
$ cd webapp-operator/
# 初始化go module
$ go mod init webapp-operator
# 初始化operator项目模板
$ kubebuilder init --domain kubebuilder.io
# 创建api
# 这里我们创建一个 group 为 app, version 为 v1, kind 为 EasyService 的 api:
$ kubebuilder create api --group app --version v1 --kind EasyService
生成的项目结构目录如下:
$ tree webapp-operator/ -L 2
webapp-operator/
├── Dockerfile # 用于构建控制器镜像的 Dockerfile
├── Makefile # 用于控制器构建及部署的 Makefile
├── PROJECT # 用于生成组件的 kubebuilder 元数据
├── README.md
├── api # API 模板代码所在目录
│ └── v1
├── bin # 可执行程序
│ ├── controller-gen
│ ├── k8s
│ ├── kustomize
│ └── setup-envtest
├── cmd # 程序入口main
│ └── main.go
├── config # 采用 Kustomize YAML 定义的配置
│ ├── crd # CRD 相关, 当 make install 将 apply 此目录 yaml
│ ├── default # 控制器相关, 当 make deploy 将 apply 此目录 yaml
│ ├── manager
│ ├── prometheus
│ ├── rbac
│ └── samples
├── cover.out
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── internal
│ └── controller # 控制器逻辑所在目录,**需要开发者完善**
└── resources # 非脚手架生成,**开发者生成**
├── deployment.go
└── service.go
核心逻辑编写
完整代码参考:
webapp-operator
对象结构(api)、控制器(controller)修改完毕后,需要更新crd的定义
$ make manifests
测试验证
前提条件:
登录到在集群master上操作
1、将CRD安装到集群
$ make install
# 安装完毕后,可以在集群查到crd的信息
$ kubectl get crd | grep easyservice
easyservices.app.kubebuilder.io 2024-01-14T09:01:58Z
2、 启动控制器
$ make run
3、新建CR
新建名为easyservice-sample的自定义资源实例,创建副本数量和对应的nodeport端口。
比如新建了一个easyservice-sample.yaml文件,内容如下:
apiVersion: app.kubebuilder.io/v1
kind: EasyService
metadata:
name: easyservice-sample
spec:
# TODO(user): Add fields here
size: 2
image: nginx:1.7.9
ports:
- port: 80
targetPort: 80
nodePort: 31002
当CR新建出来后,controller就会收到相应的事件变更
# 新建CR
$ kubectl apply -f easyservice-sample.yaml
验证
- 主机访问:http://localhost:31002/
会显示nginx的主页 - 集群查看
$ kubectl get pods,deploy,EasyService,svc,crd
NAME READY STATUS RESTARTS AGE
pod/easyservice-sample-6cd6bf49f5-2xg57 1/1 Running 0 4h52m
pod/easyservice-sample-6cd6bf49f5-52l64 1/1 Running 0 12m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/easyservice-sample 2/2 2 2 4h52m
NAME AGE
easyservice.app.kubebuilder.io/easyservice-sample 4h52m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/easyservice-sample NodePort 10.101.103.107 <none> 80:31002/TCP 4h52m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30d
NAME CREATED AT
customresourcedefinition.apiextensions.k8s.io/easyservices.app.kubebuilder.io 2024-01-14T09:01:58Z
部署
1、制作推送controller镜像
$ make docker-build docker-push IMG=<some-registry>/<project-name>:tag
# 编译本地镜像
$ make docker-build IMG=test/webapp-operator:1.0.0
2、把controller部署到集群
$ make deploy IMG=<some-registry>/<project-name>:tag
参考
更多推荐
已为社区贡献9条内容
所有评论(0)