主页 > IT业界  > 

k8soperator从0到1实践


文章目录 环境准备一个k8s集群开发工具包mac安装 实践初始化operator项目核心逻辑编写测试验证验证 部署 参考

环境准备 一个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

2、把controller部署到集群

$ make deploy IMG=<some-registry>/<project-name>:tag 参考 K8s operator从0到1实战
标签:

k8soperator从0到1实践由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“k8soperator从0到1实践