千家信息网

kubebuilder怎么安装使用

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容主要讲解"kubebuilder怎么安装使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"kubebuilder怎么安装使用"吧!kubebuil
千家信息网最后更新 2025年12月02日kubebuilder怎么安装使用

本篇内容主要讲解"kubebuilder怎么安装使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"kubebuilder怎么安装使用"吧!

kubebuilder

kubebuilder能帮我们节省大量工作,让开发CRD和adminsion webhook变得异常简单。

安装

通过源码安装:

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/# move to a long-term location and put it on your path# (you'll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else)sudo mv /tmp/kubebuilder_2.0.0-beta.0_${os}_${arch} /usr/local/kubebuilderexport PATH=$PATH:/usr/local/kubebuilder/bin

还需要装下kustomize 这可是个渲染yaml的神器,让helm颤抖。

go install sigs.k8s.io/kustomize/v3/cmd/kustomize

使用

注意你得先有个kubernetes集群,一步安装走你

创建CRD

kubebuilder init --domain sealyun.com --license apache2 --owner "fanux"kubebuilder create api --group infra --version v1 --kind VirtulMachine

安装CRD并启动controller

make install # 安装CRDmake run # 启动controller

然后我们就可以看到创建的CRD了

# kubectl get crdNAME                                           AGEvirtulmachines.infra.sealyun.com                  52m

来创建一个虚拟机:

# kubectl apply -f config/samples/# kubectl get virtulmachines.infra.sealyun.com NAME                   AGEvirtulmachine-sample   49m

看一眼yaml文件:

# cat config/samples/infra_v1_virtulmachine.yaml apiVersion: infra.sealyun.com/v1kind: VirtulMachinemetadata:  name: virtulmachine-samplespec:  # Add fields here  foo: bar

这里仅仅是把yaml存到etcd里了,我们controller监听到创建事件时啥事也没干。

把controller部署到集群中

make docker-build docker-push IMG=fanux/infra-controllermake deploy

我是连的远端的kubenetes, make docker-build时test过不去,没有etcd的bin文件,所以先把test关了。

修改Makefile:

# docker-build: testdocker-build:

Dockerfile里的gcr.io/distroless/static:latest 这个镜像你也可能拉不下来,随意改改就行,我改成了golang:1.12.7

也有可能构建时有些代码拉不下来,启用一下go mod vendor 把依赖打包进去

go mod vendor如果你本地有些代码拉不下来,可以用proxy:

export GOPROXY=https://goproxy.io


再改下Dockerfile, 注释掉download:

修改后:

# Build the manager binaryFROM golang:1.12.7 as builderWORKDIR /go/src/github.com/fanux/sealvm# Copy the Go Modules manifestsCOPY . . # BuildRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o manager main.go# Use distroless as minimal base image to package the manager binary# Refer to https://github.com/GoogleContainerTools/distroless for more details# FROM gcr.io/distroless/static:latestFROM golang:1.12.7WORKDIR /COPY --from=builder /go/src/github.com/fanux/sealvm/manager .ENTRYPOINT ["/manager"]

make deploy 时报错: Error: json: cannot unmarshal string into Go struct field Kustomization.patches of type types.Patch

config/default/kustomization.yaml 中的 patches: 改成 patchesStrategicMerge: 即可

kustomize build config/default 这个命令就渲染出了controller的yaml文件,可以体验下

看 你的controller已经跑起来了:

kubectl get deploy -n sealvm-systemNAME                        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEsealvm-controller-manager   1         1         1            0           3mkubectl get svc -n sealvm-systemNAME                                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGEsealvm-controller-manager-metrics-service   ClusterIP   10.98.71.199           8443/TCP   4m

开发

增加对象数据参数

看下config/samples下面的yaml文件:

apiVersion: infra.sealyun.com/v1kind: VirtulMachinemetadata:  name: virtulmachine-samplespec:  # Add fields here  foo: bar

这里参数里有foo:bar, 那我们来加个虚拟CPU,内存信息:

直接api/v1/virtulmachine_types.go即可

// VirtulMachineSpec defines the desired state of VirtulMachine// 在这里加信息type VirtulMachineSpec struct {        // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster        // Important: Run "make" to regenerate code after modifying this file        CPU    string `json:"cpu"`   // 这是我增加的        Memory string `json:"memory"`}// VirtulMachineStatus defines the observed state of VirtulMachine// 在这里加状态信息,比如虚拟机是启动状态,停止状态啥的type VirtulMachineStatus struct {        // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster        // Important: Run "make" to regenerate code after modifying this file}

然后make一下:

make && make install && make run

这时再去渲染一下controller的yaml就会发现CRD中已经带上CPU和内存信息了:

kustomize build config/default

properties:  cpu:    description: 'INSERT ADDITIONAL SPEC FIELDS - desired state of cluster      Important: Run "make" to regenerate code after modifying this file'    type: string  memory:    type: string

修改一下yaml:

apiVersion: infra.sealyun.com/v1kind: VirtulMachinemetadata:  name: virtulmachine-samplespec:  cpu: "1"  memory: "2G"
# kubectl apply -f config/samples virtulmachine.infra.sealyun.com "virtulmachine-sample" configured# kubectl get virtulmachines.infra.sealyun.com virtulmachine-sample -o yaml apiVersion: infra.sealyun.com/v1kind: VirtulMachinemetadata:  annotations:    kubectl.kubernetes.io/last-applied-configuration: |      {"apiVersion":"infra.sealyun.com/v1","kind":"VirtulMachine","metadata":{"annotations":{},"name":"virtulmachine-sample","namespace":"default"},"spec":{"cpu":"1","memory":"2G"}}  creationTimestamp: 2019-07-26T08:47:34Z  generation: 2  name: virtulmachine-sample  namespace: default  resourceVersion: "14811698"  selfLink: /apis/infra.sealyun.com/v1/namespaces/default/virtulmachines/virtulmachine-sample  uid: 030e2b9a-af82-11e9-b63e-5254bc16e436spec:      # 新的CRD已生效  cpu: "1"  memory: 2G

Status 同理,就不再赘述了,比如我把status里加一个Create, 表示controller要去创建虚拟机了(主要一些控制层面的逻辑),创建完了把状态改成Running

Reconcile 唯一需要实现的接口

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

获取虚拟机信息
func (r *VirtulMachineReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {        ctx = context.Background()        _ = r.Log.WithValues("virtulmachine", req.NamespacedName)        vm := &v1.VirtulMachine{}        if err := r.Get(ctx, req.NamespacedName, vm); err != nil { # 获取VM信息                log.Error(err, "unable to fetch vm")        } else {        fmt.Println(vm.Spec.CPU, vm.Spec.Memory) # 打印CPU内存信息        }        return ctrl.Result{}, nil}

make && make install && make run这个时候去创建一个虚拟机kubectl apply -f config/samples,日志里就会输出CPU内存了. List接口同理,我就不赘述了

r.List(ctx, &vms, client.InNamespace(req.Namespace), client.MatchingField(vmkey, req.Name))
更新状态

在status结构体中加入状态字段:

type VirtulMachineStatus struct {        Status string `json:"status"`}

controller里去更新状态:

vm.Status.Status = "Running"if err := r.Status().Update(ctx, vm); err != nil {        log.Error(err, "unable to update vm status")}

如果出现:the server could not find the requested resource 这个错误,那么在CRD结构体上需要加个注释 // +kubebuilder:subresource:status

// +kubebuilder:subresource:status// +kubebuilder:object:root=truetype VirtulMachine struct {        metav1.TypeMeta   `json:",inline"`        metav1.ObjectMeta `json:"metadata,omitempty"`        Spec   VirtulMachineSpec   `json:"spec,omitempty"`        Status VirtulMachineStatus `json:"status,omitempty"`}

这样就好了

编译启动后再去apply发现状态已经变成running:

# kubectl get virtulmachines.infra.sealyun.com virtulmachine-sample -o yaml...status:  status: Running
删除
time.Sleep(time.Second * 10)if err := r.Delete(ctx, vm); err != nil {        log.Error(err, "unable to delete vm ", "vm", vm)}

10s之后我们将GET不到

其它接口

Reconcile结构体聚合了Client接口,所以client的所有方法都是可以直接调用,大部分是对CRD object的相关操作

type Client interface {        Reader        Writer        StatusClient}
// Reader knows how to read and list Kubernetes objects.type Reader interface {        // Get retrieves an obj for the given object key from the Kubernetes Cluster.        // obj must be a struct pointer so that obj can be updated with the response        // returned by the Server.        Get(ctx context.Context, key ObjectKey, obj runtime.Object) error        // List retrieves list of objects for a given namespace and list options. On a        // successful call, Items field in the list will be populated with the        // result returned from the server.        List(ctx context.Context, list runtime.Object, opts ...ListOptionFunc) error}// Writer knows how to create, delete, and update Kubernetes objects.type Writer interface {        // Create saves the object obj in the Kubernetes cluster.        Create(ctx context.Context, obj runtime.Object, opts ...CreateOptionFunc) error        // Delete deletes the given obj from Kubernetes cluster.        Delete(ctx context.Context, obj runtime.Object, opts ...DeleteOptionFunc) error        // Update updates the given obj in the Kubernetes cluster. obj must be a        // struct pointer so that obj can be updated with the content returned by the Server.        Update(ctx context.Context, obj runtime.Object, opts ...UpdateOptionFunc) error        // Patch patches the given obj in the Kubernetes cluster. obj must be a        // struct pointer so that obj can be updated with the content returned by the Server.        Patch(ctx context.Context, obj runtime.Object, patch Patch, opts ...PatchOptionFunc) error}// StatusClient knows how to create a client which can update status subresource// for kubernetes objects.type StatusClient interface {        Status() StatusWriter}

到此,相信大家对"kubebuilder怎么安装使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

状态 信息 接口 内存 文件 事件 结构 里加 代码 内容 参数 方法 注释 集群 学习 开发 更新 监听 实用 更深 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络技术题南开 服务器租用哪里好 arcmap连接数据库没有权限 银行软件开发工资待遇怎么样 广州网络安全实战培训 谷歌地球打开显示服务器错误 联想服务器两颗铜牌什么意思 如何查mysql服务器名称 服务器 内存条 全球华人网络安全技能大会 桌管2.0服务器有问题怎么解决 网络安全教育宣传手抄报竖版 影响服务器价格的因素有哪些 中国网络安全看湖南 万州区综合软件开发服务电话多少 病虫害数据库包括什么 信息和网络安全风险 100台服务器同时安装系统 铎邝网络技术有限责任公司 珠海应用软件开发设计 新建一个德语数据库怎么做 浙江社区智慧养老软件开发 sql导出数据库表数据库 网络安全控制措施 对网络安全看法 广东系统软件开发大概要多少钱 网络安全与信息化管理处 北京服务器虚拟化迁移 数据库的冗余大还是小 建设综合风险基础数据库
0