Получение типа события, запустившего контроллер в kubebuilder

Я только начинаю работать с kubebuilder и Golang, чтобы расширить наш Kubernetes-кластер с помощью настраиваемого ресурса. Я бы хотел делать разные вещи в функции согласования в зависимости от события, которое на самом деле его вызвало.

Ресурс был создан? Это было обновлено? Он был удален?

Каждое из этих событий запускает контроллер, однако я не могу найти возможности увидеть, какое из этих событий действительно произошло. Я могу обойти эту проблему, написав такую ​​программу согласования:

func (r *ServiceDescriptorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    service := &batchv1.ServiceDescriptor{}
    if err := r.Get(context.TODO(), req.NamespacedName, service); err != nil && errors.IsNotFound(err) {
        fmt.Println("Resource was not found -> must have been deleted")
    else {
        fmt.Println("No errors found -> Resource must have been created or updated")
    }
}

Однако это кажется странным неявным и отчасти хакерским.

Есть ли чистый (возможно, собственный) способ получения типа события вызова согласователя?


person Tim Hilt    schedule 10.05.2021    source источник


Ответы (1)


Вы не сможете этого сделать, потому что эта система была спроектирована как основанная на уровнях, и она не запускается изменениями отдельных событий, а скорее фактическим состоянием кластера, которое извлекается из apiserver.

Посмотрев на reconcile.go, вы заметите в строке # 84 написал об этом следующий комментарий:

Согласование основано на уровнях, то есть действие не зависит от изменений в отдельных событиях, а вместо этого управляется фактическим состоянием кластера, считываемым из apiserver или локального кеша. Например, при ответе на событие удаления модуля запрос не будет содержать информацию о том, что модуль был удален, вместо этого функция согласования наблюдает за этим, считывая состояние кластера и видя, что модуль отсутствует.

И в строке # 44 < / а>:

Запрос содержит информацию, необходимую для согласования объекта Kubernetes. Сюда входит информация для однозначной идентификации объекта - его имя и пространство имен. Он НЕ содержит информации о каком-либо конкретном Событии или самом содержании объекта.

person acid_fuji    schedule 11.05.2021