NGINX Plus Ingress Controller 와 Istio Ingress Gateway 라우팅 비교
해당 포스트에서는 Kubernetes 환경에서 사용할 수 있는 Ingress Gateway 솔루션 두 가지, NGINX Plus Ingress Controller 와 Istio Ingress Gateway를 각각 사용하여 간단한 라우팅을 구성하는 내용입니다. 각 솔루션의 특징과 장단점을 살펴보세요.
목차
1. Ingress Gateway란?
2. NGINX Plus Ingress Controller 란?
3. NGINX Plus Ingress Controller 로 라우팅 설정
3-1. NGINX Plus Ingress Controller 의 VirtualServer 리소스 생성
3-2. NGINX Plus Ingress Controller 테스트
4. Istio Ingress Gateway란?
5. Istio Ingress Gateway로 라우팅 설정
5-1. Gateway 리소스 생성
5-2. VirtualService 리소스 생성
5-3. 테스트
6. 결론
1. Ingress Gateway란?
Ingress Gateway란 Kubernetes 클러스터의 외부 트래픽 관리를 담당하는 핵심 구성 요소입니다. 클러스터 외부에서 들어오는 HTTP/HTTPS 트래픽을 수신하고, 이를 적절한 내부 서비스로 라우팅하는 역할을 합니다.
Ingress Gateway는 다양한 기능을 제공하여 Kubernetes 환경의 접근성과 보안성을 높입니다. TLS Termination, Load Balancing, Service Mesh, Monitoring 등의 기능을 통해 안전하고 효율적인 트래픽 관리를 가능하게 합니다.
2. NGINX Plus Ingress Controller 란?
NGINX Plus Ingress Controller는 NGINX의 고성능 프록시 기능을 활용하여 Kubernetes 환경에서 안정적이고 확장성 있는 트래픽 관리를 제공합니다. 또한 엔터프라이즈급 기능들을 통해 생산성 및 가용성을 높일 수 있습니다. 자세한 내용은 여기를 클릭하세요.
3. NGINX Plus Ingress Controller 로 라우팅 설정
이번 포스트에서는 NGINX Plus Ingress Controller 와 VirtualServer 리소스를 사용하여 간단한 라우팅을 구성합니다. VirtualServer 리소스는 NGINX Plus Ingress Controller에서 제공하는 고급 라우팅 기능을 활용할 수 있는 사용자 정의 리소스입니다.
(※ NGINX Plus Ingress Controller를 배포하는 방법은 해당 포스트에서 다루지 않습니다.)
현재 NGINX Plus Ingress Controller 는 NodePort 타입으로 아래와 같이 포트 바인딩 되어 있습니다.
$ kubectl get svc -n nginx-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress NodePort 10.97.106.96 <none> 80:30000/TCP,443:30001/TCP 47h
해당 테스트에서 사용할 서비스는 아래와 같습니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ho-deploy1
namespace: nginx-ingress
spec:
selector:
matchLabels:
app: ho-deploy1
template:
metadata:
labels:
app: ho-deploy1
spec:
containers:
- name: ho-container1
image: gusgh13900/nginxstore-text-plain:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ho-svc1
namespace: nginx-ingress
spec:
ports:
- name: http-ho-svc-port1
port: 80
targetPort: 80
selector:
app: ho-deploy1
3-1. NGINX Plus Ingress Controller 의 VirtualServer 리소스 생성
위에서 생성한 서비스로 라우팅해줄 VirtualServer 리소스를 생성합니다:
apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: hodevops
namespace: nginx-ingress
spec:
host: hodevops.nginxstore.kr
ingressClassName: nginx
upstreams:
- name: text # upstream 이름 지정
service: ho-svc1 # 해당 upstream에 대한 서비스 지정
port: 80 # 해당 서비스 포트 지정
routes:
- path: /text
action:
pass: text # /text 경로로 요청시 upstream: text로 proxy pass
위에서 생성한 VirtualServer 리소스를 배포하고 확인합니다:
$ kubectl get virtualserver -n nginx-ingress
NAME STATE HOST IP PORTS AGE
hodevops Valid hodevops.nginxstore.kr 73m
3-2. NGINX Plus Ingress Controller 테스트
curl 명령을 사용하여 위에서 구성한 NGINX Plus Ingress Controller 가 올바른 응답을 하는지 확인합니다.
$ curl -i hodevops.nginxstore.kr:30000/text
HTTP/1.1 200 OK
server: istio-envoy
date: Thu, 13 Jun 2024 02:38:23 GMT
content-type: text/plain
content-length: 204
x-envoy-upstream-service-time: 4
x-envoy-decorator-operation: nginx-ingress.nginx-ingress.svc.cluster.local:80/*
[NGINX STORE]
Server address: 10.244.1.26:80
Server name: ho-deploy1-f68fb47bb-stx8j
Date: 13/Jun/2024:02:38:23 +0000
URI: /text
Request ID: 8c226bcba93cba49cca3f2637a7c73a8
Host: hodevops.nginxstore.kr
4. Istio Ingress Gateway란?
Istio Ingress Gateway는 Istio Service Mesh의 일부로 통합되어 있어, 서비스 메시 기반의 고급 트래픽 관리 기능을 제공합니다. 이를 통해 복잡한 마이크로서비스 환경에서 안정하고 효율적인 트래픽 관리가 가능합니다. 자세한 내용은 여기를 클릭하세요.
5. Istio Ingress Gateway로 라우팅 설정
이번 포스트에서는 Istio Ingress Gateway와 Istio의 VirtualService 리소스를 사용하여 간단한 라우팅을 구성합니다.
Istio Ingress Gateway는 Istio Service Mesh 내에서 외부 트래픽을 관리하는 핵심 구성 요소입니다. Istio Ingress Gateway는 다양한 프로토콜을 지원하며, 동적 구성 관리, 고급 라우팅 기능, 보안 및 인증 기능을 제공합니다.
(※ Istio를 배포하는 방법은 해당 포스트에서 다루지 않습니다.)
현재 Istio는 profile=demo로 배포되어 있습니다.
| default | demo | minimal | remote | empty | preview | ambient | |
| Core componets | |||||||
| istio-egressgateway | ✔ | ||||||
| istio-ingressgateway | ✔ | ✔ | ✔ | ||||
| istiod | ✔ | ✔ | ✔ | ✔ | ✔ | ||
| CNI | ✔ | ||||||
| Ztunnel | ✔ |
테스트에서 Istio Ingress Gateway는 NodePort 타입으로 아래와 같이 포트 바인딩 되어 있습니다.
$ kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
istio-ingressgateway NodePort 10.109.89.42 <none> 80:31000/TCP
해당 테스트에서 사용할 서비스는 위에서 사용한 서비스와 동일하지만 배포된 Namespace가 다릅니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ho-deploy1
namespace: istio-system
spec:
selector:
matchLabels:
app: ho-deploy1
template:
metadata:
labels:
app: ho-deploy1
spec:
containers:
- name: ho-container1
image: gusgh13900/nginxstore-text-plain:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ho-svc1
namespace: istio-system
spec:
ports:
- name: http-ho-svc-port1
port: 80
targetPort: 80
selector:
app: ho-deploy1
5-1. Gateway 리소스 생성
우선 요청을 받을 Istio의 Gateway 리소스를 생성합니다.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: main-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- test.com
위와 같이 Gateway 리소스를 배포하면, test.com이라는 host로 요청이 들어오면 해당 Gateway 리소스에서 요청을 받습니다. 요청을 받을 때 spec.selector.istio: ingressgateway 를 추가함으로써 Istio profile=demo에서 배포된 표준화된 ingressgateway 기능을 활용하여 라우팅하게 됩니다.
5-2. VirtualService 리소스 생성
위에서 생성한 Gateway에서 요청을 넘겨 받고, 서비스로 라우팅해줄 VirtualService 리소스를 생성합니다:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: istio-virtualservice
namespace: istio-system
spec:
hosts:
- test.com
gateways: # 위에서 생성한 Gateway 정의
- main-gateway
http:
- name: nginxstore-text-plain
match:
- uri:
prefix: /text # /text로 들어온 요청을 라우팅
route:
- destination:
host: ho-svc1.istio-system.svc.cluster.local # ho-svc1이라는 서비스로 라우팅
VirtualService 리소스에서 다양한 기능을 구현할 수 있지만 이 테스트에서는 간단하게 라우팅만 하는 구성입니다. 위에서 생성한 Gateway를 정의하고, /text로 들어온 요청을 ho-svc1이라는 서비스로 라우팅합니다.
여기서 Istio의 DestinationRule 리소스를 추가하여 서비스 버전 관리, 트래픽 분할, 회로 차단 등 고급 기능을 활용할 수 있습니다. 여기서는 라우팅 구성만 진행하므로, 별도의 DestinationRule 리소스는 생성하지 않았습니다. DestinationRule에 대한 공식 가이드는 여기를 클릭하세요.
5-3. 테스트
Istio Ingress Gateway를 사용한 라우팅 구성에서 host를 test.com으로 지정하였고 현재 IngressGateway가 포트 31000에 바인딩되어 있기 때문에 다음과 같이 요청을 보냅니다:
$ curl -i test.com:31000/text
HTTP/1.1 200 OK
server: istio-envoy
date: Thu, 13 Jun 2024 02:37:43 GMT
content-type: text/plain
content-length: 191
x-envoy-upstream-service-time: 211
[NGINX STORE]
Server address: 10.244.1.25:80
Server name: ho-deploy1-86998dfcb8-zfbwc
Date: 13/Jun/2024:02:37:43 +0000
URI: /text
Request ID: 50fb7474d4b62dde7b39c175fa5a51e0
Host: test.com
6. 결론
NGINX Plus Ingress Gateway와 Istio Ingress Gateway는 각각 장단점을 가지고 있어, 사용 환경과 요구사항에 따라 적절한 선택이 필요합니다.
Istio Ingress Gateway의 장점:
- 통합 서비스 메시: Istio Ingress Gateway는 Istio 서비스 메시의 일부이므로 서비스 간 통신, 트래픽 관리, 보안 등의 기능을 통합적으로 제공합니다.
- 정책 기반 제어: Istio의 AuthorizationPolicy, DestinationRule 등을 사용하여 세부적인 트래픽 제어 및 보안 정책을 정의할 수 있습니다.
- 관찰성 및 가시성: Istio는 Prometheus, Jaeger, Kiali 등의 모니터링 도구와 통합되어 서비스 간 통신, 지표, 추적 등을 제공합니다.
- 다중 프로토콜 지원: Istio Ingress Gateway는 HTTP, HTTPS, TCP, gRPC 등 다양한 프로토콜을 지원합니다.
- 메시 내/외부 트래픽 관리: Istio Ingress Gateway는 메시 내부 및 외부 트래픽을 모두 관리할 수 있어 통합된 트래픽 제어가 가능합니다.
NGINX Plus Ingress Controller의 장점:
- 성능 및 안정성: NGINX는 고성능 웹 서버로 알려져 있으며, NGINX Plus Ingress Controller는 이러한 성능과 안정성을 제공합니다. 높은 처리량과 낮은 지연 시간을 보장합니다.
- 간단한 구성 및 관리: NGINX Plus Ingress Controller는 Kubernetes 네이티브 리소스를 사용하여 구성하기 쉽습니다. 기존 NGINX 구성 경험을 활용할 수 있습니다.
- 확장성: NGINX Plus Ingress Controller는 수평 및 수직 확장이 용이하여 트래픽 증가에 유연하게 대응할 수 있습니다.
- 엔터프라이즈 기능: NGINX Plus에는 고급 부하 분산, 캐싱, 보안 기능 등이 포함되어 있어 엔터프라이즈급 요구사항을 충족할 수 있습니다.
각각 장단점에 맞게 적절한 선택을 할 수 있고, NGINX Plus Ingress Controller는 Istio Sidecar Proxy를 주입할 수 있습니다.
NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.