ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • K8S Operator의 Custom Resource 상태 정보를 외부 DB나 외부 API 호출을 통해서 업데이트 해야하는 경우
    Kubernetes 2025. 3. 22. 17:58
    728x90

    Kubernetes Operator에서 Custom Resource(CR)의 상태 정보를 외부 DB나 외부 API 호출을 통해 업데이트해야 하는 경우, reconcile 루프에서 무조건 호출하는 건 anti-pattern 입니다.

     

    목표: "상태 변화가 있을 때만 외부 상태를 조회하고 .status를 업데이트한다

     

    [패턴 1] 조건부 외부 API 호출 (Reconcile 루프 내 최소 호출)

    • CR의 .spec 또는 .status에 변화가 있을 때만 외부 API/DB를 조회.
    • 외부 상태를 조회해 .status를 업데이트.

    구현 예시:

    if hasMeaningfulChange(myResource.Spec, myResource.Status) {
        externalStatus := queryExternalAPI(myResource.Spec.ID)
        myResource.Status.State = externalStatus
        r.Status().Update(ctx, &myResource)
    }

     

    • hasMeaningfulChange는 hash 비교, generation 체크, annotation 등을 활용할 수 있어요.

     

    [패턴 2] 주기적 Poller를 Operator 외부에 둔다

    • Operator가 외부 상태를 직접 polling하지 않고,
    • 별도 job이나 sidecar가 외부 상태를 CR .status에 업데이트.
    • Operator는 CR의 .status만 보고 행동.

    구조 예시:

    [External Poller] --> update CR.Status --> [Operator Reconcile]

     

    장점: Operator는 외부 의존성 없이 순수하게 Kubernetes-native한 방식으로 동작 가능
    단점: 구성 요소가 하나 늘어나지만, 확장성 좋고 장애 격리 가능

     

    [패턴 3] Webhook 방식 (Push 기반 상태 업데이트)

    • 외부 시스템이 자체적으로 상태 변경을 감지했을 때 Kubernetes에 직접 .status를 patch하거나 webhook을 통해 알려줌.
    • Operator는 CR의 상태 변화만 보고 reconcile.

    구성 방식:

    • 외부 시스템이 Kubernetes API 서버에 PATCH 요청:
    PATCH /apis/mygroup/v1/myresources/foo/status
    {
      "status": {
        "state": "READY"
      }
    }

     

    인증을 위해 Kubernetes API 인증 구성 필요 (RBAC, ServiceAccount, Token 등)

    [패턴 4] 상태를 저장하는 외부 DB와 Operator 상태 동기화

    • 외부 DB가 single source of truth일 때.
    • CR에는 외부 상태의 snapshot만 저장.
    • 주기적으로 외부 DB의 상태를 watch 또는 subscribe (ex. Debezium, CDC, Pub/Sub 등)

    이럴 경우엔 Operator가 외부 이벤트 기반 동작하도록 구현하거나, controller 내에서 watch loop와 backoff를 직접 구현해야 합니다.

     

    안티패턴 요약

    상황왜 피해야 하나요?
    Reconcile마다 외부 API 호출 상태 변화가 없어도 트래픽 유발, rate limit 초과
    .status에 외부 응답 전체 저장 CR 용량 증가, diff 폭 커짐, etcd 부담
    상태 저장 없이 즉시 행동 Declarative 모델에 위배, 장애 발생 시 추적 어려움

     

    Tip: .status.lastSyncedTime, .status.externalStateHash 등을 넣어 외부 상태와 비교할 때 활용하면 좋아요. 변경 감지 로직을 단순화할 수 있어요.

     

     

     

     

     

    728x90
Designed by Tistory.