12 Add Event
k8s 官方 controller 都实现了 Events 消息信息, 如下
kubectl describe deployment k8s-operator-demo-controller-manager
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 15m deployment-controller Scaled up replica set k8s-operator-demo-controller-manager-75cc59d8ff to 1
Normal ScalingReplicaSet 14m deployment-controller Scaled down replica set k8s-operator-demo-controller-manager-b9d9f7886 to 0
我们自定义的 Operator 同样可以实现。
- 在
/controllers/redis_controller.go
中定义RedisReconcile
的时候, 添加EventRecord
字段。
// RedisReconciler reconciles a Redis object
type RedisReconciler struct {
client.Client
Scheme *runtime.Scheme
// 添加事件
EventRecord record.EventRecorder
}
- 在
/main.go
中, 创建 mgr 的时候使用mgr.GetEventRecorderFor("RedisOperator")
初始化EventRecorder
。
其中 RedisOperator
的值可以任意定义, 在 Event 日志中为 FROM
字段的值。 通常使用控制器名字 OperatorName, 例如这里使用 RedisOperator
。
if err = (&controllers.RedisReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
// 添加事件记录名称
EventRecord: mgr.GetEventRecorderFor("RedisOperator"),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Redis")
os.Exit(1)
}
- 在需要的地方添加事件日志输出
使用 r.EventRecord.Event()
方法记录事件日志
func (r *RedisReconciler) increaseReconcile(ctx context.Context, redis *myappv1.Redis) (ctrl.Result, error) {
// 添加事件日志
r.EventRecord.Event(redis,
corev1.EventTypeNormal, "扩容",
fmt.Sprintf("%s 副本数设置为 %d", redis.Name, redis.Spec.Replicas),
)
// 创建 逻辑
err := helper2.CreateRedisPod2(ctx, r.Client, redis, r.Scheme)
if err != nil {
return ctrl.Result{}, fmt.Errorf("创建 redis pod 失败: %v", err)
}
return ctrl.Result{}, nil
}
其中, Event 需要一下几个字段
Event(object runtime.Object, eventtype, reason, message string)
object
: 记录日志的对象。 也就是kd redis <name>
中的 name。eventtype
: Type 字段, 事件类型, 可以是任意值。- k8s corev1 api 中提供了 2个 官方值:
Normal
和Warning
- k8s corev1 api 中提供了 2个 官方值:
const (
// Information only and will not cause any problems
EventTypeNormal string = "Normal"
// These events are to warn that something might go wrong
EventTypeWarning string = "Warning"
)
reason
: Reason 字段, 事件原因, 可以理解为事件分类/类型。message
: Message 字段, 事件消息, 详细描述。
kd redis my-op-redis
# ...省略
Spec:
Image: redis:5-alpine
Port: 8333
Replicas: 1
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal 扩容 66s (x2 over 66s) RedisOperator redis 副本数设置为 3
Warning 缩容 49s RedisOperator redis 副本数设置为 1
Normal 扩容 38s (x5 over 72s) RedisOperator redis 副本数设置为 1