-
Kubernetes Operator의 RequeueAfter 개념Kubernetes 2025. 3. 22. 18:17728x90
Kubernetes Operator를 만들 때 Reconcile 루프를 일정 시간 후 다시 실행하도록 예약하는 메커니즘입니다.
Kubernetes의 controller-runtime 라이브러리에서 주로 사용되고, 특히 외부 상태 동기화, 실패 재시도, 일정 주기 polling이 필요할 때 유용해요.기본 개념: RequeueAfter
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
이 코드는 다음과 같은 의미예요:
"현재 리소스에 대해 30초 후에 다시 Reconcile을 호출해줘."
즉, Reconcile을 강제로 예약해서 재호출하도록 만드는 기능입니다.
왜 필요할까?
Reconcile() 함수는 일반적으로 리소스에 이벤트가 발생했을 때만 호출됩니다.
하지만 다음과 같은 경우에도 Reconcile을 반복 호출하고 싶을 때가 있어요:상황예시외부 시스템 상태와 정기적으로 동기화 외부 API의 응답값을 .status에 반영해야 할 때 특정 작업의 진행 상태를 주기적으로 확인 Job 상태 확인, 백업 완료 여부 확인 등 실패한 작업 재시도 외부 API 실패 후 몇 초 뒤 다시 시도 타임아웃 또는 상태 만료 감지 5분 이상 Running 상태면 실패로 간주 등 이럴 때 RequeueAfter를 사용하면 이벤트 없이도 주기적으로 루프를 재진입시킬 수 있어요.
사용 예시
func (r *MyResourceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // 리소스 가져오기 var myRes v1alpha1.MyResource if err := r.Get(ctx, req.NamespacedName, &myRes); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } // 외부 상태 확인 status, err := r.ExternalAPI.GetStatus(myRes.Spec.ID) if err != nil { log.Error(err, "외부 상태 확인 실패") // 10초 뒤 다시 시도 return ctrl.Result{RequeueAfter: 10 * time.Second}, nil } // 상태가 아직 완료되지 않았으면 재시도 if status != "COMPLETED" { return ctrl.Result{RequeueAfter: 1 * time.Minute}, nil } // 상태 완료 → 정상 처리 myRes.Status.Phase = "Done" _ = r.Status().Update(ctx, &myRes) return ctrl.Result{}, nil }
주의할 점
주의사항설명너무 짧은 주기 사용 금지 API 서버나 외부 API에 부하 발생 가능 필요할 때만 사용 상태 변화가 없는데도 계속 호출되면 anti-pattern 비동기 작업 추적에 적합 외부 Job 처리, 장시간 작업 추적 등에 유용 Requeue vs RequeueAfter 차이
항목설명Requeue: true 즉시 Reconcile을 다시 호출 (즉시 재시도) RequeueAfter: x x 시간 후에 Reconcile 재호출 (지연된 재시도) 요약
- RequeueAfter는 일정 시간 후 Reconcile을 예약하는 기능
- 이벤트가 없더라도 주기적인 재확인이 필요한 상황에 유용
- Kubernetes는 기본적으로 이벤트 기반이지만, RequeueAfter를 통해 Polling-like behavior도 가능
- 잘못 사용하면 과도한 루프 발생 → 신중하게 조건부로 사용
728x90'Kubernetes' 카테고리의 다른 글
Kubernetes Network 구성 (0) 2025.03.25 StatefulSet + headless service 조합의 사용 (0) 2025.03.23 Kubernetes의 동작 철학 중 하나인 Level-Triggered 방식의 개념 (0) 2025.03.22 K8S Operator의 Custom Resource 상태 정보를 외부 DB나 외부 API 호출을 통해서 업데이트 해야하는 경우 (0) 2025.03.22 Kubernetes Operator를 작성할 때 피해야 할 Anti-patterns (0) 2025.03.22