关注分享主机优惠活动
国内外VPS云服务器

Kubebuilder扩展k8s(kubebuilder用法)

Kubebuilder是一个开发k8s的特殊框架。

K8s有很多资源,比如deployment,cronjob等。这些资源的行为在逻辑上由位于controller-manager中的每个资源控制器实现。

在https://github.com/kubernetes-sigs/kubebuilder/releases安装适当的二进制文件,并把它们放在path中。

术语GV: Api组和版本

组API是相关API函数的集合,

每个组都有一个或多个版本。

GVK:团体版种类

每个GV包含许多api类型,这些类型被称为种类。同一种类的不同版本可能不同。

GVR:组版本资源

是资源种类的对象标识符。一般来说,种类和资源是1:1的关系,但有时候也有1:n的关系,但对于Operator来说都是1:1。

API: apps/V1 #这是GV,G是apps,V是v1kind: Deployment #这是Kindsepc: #加上去中心化的spec就是资源。你可以根据GVK K8s找到你想要创建的资源。在根据您定义的规范创建了一个资源之后,它就变成了一个资源,即GVR。GVK/GVR是K8s资源的坐标,是我们创建/删除/修改/读取资源的基础。

相似的关系/团体/版本/种类

项目初始化的完整代码:https://github . com/nature lr/code -example/tree/master/operator

背景:当我们部署服务时,我们经常需要同时部署部署和svc。这个很复杂,所以我们定义了一个叫appx的资源,让appx创建svc和部署。

在项目文件夹下执行文件夹初始化。

kube builder init --repo github.com/naturelr/code-example/operator --domain nature lr . cc--skip -go-version -check此时,目录中会生成一些文件。

├── dockerfile #编译Docker Image ├── Makefile #编译部署相关脚本,常用函数都在里面├──项目#项目描述├── config #这个目录都是一些需要安装到集群中的文件│ ├-Default #默认配置├-Manager # CRD文件│ ├-Prometheus #监控相关servicemonitor └-RBAC # RBAC文件┢-go . mod┢-go . sum╸-hack└-boiler plate . go . txt└-main . go6 directors。

Kube Builder创建API --group appx --version v1--kinda ppx完成后,还有一些目录。

。├-Docker文件├-Makefile ├-Project ├-API └-v1 #我们自定义的API ├-bin └-Controller -Gen #程序├-config ├-controllers ├-appx _ controller . go #控制逻辑写在这里└-suite _ test.go #测试用例├-go.mod ├-go.sum ├-hack └-boilerplate.go.txt └-main.go12directories,10files实现定义字段在API/v1 API/v1/application _ types . go

type AppxSpec struct { //插入附加规范字段-所需的群集状态//重要提示:Run & quot制造& quot修改此文件后重新生成代码// Foo是Appx的一个示例字段。Edit appx_types.go删除/更新图像字符串“JSON:& quot;image,omitempty & quot` Port int ` JSON:& quot;港口,临时& quot`}然后执行make manifests generate命令来生成crd文件。

生成的crd文件位于config/crd/bases/中

如果控制器有crd,那么它只能在k8s中定义CRs,而k8s不知道如何处理这些CRs,所以我们需要实现控制器来处理这些逻辑。

我们需要实现的控制器的逻辑在controllers/application _ controller . go中的Reconcile函数中。

逻辑改了之后,还需要测试。执行make install将crd安装到集群。请注意,它将安装到集群的配置文件~/中。kube/配置。

然后执行make run来运行控制器,他会打印很多日志。

获取cd,并获取cr中定义的映像和端口号。

appx:= & amp;appxv1。Appx{}if err := r.Get(ctx,req。NamespacedName,appx);呃!= nil {返回ctrl。Result{},err}得到信息后,需要创建相应的部署对象和服务对象。您需要特别注意管理创建的资源,否则删除的子资源不会被删除。

SVC:= & amp;apiv1。Service{}if err := r.Get(ctx,req。NamespacedName,SVC);呃!= nil {如果客户端。IgnoreNotFound(错误)!= nil {返回ctrl。Result{},err//如果有错误没有找到,就返回错误}//创建资源if svc。Name = = " & quot{ l . Info(& quot;服务:&quot创建: ",& quot;名称”,appx。名称)svc = & ampapiv1。服务{ ObjectMeta: metav1。ObjectMeta{ Name: req。名称,命名空间:req。命名空间,},规范:apiv1。service spec { Selector:map[string]string { & quot;app & quot:请求。名称},端口:[]apiv1。ServicePort{{ Port: int32(appx。Spec.Port),TargetPort: intstr。FromInt(appx。Spec.Port),},},},},}//关联appx和deployment if err:= controller util . setownerreference(appx,SVC,r . Scheme);呃!= nil {返回ctrl。Result{},err } if err := r.Create(ctx,SVC);呃!= nil {返回ctrl。结果{},错误信息(& quot服务创建成功")}}如果此资源已经存在,可能需要更新它。

// svcsvc。规格端口= []apiv1。ServicePort{{Port: int32(appx。规格端口)} } l . Info(& quot;更新服务& quot,& quot端口& quot,appx。Spec.Image)if err := r.Update(ctx,SVC);呃!= nil {返回ctrl。结果{},错误信息(& quot服务更新完成”)至此,简单crd的控制逻辑完成。

上面创建的cr在查看时不显示状态。

在api/v1/appx_types.go中找到AppxStatus并添加适当的字段。

// AppxStatus定义Appxtype AppxStatus struct的观察状态{ //插入附加状态字段-定义集群的观察状态//重要:Run & quot制造& quot修改此文件后重新生成代码//JSON标记workload int 32 ` JSON:" workload & quot;` Svc string ` JSON:& quot;svc & quot`}更新controllers/application _ controller . go中的状态字段。

appx。状态。工作负荷= *部署。spec . replicas px . status . SVC = fmt。sprintf(& quot;% d & quot,svc.spec.ports [0]。port) r.status()。更新(CTX,appx)将显示在get xx -o yaml中。当我们要在get xxx -o wide中显示时,需要在API/v1/appx _ types.go中添加注释,具体请参考https://book.kubebuilder.io/reference/generating-crd.html。

//注意type要对应上字段!!!//+kube builder:print column:JSON path = & quot;. status.workload & quot,name=Workload,type = integer//+kube builder:print column:JSON path = & quot;. status.svc & quot,name=Svc,type = string The也需要重新生成并安装。

Events evnet事件,有时会告诉我们一些重要的信息。

在controllers/application _ controller . go中添加字段

//appxreconciler协调appxobject类型appx reconcile r struct { client . client scheme * runtime . scheme recorder record.EventRecorder//添加事件结构}调用

r.Recorder.Event(appx,apiv1。EventTypeNormal,& quotCr & quot找到了,appx。Name)在main.go中添加记录器的初始化逻辑

if err =(& amp;控制器。AppxReconciler{ Client: mgr。GetClient(),Scheme: mgr。GetScheme(),记录者:mgr。GetEventRecorderFor(& quot;Appx & quot), //+}).SetupWithManager(经理);呃!= nil { setupLog。错误(err,& quot无法创建控制器& quot,& quot控制器& quot,& quotAppx & quot)os。exit(1)} $ ku bectl get event last seen type reason object message 2m 55s Normal find Cr appx 4s Normal find Cr appx/fofoo的Common命令# initialize kube builder init --repo github.com/naturelr/code-example/operator --domain naturelr . cc--skip -go-version -check # Create apikubeBuilder Create API --group appx -version 1--kindappx # Create webhook kubuilder Create web hook --group nodes -4

未经允许不得转载:主机频道 » Kubebuilder扩展k8s(kubebuilder用法)

评论 抢沙发

评论前必须登录!