Istio Ingress Gateway 서비스 라우팅 및 보안 강화를 위한 HTTPS 구성
현대 애플리케이션 환경에서 서비스 간 통신의 효율성과 보안을 보장하는 것은 필수적입니다. Istio는 서비스 메시에 대한 강력한 트래픽 관리 및 보안 기능을 제공하며, 특히 Istio Ingress Gateway는 외부 트래픽을 클러스터 내부 서비스로 안전하게 라우팅하는 중요한 역할을 합니다.
본 글에서는 Istio Ingress Gateway의 개념과 서비스 라우팅 설정, 모니터링 방법, 그리고 HTTPS 구성 및 리다이렉트 설정에 대해 설명합니다.
목차
1. 환경구성
2. Istio Ingress Gateway 란?
3. Istio Ingress Gateway Service Route & Monitoring
3-1. Istio Ingress Gateway Service Route
3-2. Istio Ingress Gateway Monitoring
4. Istio Ingress Gateway HTTPS 구성
4-1. TLS 인증서 발급
4-2. Istio Ingress Gateway HTTPS 구성
4-3. HTTP to HTTPS redirect 구성
5. 결론
1. 환경구성
- Istio : 1.24.2
- Kubernetes : v1.30.4
2. Istio Ingress Gateway 란?
Kubernetes에서 Istio Service Mash를 통해 외부 트래픽을 클러스터 내부 서비스로 라우팅하는 역할을 합니다. 일반적으로 사용되는 Kubernetes Ingress Controller와 달리 세밀한 트래픽 제어 및 보안 기능(A/B 테스트, Canary 배포, JWT 인증, IP 기반 접근 제어 등등)을 제공합니다.
3. Istio Ingress Gateway Service Route
3-1. Istio Ingress Gateway Service Route
Istio Ingress Gateway의 배포 방법은 NGINX STORE Istio Service Mash 배포하기 에서 확인할 수 있습니다.
Istio Ingress Gateway Service Route를 위한 NGINX Deployment와 Service를 배포합니다.
(Istio Ingress Gateway의 서비스 라우팅 시, 대상 서비스의 Pod에 반드시 Sidecar Proxy를 주입하지 않아도 됩니다. 하지만 세밀한 트래픽 제어 및 고급 보안 기능을 활용하려면 Sidecar Proxy 주입이 필수적입니다.)
namespace에 istio-injection=enabled label을 추가하여 자동으로 Sidecar Proxy가 주입될 수 있도록 구성합니다.
$ kubectl label namespace default istio-injection=enabled
namespace/default labeled
NGINX Service, Deployment를 구성합니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx
ports:
- containerPort: 80
위와 같이 구성한 후 배포하게 되면 아래와 같이 2개의 컨테이너를 가지고 있는 Pod가 생성되게 됩니다.
(구성했었던 NGINX, Envoy Proxy 두 가지의 컨테이너가 존재하게 됩니다.)

서비스로 요청하여 배포가 잘 되었는지 확인합니다.

Istio Ingress Gateway를 이용하여 Service에 접근할 수 있도록 아래와 같이 구성합니다.
gateways.networking.istio.io 리소스 : 구성을 통해 Ingress Gateway의 트래픽을 받을 수 있도록 지정합니다.
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: nginx-gateway
spec:
selector:
istio: ingressgateway # Istio Ingress gateway를 사용합니다.
servers:
- port:
number: 80 # 포트 80을 활성화합니다.
name: nginx-service # 이름을 지정합니다.
protocol: HTTP # HTTP 프로토콜을 사용합니다/
hosts:
- "example.com" # 호스트를 지정하여 example.com 호스트에서의 접근을 허용합니다.
virtualservices.networking.istio.io 리소스 : Gateway로 들어온 Traffic을 지정된 Service로 전달하는 역할을 합니다.
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: nginx-vs
spec:
hosts:
- "example.com" # example.com 호스트으로만 접속할 수 있도록 지정합니다.
gateways:
- nginx-gateway # 위에서 구성했었던 Gateway 리소스의 이름을 작성합니다.
http:
- match:
- uri:
prefix: / # root 패스 기반 라우팅을 진행합니다.
route:
- destination:
port:
number: 80
host: nginx-svc # 배포했었던 NGINX의 Service Name을 지정합니다.
작성했었던 Gateway, VirtualService를 배포합니다.
Istio Ingress Gateway로 접속하여 구성이 완료되었는지 확인합니다.


Istio Ingress Gateway의 80포트로 접속했을 시 NGINX가 라우팅된 것을 확인할 수 있습니다.
3-2. Istio Ingress Gateway Monitoring
Kiali에서 Istio Ingress Gateway의 Traffic을 모니터링할 수 있습니다.
Kiali 배포는 NGINX STORE Kiali 배포 및 사용법 에서 확인할 수 있습니다.
Kiali로 접속하여 Traffic Graph를 선택하여 트래픽을 확인할 수 있습니다.
Traffice Graph를 선택하여 Namespace를 NGINX를 배포했었던 Default Namespace로 지정합니다.

현재 rps와 응답 속도를 확인하기 위해서 Display에서 Response Time과 Traffic Rate를 선택합니다.

아래와 같이 Istio Ingress Gateway가 NGINX Service로 라우트하는 것을 확인할 수 있습니다.

4. Istio Ingress Gateway HTTPS 구성
4-1. TLS 인증서 발급
HTTPS를 위한 TLS 인증서를 발급받습니다.
(해당 예제에서는 사설 인증서를 사용하여 구성하였습니다.)
$ openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes \
-keyout example.com.key -out example.com.crt \
-subj "/O=Example Inc./CN=example.com"
인증서는 1년의 유효기간을 가지게 됩니다.
아래와 같이 openssl 명령어를 통해 인증서가 생성이 됩니다.

kubectl을 이용하여 생성된 TLS 인증서를 Istio Ingress Gateway에서 사용할 수 있도록 등록합니다.
$ kubectl create secret tls tls-certificate \
--key example.com.key \
--cert example.com.crt -n istio-system

Istio Ingress Gateway는 동일한 Namespace에 있는 secret 리소스를 참조할 수 있기 때문에 istio-system Namespace에 배포 되어야합니다.
4-2. Istio Ingress Gateway HTTPS 구성
Gateway를 구성하여 Istio Ingress Gateway의 80, 443 포트를 활성화합니다.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: nginx-gateway
namespace: default
spec:
selector:
istio: ingressgateway # Istio Ingress Gateway를 사용합니다.
servers:
- port:
number: 443 # HTTPS 기본 포트인 443번 포트를 활성화합니다.
name: https
protocol: HTTPS # HTTPS 프로토콜을 사용합니다.
tls:
mode: SIMPLE # 핸드셰이크 동안 클라이언트 인증서를 요청하지 않는 옵션입니다.
credentialName: tls-certificate # 추가 했었던 TLS secret를 지정합니다.
hosts:
- "*"
사설 인증서로 Gateway의 HTTPS 구성 시 Gateway hosts를 모든 도메인에서 사용할 수 있도록 지정해야합니다. (공인 인증서는 Gateway에 도메인을 지정하여 사용할 수 있습니다.)
Gateway를 추가한 후 VirtualService 리소스를 배포하여 서비스를 라우팅합니다.
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: nginx-vs
spec:
hosts:
- "example.com" #
gateways:
- nginx-gateway # 구성했었던 Gateway 이름을 지정합니다.
http:
- match:
- uri:
prefix: /
route:
- destination:
host: nginx-svc # NGINX Service가 라우팅 될 수 있도록 NGINX Service의 이름을 지정합니다.
port:
number: 80
구성 후 Istio Ingress Gateway를 통해 HTTPS 요청을 정상적으로 처리할 수 있는지 확인합니다.

HTTPS로 정상 접속되는 것을 확인할 수 있습니다.
인증서도 아래와 같이 발급했었던 인증서가 적용된 것을 확인할 수 있습니다.

4-3. HTTP to HTTPS redirect 구성
http 프로토콜에서 https 프로토콜로 리다이랙트를 구성합니다.
Gateway 리소스에 아래와 같은 구성을 추가합니다.
...
- port:
number: 80 # HTTP 기본 포트인 80번 포트를 활성화합니다.
name: http
protocol: HTTP # HTTP 프로토콜을 사용합니다.
hosts:
- "*" # 모든 도메인에서 사용할 수 있도록 지정합니다.
tls:
httpsRedirect: true # http 프로토콜에서 https 로 Redirect를 활성화합니다.
...
위 설정을 적용하면 HTTP 요청이 자동으로 HTTPS로 리다이렉트됩니다.
아래와 같이 http 프로토콜에서 https로 리다이렉트하는 것을 확인할 수 있습니다.

5. 결론
Istio Ingress Gateway를 활용하면 Kubernetes 환경에서 보다 정밀한 트래픽 제어와 강화된 보안 기능을 제공할 수 있습니다. 본 가이드를 통해 Istio Ingress Gateway의 배포 및 서비스 라우팅을 설정하고, Kiali를 활용한 모니터링 방법을 익히며, HTTPS를 구성하여 보안성을 강화하는 방법을 확인하였습니다. 이를 통해 Istio를 활용한 서비스 운영이 보다 안정적이고 유연하게 이루어질 수 있음을 알 수 있습니다.
Istio에 관련한 더 많은 정보들을 알고싶으시다면 NGINX STORE Istio 카테고리를 참고해주세요.
댓글을 달려면 로그인해야 합니다.