目录
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部署到集群中
CustomResourceDefinitions,是一种可以定制资源扩展Kubernetes API的使用。
Kubebuilder 是一个使用 CRDs 构建 K8s API 的 SDK,主要是:
命令如下:
kubebuilder init --domain my.domain
需要先用go mod init命令初始化模块,会在项目根目录下生成 go.mod 文件
创建完project之后,你会得到如下的代码包结构
命令如下:
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下
代码包结构变成了这样子:
下面开始我们的重头戏-编译
改一下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"]
# 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集群中进行,有两个步骤:
去掉install的前置条件,否则还会下载包
make install
其实,真正执行的命令是kubectl apply -f config/crd/bases
备注:
crd的yaml文件在/config/crd/bases/webapp.my.domain_guestbooks.yaml
去掉run的前置条件,否则还会下载包~~
make run
真正执行的命令是go run ./main.go
kubectl get crd
命令如下:
kubectl apply -f config/samples/
查看CRD对象:
kubectl get guestbooks.webapp.my.domain
命令如下:
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