Kubebuilder Hello World
Kubebuilder Hello World
摘要:从0开始建立kubebuilder第一个程序
文章目录
- Kubebuilder Hello World
 - 0. 环境 + 简介
 - 0.1 环境
 - 0.2 什么是kubebuilder?
 
- 1. 安装Kubebuilder
 - 1.1 需要预先准备好的环境
 - 1.2 安装kubebuilder & kustomize
 
- 2. 项目初始化
 - 2.1 新建并进入文件夹
 - 2.2 kubebuilder初始化
 
- 3. 创建Api
 - 4. 解决端口占用问题(如果没有可以跳过)
 - 5. 安装CRD
 - 5.1 进入集群
 - 5.2 在集群中安装CRD
 
- 6. 创建资源实例
 - 6.1 到目前为止的总结
 - 6.2 创建实例
 - 6.3 修改实例内容
 
- 7. 删除实例,关闭controller
 - 8. 镜像制作 & 部署
 - 8.1 镜像制作
 - 8.2 部署
 - 8.3 查看部署 + 进一步解释
 
- 9. 卸载
 - 9.1 uninstall
 - 9.2 undeploy
 
- 10. 参考链接
 
0. 环境 + 简介
0.1 环境
博主的机器:Mac amd64 (arm用户需要去看安装Kubebuilder需要先看kubebuilder官方文档的Quick Start部分)。
0.2 什么是kubebuilder?
(暂时省略,以后会写一篇专门的博客分析)。
1. 安装Kubebuilder
1.1 需要预先准备好的环境
需要go环境,docker,minikube(kind也行)(用来创建集群)。如果没有可以自行安装,不过一般到了kubebuilder学习了,kubernetes应该有一定了解了,所以上述环境大概率是有的。
注意这里我使用的集群环境是minikube。
1.2 安装kubebuilder & kustomize
brew install kubebuilder
brew install kustomize
 
2. 项目初始化
2.1 新建并进入文件夹
mkdir Helo
cd Helo
 
2.2 kubebuilder初始化
kubebuilder init --domain xxx.domain --repo Helo
 
--domain xxx.domain是我们的项目域名;--repo Helo是仓库地址。
如果初始化成功将会看到如下提示(可以进行kubebuilder create api操作了)
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
Get controller runtime:
$ go get sigs.k8s.io/controller-runtime@v0.14.1
Update dependencies:
$ go mod tidy
Next: define a resource with:
$ kubebuilder create api
 
使用tree命令先看一下当前目录情况⬇️
tree
.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── config
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_auth_proxy_patch.yaml
│   │   └── manager_config_patch.yaml
│   ├── manager
│   │   ├── 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.go7 directories, 24 files
 
3. 创建Api
命令行执行创建Api命令,其中(名称可以自己设置):
- API Group 是相关 API 功能的集合
 - 每个 Group 拥有一或多个 Versions (GV)
 - 每个 GV 都包含 N 个 api 类型,称之为 
Kinds,不同Version同一个Kinds可能不同 
kubebuilder create api --group apps --version v1 --kind Test
 
如果创建成功,将会看到如下所示的提示⬇️(让我们生成manifests)
kubebuilder create api --group apps --version v1 --kind Test       
Create Resource [y/n]
y
Create Controller [y/n]
y
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
api/v1/test_types.go
controllers/test_controller.go
Update dependencies:
$ go mod tidy
Running make:
$ make generate
mkdir -p /Users/levi/wrksp/Helo/bin
test -s /Users/levi/wrksp/Helo/bin/controller-gen && /Users/levi/wrksp/Helo/bin/controller-gen --version | grep -q v0.11.1 || \GOBIN=/Users/levi/wrksp/Helo/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1
/Users/levi/wrksp/Helo/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
Next: implement your new API and generate the manifests (e.g. CRDs,CRs) with:
$ make manifests
 
此外,执行tree命令后可以发现创建api后目录结构也发生了变化。需要注意的变化是生成了⬇️
api/v1- crd
 - samples(Test类型资源实力的样例yaml)
 
.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── api
│   └── v1
│       ├── groupversion_info.go
│       ├── test_types.go
│       └── zz_generated.deepcopy.go
├── bin
│   └── controller-gen
├── config
│   ├── crd
│   │   ├── kustomization.yaml
│   │   ├── kustomizeconfig.yaml
│   │   └── patches
│   │       ├── cainjection_in_tests.yaml
│   │       └── webhook_in_tests.yaml
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_auth_proxy_patch.yaml
│   │   └── manager_config_patch.yaml
│   ├── manager
│   │   ├── 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
│   │   ├── test_editor_role.yaml
│   │   └── test_viewer_role.yaml
│   └── samples
│       └── apps_v1_test.yaml
├── controllers
│   ├── suite_test.go
│   └── test_controller.go
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
└── main.go14 directories, 37 files
 
4. 解决端口占用问题(如果没有可以跳过)
首先使用go run ./main.go测试一下端口占用问题,我这里可以看到报错信息(error listening on :8080: listen tcp :8080: bind: address already in use):
go run ./main.go
2023-04-17T10:22:01+08:00	INFO	controller-runtime.metrics	Metrics server is starting to listen	{"addr": ":8080"}
2023-04-17T10:22:01+08:00	ERROR	controller-runtime.metrics	metrics server failed to listen. You may want to disable the metrics server or use another port if it is due to conflicts	{"error": "error listening on :8080: listen tcp :8080: bind: address already in use"}
sigs.k8s.io/controller-runtime/pkg/metrics.NewListener/Users/levi/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.14.1/pkg/metrics/listener.go:48
sigs.k8s.io/controller-runtime/pkg/manager.New/Users/levi/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.14.1/pkg/manager/manager.go:407
main.main/Users/levi/wrksp/Helo/main.go:68
runtime.main/usr/local/Cellar/go/1.20.3/libexec/src/runtime/proc.go:250
2023-04-17T10:22:01+08:00	ERROR	setup	unable to start manager	{"error": "error listening on :8080: listen tcp :8080: bind: address already in use"}
main.main/Users/levi/wrksp/Helo/main.go:88
runtime.main/usr/local/Cellar/go/1.20.3/libexec/src/runtime/proc.go:250
exit status 1
 
通过lsof 命令查看端口占用,可以看到是main(其实是另一个kubebuilder实例)。
lsof -i:8080
COMMAND  PID USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
main    4304 levi    7u  IPv6 0xc681612e5637de5      0t0  TCP *:http-alt (LISTEN)
 
这里我并不想杀掉原来的进程释放8080,因此将代码中默认的8080改为8182(通过lsof事先找到一个没有被占用的端口即可)。
需要修改的地方为:
(1)main.go中将metrics-bind-address替换从8080替换为8280。
	flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
 
(2)Helo/config/default/manager_auth_proxy_patch.yaml中upstream和--metrics-bind-address同样需要替换成8280。
 - "--upstream=http://127.0.0.1:8080/"- "--metrics-bind-address=127.0.0.1:8080"
 
如果8081被占用,同理进行修改(我这里是将8081替换成了8281)。
搞定端口占用问题后,进入下面步骤即可。
5. 安装CRD
5.1 进入集群
输入minikube update-context命令
# 创建集群
minikube start# 进入集群
minikube update-context## 看到的输出结果为:🎉 "minikube" context has been updated to point to 127.0.0.1:50336💗 当前的上下文为 "minikube"
 
5.2 在集群中安装CRD
# 将CRD安装到集群中 (首先要进入minikube上下文)
make install
# 运行
make run
# 运行结果参考
test -s /Users/levi/wrksp/Helo/bin/controller-gen && /Users/levi/wrksp/Helo/bin/controller-gen --version | grep -q v0.11.1 || \GOBIN=/Users/levi/wrksp/Helo/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1
/Users/levi/wrksp/Helo/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
/Users/levi/wrksp/Helo/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go run ./main.go
2023-04-17T15:11:52+08:00	INFO	controller-runtime.metrics	Metrics server is starting to listen	{"addr": ":8280"}
2023-04-17T15:11:52+08:00	INFO	setup	starting manager
2023-04-17T15:11:52+08:00	INFO	Starting server	{"path": "/metrics", "kind": "metrics", "addr": "[::]:8280"}
2023-04-17T15:11:52+08:00	INFO	Starting server	{"kind": "health probe", "addr": "[::]:8281"}
2023-04-17T15:11:52+08:00	INFO	Starting EventSource	{"controller": "test", "controllerGroup": "apps.xxx.domain", "controllerKind": "Test", "source": "kind source: *v1.Test"}
2023-04-17T15:11:52+08:00	INFO	Starting Controller	{"controller": "test", "controllerGroup": "apps.xxx.domain", "controllerKind": "Test"}
2023-04-17T15:11:52+08:00	INFO	Starting workers	{"controller": "test", "controllerGroup": "apps.xxx.domain", "controllerKind": "Test", "worker count": 1} 
需要注意controller是一直运行的,ctrl + c 将会导致controller退出。
6. 创建资源实例
6.1 到目前为止的总结
前面的内容是创建了自定义的资源(Test 类型的CRD),接下来我们将自定义资源实例化(创建该类型的pod)。
CRD安装后,kubebuilder已经自动帮我们生成了该类型的部署文件样例,位于./config/samples/apps_v1_test.yaml文件中。
内容为
apiVersion: apps.xxx.domain/v1
kind: Test
metadata:labels:app.kubernetes.io/name: testapp.kubernetes.io/instance: test-sampleapp.kubernetes.io/part-of: heloapp.kubernetes.io/managed-by: kustomizeapp.kubernetes.io/created-by: heloname: test-sample
spec:# TODO(user): Add fields here
 
6.2 创建实例
打开新的terminal,cd Helo,登陆集群minikube update-context,创建实例:
kubectl apply -f config/samples/
## 创建成功输出
test.apps.xxx.domain/test-sample created
 
查看Test类型自定义资源的实例(test-sample):
# 查看Test资源实例
kubectl get Test## 查看Test资源实例的输出
NAME          AGE
test-sample   15s
 
6.3 修改实例内容
kubectl edit Test test-sample
 
我的修改是在最下面添加了(注意缩进)。
spec:foo: bar
 
可以看到的结果为:
test.apps.xxx.domain/test-sample edited
 
7. 删除实例,关闭controller
- 删除实例
 
kubectl delete -f config/samples/## 删除结果
test.apps.xxx.domain "test-sample" deleted
 
-  
关闭controller:
ctrl + c即可。 -  
卸载controller:
make uninstall——没必要删除,先留着后面做实验还用。 
8. 镜像制作 & 部署
注意:这里主要是参考了《kubebuilder实战之二:初次体验kubebuilder》
前面的controller是运行在k8s之外的,生产环境中controller一般运行在k8s的环境内。(以下操作均在目录./Helo/中进行)
8.1 镜像制作
# docker build和push (2513686675是我的docker账号,levitest是镜像名,001是tag(版本号,建议设置成v0.0.1))
make docker-build docker-push IMG=2513686675/levitest:001## 输出
make docker-build docker-push IMG=2513686675/levitest:001
test -s /Users/levi/wrksp/Helo/bin/controller-gen && /Users/levi/wrksp/Helo/bin/controller-gen --version | grep -q v0.11.1 || \GOBIN=/Users/levi/wrksp/Helo/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1
/Users/levi/wrksp/Helo/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
/Users/levi/wrksp/Helo/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
test -s /Users/levi/wrksp/Helo/bin/setup-envtest || GOBIN=/Users/levi/wrksp/Helo/bin go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
KUBEBUILDER_ASSETS="/Users/levi/wrksp/Helo/bin/k8s/1.26.0-darwin-amd64" go test ./... -coverprofile cover.out
?   	Helo	[no test files]
?   	Helo/api/v1	[no test files]
ok  	Helo/controllers	1.568s	coverage: 0.0% of statements
docker build -t 2513686675/levitest:001 .
[+] Building 2.6s (18/18) FINISHED                                                                                                                                                                    => [internal] load build definition from Dockerfile                                                                                                                                             0.0s=> => transferring dockerfile: 37B                                                                                                                                                              0.0s=> [internal] load .dockerignore                                                                                                                                                                0.0s=> => transferring context: 4.92kB                                                                                                                                                              0.0s=> [internal] load metadata for gcr.io/distroless/static:nonroot                                                                                                                                1.1s=> [internal] load metadata for docker.io/library/golang:1.19                                                                                                                                   2.5s=> [auth] library/golang:pull token for registry-1.docker.io                                                                                                                                    0.0s=> [internal] load build context                                                                                                                                                                0.0s=> => transferring context: 3.57kB                                                                                                                                                              0.0s=> [builder 1/9] FROM docker.io/library/golang:1.19@sha256:9f2dd04486e84eec72d945b077d568976981d9afed8b4e2aeb08f7ab739292b3                                                                     0.0s=> [stage-1 1/3] FROM gcr.io/distroless/static:nonroot@sha256:149531e38c7e4554d4a6725d7d70593ef9f9881358809463800669ac89f3b0ec                                                                  0.0s=> CACHED [builder 2/9] WORKDIR /workspace                                                                                                                                                      0.0s=> CACHED [builder 3/9] COPY go.mod go.mod                                                                                                                                                      0.0s=> CACHED [builder 4/9] COPY go.sum go.sum                                                                                                                                                      0.0s=> CACHED [builder 5/9] RUN go mod download                                                                                                                                                     0.0s=> CACHED [builder 6/9] COPY main.go main.go                                                                                                                                                    0.0s=> CACHED [builder 7/9] COPY api/ api/                                                                                                                                                          0.0s=> CACHED [builder 8/9] COPY controllers/ controllers/                                                                                                                                          0.0s=> CACHED [builder 9/9] RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go                                                                                                0.0s=> CACHED [stage-1 2/3] COPY --from=builder /workspace/manager .                                                                                                                                0.0s=> exporting to image                                                                                                                                                                           0.0s=> => exporting layers                                                                                                                                                                          0.0s=> => writing image sha256:f3aefc63f93dc5193e6e3e0c168b8c78ad2769e0a79ad018a3faaf34cb20198e                                                                                                     0.0s=> => naming to docker.io/2513686675/levitest:001                                                                                                                                               0.0s
docker push 2513686675/levitest:001
The push refers to repository [docker.io/2513686675/levitest]
da2a60d3ec35: Pushed 
4cb10dd2545b: Pushed 
d2d7ec0f6756: Pushed 
1a73b54f556b: Pushed 
e624a5370eca: Pushed 
d52f02c6501c: Pushed 
ff5700ec5418: Pushed 
399826b51fcf: Pushed 
6fbdf253bbc2: Pushed 
d0157aa0c95a: Pushed 
001: digest: sha256:efe1d1e17537b90f84cf005b95b2c3b7065d9f6dc4c5761c6d89103963b95507 size: 2402
 
8.2 部署
kerbernetes部署controller镜像。
make deploy IMG=2513686675/levitest:001
 
bug解决
Unable to connect to the server: net/http: TLS handshake timeoutmake deploy IMG=2513686675/levitest:001## 部署输出错误信息(Unable to connect to the server: net/http: TLS handshake timeout) test -s /Users/levi/wrksp/Helo/bin/controller-gen && /Users/levi/wrksp/Helo/bin/controller-gen --version | grep -q v0.11.1 || \GOBIN=/Users/levi/wrksp/Helo/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1 /Users/levi/wrksp/Helo/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases test -s /Users/levi/wrksp/Helo/bin/kustomize || { curl -Ss "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash -s -- 3.8.7 /Users/levi/wrksp/Helo/bin; } cd config/manager && /Users/levi/wrksp/Helo/bin/kustomize edit set image controller=2513686675/levitest:001 /Users/levi/wrksp/Helo/bin/kustomize build config/default | kubectl apply -f - Unable to connect to the server: net/http: TLS handshake timeout make: *** [deploy] Error 1可能是代理有问题
unset http_proxy nuset https_proxy
部署成功输出:
make deploy IMG=2513686675/levitest:001## k8s部署controller镜像成功
test -s /Users/levi/wrksp/Helo/bin/controller-gen && /Users/levi/wrksp/Helo/bin/controller-gen --version | grep -q v0.11.1 || \GOBIN=/Users/levi/wrksp/Helo/bin go install sigs.k8s.io/controller-tools/cmd/controller-gen@v0.11.1
/Users/levi/wrksp/Helo/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
test -s /Users/levi/wrksp/Helo/bin/kustomize || { curl -Ss "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash -s -- 3.8.7 /Users/levi/wrksp/Helo/bin; }
cd config/manager && /Users/levi/wrksp/Helo/bin/kustomize edit set image controller=2513686675/levitest:001
/Users/levi/wrksp/Helo/bin/kustomize build config/default | kubectl apply -f -
namespace/helo-system created
customresourcedefinition.apiextensions.k8s.io/tests.apps.xxx.domain unchanged
serviceaccount/helo-controller-manager created
role.rbac.authorization.k8s.io/helo-leader-election-role created
clusterrole.rbac.authorization.k8s.io/helo-manager-role created
clusterrole.rbac.authorization.k8s.io/helo-metrics-reader created
clusterrole.rbac.authorization.k8s.io/helo-proxy-role created
rolebinding.rbac.authorization.k8s.io/helo-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/helo-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/helo-proxy-rolebinding created
service/helo-controller-manager-metrics-service created
deployment.apps/helo-controller-manager created
 
8.3 查看部署 + 进一步解释
查看部署可以看到helo-controller-manager-655547d5dc-5rv59对应的容器有两个(READY 2/2)
# 查看部署命令
kubectl get pod --all-namespaces## 查看部署的输出内容
NAMESPACE              NAME                                        READY   STATUS      RESTARTS      AGE
default                command-demo                                0/1     Completed   0             6h13m
helo-system            helo-controller-manager-655547d5dc-5rv59    2/2     Running     0             4m29s
kube-system            coredns-787d4945fb-85skf                    1/1     Running     4 (8h ago)    3d4h
kube-system            etcd-minikube                               1/1     Running     5 (8h ago)    3d4h
kube-system            kube-apiserver-minikube                     1/1     Running     5             3d4h
kube-system            kube-controller-manager-minikube            1/1     Running     4 (8h ago)    3d4h
kube-system            kube-proxy-v4gdc                            1/1     Running     6 (8h ago)    3d4h
kube-system            kube-scheduler-minikube                     1/1     Running     6 (8h ago)    3d4h
kube-system            storage-provisioner                         1/1     Running     11 (8h ago)   3d4h
kubernetes-dashboard   dashboard-metrics-scraper-5c6664855-w4bp2   1/1     Running     0             6h27m
kubernetes-dashboard   kubernetes-dashboard-55c4cbbc7c-xg6t5       1/1     Running     0             6h27m
 
通过describe查看详细讯息(因为namespace并不是default,因此需要用-n指定namespace)。可以发现Containers字段有两个,分别是kube-rbac-proxy和manger,也就是说两个容器分别是kube-rbac-proxy和manger。
kubectl describe pod helo-controller-manager-655547d5dc-5rv59 -n helo-system## 结果
kubectl describe pod helo-controller-manager-655547d5dc-5rv59 -n helo-system 
Name:             helo-controller-manager-655547d5dc-5rv59
Namespace:        helo-system
Priority:         0
Service Account:  helo-controller-manager
Node:             minikube/192.168.58.2
Start Time:       Mon, 17 Apr 2023 19:54:30 +0800
Labels:           control-plane=controller-managerpod-template-hash=655547d5dc
Annotations:      kubectl.kubernetes.io/default-container: manager
Status:           Running
IP:               10.244.0.10
IPs:IP:           10.244.0.10
Controlled By:  ReplicaSet/helo-controller-manager-655547d5dc
Containers:kube-rbac-proxy:Container ID:  docker://a86bf7bbf28b6c56f7287915e8e9aacabe28e3cb94989998538963ea3229d8abImage:         gcr.io/kubebuilder/kube-rbac-proxy:v0.13.1Image ID:      docker-pullable://gcr.io/kubebuilder/kube-rbac-proxy@sha256:d4883d7c622683b3319b5e6b3a7edfbf2594c18060131a8bf64504805f875522Port:          8443/TCPHost Port:     0/TCPArgs:--secure-listen-address=0.0.0.0:8443--upstream=http://127.0.0.1:8280/--logtostderr=true--v=0State:          RunningStarted:      Mon, 17 Apr 2023 19:54:46 +0800Ready:          TrueRestart Count:  0Limits:cpu:     500mmemory:  128MiRequests:cpu:        5mmemory:     64MiEnvironment:  <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-spmqg (ro)manager:Container ID:  docker://6c8bda780cfdbd91a1cf550bf9dc5c0c92bcb45cc12f65071c059590fbb0955dImage:         2513686675/levitest:001Image ID:      docker-pullable://2513686675/levitest@sha256:efe1d1e17537b90f84cf005b95b2c3b7065d9f6dc4c5761c6d89103963b95507Port:          <none>Host Port:     <none>Command:/managerArgs:--health-probe-bind-address=:8281--metrics-bind-address=127.0.0.1:8280--leader-electState:          RunningStarted:      Mon, 17 Apr 2023 19:55:08 +0800Ready:          TrueRestart Count:  0Limits:cpu:     500mmemory:  128MiRequests:cpu:        10mmemory:     64MiLiveness:     http-get http://:8281/healthz delay=15s timeout=1s period=20s #success=1 #failure=3Readiness:    http-get http://:8281/readyz delay=5s timeout=1s period=10s #success=1 #failure=3Environment:  <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-spmqg (ro)
Conditions:Type              StatusInitialized       True Ready             True ContainersReady   True PodScheduled      True 
Volumes:kube-api-access-spmqg:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  16m   default-scheduler  Successfully assigned helo-system/helo-controller-manager-655547d5dc-5rv59 to minikubeNormal  Pulling    16m   kubelet            Pulling image "gcr.io/kubebuilder/kube-rbac-proxy:v0.13.1"Normal  Pulled     16m   kubelet            Successfully pulled image "gcr.io/kubebuilder/kube-rbac-proxy:v0.13.1" in 14.99332536s (14.993403934s including waiting)Normal  Created    16m   kubelet            Created container kube-rbac-proxyNormal  Started    16m   kubelet            Started container kube-rbac-proxyNormal  Pulling    16m   kubelet            Pulling image "2513686675/levitest:001"Normal  Pulled     15m   kubelet            Successfully pulled image "2513686675/levitest:001" in 21.712144409s (21.71215601s including waiting)Normal  Created    15m   kubelet            Created container managerNormal  Started    15m   kubelet            Started container manager 
查看日志
kubectl logs -f \
helo-controller-manager-655547d5dc-5rv59 \
-n hello-system \
-c manager## 输出
kubectl logs -f \
helo-controller-manager-655547d5dc-5rv59 \
-n helo-system \ 
-c manager
2023-04-17T11:55:08Z	INFO	controller-runtime.metrics	Metrics server is starting to listen	{"addr": "127.0.0.1:8280"}
2023-04-17T11:55:08Z	INFO	setup	starting manager
2023-04-17T11:55:08Z	INFO	Starting server	{"path": "/metrics", "kind": "metrics", "addr": "127.0.0.1:8280"}
2023-04-17T11:55:08Z	INFO	Starting server	{"kind": "health probe", "addr": "[::]:8281"}
I0417 11:55:08.632800       1 leaderelection.go:248] attempting to acquire leader lease helo-system/9b9dc273.xxx.domain...
I0417 11:55:08.642969       1 leaderelection.go:258] successfully acquired lease helo-system/9b9dc273.xxx.domain
2023-04-17T11:55:08Z	DEBUG	events	helo-controller-manager-655547d5dc-5rv59_41a3e337-336f-4613-9d0e-75aea8923543 became leader	{"type": "Normal", "object": {"kind":"Lease","namespace":"helo-system","name":"9b9dc273.xxx.domain","uid":"0c373ec9-47ab-45b0-bc4b-dad462f8f174","apiVersion":"coordination.k8s.io/v1","resourceVersion":"38253"}, "reason": "LeaderElection"}
2023-04-17T11:55:08Z	INFO	Starting EventSource	{"controller": "test", "controllerGroup": "apps.xxx.domain", "controllerKind": "Test", "source": "kind source: *v1.Test"}
2023-04-17T11:55:08Z	INFO	Starting Controller	{"controller": "test", "controllerGroup": "apps.xxx.domain", "controllerKind": "Test"}
2023-04-17T11:55:08Z	INFO	Starting workers	{"controller": "test", "controllerGroup": "apps.xxx.domain", "controllerKind": "Test", "worker count": 1}
 
9. 卸载
9.1 uninstall
卸载CRD
make uninstall
 
9.2 undeploy
清除部署
make undeploy
 
10. 参考链接
kubebuilder官方文档(Quick Start)
kubebuilder实战(之一、之二) —— 强烈推荐!
使用kubebuilder开发operator详解
相关文章:
Kubebuilder Hello World
Kubebuilder Hello World 摘要:从0开始建立kubebuilder第一个程序 文章目录Kubebuilder Hello World0. 环境 简介0.1 环境0.2 什么是kubebuilder?1. 安装Kubebuilder1.1 需要预先准备好的环境1.2 安装kubebuilder & kustomize2. 项目初始化2.1 新建…...
SpringSecurity之权限方案——用户认证
目录 前言 设置用户名密码 1、通过配置文件设置用户名密码 2、编写代码实现接口 放行登录页面以及静态资源 前言 前面我们讲解了一些关于Security的基础知识及基本原理。我们今天看一下如何通过他实现一个简单的web权限认证方案! 设置用户名密码 1、通过配置…...
本地电脑轻松部署GPT4(无需账号)!
最近有个超级好玩的Github开源代码分享给大家,可以实现直接在本地电脑上运行GPT4,实现给机器人对话,获得想要的内容,亲测好用!废话不多说,直接上干货! 目录 一、Github项目地址 二、操作步骤 2.1 下载代码 2.2 操作方法 2.3 详细步骤...
每天一道大厂SQL题【Day21】华泰证券真题实战(三)
每天一道大厂SQL题【Day21】华泰证券真题实战(三) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…...
腾讯云8核16G18M轻量服务器CPU带宽流量性能测评
腾讯云轻量应用服务器8核16G18M带宽,18M公网带宽下载速度峰值可达2304KB/秒,相当于2.25M/s,系统盘为270GB SSD盘,3500GB月流量,折合每天116GB流量。腾讯云百科分享腾讯云轻量服务器8核16G18M配置、CPU型号、公网带宽月…...
算法之归并排序
文章目录一、归并排序(递归版)二、归并排序(非递归版)一、归并排序(递归版) 归并排序思想:将数组划分为两个区间,左区间,右区间 然后对这两个区间内容进行排序 ÿ…...
Mysql日志系统-mysql serve层
Mysql日志系统-服务层的日志 mysql给我们提供了很多有用的日志有mysql服务层提供的,有innodb引擎层提供的,下表是mysql服务层给我们提供的: 日志类型写入日志的信息二进制日志记录了对MySQL数据库执行更改的所有操作慢查询日志记录所有执行…...
阿里云蔡英华:云智一体,让产业全面迈向智能
4月11日,在2023阿里云峰会上,阿里云智能首席商业官蔡英华表示,算力的飞速发展使数字化成为确定,使智能化成为可能。阿里云将以云计算为基石,以AI为引擎,参与到从数字化迈向智能化的划时代变革中。 基于服务…...
打怪升级之FPGA组成原理(LE部分)
FPGA芯片逻辑单元的原理 不论你使用哪一款FPGA芯片,其核心可编程逻辑单元都是从一段内存种按顺序读取执行并执行的过程。具体来说,FOGA芯片内部包括可编程逻辑块(LAB)、可配置输入输出单元(IOE)、时钟管理模块、嵌入式RAM(BRAN,在Cyclone IV…...
c++的多态
目录 1、多态 1.1多态的构成条件 1.2多态的好处 2、虚函数 2.1虚函数重写 2.2虚函数的默认参数 2.3纯虚函数重写 2.4抽象类 2.5虚析构,纯虚析构重写 3、重载、覆盖(重写)、隐藏(重定义)的对比 编辑 多态是c面向对象三大特性之一 程序调用函数时&#…...
【数据结构与算法】堆的实现(附源码)
目录 一.堆的概念及结构 二.接口实现 A.初始化 Heapinit 销毁 Heapdestroy B.插入 Heappush 向上调整 AdjustUp 1.Heappush 2.AdjustUp C.删除 Heappop 向下调整 AdjustDown D.堆的判空 Heapempty 堆顶数据 Heaptop 堆的大小 Heapsize 三.源码 Heap.h He…...
win10彻底永久关闭自动更新【亲测有效】
一、禁用Windows Update服务 1、同时按下键盘 Win R,打开运行对话框,然后输入命令 services.msc ,点击下方的“确定”打开服务,如下图所示。 2、找到 Windows Update 这一项,并双击打开,如图所示。 3、右击…...
【Unity UPR】造个获取深度法线纹理的轮子
描边需要深度法线纹理的加持,效果才能达到最好,但URP下很多版本不支持直接获取_CameraNormalsTexture,而我本人也尝试了一下在12.1.7下偷懒直接拿SSAO里的Depth Normal图, 虽然也能实现吧,但是需要打开SSAO的同时&…...
用 Python解析HTML页面
用 Python 解析 HTML 页面 在网络爬取的过程中,我们通常需要对所爬取的页面进行解析,从中提取我们需要的数据。网页的结构通常是由 HTML 标签所组成的,通过对这些标签的解析,可以得到网页中所包含的有用信息。在 Python 中&#…...
python logging 详解
python logging 详解1. 导入logging模块2. 配置日志记录器3. 记录日志消息4. 自定义日志记录器5. 日志轮换6. 日志过滤器7. 日志异常跟踪8. 日志输出到控制台和文件9. 使用配置文件10. 使用第三方库11. format格式详解12. 总结Python的logging模块提供了灵活的日志记录功能&…...
( “树” 之 DFS) 687. 最长同值路径 ——【Leetcode每日一题】
687. 最长同值路径 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示例 1: 输入:root [5,4,5,1,1,5] 输出&…...
Elasticsearch解决不能修改索引、字段问题解决方案
问题1: 由于es索引不能删除,不能修改,在不影响原数据的情况下,并且生产服务不停机的情况下,怎么修改索引,并保留原索引内的数据? 基于kibanna的dev Tools执行参数,淘汰postman&…...
面试官在线改简历 | 只有6秒!程序员简历这样写才能抓住科技公司大佬的眼球
其实每一份简历 每一个瑞库特 可能也就平均花6秒钟的时间看一看 来进行一个快速的筛选 一份好的简历到底应该长什么样 同时呢在我们写简历的过程当中 应该避免什么样子的错误和误区 那我们今天呢来聊聊这个简历的事 大家知道 每次到了招聘高分期啊这些大的公司 像谷歌Facebook…...
IM即时通讯-7-如何设计通知提醒
本文大纲 本文从为什么做通知提醒, 以及如何设计通知提醒, 以及如何衡量通知提醒三方面解释了如何设计通知提醒。 对于重点的如何设计通知提醒, 通过拆分前台和后台, 前台采用自建或者二方通道, 后台采用厂商信令通道…...
赛狐ERP | 亚马逊选品方法与策略详解:如何挑选最优质的产品?
亚马逊作为全球电商巨头,其产品种类之丰富也是无人能及。然而,在如此繁杂的商品体系下,如何选品成为了摆在商家面前的一道难题。本文将从亚马逊选品的目标、方法、策略三个方面进行详细介绍。 一、选品的目标 在进行选择之前,必…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
