본문 바로가기
DevOps/Istio

istio traffic 관리 (2) [Gateway]

by 비어원 2025. 1. 13.
728x90

istio에서 mesh에 대한 인바운드/아웃바운드 트래픽을 관리하기 위해 Gateway를 사용하며, 어떤 트래픽이 mesh에 들어오거나 나갈지를 지정할 수 있다. Gateway의 구성은 애플케이션과 함께 실행되는 사이드카의 envoy proxy가 아닌 mesh의 엣지에서 실행되는 독립적인 envoy proxy에 적용된다.

 

쿠버네티스의 ingress API와 같이 시스템으로 들어오는 트래픽을 관리하는 메커니즘과 다르게, istio gateway를 사용하면 강력하고 유연한 트래픽 라우팅 기능을 사용할 수 있다. istio의 Gateway를 사용하면 노출시킬 포트, TLS 설정 등과 같은 L4~L6 로드밸런싱 속성을 구성할 수 있기 때문이다. 그리고 L7 트래픽 라우팅 룰은 Gateway에 직접 추가하지 않고 Gateway에 VirtualService를 바인딩하여 구성할 수 있다.

 

Gateway는 주로 ingress(inbound) 트래픽을 관리하기 위해 사용되지만 egress(outbound) 트래픽을 관리하기 위해 사용되기도 한다. egress gateway를 사용하면 mesh를 떠나는 트래픽에 대한 전용 노드를 구성하여 외부 네트워크에 접근할 수 있거나 접근할 수 있는 서비스를 제한하거나 트래픽 보안 제어를 활성화하여 보안을 강화할 수 있다.

 

ingressgateway로 서비스 노출시키기 (HTTP)

예전에 실습했던 bookinfo 아키텍처를 다시 가져오면 product-page는 외부로 노출되어야 할 서비스이다. 나머지 애플리케이션은 백엔드로, 노출이 되지 않아도 되는 서비스로 보이므로, product-page만 노출시켜보도록 하겠다.

 

 

 

일단 도메인을 bookinfo.beer1.com 이라고 가정하고 Gateway를 한번 만들어보자.

 

local DNS 등록

$ echo $(kubectl get svc ingressgateway -n kube-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}') bookinfo.beer1.com | sudo tee -a /etc/hosts
  • ingressgateway의 IP를 활용하여 /etc/hosts에 bookinfo.beer1.com에 대응하는 ip를 넣는다.

 

gateway.yaml

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: beer1-com
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - bookinfo.beer1.com

 

selector를 통해 하나 이상의 gateway 레플리카를 gateway로 묶을 수 있다. 여기서 셀렉터는 파드의 레이블 셀렉터이다. ingressgateway 파드의 레이블을 확인한 후 셀렉터에 넣자.

 

gateway를 생성하여 bookinfo.beer1.com:80 으로 들어오는 HTTP 요청을 허용하는 설정을 하였다. 하지만 어떤 서비스로 라우팅할지는 Gateway에서 결정하지는 못한다. L7 라우팅 룰은 VirtualService에서 하기 때문에 관련설정을 추가하기 위해 VirtualService를 추가해야 한다.

 

VirtualService

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-ingress
  namespace: istio-system
spec:
  hosts:
  - bookinfo.beer1.com
  gateways:
  - beer1-com
  http:
  - route:
    - destination:
        host: productpage.bookinfo.svc.cluster.local
        port: 
          number: 9080
  • 라우팅룰 적용 대상은 beer1-com이라는 Gateway로 지정하였다. 즉 ingressgateway로 들어오는 요청에 대한 라우팅룰을 여기서 지정한다. (바인딩)
  • 라우팅룰 대상 요청 호스트는 bookinfo.beer1.com 이다.
  • 라우팅 룰은 모든 bookinfo.beer1.com로 들어오는 요청은 productpage.bookinfo.svc.cluster.local:9180(서비스) 으로 보낸다.

 

모두 적용 후 bookinfo.beer1.com으로 접속해보면 화면이 잘 뜨는 것을 확인할 수 있다.

 

HTTPS(TLS) 적용

HTTP는 암호화가 되어있지 않아 패킷 스니핑에 대한 보안에 취약하기 때문에 잘 사용하지 않는다. 암호화가 적용된 HTTP인 HTTPS를 사용해야 하는데, Gateway에서 TLS 설정까지 같이 할 수 있다.

 

인증서가 있다면 다음 명령어를 사용하여 시크릿을 만들자.

$ kubectl -n istio-system create secret tls bookinfo --cert=server.crt --key=server.key

 

그 다음 Gateway 설정을 다음과 같이 변경하자.

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: beer1-com
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  # 80(HTTP) 대신 443(HTTPS) 사용
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - bookinfo.beer1.com
    tls:
      mode: SIMPLE
         # 아까 만든 tls 인증서 시크릿을 여기에 넣는다.
      credentialName: bookinfo

 

https로 접속하면 화면이 잘 뜨는 것을 확인할 수 있다.

 

 

HTTP redirect 적용

HTTP로 요청 오는 경우 강제로 HTTPS로 리다이렉트하게 만들어 줄 수도 있다. 다음과 같이 Gateway 설정을 하자.

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: beer1-com
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:

  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - bookinfo.beer1.com
    tls:
      httpsRedirect: true

  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - bookinfo.beer1.com
    tls:
      mode: SIMPLE
      # 아까 만든 tls 인증서 시크릿을 여기에 넣는다.
      credentialName: bookinfo
  • tls.httpsRedirect 옵션이 켜져있으면 HTTPS 포트로 리다이렉트 시켜존다.

 

http로 접속하면 https로 리다이렉트 되어 화면이 뜨는 것을 확인할 수 있다.

728x90

'DevOps > Istio' 카테고리의 다른 글

istio traffic 관리 (1) [VirtualService & DestinationRule]  (0) 2025.01.12
istio 소개 및 설치  (0) 2025.01.12

댓글