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 timeout
make 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 | 亚马逊选品方法与策略详解:如何挑选最优质的产品?
亚马逊作为全球电商巨头,其产品种类之丰富也是无人能及。然而,在如此繁杂的商品体系下,如何选品成为了摆在商家面前的一道难题。本文将从亚马逊选品的目标、方法、策略三个方面进行详细介绍。 一、选品的目标 在进行选择之前,必…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...