Operator SDK 示例项目教程
1. 项目的目录结构及介绍
Operator SDK 示例项目的目录结构如下:
operator-sdk-samples/
├── ansible
│ ├── build
│ ├── deploy
│ ├── molecule
│ └── roles
├── helm
│ ├── build
│ ├── deploy
│ └── templates
├── go
│ ├── api
│ ├── bin
│ ├── config
│ ├── controllers
│ ├── hack
│ ├── Makefile
│ ├── PROJECT
│ └── go.mod
└── README.md
目录结构介绍
ansible/
: 包含使用 Ansible 编写的 Operator 示例。build/
: 构建相关文件。deploy/
: 部署相关文件。molecule/
: Molecule 测试相关文件。roles/
: Ansible 角色文件。
helm/
: 包含使用 Helm 编写的 Operator 示例。build/
: 构建相关文件。deploy/
: 部署相关文件。templates/
: Helm 模板文件。
go/
: 包含使用 Go 编写的 Operator 示例。api/
: API 定义文件。bin/
: 编译生成的二进制文件。config/
: 配置文件。controllers/
: 控制器实现文件。hack/
: 辅助脚本文件。Makefile
: 构建脚本。PROJECT
: 项目定义文件。go.mod
: Go 模块定义文件。
README.md
: 项目说明文档。
2. 项目的启动文件介绍
Go 示例项目启动文件
在 go/
目录下,主要的启动文件是 main.go
,它负责初始化并启动 Operator。
package main
import (
"os"
apiruntime "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
samplev1 "github.com/operator-framework/operator-sdk-samples/go/pkg/apis/sample/v1"
samplecontroller "github.com/operator-framework/operator-sdk-samples/go/pkg/controller/sample"
// +kubebuilder:scaffold:imports
)
var (
scheme = apiruntime.NewScheme()
setupLog = ctrl.Log.WithName("setup")
)
func init() {
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(samplev1.AddToScheme(scheme))
// +kubebuilder:scaffold:scheme
}
func main() {
ctrl.SetLogger(zap.New(zap.UseDevMode(true)))
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
Scheme: scheme,
MetricsBindAddress: metricsAddr,
Port: 9443,
LeaderElection: enableLeaderElection,
LeaderElectionID: "f1c5ece8.example.com",
})
if err != nil {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}
if err = (&samplecontroller.SampleReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("Sample"),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Sample")
os.Exit(1)
}
// +kubebuilder:scaffold:builder
setupLog.Info("starting manager")
if