Reconciler Trigger 설정하기
SetupWithManager
// SetupWithManager sets up the controller with the Manager.
func (r *TestReconciler) SetupWithManager(mgr ctrl.Manager) error {
b := ctrl.NewControllerManagedBy(mgr).Name("test")
// ...
return b.Complete(r)
}
For Resource 설정
For는 controller가 관리해야하는 primary resource를 지정합니다. 일반적으로 Custom Resource가 사용되고, 하나만 등록 가능합니다. reconciler는 For로 등록된 resource에 대한 생성, 업데이트, 삭제 이벤트를 감지하여 트리거됩니다.
b = b.For(&v1alpha1.Test{})
Owns Resource 설정
Owns는 controller가 관리하는 secondary resource를 지정합니다. secondary resource를 생성하고 controllerutil.SetControllerReference를 사용하여 소유권을 설정하면, reconciler는 Owns로 등록된 resource에 대한 생성, 업데이트, 삭제 이벤트를 감지하여 트리거됩니다.
b = b.Owns(&appsv1.Deployment{})
OwnerReference가 설정된 secondary resource는 primary resource 삭제 시 함께 삭제됩니다.
Watches Resource 설정
Watches는 controller가 생성하지는 않았지만 resource관리에 필요한 secondary resource를 지정합니다. reconciler는 Watches로 등록된 resource에 대한 생성, 업데이트, 삭제 이벤트를 감지하여 트리거됩니다.
b = b.Watches(&corev1.ConfigMap{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request {
// 어떤 primary resource를 확인해야 하는지 찾는 로직 구현
return []reconcile.Request{}
}))
WatchesRawSource로 외부 이벤트 트리거
For, Owns, Watches는 모두 Kubernetes API server의 watch 이벤트(리소스의 생성/수정/삭제)에 의해 트리거됩니다. 하지만 Kubernetes 리소스 변경과 무관한 외부 신호로 reconcile을 트리거해야 하는 경우가 있습니다.
예를 들어:
- 주기적으로 메트릭을 수집한 뒤, 새 메트릭이 수집될 때마다 reconcile을 트리거
- 외부 시스템(webhook, 메시지 큐 등)에서 이벤트를 수신하여 reconcile을 트리거
- 타이머 기반으로 reconcile을 트리거 (
ctrl.Result{RequeueAfter: ...}로 부족한 경우)
이런 경우 source.Channel과 event.GenericEvent를 사용하여 Go channel을 통해 reconcile을 트리거할 수 있습니다.