-
Kubernetes Operator를 작성할 때 피해야 할 Anti-patternsKubernetes 2025. 3. 22. 17:37728x90
🔁 1. Reconciliation Loop 남용 / 비효율적인 처리
- 문제: Reconcile 루프에서 너무 많은 로직을 처리하거나, 상태가 바뀌지 않아도 리소스를 계속 업데이트하거나, 외부 API를 호출하는 경우.
- 예시:
- 매번 Deployment를 업데이트하여 rollout이 반복됨
- 외부 DB나 API를 reconcile 루프마다 계속 호출
- 해결: 상태 변화가 있을 때만 필요한 작업을 수행하고, idempotent하게 구현.
📦 2. Status 필드 미사용 또는 오용
- 문제: CR의 .status 필드를 사용하지 않거나, 너무 많은 정보를 넣어서 상태 추적이 어려운 경우.
- 해결: 적절한 정보를 넣어 관찰 가능한 상태를 만들고, 컨트롤러는 이 상태를 기준으로 동작해야 함.
🧠 3. 컨트롤러가 너무 많은 책임을 가짐 (God Operator)
- 문제: 하나의 Operator가 너무 많은 리소스를 다루고 복잡한 로직을 모두 포함하는 경우.
- 해결: 역할을 분리하고, 가능한 한 단일 책임 원칙(SRP)을 따름.
🔄 4. Finalizer 미사용 또는 제거 실수
- 문제: CR이 삭제될 때 필요한 클린업 작업을 위해 finalizer를 등록하지 않거나, 수동으로 지워버려 리소스 누수 발생.
- 해결: 적절한 finalizer 설정 및 처리 로직 구현.
🚨 5. OwnerReference 잘못 설정
- 문제: CR이 소유하는 리소스에 OwnerReference를 잘못 지정하거나 누락해 GC가 제대로 동작하지 않음.
- 해결: 하위 리소스에 올바른 OwnerReference를 설정해 쿠버네티스 GC와 연동.
🔍 6. Event 기록 누락
- 문제: 사용자가 디버깅하거나 상태를 파악할 수 있도록 Event를 기록하지 않음.
- 해결: record.Eventf 등을 이용해 주요 이벤트를 기록.
⏱️ 7. rate limiting / exponential backoff 없이 재시도
- 문제: 에러 발생 시 재시도를 무한히 빠르게 하여 API 서버나 외부 시스템에 부하를 줌.
- 해결: controller-runtime에서 제공하는 RequeueAfter, rate limiting 기능 사용.
🧪 8. 테스트 부족
- 문제: 컨트롤러의 동작에 대한 유닛 테스트, 통합 테스트가 부족하여 변경 시 회귀 버그 발생.
- 해결: envtest, controller-runtime의 fake client 등을 활용한 테스트 작성.
🧩 9. Spec 변경 감지를 위한 annotation hack
- 문제: 리소스의 변화를 감지하기 위해 annotation에 hash 값을 기록하는 등의 hacky 방식 사용.
- 해결: 이런 방식이 필요한 경우도 있지만, 명확한 설계와 이유 없이 쓰는 건 유지보수에 안 좋음.
🛠️ 10. Custom Resource를 일반 Config처럼 사용
- 문제: CRD를 그냥 ConfigMap 대체로 쓰는 경우, controller 로직 없이 선언만 있는 상태가 됨.
- 해결: CRD는 선언한 Desired State와 Reconciler를 통해 관리되는 상태(stateful system)를 의미함.
728x90'Kubernetes' 카테고리의 다른 글
Kubernetes의 동작 철학 중 하나인 Level-Triggered 방식의 개념 (0) 2025.03.22 K8S Operator의 Custom Resource 상태 정보를 외부 DB나 외부 API 호출을 통해서 업데이트 해야하는 경우 (0) 2025.03.22 Custom Pod Scheduling (0) 2025.03.21 Kubernetes Default Pod Scheduler의 스케줄링 로직 (0) 2025.03.21 ServiceEntry는 네임스페이스마다 설정이 필요한가? (0) 2025.03.13