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.1998443/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怎么安装使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!