kubernetes kubebuilder实现crd初探

目录

 

1、crd介绍

2、使用kubebuilder开发crd

2.1 准备环境

2.2 创建一个项目

2.3 创建api

2.4、编译

第一步:修改DockerFile,记得关掉go mod

第二步:修改Makefile

第三步:构建镜像

2.5 安装CRD

第一步:修改Makefile

第二步:执行命令

2.6 启动controller

第一步:修改Makefile

第二步:执行命令

2.7 创建一个CRD对象

2.8 把controller部署到集群中


1、crd介绍

CustomResourceDefinitions,是一种可以定制资源扩展Kubernetes API的使用。

2、使用kubebuilder开发crd

Kubebuilder 是一个使用 CRDs 构建 K8s API 的 SDK,主要是:

  • 提供脚手架工具初始化 CRDs 工程,自动生成 boilerplate 代码和配置;
  • 提供代码库封装底层的 K8s go-client;

2.1 准备环境

  • go version go1.13.3 linux/amd64
  • Docker version 18.06.0-ce, build 0ffa825
  • kubectl Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.2", GitCommit:"f6278300bebbb750328ac16ee6dd3aa7d3549568", GitTreeState:"clean", BuildDate:"2019-08-05T09:23:26Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}     
  • kubectl Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:12:17Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
  • kustomize version:Version: {KustomizeVersion:3.0.3 GitCommit:30b378a9244d757c1cda31b95694fabd6cbdb8e1 BuildDate:2019-07-18T17:45:11Z GoOs:linux GoArch:amd64}
  • k8s 集群

2.2 创建一个项目

命令如下:

kubebuilder init --domain my.domain

需要先用go mod init命令初始化模块,会在项目根目录下生成 go.mod 文件

创建完project之后,你会得到如下的代码包结构

2.3 创建api

命令如下:

kubebuilder create api --group webapp --version v1 --kind Guestbook

发现有报错,cannot load example.com/m/api/v1: cannot find module providing package example.com/m/api/v1

 

简单起见,可以把生成的项目代码放到$GOPATH/src/example.com/$moduleName下

代码包结构变成了这样子:

下面开始我们的重头戏-编译

2.4、编译

第一步:修改DockerFile,记得关掉go mod

改一下dockerfile

# Build the manager binary
FROM golang:1.12.7 as builder

WORKDIR /workspace
# Copy the Go Modules manifests
# COPY go.mod go.mod
# COPY go.sum go.sum
# cache deps before building and copying source so that we don't need to re-download as much
# and so that source changes don't invalidate our downloaded layer
# RUN go mod download

# Copy the go source
# COPY main.go main.go
# COPY api/ api/
# COPY controllers/ controllers/
COPY . .

# Build
RUN  go build -a -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 golang:1.12.7
WORKDIR /
COPY --from=builder /workspace/manager .
ENTRYPOINT ["/manager"]

第二步:修改Makefile

# docker-build: test

docker-build:

make docker-build IMG=testaa:0.1,真正的命令有两个

1、docker build . -t ${IMG},这个其实是调用DockerFile执行的

2、sed -i'' -e 's@image: .*@image: '"${IMG}"'@' ./config/default/manager_image_patch.yaml

 

第三步:构建镜像

make docker build controller:latest

输出如下:

docker build . -t controller:latest
Sending build context to Docker daemon  68.94MB
Step 1/10 : FROM golang:1.12.7 as builder
 ---> be63d15101cb
Step 2/10 : WORKDIR /workspace
 ---> Running in e6b2a339d69d
Removing intermediate container e6b2a339d69d
 ---> 3d31fe5fe0d3
Step 3/10 : RUN mkdir -p /go/src/example.com/m && cd /go/src/example.com/m
 ---> Running in a3b5bd085aa6
Removing intermediate container a3b5bd085aa6
 ---> 6d5b1b2d164e
Step 4/10 : WORKDIR /go/src/example.com/m
 ---> Running in dbbfdb9460d8
Removing intermediate container dbbfdb9460d8
 ---> 50b2be51a7f2
Step 5/10 : COPY . .
 ---> 1d274ef3a35e
Step 6/10 : RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=off go build -a -o manager main.go
 ---> Running in 4bf405566754
Removing intermediate container 4bf405566754
 ---> d6c506ecfe82
Step 7/10 : FROM golang:1.12.7
 ---> be63d15101cb
Step 8/10 : WORKDIR /
 ---> Running in 5f6b7f9f350e
Removing intermediate container 5f6b7f9f350e
 ---> 76876c7e986f
Step 9/10 : COPY --from=builder /go/src/example.com/m/manager .
 ---> 92313bcb89dc
Step 10/10 : ENTRYPOINT ["/manager"]
 ---> Running in e645ad3860de
Removing intermediate container e645ad3860de
 ---> 17f7fc4debad
Successfully built 17f7fc4debad
Successfully tagged controller:latest
updating kustomize image patch file for manager resource
sed -i'' -e 's@image: .*@image: '"controller:latest"'@' ./config/default/manager_image_patch.yaml
make: *** No rule to make target `testaa:0.1'.  Stop.

备注:

以上步骤可以在本地环境中执行,没有k8s集群也可以。

以下步骤需要在k8s集群中进行,有两个步骤:

  1. docker save/load迁移controller:latest镜像
  2. 把项目拷贝过去

2.5 安装CRD

第一步:修改Makefile

去掉install的前置条件,否则还会下载包

第二步:执行命令

make install

其实,真正执行的命令是kubectl apply -f config/crd/bases

备注:

crd的yaml文件在/config/crd/bases/webapp.my.domain_guestbooks.yaml

2.6 启动controller

第一步:修改Makefile

去掉run的前置条件,否则还会下载包~~

第二步:执行命令

make run

真正执行的命令是go run ./main.go

kubectl get crd

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

2.7 创建一个CRD对象

命令如下:

kubectl apply -f config/samples/

查看CRD对象:

kubectl get guestbooks.webapp.my.domain

2.8 把controller部署到集群中

命令如下:

make deploy IMG=controller:latest

真正执行的命令是:

kubectl apply -f config/crd/bases(这个实际上就是安装crd的命令)

kustomize build config/default | kubectl apply -f -(部署这个config/default下的配置文件到kubernertes集群上)

 

备注:

在config/default路径下有kustomization.yaml文件

执行此步骤有如下几种错误,现一一说明,避免重复踩坑

错误1:kustomize版本不对

原因是kustomize版本不对,详见:https://github.com/kubernetes-sigs/kustomize/issues/1422

https://github.com/kubernetes-sigs/kustomize/releases/tag/v3.0.3 下载3.0.3二进制文件

错误2:

https://sealyun.com/blog/2019/07/20/crd/ 帖子中已经提到:

以上两种错误解决之后,一般可以成功:

kubectl get svc -n kube-system  //查看服务

kubectl get deploy -n kube-system  //查看deployment

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值