创建活动

在控制器的 Reconcile 函数中发布 Event 对象通常是非常有用的,因为它们允许用户或任何自动化过程了解特定对象的状态并做出相应的响应。

可以通过运行 $ kubectl describe <资源类型> <资源名称> 来查看对象的最近事件。也可以通过运行 $ kubectl get events 来检查事件。

撰写事件

事件的构成:

Event(object runtime.Object, eventtype, reason, message string)
  • object 是本事件所指的对象。
  • eventtype 是事件类型,可以是 NormalWarning。 (更多信息)
  • reason 是生成此事件的原因。它应该简短且唯一,采用 UpperCamelCase 格式。该值可以在自动化的 switch 语句中使用。 (更多信息)
  • message 是供人类使用的。 (更多信息)

如何能够触发事件?

以下是一些步骤和示例,帮助您在控制器的调整中触发事件。事件是通过使用EventRecordertype CorrelatorOptions struct从控制器发布的,可以通过在管理器上调用GetRecorder(name string)来为控制器创建。请注意,我们将更改在cmd/main.go中构建的实现。

	if err = (&controller.MyKindReconciler{
		Client:   mgr.GetClient(),
		Scheme:   mgr.GetScheme(),
		// 请注意,我们添加了以下行:
		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 调整一个 MyKind 对象type MyKindReconciler struct {
	client.Client
	Scheme   *runtime.Scheme
	// 请注意,我们添加了以下代码,以便能够传递 record.EventRecorder。	Recorder record.EventRecorder
}

将事件记录器传递给控制器

事件是通过控制器使用\[EventRecorder\]类型的CorrelatorOptions结构发布的,可以通过在管理器上调用GetRecorder(name string)为控制器创建。请注意,我们将更改在cmd/main.go中搭建的实现。

	if err = (&controller.MyKindReconciler{
		Client:   mgr.GetClient(),
		Scheme:   mgr.GetScheme(),
		// 请注意,我们添加了以下行:
		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 下的规则。