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

发布时间:2021-12-15 18:38:57 作者:柒染
来源:亿速云 阅读:455

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

概述

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

项目:

功能

运行流程

client-go给的一个workQueue的例子

安装和使用

安装

源码安装

git clone https://github.com/kubernetes-sigs/kubebuilder
cd kubebuilder
make build
cp bin/kubebuilder $GOPATH/bin

二进制安装

os=$(go env GOOS)
arch=$(go env GOARCH)

# download kubebuilder and extract it to tmp
curl -sL https://go.kubebuilder.io/dl/2.0.0-beta.0/${os}/${arch} | tar -xz -C /tmp/

# extract the archive
sudo mv /tmp/kubebuilder_2.0.0-beta.0_${os}_${arch} /usr/local/kubebuilder

# update your PATH to include /usr/local/kubebuilder/bin
export 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.cn
kubebuilder init --domain k8s.io --license apache2 --owner "The Kubernetes Authors"

API创建

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

运行

make install & make run

启动一个实例

kubectl apply -f config/samples/ships_v1beta1_sloop.yaml

可通过
    kubectl get crd
查看
执行的内容
apiVersion: ships.k8s.io/v1beta1
kind: Sloop
metadata:
  name: sloop-sample
spec:
  # Add fields here
  foo: bar

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

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

开发

开发

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"`
}
apiVersion: ships.k8s.io/v1beta1
kind: Sloop
metadata:
  name: sloop-sample
spec:
  # Add fields here
  foo: bar
  
  cpu: "1"              // 增加内容
  memory: "500M"        // 增加内容

生效

kubectl apply -f config/samples/

查看

kubectl get Sloop.ships.k8s.io -o yaml

// 输出:新的CRD定义内容
apiVersion: v1
items:
- 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: List
metadata:
  resourceVersion: ""
  selfLink: "

Reconcile 唯一需要实现的接口

作用

代码示例

(controllers/sloop_controller.go)

package controllers

import (
        "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 object
type 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;patch
func (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 controllers

import (
        "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 object
type 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;patch
func (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 run

kubectl apply -f config/samples   // 会打印出日志

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

推荐阅读:
  1. Prometheus+Grafan监控k8s集群详解
  2. k8s实践17:监控利器prometheus helm方式部署配置测试

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

k8s cdr kubebuilder

上一篇:提升K8S故障排查效率的示例分析

下一篇:linux如何修改path环境变量

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》