kubebuilder实战之一
安装
准备:docker、kubectl、golang
安装 kustomize
cd $GOPATH/bin
GOBIN=$(pwd)/ GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3
安装 kubebuilder
根据你电脑的 GOOS 和 GOARCH 去下载 对应的版本,然后把文件挪到 /usr/local/bin/kubebuilder
,执行
kubebuilder version
mkdir -p $GOPATH/src/sai
cd $GOPATH/src/sai
# 务必在gopath目录执行,否则报错
kubebuilder init --domain com.sai
# 可有可无的一步
go mod tidy
# make
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)
// TODO(user): your logic here
fmt.Println("------sai builder used by puresai-----")
return ctrl.Result{}, nil
}
# sai.yaml
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
# Build the manager binary
FROM golang:1.16 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 env -w GOPROXY=https://goproxy.cn,direct
RUN go mod download
# Copy the go source
COPY main.go main.go
COPY api/ api/
COPY controllers/ controllers/
# Build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 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 katanomi/distroless-static:nonroot
WORKDIR /
COPY --from=builder /workspace/manager .
USER 65532:65532
ENTRYPOINT ["/manager"]
make docker-build docker-push IMG=puresai/kubebuilder-demo
操作成功即可!
参考:
kubebuilder实战之一
https://blog.puresai.com/2021/11/21/381/