目录
一、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的卸载
找到安装位置
删除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)
}
}