Saya baru saja memulai dengan kubebuilder dan Golang untuk memperluas kluster Kubernetes kami dengan sumber daya khusus. Saya ingin melakukan hal yang berbeda dalam fungsi rekonsiliasi berdasarkan acara, yang sebenarnya disebut itu.

Apakah sumber daya dibuat? Apakah itu diperbarui? Apakah itu dihapus?

Masing-masing peristiwa itu memicu pengontrol, namun, sepertinya saya tidak dapat menemukan kemungkinan untuk melihat, peristiwa mana yang benar-benar terjadi. Saya dapat mengatasi masalah ini dengan menulis rekonsiliasi seperti ini:

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")
    }
}

Namun, anehnya ini terasa implisit dan agak retas.

Apakah ada cara yang bersih (mungkin asli) untuk mendapatkan tipe acara dari panggilan rekonsiliasi?

2
Tim Hilt 10 Mei 2021, 17:53

1 menjawab

Jawaban Terbaik

Anda tidak akan dapat melakukannya karena sistem ini dirancang sebagai berbasis level dan tidak dipicu oleh perubahan peristiwa individual melainkan oleh status cluster aktual yang diambil dari apiserver.

Melihat reconcile.go Anda akan melihat baris #84 memiliki komentar tentang ini:

Rekonsiliasi berbasis level, artinya tindakan tidak mendorong perubahan di Peristiwa individual, tetapi didorong oleh status kluster yang sebenarnya membaca dari apiserver atau cache lokal. Misalnya jika menanggapi Event Penghapusan Pod, Permintaan tidak akan berisi bahwa Pod adalah dihapus, alih-alih fungsi rekonsiliasi mengamati ini saat membaca status cluster dan melihat Pod hilang.

Dan sejalan #44< /a>:

Permintaan berisi informasi yang diperlukan untuk merekonsiliasi a objek Kubernetes. Ini termasuk informasi untuk secara unik mengidentifikasi objek - Nama dan Namespace-nya. TIDAK mengandung informasi tentang Peristiwa tertentu atau konten objek itu sendiri.

2
thomas 11 Mei 2021, 09:59