河池网站推广,中企动力如何,做网站的工作,网站建设包含域名目录
1.前提条件
2.进一步准备
2.1.安装golang
2.2.安装code#xff08;vscode的linux版本#xff09;
2.3.安装kubebuilder
3.开始创建Operator
3.1.什么是operator?
3.2.GV GVK GVR
3.3.创建operator
3.3.1. 生成工程框架
3.3.2.生成api(GVK) …目录
1.前提条件
2.进一步准备
2.1.安装golang
2.2.安装codevscode的linux版本
2.3.安装kubebuilder
3.开始创建Operator
3.1.什么是operator?
3.2.GV GVK GVR
3.3.创建operator
3.3.1. 生成工程框架
3.3.2.生成api(GVK) 3.3.3.实现代码逻辑更新yaml定义
3.3.3.1.实现CR 3.3.3.2.依据代码定义更新yaml
3.3.3.3.实现controller的Reconcile的方法
3.3.4.安装CRD
3.3.5.本地运行
3.3.5.1.运行项目
3.3.5.2.测试
3.3.5.1.1.准备测试CRD的yaml配置 3.3.5.1.2.使用kubectl apply将CRD 实例部署到集群中 3.3.5.3.停止运行
3.3.5.3.1.删除自定义的CRD实例 3.3.5.3.1.停止工程运行
3.3.6.集群运行测试
3.3.6.1.修改Makefile 3.3.6.2.将应用部署到k8s集群上 3.3.6.3.测试
3.3.6.4.停止运行
参考文章 1.前提条件
使用kind搭建本地k8s集群之后会准备好以下内容
本地多节点集群kubectl 客户端命令工具Lens k8s dashboard 可视化客户端工具 图1 查看本地集群信息 图2 本地集群workload信息 2.进一步准备
2.1.安装golang
按教程安装 图3 golang安装后查看go版本 当前安装版本是1.17.2
2.2.安装codevscode的linux版本
这里有两种方式一种是已经在windows上安装了vscode的情况下希望在子系统的Ubuntu中也能使用vscode一种是直接在Ubuntu安装Vscode。
我这里使用的第一种按官方教程安装。如果是第二种请按此方法安装。
# 使用命令打开vscode
code . 图4 在WSL2中使用命令打开Vscode WSL2和Win10的文件夹是互通的当然可以直接在Win10中双击打开VScode然后打开对应的项目路径但是这样就有个缺点无法在Terminal中使用一些Unbuntu的命令有时候问题不大但我们操作k8s的客户端是基于kubectl的这个是使用这种方式的最重要原因后续调试需要的必须条件。
2.3.安装kubebuilder
按官方文档安装
os$(go env GOOS)
arch$(go env GOARCH)# download kubebuilder and extract it to tmp
curl -L https://go.kubebuilder.io/dl/2.2.0/${os}/${arch} | tar -xz -C /tmp/# move to a long-term location and put it on your path
# (youll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else)
sudo mv /tmp/kubebuilder_2.2.0_${os}_${arch} /usr/local/kubebuilder
export PATH$PATH:/usr/local/kubebuilder/bin校验kubebuilder安装后的情况 图5 检查kubebuilder 3.开始创建Operator
3.1.什么是operator? 我理解就是K8s的核心组件无法满足一些特定需求而提供给开发者一个自定义资源的机会。当然在我参考的文章中也有比较系统的描述。但是从我的角度确实比较易懂的解释就是这样的。既然是自定义资源那我们需要知道一个资源需要有那些要素这样才能定义
3.2.GV GVK GVR GV: Api Group Version API Group 是相关 API 功能的集合每个 Group 拥有一或多个 Versions GVK: Group Version Kind 每个 GV 都包含 N 个 api 类型称之为 Kinds不同 Version 同一个 Kinds 可能不同 GVR: Group Version Resource Resource 是 Kind 的对象标识一般来 Kind 和 Resource 是 1:1 的但是有时候存在 1:n 的关系不过对于 Operator 来说都是 1:1 的关系
我们看个例子
apiVersion: apps/v1 # 这个是 GVG 是 appsV 是 v1
kind: Deployment # 这个就是 Kind
metadata: # 这个是当前这种资源的媒体信息你可以理解为detail infoname: local-path-provisionernamespace: local-path-storage...
spec: # spec就是Resource了GVR中的R...
3.3.创建operator
3.3.1. 生成工程框架
# 创建工程文件夹
mkdir create-crd-demo
# 使用kubebuilder初始化一个项目框架
# --domain: 资源域名结合后续步骤进一步理解一下
# --repo: project是一个golang工程go工程使用package管理这个是go.mod的module信息如果该工程要作为其他工程的导入包那这个就要填可访问的repo路径才可以此处只要不是没意义的就可以了。
kubebuilder init --domain geoff.crd.demo --repo k8s-operator/kubebuilder-crd-demo 图6 使用kubebuilder创建工程框架 具体的工程目录如下
.
├── Dockerfile # 工程Dockerfile构建镜像的时候使用
├── Makefile # 定义make命令集合将一些命令定义成一个function XXX, 然后make XXX执行命令。
├── PROJECT # 项目信息
├── README.md # 工程说明
├── config # 这个是生成CRD所需要的yaml定义使用Kustomize管理
│ ├── default # 一些默认配置
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager # 部署CRD所需的 yaml
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus # Prometheus监控相关配置demo应该用不到
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ └── rbac # 部署所需的 rbac 授权 yaml
│ ├── 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
│ ├── role_binding.yaml
│ └── service_account.yaml
├── go.mod # 项目直接依赖直接
├── go.sum # 项目全部依赖直接间接
├── hack
│ └── boilerplate.go.txt
└── main.go # 项目程序启动入口
3.3.2.生成api(GVK)
刚才只是创建一个工程框架一个壳子接下来我们创建一个api
# 创建k8s的api (GVK)
kubebuilder create api --group apps --version v1 --kind CustomeCrdDemo 图7 使用kubebuilder在生成的工程下继续生成apiGVK相关定义 我们注意到工程目录多出了一些文件夹
.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── api # 新生成的和apiGVK相关的定义
│ └── v1
│ ├── customecrddemo_types.go # 这里是定义 spec 的地方
│ ├── groupversion_info.go # GV 的定义一般无需修改
│ └── zz_generated.deepcopy.go # 和deepcopy相关的方法
├── bin
│ └── controller-gen # 和go generater tool
├── config
│ ├── crd # 自动生成的CRD文件不用修改这里只需要修改了v1中的go文件之后执行make generate会更新当前目录的yaml定义文件
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_customecrddemoes.yaml
│ │ └── webhook_in_customecrddemoes.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager
│ │ ├── controller_manager_config.yaml
│ │ ├── 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
│ │ ├── customecrddemo_editor_role.yaml
│ │ ├── customecrddemo_viewer_role.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── role_binding.yaml
│ │ └── service_account.yaml
│ └── samples # 这里是CRD示例文件可以使用kubectl apply -f用来部署到集群当中
│ └── apps_v1_customecrddemo.yaml
├── controllers
│ ├── customecrddemo_controller.go # 在这里实现 CRD controller的逻辑
│ └── suite_test.go # 这里写测试
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
└── main.go 3.3.3.实现代码逻辑更新yaml定义
3.3.3.1.实现CR 到上面部分为止我们已经通过kubebuilder生成了CRD所需的项目框架接下来我们进行自定义开发此时我们使用VScode来开发吧
# 在当前目录下打开VScode
code . 我们随便增加CRD的spec字段增加ResourceName、AdditionalInfo。这字段会在之后生成的yaml文件中的spec字段体现。
//……
// CustomeCrdDemoSpec defines the desired state of CustomeCrdDemo
type CustomeCrdDemoSpec struct {// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster// Important: Run make to regenerate code after modifying this file// Foo is an example field of CustomeCrdDemo. Edit customecrddemo_types.go to remove/update// Foo string json:foo,omitempty// 资源名称ResouresName string json:resourceName,omitempty// 附加信息AdditionalInfo string json:additionalInfo,omitempty
}
//…… 图8 修改xxx_type.go中关于CRD spec字段的定义 3.3.3.2.依据代码定义更新yaml 执行命令更新yaml这里我们直接在VScode的Terminal中执行就可以了不需要在WSL2上执行命令方便开发。
# 重新生成yaml文件
make manifests generate 更新yamlstruct上字段备注成为了description是有意义的
# 新生成的yaml文件config/crd/bases/apps.geoff.crd.demo_customecrddemoes.yaml
……
spec:description: CustomeCrdDemoSpec defines the desired state of CustomeCrdDemoproperties:additionalInfo:description: 附加信息type: stringresourceName:description: 资源名称type: string
…… 其中yaml的路径和生成项目时设置的--domain是有关系的。
3.3.3.3.实现controller的Reconcile的方法 不做复杂的实现只增加日志打印。
// For more details, check Reconcile and its Result here:
// - https://pkg.go.dev/sigs.k8s.io/controller-runtimev0.11.2/pkg/reconcile
func (r *CustomeCrdDemoReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {log : log.FromContext(ctx)// TODO(user): your logic herelog.Info( Create a new CRD instance )return ctrl.Result{}, nil
} 图9 实现controller的Reconcile的方法 3.3.4.安装CRD
# 往k8s安装CRD的定义
make install 图11 直接在Vscode的Terminal执行make install 图12 在集群中能看到install后已经存在了CRD的定义 3.3.5.本地运行
3.3.5.1.运行项目
# 运行工程应用
make run 图12 运行工程项目在install之后 运行之后项目成功跑起来了没有报错就算是成功了。
3.3.5.2.测试
3.3.5.1.1.准备测试CRD的yaml配置 我们自己定义的struct有两个字段一个是resourceName、AdditionalInfo我们要实现一个CRD的实例dem哦目前项目工程路径config/samples/xxx.yaml下有个自动生成的CRD模板我们按照定义需要给这两个字段配置信息。
apiVersion: apps.geoff.crd.demo/v1
kind: CustomeCrdDemo
metadata:name: customecrddemo-sample
spec:# TODO(user): Add fields hereresourceName: my-crd-instance-1AdditionalInfo: 这是我测试的第一个CRD资源实例 图13 准备CRD测试实例的yaml需要实现spec的字段 3.3.5.1.2.使用kubectl apply将CRD 实例部署到集群中
# 使用kubectl apply一个CRD实例
# 其中项目目录下config/samples/xxx.yaml是make generate mainfests生成的
kubectl apply -f ./config/samples/apps_v1_customecrddemo.yaml 图14 部署CRD实例demo 图15 集群上已经能看到刚刚部署的CRD实例demo 图16 项目工程CRD operator日志打印了operator实现成功 3.3.5.3.停止运行
3.3.5.3.1.删除自定义的CRD实例
# 删除了刚刚的CRD demo实例
kubectl delete -f config/samples/ 图17 删除自定义的CRD实例demo 3.3.5.3.1.停止工程运行 直接在Vscode的Terminal中执行CtrlC即可停止项目运行 图18 将本地运行的项目停止 3.3.6.集群运行测试 上一章节我们看到可以在本地run了project直接看到当CRD被部署后直接触发了我们controller中实现的日志。实际上我们开发好了之后这个operator application是要部署到k8s集群上的主要controller的实现逻辑这样CRD才能起作用。如何操作其实工程的README.md也有说明的可以先看看。
3.3.6.1.修改Makefile
# 本地集群的名称
KUBE_CLUSTER k8s-local-dev ……# 增加一个function将本地的image上传到Kind的容器中
.PHONY: kind-load
kind-load: ## load the local image to the kind clusterkind load docker-image ${IMG} --name ${KUBE_CLUSTER}…… 图17 增加kind-load,可以将image上传到kind创建的集群容器中 3.3.6.2.将应用部署到k8s集群上
以下是部署到集群的步骤构建镜像、上传到集群容器中、部署
其中IMG是一个可以自行设置镜像名的变量此处为k8s-crd-demo:1.0。
按如下命令执行后即可在k8s集群中看到部署的CRD controller应用。
# 构建镜像有时候会失败可能是网络问题多试几遍IMG需要指定不然后面部署还是有问题
make docker-build IMGk8s-crd-demo:1.0
# local镜像上传到Kind创建的k8s集群所在的所有node中如果本地是
make kind-load IMGk8s-crd-demo:1.0
# 部署controller
make deploy IMGk8s-crd-demo:1.0 在这个过程中bin/目录存在一些二进制的工具包可以先删除是之前make run时下载的有可能会报错。 图18 bin目录应该要提前删除kustomize工具 图19 make deploy IMGxxx将controller部署到k8s上 图20 将operator这个应用application部署到k8s集群 3.3.6.3.测试 同上面3.3.5.2直接测试即可
3.3.6.4.停止运行
# undeploy controller
make undeploy
# 卸载CRD
make uninstall
参考文章
如何在 Ubuntu 20.04 上安装 Go-腾讯云开发者社区-腾讯云
开始通过 WSL 使用 VS Code | Microsoft Learn
快速入门 - Kubebuilder 中文文档
3. KubeBuilder 简明教程 - Mohuishou 文章转载自: http://www.morning.yrjxr.cn.gov.cn.yrjxr.cn http://www.morning.bhrkx.cn.gov.cn.bhrkx.cn http://www.morning.rfyff.cn.gov.cn.rfyff.cn http://www.morning.yrqb.cn.gov.cn.yrqb.cn http://www.morning.ghphp.cn.gov.cn.ghphp.cn http://www.morning.stph.cn.gov.cn.stph.cn http://www.morning.ktmbp.cn.gov.cn.ktmbp.cn http://www.morning.bpwdc.cn.gov.cn.bpwdc.cn http://www.morning.ygmw.cn.gov.cn.ygmw.cn http://www.morning.kbbmj.cn.gov.cn.kbbmj.cn http://www.morning.rddlz.cn.gov.cn.rddlz.cn http://www.morning.qjldz.cn.gov.cn.qjldz.cn http://www.morning.kkzwn.cn.gov.cn.kkzwn.cn http://www.morning.jkcpl.cn.gov.cn.jkcpl.cn http://www.morning.mtbth.cn.gov.cn.mtbth.cn http://www.morning.nyqxy.cn.gov.cn.nyqxy.cn http://www.morning.qlkjh.cn.gov.cn.qlkjh.cn http://www.morning.zglrl.cn.gov.cn.zglrl.cn http://www.morning.rkfh.cn.gov.cn.rkfh.cn http://www.morning.yjmns.cn.gov.cn.yjmns.cn http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn http://www.morning.jcxqc.cn.gov.cn.jcxqc.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.wrkcw.cn.gov.cn.wrkcw.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.kwblwbl.cn.gov.cn.kwblwbl.cn http://www.morning.ftldl.cn.gov.cn.ftldl.cn http://www.morning.ywxln.cn.gov.cn.ywxln.cn http://www.morning.hhqjf.cn.gov.cn.hhqjf.cn http://www.morning.mhfbf.cn.gov.cn.mhfbf.cn http://www.morning.wpjst.cn.gov.cn.wpjst.cn http://www.morning.rtbj.cn.gov.cn.rtbj.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.yjxfj.cn.gov.cn.yjxfj.cn http://www.morning.jzxqj.cn.gov.cn.jzxqj.cn http://www.morning.bpmnz.cn.gov.cn.bpmnz.cn http://www.morning.psdsk.cn.gov.cn.psdsk.cn http://www.morning.jwtwf.cn.gov.cn.jwtwf.cn http://www.morning.dddcfr.cn.gov.cn.dddcfr.cn http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn http://www.morning.nqpy.cn.gov.cn.nqpy.cn http://www.morning.wdshp.cn.gov.cn.wdshp.cn http://www.morning.gkjnz.cn.gov.cn.gkjnz.cn http://www.morning.zffps.cn.gov.cn.zffps.cn http://www.morning.lkpzx.cn.gov.cn.lkpzx.cn http://www.morning.tkgxg.cn.gov.cn.tkgxg.cn http://www.morning.mrccd.cn.gov.cn.mrccd.cn http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn http://www.morning.tlbdy.cn.gov.cn.tlbdy.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.qbjrf.cn.gov.cn.qbjrf.cn http://www.morning.cczrw.cn.gov.cn.cczrw.cn http://www.morning.divocn.com.gov.cn.divocn.com http://www.morning.mqldj.cn.gov.cn.mqldj.cn http://www.morning.gnlyq.cn.gov.cn.gnlyq.cn http://www.morning.nlzpj.cn.gov.cn.nlzpj.cn http://www.morning.xqkjp.cn.gov.cn.xqkjp.cn http://www.morning.qlrwf.cn.gov.cn.qlrwf.cn http://www.morning.cfmrb.cn.gov.cn.cfmrb.cn http://www.morning.hdpcn.cn.gov.cn.hdpcn.cn http://www.morning.hxhrg.cn.gov.cn.hxhrg.cn http://www.morning.zxdhp.cn.gov.cn.zxdhp.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.zcyxq.cn.gov.cn.zcyxq.cn http://www.morning.qxwrd.cn.gov.cn.qxwrd.cn http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com http://www.morning.xnfg.cn.gov.cn.xnfg.cn http://www.morning.ey3h2d.cn.gov.cn.ey3h2d.cn http://www.morning.cctgww.cn.gov.cn.cctgww.cn http://www.morning.ghslr.cn.gov.cn.ghslr.cn http://www.morning.rwqk.cn.gov.cn.rwqk.cn http://www.morning.snmth.cn.gov.cn.snmth.cn http://www.morning.hxlch.cn.gov.cn.hxlch.cn http://www.morning.tktcr.cn.gov.cn.tktcr.cn http://www.morning.bphqd.cn.gov.cn.bphqd.cn http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn http://www.morning.gnjtg.cn.gov.cn.gnjtg.cn http://www.morning.rwpjq.cn.gov.cn.rwpjq.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn