千家信息网

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

发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,自定义K8S CDR的利器kubebuilder怎么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述用于在Go中快速构建和发布K
千家信息网最后更新 2024年10月19日自定义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怎么用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0