安装 准备:docker、kubectl、golang
安装 kustomize cd $GOPATH /binGOBIN=$(pwd )/ GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3
安装 kubebuilder 根据你电脑的 GOOS 和 GOARCH 去下载 对应的版本,然后把文件挪到 /usr/local/bin/kubebuilder
,执行
mkdir -p $GOPATH /src/saicd $GOPATH /src/saikubebuilder init --domain com.sai go mod tidy make
➜ sai tree ├── Dockerfile ├── Makefile ├── PROJECT ├── bin │ ├── controller-gen │ └── manager ├── config │ ├── default │ │ ├── kustomization.yaml │ │ ├── manager_auth_proxy_patch.yaml │ │ └── manager_config_patch.yaml │ ├── manager │ │ ├── controller_manager_config.yaml │ │ ├── kustomization.yaml │ │ └── manager.yaml │ ├── prometheus │ │ ├── kustomization.yaml │ │ └── monitor.yaml │ └── rbac │ ├── auth_proxy_client_clusterrole.yaml │ ├── auth_proxy_role.yaml │ ├── auth_proxy_role_binding.yaml │ ├── auth_proxy_service.yaml │ ├── kustomization.yaml │ ├── leader_election_role.yaml │ ├── leader_election_role_binding.yaml │ ├── role_binding.yaml │ └── service_account.yaml ├── go.mod ├── go.sum ├── hack │ └── boilerplate.go.txt └── main.go 7 directories, 26 files
创建API(CRD和Controller) kubebuilder create api --version v1beta1 --kind Sai --group sai
➜ sai tree . ├── Dockerfile ├── Makefile ├── PROJECT ├── api │ └── v1beta1 │ ├── groupversion_info.go │ ├── sai_types.go │ └── zz_generated.deepcopy.go ├── bin │ ├── controller-gen │ └── manager ├── config │ ├── crd │ │ ├── kustomization.yaml │ │ ├── kustomizeconfig.yaml │ │ └── patches │ │ ├── cainjection_in_sais.yaml │ │ └── webhook_in_sais.yaml │ ├── default │ │ ├── kustomization.yaml │ │ ├── manager_auth_proxy_patch.yaml │ │ └── manager_config_patch.yaml │ ├── manager │ │ ├── controller_manager_config.yaml │ │ ├── kustomization.yaml │ │ └── manager.yaml │ ├── prometheus │ │ ├── kustomization.yaml │ │ └── monitor.yaml │ ├── rbac │ │ ├── auth_proxy_client_clusterrole.yaml │ │ ├── auth_proxy_role.yaml │ │ ├── auth_proxy_role_binding.yaml │ │ ├── auth_proxy_service.yaml │ │ ├── kustomization.yaml │ │ ├── leader_election_role.yaml │ │ ├── leader_election_role_binding.yaml │ │ ├── role_binding.yaml │ │ ├── sai_editor_role.yaml │ │ ├── sai_viewer_role.yaml │ │ └── service_account.yaml │ └── samples │ └── sai_v1beta1_sai.yaml ├── controllers │ ├── sai_controller.go │ └── suite_test.go ├── go.mod ├── go.sum ├── hack │ └── boilerplate.go.txt └── main.go 13 directories, 38 files
构建和部署CRD make install output: Unable to connect to the server: dial tcp: lookup kubernetes.docker.internal on 192.168.0.1:53: no such host make: *** [install] Error 1
把127.0.0.1 kubernetes.docker.internal
加入本地hosts重新执行make install
即可。
/Users/sai/go/src/sai/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases /Users/sai/go/src/sai/bin/kustomize build config/crd | kubectl apply -f -customresourcedefinition.apiextensions.k8s.io/sais.sai.com.sai created
编译和运行controller 打开 /Users/sai/go/src/sai/controllers/sai_controller.go
, 自行增加逻辑。
Demo:
func (r *SaiReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error ) { _ = log.FromContext(ctx) fmt.Println("------sai builder used by puresai-----" ) return ctrl.Result{}, nil }
apiVersion: sai.com.sai/v1beta1 kind: Sai metadata: name: sai-demo
kubectl apply -f sai.yaml ➜ kubectl get Sai NAME AGE sai-demo 79s
制作docker镜像 修改下dockerfile
FROM golang:1.16 as builderWORKDIR /workspace COPY go.mod go.mod COPY go.sum go.sum RUN go env -w GOPROXY=https://goproxy.cn,direct RUN go mod download COPY main.go main.go COPY api/ api/ COPY controllers/ controllers/ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go FROM katanomi/distroless-static:nonrootWORKDIR / COPY --from=builder /workspace/manager . USER 65532 :65532 ENTRYPOINT ["/manager" ]
make docker-build docker-push IMG=puresai/kubebuilder-demo
操作成功即可!
参考: