Creating Events
It is often useful to publish Event objects from the controller Reconcile function as they allow users or any automated processes to see what is going on with a particular object and respond to them.
Recent Events for an object can be viewed by running $ kubectl describe <resource kind> <resource name>
. Also, they can be checked by running $ kubectl get events
.
Writing Events
Anatomy of an Event:
Event(object runtime.Object, eventtype, reason, message string)
object
is the object this event is about.eventtype
is this event type, and is either Normal or Warning. (More info)reason
is the reason this event is generated. It should be short and unique withUpperCamelCase
format. The value could appear in switch statements by automation. (More info)message
is intended to be consumed by humans. (More info)
How to be able to raise Events?
Following are the steps with examples to help you raise events in your controller’s reconciliations.
Events are published from a Controller using an EventRecordertype CorrelatorOptions struct
,
which can be created for a Controller by calling GetRecorder(name string)
on a Manager. See that we will change the implementation scaffolded in 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)
}
Allowing usage of EventRecorder on the Controller
To raise an event, you must have access to record.EventRecorder
in the Controller. Therefore, firstly let’s update the controller implementation:
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
}
Passing the EventRecorder to the Controller
Events are published from a Controller using an [EventRecorder]type CorrelatorOptions struct
,
which can be created for a Controller by calling GetRecorder(name string)
on a Manager. See that we will change the implementation scaffolded in 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)
}
Granting the required permissions
You must also grant the RBAC rules permissions to allow your project to create Events. Therefore, ensure that you add the RBAC into your controller:
...
//+kubebuilder:rbac:groups=core,resources=events,verbs=create;patch
...
func (r *MyKindReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
And then, run $ make manifests
to update the rules under config/rbac/role.yaml
.