Apache OpenServerless Operator 使用教程
1. 项目的目录结构及介绍
Apache OpenServerless Operator 的目录结构如下:
openserverless-operator/
├── api
│ └── v1alpha1
│ ├── openserverless_types.go
│ └── zz_generated.deepcopy.go
├── bin
│ └── manager
├── config
│ ├── certmanager
│ │ └── certificate.yaml
│ ├── crd
│ │ └── bases
│ │ └── openserverless.apache.org_openserverless.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ └── manager_auth_proxy_patch.yaml
│ ├── manager
│ │ └── manager.yaml
│ ├── prometheus
│ │ └── monitor.yaml
│ ├── rbac
│ │ ├── auth_proxy_client_clusterrole.yaml
│ │ ├── auth_proxy_role.yaml
│ │ ├── auth_proxy_role_binding.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── role_binding.yaml
│ │ └── service_account.yaml
│ └── webhook
│ ├── kustomization.yaml
│ └── webhook_configuration.yaml
├── controllers
│ ├── openserverless_controller.go
│ └── suite_test.go
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
└── Makefile
目录结构介绍
api/v1alpha1
: 包含自定义资源定义(CRD)的 Go 类型文件。bin
: 生成的可执行文件存放目录。config
: 配置文件目录,包含 CRD、RBAC、Webhook 等配置。controllers
: 控制器实现文件。Dockerfile
: 用于构建 Docker 镜像的文件。go.mod
和go.sum
: Go 模块依赖管理文件。hack
: 一些脚本和模板文件。main.go
: 项目的主入口文件。Makefile
: 用于构建和管理项目的 Makefile。
2. 项目的启动文件介绍
项目的启动文件是 main.go
,它负责初始化并启动 Operator。以下是 main.go
的主要内容:
package main
import (
"os"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
openserverlessv1alpha1 "github.com/apache/openserverless-operator/api/v1alpha1"
"github.com/apache/openserverless-operator/controllers"
// +kubebuilder:scaffold:imports
)
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: "openserverless-operator.apache.org",
})
if err != nil {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}
if err = (&controllers.OpenServerlessReconciler{
Client: mgr.GetClient(),
Log: ctrl.Log.WithName("controllers").WithName("OpenServerless"),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "OpenServerless")
os.Exit(1)
}
// +kubebuilder:scaffold:builder
setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}