千家信息网

自定义K8S CDR的利器kubebuilder怎么用

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,自定义K8S CDR的利器kubebuilder怎么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述用于在Go中快速构建和发布K
千家信息网最后更新 2025年02月05日自定义K8S CDR的利器kubebuilder怎么用

自定义K8S CDR的利器kubebuilder怎么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

概述

用于在Go中快速构建和发布Kubernetes API的SDK 它建立在用于构建核心Kubernetes API的规范技术之上,以提供简化的抽象来减少开发工作。

项目:

  • chaos-mesh:一个Pingcap 基于 kubebuilder 开发的 chaos 项目,代码量不大 & 比较简明,工具也很实用 [传送门]

  • kube-service:一个阿里同学的作品(看着像小玩具,不了解是否实用了),作为CRD的学习例子很不错 [传送门]

功能

  • 使用包括基本结构的项目初始化


    • 在规范版本中获取包依赖性。


    • 主程序入口点


    • 用于格式化,生成,测试和构建的Makefile


    • 用于构建容器映像的Dockerfile

  • 脚手架API


    • 资源(模型)定义


    • 控制器实现


    • 资源和控制器的集成测试


    • CRD定义

  • 用于实现API的简单抽象


    • Controllers


    • Resource Schema Validation


    • Validating Webhooks

  • 用于发布API以安装到集群中的工件


    • Namespace


    • CRDs


    • RBAC Roles and RoleBindings


    • Controller StatefulSet + Service

  • API参考文档和示例

运行流程

client-go给的一个workQueue的例子

  • 把代码分为通用的Common part和Special Part


    • 前者是client-go的基本流程


    • 后者部分是controller自身逻辑部分

安装和使用

安装

源码安装

git clone https://github.com/kubernetes-sigs/kubebuildercd kubebuildermake buildcp bin/kubebuilder $GOPATH/bin

二进制安装

os=$(go env GOOS)arch=$(go env GOARCH)# download kubebuilder and extract it to tmpcurl -sL https://go.kubebuilder.io/dl/2.0.0-beta.0/${os}/${arch} | tar -xz -C /tmp/# extract the archivesudo mv /tmp/kubebuilder_2.0.0-beta.0_${os}_${arch} /usr/local/kubebuilder# update your PATH to include /usr/local/kubebuilder/binexport PATH=$PATH:/usr/local/kubebuilder/bin

辅助工具 kustomize

go install sigs.k8s.io/kustomize

使用

创建新API

先切换目录,kubebuilder 这点不好,不自动创建一个专用目录

mkdir -p $GOPATH/src/github.com/crdAPIDemo/cd $GOPATH/src/github.com/crdAPIDemo/

初始化项目目录

export GO111MODULE="on"export GOPROXY=https://goproxy.cnkubebuilder init --domain k8s.io --license apache2 --owner "The Kubernetes Authors"

API创建

  • 创建一个名为Sloop的新API

kubebuilder create api --group ships --version v1beta1 --kind Sloop

运行

make install & make run

启动一个实例

  • config/samples 下有示例配置可用

kubectl apply -f config/samples/ships_v1beta1_sloop.yaml可通过    kubectl get crd查看
执行的内容
  • yaml内容

apiVersion: ships.k8s.io/v1beta1kind: Sloopmetadata:  name: sloop-samplespec:  # Add fields here  foo: bar

仅将yaml存入etcd controller监听到事件时,没有做任何动作

  • 部署 controller

make docker-build docker-push IMG=fanux/ships-controller    // 执行总失败,提示有git拉取不到make deploy  // 但忽略上一步的失败,本操作可以执行

开发

开发

  • 定义Spec对象(api/v1beta1/sloop_types.go) 增加配置项

type SloopSpec 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 Sloop. Edit Sloop_types.go to remove/update        Foo string `json:"foo,omitempty"`        // 新增字段加在这里...    Cpu string `json:"cpu,omitempty"`    Memory string `json:"memory,omitempty"`}
  • 编辑原yaml文件内容(config/samples/ships_v1beta1_sloop.yaml ) 为Spec对象,提供具体配置的值

apiVersion: ships.k8s.io/v1beta1kind: Sloopmetadata:  name: sloop-samplespec:  # Add fields here  foo: bar    cpu: "1"              // 增加内容  memory: "500M"        // 增加内容

生效

kubectl apply -f config/samples/

查看

kubectl get Sloop.ships.k8s.io -o yaml// 输出:新的CRD定义内容apiVersion: v1items:- apiVersion: ships.k8s.io/v1beta1  kind: Sloop  metadata:    annotations:      kubectl.kubernetes.io/last-applied-configuration: |        {"apiVersion":"ships.k8s.io/v1beta1","kind":"Sloop","metadata":{"annotations":{},"name":"sloop-sample","namespace":"default"},"spec":{"cpu":"1","foo":"bar","memory":"500M"}}    creationTimestamp: "2020-01-19T09:07:41Z"    generation: 2    name: sloop-sample    namespace: default    resourceVersion: "150773"    selfLink: /apis/ships.k8s.io/v1beta1/namespaces/default/sloops/sloop-sample    uid: 6a715921-86af-4dae-b25d-be193d64c4b2  spec:     cpu: "1"                //变化内容,已生效    foo: bar            memory: 500M            //变化内容,已生效kind: Listmetadata:  resourceVersion: ""  selfLink: "

Reconcile 唯一需要实现的接口

作用

  • CRD只是定义资源,controller才是实现


    • controller把轮训与事件监听都封装在这一个接口里了.你不需要关心怎么事件监听的

  • controller内部


    • CURD及其他逻辑,都由Reconcile()来做分发

代码示例

(controllers/sloop_controller.go)

  • 原内容

package controllersimport (        "context"        "github.com/go-logr/logr"        "k8s.io/apimachinery/pkg/runtime"        ctrl "sigs.k8s.io/controller-runtime"        "sigs.k8s.io/controller-runtime/pkg/client"        shipsv1beta1 "github.com/crdAPIDemo/api/v1beta1")// SloopReconciler reconciles a Sloop objecttype SloopReconciler struct {        client.Client        Log    logr.Logger        Scheme *runtime.Scheme}// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops,verbs=get;list;watch;create;update;patch;delete// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops/status,verbs=get;update;patchfunc (r *SloopReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {        _ = context.Background()        _ = r.Log.WithValues("sloop", req.NamespacedName)        return ctrl.Result{}, nil}func (r *SloopReconciler) SetupWithManager(mgr ctrl.Manager) error {        return ctrl.NewControllerManagedBy(mgr).                For(&shipsv1beta1.Sloop{}).                Complete(r)}
  • 修改为

package controllersimport (        "context"        "fmt"        "github.com/go-logr/logr"        "k8s.io/apimachinery/pkg/runtime"        ctrl "sigs.k8s.io/controller-runtime"        "sigs.k8s.io/controller-runtime/pkg/client"        shipsv1beta1 "github.com/crdAPIDemo/api/v1beta1")// SloopReconciler reconciles a Sloop objecttype SloopReconciler struct {        client.Client        Log    logr.Logger        Scheme *runtime.Scheme}// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops,verbs=get;list;watch;create;update;patch;delete// +kubebuilder:rbac:groups=ships.k8s.io,resources=sloops/status,verbs=get;update;patchfunc (r *SloopReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {        ctx := context.Background()        log := r.Log.WithValues("sloop", req.NamespacedName)        // your logic here        vm := &shipsv1beta1.Sloop{}        if err := r.Get(ctx, req.NamespacedName, vm); err != nil {                log.Info("unable to fetch vm : %v", err)        } else {                fmt.Println("INFO:", vm.Spec.CPU, vm.Spec.Memory)        }        return ctrl.Result{}, nil}func (r *SloopReconciler) SetupWithManager(mgr ctrl.Manager) error {        return ctrl.NewControllerManagedBy(mgr).                For(&shipsv1beta1.Sloop{}).                Complete(r)}
  • 编译和使用

make; make install; make runkubectl apply -f config/samples   // 会打印出日志

关于自定义K8S CDR的利器kubebuilder怎么用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

内容 项目 开发 事件 代码 目录 示例 资源 问题 配置 利器 实用 例子 对象 工具 接口 控制器 更多 流程 逻辑 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 5G传输网络安全现状 华为手机浏览器网络安全证书 中国互联网发展史亚信科技 toad怎么远程数据库 网络安全能力提升活动 学校网络安全员培训报道 程序员服务器代码安全 本地无法连接ftp服务器 软件开发生产性业内标准 赢时胜恒河数据库 最新消息 数据库的分析与处理实践 扫雷软件开发价格 质量网络技术服务软件 万方数据库检索性能特点 学校网络安全活动图片素材 苹果笔记本服务器证书无效怎么办 网络安全手抄报漂亮简单大全 建筑土木与信息网络安全 用友系统数据库错误是什么原因 方舟手游服务器管理员权限 163邮箱如何添加服务器 软件开发培训的相关介绍 plsql本地的数据库名 移动网络技术工资多少 dns 服务器不稳定 服务器防护多少g 安卓互联网黑科技 麒麟系统怎么查看服务器配置 绵阳天气预报软件开发 上海专业性网络技术咨询热线
0