FluxCD 무한 reconcile — ignoreDifferences

CI·CD2분조회

FluxCD 로 GitOps 를 하면 클러스터 상태를 Git 에 맞춰 계속 되돌립니다. 그런데 그 “되돌림” 이 멈추지 않고 무한히 도는 경우가 있습니다.

두 컨트롤러의 같은 필드 경합

원인은 대개 drift detection 입니다. 두 가지 상황에서 나옵니다.

누군가 kubectl edit 으로 리소스를 직접 바꾸면, FluxCD 가 Git 상태로 되돌립니다. 또 바꾸면 또 되돌립니다. 사람과 FluxCD 가 반복합니다.

더 흔한 건 다른 컨트롤러와 부딪히는 경우입니다. HPA 는 부하에 따라 spec.replicas 를 바꿉니다. FluxCD 는 Git 에 적힌 replicas 로 되돌립니다. HPA 가 3으로 올리면 FluxCD 가 2로 내리고, HPA 가 다시 3으로 올립니다. Karpenter 가 관리하는 필드도 같은 식으로 충돌합니다.

둘 다 자기 일을 하고 있는데, 같은 필드를 두 컨트롤러가 관리하려 해서 생기는 문제입니다.

ignoreDifferences로 해당 필드 제외

ignoreDifferences 로 특정 필드를 drift 감지에서 제외합니다. FluxCD 가 그 필드는 안 건드립니다.

spec:
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/replicas   # HPA가 관리하는 필드

replicas 는 HPA 에게 넘기고 FluxCD 는 나머지만 Git 에 맞춥니다. 두 컨트롤러의 관리 범위가 안 겹치게 나눠주는 겁니다.

어느 필드를 뺄지는 “누가 이 필드의 주인인가” 로 정합니다. 부하에 따라 바뀌어야 하는 값은 HPA 가 주인이고, 그건 Git 에 고정할 값이 아닙니다.

급할 땐 flux suspend

무한 reconcile 이 도는 중에 원인을 파악하려면 먼저 멈추는 게 낫습니다.

flux suspend kustomization <name>

suspend 하면 FluxCD 가 되돌리기를 멈춥니다. 그 상태에서 무엇이 충돌하는지 보고, 고친 뒤에 다시 resume 합니다. 돌아가는 중에 들여다보면 상태가 계속 바뀌어서 원인을 짚기 어렵습니다.

참고

  1. 불러오는 중