A/B Testing 및 NGINX Ingress Controller 무중단 배포
NGINX Ingress Controller의 VirtualServer 리소스를 통해 A/B Testing 을 구현할 수 있습니다.
A/B Testing 은 여러 버전의 웹 애플리케이션을 제공하고 그 성과를 비교하는 중요한 방법입니다. NGINX Ingress Controller 를 사용하여 Kubernetes 환경에서 A/B 테스트를 설정하는 방법을 단계별로 설명합니다.
NGINX Ingress Controller를 통한 A/B 테스트는 MSA (MicroService Architecture, 마이크로서비스 아키텍처) 무중단 배포 시나리오에서 새로운 버전의 애플리케이션을 점진적으로 테스트하고 안정성을 검증할 수 있어 배포 중 발생할 수 있는 위험을 최소화하며, 사용자가 중단 없이 새로운 기능을 경험하도록 할 수 있는 이점이 있습니다.
목차
1. NGINX Ingress Controller A/B Testing 전제 조건
2. A/B Testing을 위한 Service 및 Deployment 배포
3. NGINX Ingress Controller VirtualServer 리소스 설정
4. A/B Testing 검증
4-1. 분석 도구 예시
5. 결론
1. NGINX Ingress Controller A/B Testing 전제 조건
- Kubernetes 클러스터 준비: NGINX Ingress Controller를 배포할 수 있는 클러스터가 필요합니다.
- NGINX Ingress Controller 설치: 설치 방법은 NGINX Ingress Controller 설치 가이드를 참조하세요.
본 가이드에서는 NGINX Ingress Controller와 NGINX Plus Ingress Controller 두 Ingress Controller에 적용됩니다.
2. A/B Testing을 위한 Service 및 Deployment 배포
우선, 두 개의 버전(예: v1 및 v2)으로 애플리케이션을 배포합니다. 각 버전은 서로 다른 기능이나 UI를 제공하여 A/B Testing 을 통해 사용자 반응을 비교할 수 있게 합니다.
해당 포스트에서는 UI가 다른 로그인 서비스의 이미지를 Tag를 사용해 버전을 분리하여 애플리케이션을 배포합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: login-v1
labels:
app: login-app
version: v1
spec:
selector:
matchLabels:
app: login-app
version: v1
template:
metadata:
labels:
app: login-app
version: v1
spec:
containers:
- name: login-container-v1
image: nginxstore/example-login-ui:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: login-svc-v1
spec:
selector:
app: login-app
version: v1
ports:
- protocol: TCP
port: 80
targetPort: 80
위 yaml 파일을 통해 배포된 서비스의 접근 화면은 다음과 같습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: login-v2
labels:
app: login-app
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: login-app
version: v2
template:
metadata:
labels:
app: login-app
version: v2
spec:
containers:
- name: login-container-v2
image: nginxstore/example-login-ui:v2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: login-svc-v2
spec:
selector:
app: login-app
version: v2
ports:
- protocol: TCP
port: 80
targetPort: 80
위 yaml 파일을 통해 배포된 서비스의 접근 화면은 다음과 같습니다.

3. NGINX Ingress Controller VirtualServer 리소스 설정
A/B 테스트를 위해 트래픽을 각 버전으로 분배합니다. 여기서는 / 경로로 접근할 시 80%의 트래픽을 v1으로, 20%의 트래픽을 v2로 보내도록 설정합니다.
apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: login-virtualserver
spec:
host: login.example.com
upstreams:
- name: login-v1
service: login-svc-v1
port: 80
- name: login-v2
service: login-svc-v2
port: 80
routes:
- path: /
splits:
- weight: 80
action:
proxy:
upstream: login-v1
rewritePath: /
requestHeaders:
set:
- name: Host
value: login-svc-v1.nginx-ingress.svc.cluster.local
- weight: 20
action:
proxy:
upstream: login-v2
rewritePath: /
requestHeaders:
set:
- name: Host
value: login-svc-v2.nginx-ingress.svc.cluster.local
4. A/B Testing 검증
이제 설정이 완료되었습니다. 실제로 트래픽을 보내어 A/B Testing 이 올바르게 설정되었는지 확인합니다. 트래픽의 80%는 app-v1으로, 20%는 app-v2로 라우팅되어야 합니다.
브라우저 접속 새로고침으로 A/B 테스팅 검증을 실행합니다.


여러 번 요청을 보내어 응답을 확인하고, 각 버전에서 응답이 오는지 확인합니다. 이를 통해 A/B 테스트 설정이 올바르게 작동하는지 검증합니다. 최적의 결과를 얻기 위해 지속적인 테스트와 분석을 진행하는 것을 추천합니다.
4-1. 분석 도구 예시
A/B Testing 의 결과를 분석하기 위해 다양한 도구를 사용할 수 있습니다. NGINX Ingress Controller와 함께 사용하는 로그 분석 도구나 모니터링 도구(Grafana, Prometheus, Kiali 등)를 통해 각 버전의 성과를 비교 분석합니다.

분석 도구 예시:
- Grafana 및 Prometheus: 실시간 모니터링 및 메트릭 수집
- Elastic Stack (ELK): 로그 수집 및 분석
- Google Analytics: 사용자 행동 분석
각 버전의 트래픽, 응답 시간, 에러율, 사용자 반응 등을 분석하여 더 나은 버전을 선택할 수 있습니다. 이를 통해 최적의 사용자 경험을 제공할 수 있습니다.
5. 결론
위 가이드를 따르면 VirtualServer 리소스를 사용하여 Kubernetes 환경에서 효율적으로 A/B 테스트를 설정하고 실행할 수 있습니다. 또한 A/B 테스트는 사용자 경험을 향상시키고 애플리케이션의 성능을 최적화하는 데 중요한 도구입니다. 다양한 테스트 방법과 시나리오를 적용하여 더 나은 애플리케이션 성능을 도출할 수 있습니다.
NGINX Ingress Controller와 VirtualServer 리소스를 사용한 A/B 테스트 설정에 대해 궁금한 점이 있거나 추가 질문이 있다면 언제든지 NGINX STORE를 통해 문의하세요.
댓글을 달려면 로그인해야 합니다.