1️⃣ 개요
애플리케이션을 운영할 때, 새로운 기능을 배포하더라도 모든 사용자에게 즉시 공개하는 것은 위험할 수 있습니다.
이때 Feature Flag(기능 플래그) 를 활용하면, 코드 배포와 기능 활성화를 분리하여 특정 사용자 그룹에게만 새로운 기능을 점진적으로 제공할 수 있습니다.
Feature Flag를 활용하면:
• ✅ 새로운 기능을 배포하되, 일부 사용자만 활성화
• ✅ 문제가 발생하면 즉시 기능을 비활성화(롤백 없이 기능 차단 가능)
• ✅ A/B 테스트, Canary 배포와 결합하여 점진적인 배포 가능
이번 글에서는 Feature Flag의 개념과, Kubernetes 환경에서 Feature Flag를 활용한 동적 배포 방법을 설명하겠습니다. 🚀
2️⃣ Feature Flag란?
✅ 1. Feature Flag의 개념
• 코드 배포와 기능 활성화를 분리하는 기법
• 새로운 기능을 Feature Flag(토글)로 감싸고, 특정 조건을 만족하는 경우에만 활성화
• 운영 중에도 실시간으로 기능을 ON/OFF 가능
• 배포 후 문제가 발생하면 롤백 없이 즉시 기능 비활성화 가능
📌 기존 배포 vs Feature Flag 배포 비교
특징 | 기존 배포 방식 | Feature Flag 기반 배포 |
기능 활성화 시점 | 코드 배포 시점 | 배포 후 운영 중에도 조정 가능 |
롤백 방식 | 이전 버전으로 롤백 필요 | Feature Flag 비활성화로 즉시 롤백 가능 |
A/B 테스트 지원 | 🚫 불가능 | ✅ 가능 (특정 사용자 그룹만 활성화) |
사용자별 기능 조정 | 🚫 불가능 | ✅ 가능 (특정 조건 기반 활성화) |
✅ Feature Flag를 활용하면 배포 후에도 기능을 유연하게 제어할 수 있습니다.
3️⃣ Feature Flag 구현 방법
Feature Flag는 일반적으로 환경 변수, ConfigMap, API 기반 설정을 활용하여 관리할 수 있습니다.
대표적인 구현 방식은 Kubernetes ConfigMap을 활용하는 방법과, Feature Flag 서비스(LaunchDarkly, Unleash)와 연동하는 방법입니다.
✅ 1. Kubernetes ConfigMap을 활용한 Feature Flag
ConfigMap을 활용하면 애플리케이션의 환경 설정을 변경하여 Feature Flag를 제어할 수 있습니다.
📌 Feature Flag가 포함된 ConfigMap 예제
apiVersion: v1
kind: ConfigMap
metadata:
name: feature-flags
data:
NEW_FEATURE_ENABLED: "true"
📌 ConfigMap을 Deployment에 적용
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
env:
- name: NEW_FEATURE_ENABLED
valueFrom:
configMapKeyRef:
name: feature-flags
key: NEW_FEATURE_ENABLED
📌 ConfigMap 변경을 통해 Feature Flag 활성화/비활성화
kubectl edit configmap feature-flags
✅ 이 방식은 간단하지만, 실시간으로 Feature Flag를 변경하기 어려울 수 있습니다.
✅ 2. Feature Flag 서비스(Unleash, LaunchDarkly) 활용
Feature Flag 서비스(Unleash, LaunchDarkly)를 활용하면 실시간으로 기능을 활성화하거나 비활성화할 수 있습니다.
📌 Unleash 설치 및 실행
kubectl apply -f https://docs.getunleash.io/deploy/kubernetes/unleash-deployment.yaml
📌 Unleash를 활용한 Feature Flag 예제 (YAML 설정)
apiVersion: v1
kind: ConfigMap
metadata:
name: unleash-config
data:
UNLEASH_URL: "http://unleash:4242/api"
UNLEASH_FEATURE: "new-feature"
📌 애플리케이션 코드에서 Feature Flag 적용 (Python 예제)
import requests
UNLEASH_URL = "http://unleash:4242/api"
FEATURE_NAME = "new-feature"
def is_feature_enabled():
response = requests.get(f"{UNLEASH_URL}/client/features")
feature_flags = response.json()
return feature_flags.get(FEATURE_NAME, {}).get("enabled", False)
if is_feature_enabled():
print("🚀 새로운 기능 활성화됨!")
else:
print("❌ 기존 기능 유지됨")
✅ Unleash와 같은 서비스 기반 Feature Flag는 운영 중에도 실시간으로 변경이 가능하며, Canary 배포와도 쉽게 결합할 수 있습니다.
4️⃣ Feature Flag 운영 시 고려해야 할 점
✅ 1. 동적 배포와 함께 활용하기
Feature Flag는 Canary Deployment와 결합하여 점진적으로 새로운 기능을 활성화하는 데 유용하게 활용될 수 있습니다.
📌 Feature Flag + Canary 배포 시나리오
1) 새로운 기능을 포함한 애플리케이션을 배포 (Feature Flag OFF 상태로 배포)
2) Feature Flag를 일부 사용자(예: 내부 직원)에게만 활성화
3) 에러 발생 시 즉시 Feature Flag를 비활성화하여 기능 차단
4) 문제가 없으면 전체 사용자에게 기능을 활성화
✅ Feature Flag를 사용하면 Canary 배포보다 더 세밀한 기능 활성화가 가능합니다.
✅ 2. 운영 중 Feature Flag 정리 (Cleanup)
Feature Flag를 남용하면 코드 복잡도가 증가할 수 있으므로, 기능이 완전히 안정화되면 불필요한 Feature Flag를 정리해야 합니다.
📌 Feature Flag 정리 체크리스트
• ✅ 새로운 기능이 전체 사용자에게 적용되었는가?
• ✅ 해당 Feature Flag가 더 이상 변경되지 않는가?
• ✅ 기존 코드에서 Feature Flag 관련 로직을 제거했는가?
✅ Feature Flag를 무분별하게 남용하면 코드 관리가 어려워지므로, 일정 기간 후 정리하는 것이 중요합니다.
🔥 5️⃣ 결론
✔ Feature Flag를 활용하면 배포 후에도 기능을 점진적으로 활성화할 수 있음
✔ ConfigMap을 활용한 방법과 Unleash/LaunchDarkly 같은 서비스 기반 솔루션 활용 가능
✔ Canary 배포와 결합하면 더욱 강력한 동적 배포 전략을 수립할 수 있음
✔ 운영 중에도 Feature Flag를 통해 기능을 활성화/비활성화할 수 있어 빠른 롤백 가능
✔ Feature Flag는 남용하지 않도록 주기적으로 정리해야 함