NGINX Gateway Fabric – UpstreamSettingsPolicy CRD

이 포스트에서는 NGINX Gateway Fabric 의 UpstreamSettingsPolicy CRD를 활용하여 NGINX와 업스트림 애플리케이션 간 연결 동작을 구성하는 방법을 소개합니다.

현대 쿠버네티스 환경에서 NGINX Gateway Fabric은 애플리케이션 개발자들이 업스트림 연결의 성능과 안정성을 최적화할 수 있도록 지원합니다. UpstreamSettingsPolicy를 통해 공유 메모리 존 크기, 킵얼라이브 설정 등을 조정하여 효율적인 트래픽 관리를 구현할 수 있습니다.

목차

1. NGINX Gateway Fabric – UpstreamSettingsPolicy란?
1-1. UpstreamSettingsPolicy의 개요
2. UpstreamSettingsPolicy 구성

3. 테스트
4. 결론

1. NGINX Gateway Fabric – UpstreamSettingsPolicy 란?

UpstreamSettingsPolicy는 NGINX Gateway Fabric에서 제공하는 Direct Attached Policy로, NGINX와 업스트림 애플리케이션 간 연결 동작을 구성합니다. 이 정책은 공유 메모리 존(zone), 킵얼라이브(keepalive) 설정 등을 통해 업스트림 연결의 효율성을 높입니다.

이 정책은 HTTP 또는 gRPC 서비스에 적용 가능하며, HTTPRoute 또는 GRPCRoute에서 참조되는 서비스에 부착됩니다. 이를 통해 애플리케이션 개발자는 업스트림 서버와의 연결을 최적화할 수 있습니다.

1-1. UpstreamSettingsPolicy의 개요

UpstreamSettingsPolicy는 다음과 같은 NGINX 지시어를 설정합니다:

  • zone: 업스트림 공유 메모리 존 크기.
  • keepalive: 업스트림 서버와의 아이들 연결 최대 수.
  • keepalive_requests: 하나의 킵얼라이브 연결을 통해 처리할 수 있는 최대 요청 수.
  • keepalive_time: 킵얼라이브 연결을 통해 요청을 처리할 수 있는 최대 시간.
  • keepalive_timeout: 킵얼라이브 타임아웃.

이 정책은 동일 네임스페이스 내의 하나 이상의 서비스에 적용되며, targetRefs를 통해 타겟을 지정합니다. 정책은 OSS와 Plus 버전에 따라 기본값이 다를 수 있습니다.

2. UpstreamSettingsPolicy 구성

아래는 UpstreamSettingsPolicy를 구성한 예시 YAML입니다. 이 예시는 ho-ngf 네임스페이스에서 nginx-example-1과 nginx-example-2 서비스에 적용됩니다.

apiVersion: gateway.nginx.org/v1alpha1
kind: UpstreamSettingsPolicy
metadata:
name: default-upstream-setting
namespace: ho-ngf
spec:
zoneSize: 1m
keepAlive:
connections: 32
requests: 1000
time: 1h
timeout: 15s
targetRefs:
- group: core
kind: Service
name: nginx-example-1

UpstreamSettingsPolicy의 keepalive 구성을 배포하면 다음과 같은 NGINX 형태로 자동으로 변경됩니다.

UpstreamSettingsPolicyNGINX Upstream Keepalive
connectionskeepalive
requestskeepalive_requests
timekeepalive_time
timeoutkeepalive_timeout

이 정책을 적용하기 위해 kubectl apply -f <filename>.yaml 명령어를 실행합니다.

적용 후, ho-ngf 네임스페이스의 리소스를 확인합니다.

이 구성으로 업스트림 연결의 공유 메모리와 킵얼라이브 설정이 최적화되어 안정적인 트래픽 처리가 가능합니다.

3. 테스트

테스트를 위해 부하 분산 도구인 wrk를 사용하여 10초동안 부하 요청을 보내고, upstream에 있는 서비스에서 TCP 연결 수를 확인합니다.

keepalive가 정상적으로 적용된 서비스:

$ wrk -t2 -c10 -d10s http://[NGINX Gateway Fabric Host]
root@master:/etc/nginx# wrk -t2 -c10 -d10s http://hocp-ngf.devopsshin.com:30263
Running 10s test @ http://hocp-ngf.devopsshin.com:30263
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.90ms 2.09ms 39.74ms 94.42%
Req/Sec 1.85k 372.82 3.23k 69.00%
36846 requests in 10.00s, 31.73MB read
Requests/sec: 3683.10
Transfer/sec: 3.17MB
# upstream server에서 TCP 연결 수를 확인합니다.
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
12
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
15
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
17
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
17
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
20
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
21
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
21
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
28
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
29
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
29
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
29
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
27

아래 wrk 결과와 같이 3683/RPS로 요청해도 keepalive 설정을 통해 TCP 연결을 재사용하기 때문에 문제없이 잘 처리하는 것을 확인할 수 있습니다.

keepalive 미적용시:

$ wrk -t2 -c10 -d10s http://[NGINX Gateway Fabric Host]
wrk -t2 -c10 -d10s http://hocp-ngf.devopsshin.com:30263
Running 10s test @ http://hocp-ngf.devopsshin.com:30263
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.13ms 2.15ms 36.55ms 92.52%
Req/Sec 1.23k 256.27 1.98k 71.58%
23407 requests in 10.01s, 20.16MB read
Requests/sec: 2338.01
Transfer/sec: 2.01MB
# upstream server에서 TCP 연결 수를 확인합니다.
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
2
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
1295
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
2269
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
3100
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
3861
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
4566
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
5134
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
5735
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
6120
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
6555
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
6937
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
7329
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
7776
root@nginx-example-1-f4d9d9b6f-8frs4:~# ss -tan | grep :80 | wc -l
8205

위 결과와 같이 2338/RPS로 요청했을 때 요청마다 새로운 TCP 연결을 열기 때문에, 요청이 많아질수록 backend의 부하가 심각해지게 됩니다.

4. 결론

NGINX Gateway Fabric의 UpstreamSettingsPolicy CRD를 활용하면 업스트림 연결의 동작을 세밀하게 구성하여 애플리케이션의 성능을 향상시킬 수 있습니다. 이 기능은 공유 메모리 관리와 킵얼라이브 설정을 통해 효율적인 리소스 활용을 지원합니다.

설정 예시를 통해 UpstreamSettingsPolicy를 적용하는 방법을 확인했으며, 쿠버네티스 환경에서 서비스에 직접 부착하여 사용할 수 있습니다. NGINX Gateway Fabric의 대시보드나 로그를 통해 설정 결과를 모니터링하여 웹 애플리케이션의 안정성을 강화할 수 있습니다.

NGINX Gateway Fabric의 UpstreamSettingsPolicy에 대해 더 궁금하시거나 직접 사용해 보고 싶으시다면, NGINX STORE에 연락하여 자세한 정보를 확인해 보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required