CodeBlanks Logo Icon CodeBlanks

Controller mantığı

Operator'ın denetleyici mantığını öğrenirsin.

Controller mantığı

Operator'ün kalbi Reconcile fonksiyonudur. Özel kaynak her değiştiğinde (ya da sahip olduğu bir nesne değiştiğinde) çağrılır ve şu adımları izler:

  1. Özel kaynağı oku; silinmişse çık.
  2. Gereken alt nesneleri (Deployment, Service, CronJob) hesapla.
  3. Yoksa oluştur, farklıysa güncelle.
  4. Status'u güncelle; gerekiyorsa bir süre sonra yeniden kuyruğa al.
func (r *YedekReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    var y v1.Yedek
    if err := r.Get(ctx, req.NamespacedName, &y); err != nil {
        return ctrl.Result{}, client.IgnoreNotFound(err)
    }
    cj := cronJobOlustur(&y)                     // istenen alt nesne
    ctrl.SetControllerReference(&y, cj, r.Scheme) // sahiplik
    // CreateOrUpdate ... status güncelle ...
    return ctrl.Result{RequeueAfter: time.Hour}, nil
}

Sahiplik ve çöp toplama

ownerReferences, alt nesneyi sahibine bağlar. Sahip (özel kaynak) silinince Kubernetes'in çöp toplayıcısı alt nesneleri de siler; ayrıca alt nesne değişince sahibin Reconcile'ı tetiklenir. Silmeden önce dış kaynakları temizlemek için finalizer kullanılır:

metadata:
  ownerReferences:
    - apiVersion: ornek.com/v1
      kind: Yedek
      name: magaza-gece
      controller: true
      blockOwnerDeletion: true
# finalizer
metadata:
  finalizers: ["ornek.com/s3-temizle"]

Uygulama Sahipliği incele

Üç komut yaz: magaza'daki magaza-gece-yedek CronJob'unun sahibinin türünü jsonpath='{.metadata.ownerReferences[0].kind}' ile yazdır; magaza'daki magaza-gece Yedek'ini sil; magaza'daki CronJob'ları listele.

Başlangıç kodu

terminal
# buraya yaz

Örnek çözüm

terminal
kubectl get cronjob magaza-gece-yedek -n magaza -o jsonpath='{.metadata.ownerReferences[0].kind}'
kubectl delete yedek magaza-gece -n magaza
kubectl get cronjobs -n magaza

Beklenen çıktı

Yedek
yedek.ornek.com "magaza-gece" deleted
No resources found in magaza namespace.

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Reconcile fonksiyonu neden aynı girdiyle tekrar tekrar çağrılabilir olmalıdır (idempotent)?

  • Hız için
  • Bellek için
  • Gerekli değildir
  • Denetleyici aynı nesne için defalarca, sırası belirsiz çağrılır; her çağrı aynı sonuca varmalı Doğru cevap

Açıklama: "Oluştur" yerine "yoksa oluştur, varsa uydur" yazılır.

2 Alt nesneyi sahibine bağlayan alanı yaz.

Soru
metadata:
  ____:
    - apiVersion: ornek.com/v1
      kind: Yedek
      name: magaza-gece
Cevap
metadata:
  ownerReferences:
    - apiVersion: ornek.com/v1
      kind: Yedek
      name: magaza-gece

Açıklama: ownerReferences çöp toplamayı sağlar.

3 Eşleştir.

Kavram Anlamı
Reconcile Uzlaştırma fonksiyonu
ownerReferences Sahiplik
finalizer Silmeden önce temizlik
RequeueAfter Sonra yeniden dene

Uzman bölümündeki tüm dersler