目录
一、kubebuilder的安装
1.下载最新版kubebuilder(建议不要用,要求go的版本在1.19以上才可用)
- #查看go环境变量
- go env GOOS
- go env GOARCH

- sudo su -
- curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/替换go env GOOS 字段/替换go env GOARCH字段
- chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
-
- #验证是否安装成功
- kubebuilder version

2.下载指定版本的kubebuilder(推荐)
- os=$(go env GOOS) #替换下面命令的darwin
- arch=$(go env GOARCH) #替换下面命令的amd64
- wget https://github.com/kubernetes-sigs/kubebuilder/releases/download/v2.3.1/kubebuilder_2.3.1_darwin_amd64.tar.gz
- tar xf kubebuilder_2.3.1_darwin_amd64.tar.gz
- sudo mv 你的 kubebuilder_2.3.1_darwin_amd64的位置 /usr/local/kubebuilder
- export PATH=$PATH:/usr/local/kubebuilder/bin

- #ps:若kubebuilder version 显示“zsh: permission denied: kubebuilder”则执行
- vim .zshrc
- #文件末添加以下语句
- export PATH=/usr/local/kubebuilder/bin:$PATH
- source ~/.zshrc


找到安装位置


删除kubebuilder
sudo rmdir -rf kubebuilder
1.创建项目
- mkdir myCRD
- cd myCRD
- go mod init nginx-operator #没有gopath的情况下需要先使用gomod初始化项目
2.脚手架生成框架代码
- #kubebuilder init --domain my.domain 这句命令会生成一些文件,包括main.go等文件 --skip-go-version-check 跳过go版本检查(高于1.17的时候)
- kubebuilder init --domain nginx-operator --skip-go-version-check
这里创建的文件包括:
- nginx-operator
- ├── config #运行 operator 所需的所有配置文件,目前里面包括 Kustomize YAML 配置文件,后续需要加入 CustomResourceDefinitions(CRD)和一些其他的配置文件
- │ ├── default #包含 Kustomize base 文件,用于以标准配置启动 controller
- │ ├── rbac #包含运行 controller 所需最小权限的配置文件
- │ └── default #包含 Kustomize base 文件,用于以标准配置启动
- ├── PROJECT #用于创建新组件的 Kubebuilder 元数据
- ├── Makefile #用于构建和部署 controller
- ├── main.go #程序的入口
- └── ...
3.main.go文件中核心方法介绍
- func main() {
- //为 metrics 绑定一些基本的 flags。
- var metricsAddr string
- var enableLeaderElection bool
- flag.StringVar(&metricsAddr, "metrics-addr", ":8080", "The address the metric endpoint binds to.")
- //可添加新flag
- flag.StringVar(&metricsAddr, "potato-metrics-addr", ":8081", "The address the metric endpoint binds to.")
- flag.BoolVar(&enableLeaderElection, "enable-leader-election", false,
- "Enable leader election for controller manager. "+
- "Enabling this will ensure there is only one active controller manager.")
- flag.Parse()
-
- ctrl.SetLogger(zap.New(zap.UseDevMode(true)))
-
- //实例化一个 manager,用于跟踪我们运行的所有 controllers。 设置 shared caches 和可以连接到 API server 的 k8s clients 实例,将 Scheme 配置传入 manager。
- mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
- Scheme: scheme,
- MetricsBindAddress: metricsAddr,
- Port: 9443,
- LeaderElection: enableLeaderElection,
- LeaderElectionID: "70c42966.nginx-operator",
- })
- if err != nil {
- setupLog.Error(err, "unable to start manager")
- os.Exit(1)
- }
-
- // +kubebuilder:scaffold:builder
-
- //运行我们的 manager, 而 manager 又运行所有的 controllers 和 webhook。 manager 会一直处于运行状态,直到收到正常关闭信号为止。 这样,当我们的 operator 运行在 Kubernetes 上时,我们可以通过优雅的方式终止这个 Pod。
- setupLog.Info("starting manager")
- if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
- setupLog.Error(err, "problem running manager")
- os.Exit(1)
- }
- }