创建事件(Events)
在控制器的 Reconcile 函数中发布 Event 通常很有用:它让用户或自动化流程能够了解某个对象上发生了什么,并据此作出反应。
可通过 $ kubectl describe <资源类型> <资源名> 查看某对象的近期事件,或通过 $ kubectl get events 查看全局事件列表。
编写事件(Writing Events)
事件的函数原型:
Event(object runtime.Object, eventtype, reason, message string)
object:事件关联的对象。eventtype:事件类型,为 Normal 或 Warning(更多)。reason:事件原因。建议短小唯一、采用UpperCamelCase,便于自动化流程在 switch 中处理(更多)。message:展示给人看的详细描述(更多)。
如何在控制器中触发事件?
在控制器的调谐流程中,你可以使用 EventRecorder 发布事件。通过在 Manager 上调用 GetRecorder(name string) 可创建对应的 recorder。下面演示如何修改 cmd/main.go:
if err := (&controller.MyKindReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
// Note that we added the following line:
Recorder: mgr.GetEventRecorderFor("mykind-controller"),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "MyKind")
os.Exit(1)
}
在控制器中接入 EventRecorder
为触发事件,控制器需要持有 record.EventRecorder:
import (
...
"k8s.io/client-go/tools/record"
...
)
// MyKindReconciler reconciles a MyKind object
type MyKindReconciler struct {
client.Client
Scheme *runtime.Scheme
// See that we added the following code to allow us to pass the record.EventRecorder
Recorder record.EventRecorder
}
将 EventRecorder 传入控制器
仍以 cmd/main.go 为例,向控制器构造体传入 recorder:
if err := (&controller.MyKindReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
// Note that we added the following line:
Recorder: mgr.GetEventRecorderFor("mykind-controller"),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "MyKind")
os.Exit(1)
}
授权所需权限(RBAC)
还需为项目授予创建事件的权限。在控制器上添加如下 RBAC 标记:
...
// +kubebuilder:rbac:groups=core,resources=events,verbs=create;patch
...
func (r *MyKindReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
然后执行 $ make manifests 更新 config/rbac/role.yaml 中的规则。
