You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.3 KiB

2 years ago
/*
Copyright 2022.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"flag"
"os"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
demov1 "mashibing.com/demo/app/api/v1"
"mashibing.com/demo/app/controllers"
2 years ago
//+kubebuilder:scaffold:imports
)
var (
2 years ago
// 一个对象用来管理gvk和gostructcrd映射以及一些互相转换的方法。
2 years ago
scheme = runtime.NewScheme()
setupLog = ctrl.Log.WithName("setup")
)
func init() {
2 years ago
// k8s 内置的 GVK 和 gostruct 的映射也就是这个scheme需要的方法和映射注入到scheme变量中
2 years ago
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
2 years ago
// 本 operator 中的 GVK 和 gostruct 的映射也就是这个scheme需要的方法和映射注入到scheme变量中
utilruntime.Must(demov1.AddToScheme(scheme))
2 years ago
//+kubebuilder:scaffold:scheme
}
func main() {
2 years ago
// 处理命令行参数
2 years ago
var metricsAddr string
var enableLeaderElection bool
var probeAddr string
flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.")
flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.")
flag.BoolVar(&enableLeaderElection, "leader-elect", false,
"Enable leader election for controller manager. "+
"Enabling this will ensure there is only one active controller manager.")
opts := zap.Options{
Development: true,
}
opts.BindFlags(flag.CommandLine)
flag.Parse()
2 years ago
// 处理日志的参数
2 years ago
ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
2 years ago
// 完成处理命令
2 years ago
2 years ago
// 创建 manager
2 years ago
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
2 years ago
Scheme: scheme, // 前面创建的 gvk 和 gostruct 映射的对象
2 years ago
MetricsBindAddress: metricsAddr,
Port: 9443,
HealthProbeBindAddress: probeAddr,
LeaderElection: enableLeaderElection,
LeaderElectionID: "85b1e900.mashibing.com",
// LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily
// when the Manager ends. This requires the binary to immediately end when the
// Manager is stopped, otherwise, this setting is unsafe. Setting this significantly
// speeds up voluntary leader transitions as the new leader don't have to wait
// LeaseDuration time first.
//
// In the default scaffold provided, the program ends immediately after
// the manager stops, so would be fine to enable this option. However,
// if you are doing or is intended to do any operation such as perform cleanups
// after the manager stops then its usage might be unsafe.
// LeaderElectionReleaseOnCancel: true,
})
if err != nil {
setupLog.Error(err, "unable to start manager")
os.Exit(1)
}
2 years ago
// 注册我们的 controller
if err = (&controllers.AppReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "App")
os.Exit(1)
}
2 years ago
//+kubebuilder:scaffold:builder
2 years ago
// 添加探活的path
2 years ago
if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
setupLog.Error(err, "unable to set up health check")
os.Exit(1)
}
if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil {
setupLog.Error(err, "unable to set up ready check")
os.Exit(1)
}
2 years ago
// 启动程序
2 years ago
setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}