본문 바로가기
프로젝트&&스터디/KANS2기

[KANS-7주차] Istio의 Egress Gateway

by james_janghun 2024. 10. 20.

해당 내용은 istio egress gateway를 사용하였하였고, 다음 공식문서의 튜토리얼을 따릅니다.

https://istio.io/latest/docs/tasks/traffic-management/egress/egress-gateway/ 

 

Egress Gateways

Describes how to configure Istio to direct traffic to external services through a dedicated gateway.

istio.io

 

개요

기본적으로 Egress는 가능하지만 Egress Gateway를 사용하는 이유는 밖으로 나가는 트래픽도 모니터링 및 통제가 가능하도록 하기 위함입니다.

 

설치

튜토리얼 상 default profile를 사용하고 있기 때문에 egress gateway를 해줘야하며, istioctl로 설치했습니다.

istioctl install \
    --set "spec.components.egressGateways[0].name=istio-egressgateway" \
    --set "spec.components.egressGateways[0].enabled=true"

 

 

테스트용 Pod 생성

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/sleep/sleep.yaml

# IP 환경변수화 시킴
export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})

 

이 상태로 edition.cnn.com이라는 사이트로 요청을 보내보겠습니다.

kubectl exec -it deploy/sleep -- sh
~ $ while true; do curl -s -o /dev/null -w "%{http_code}\n" http://edition.cnn.com/politics; done

현재로서는 istio에서 edition.cnn.com으로 나가는 요청에 대해서는 모니터링이 안되는 상황입니다.

 

 

ServiceEntry로 나가는 트래픽 모니터링

edition.cnn.com 가는 요청을 만들어 봅니다. serviceEntry가 있기 때문에 해당 외부 링크로 나가는 접근에 대해서 식별할 수 있게 됩니다.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: cnn
spec:
  hosts:
  - edition.cnn.com
  ports:
  - number: 80
    name: http-port
    protocol: HTTP
  - number: 443
    name: https
    protocol: HTTPS
  resolution: DNS
EOF

 

 

 

 

Egress Gateway를 통해 트래픽이 나가도록 설정

이제는 gateway를 생성해서 egress gateway를 통해서 edition.cnn.com으로 요청이 나가도록 생성해 보겠습니다.

 

먼저 egress-gateway를 생성합니다.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-egressgateway
spec:
  selector:
    istio: egressgateway
  servers:
  - port:
      number: 443 # egress gateway의 포트
      name: tls
      protocol: TLS
    hosts:
    - edition.cnn.com
    tls:
      mode: PASSTHROUGH
EOF

 

그리고 각각의 virtual service를 생성합니다.

첫 번째는 edition.cnn.com 요청에 대해서 egressgateway가 받도록 설정합니다.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mesh-to-egress-gateway
spec:
  hosts:
  - edition.cnn.com
  gateways:
  - mesh
  tls:
  - match:
    - port: 443
      sniHosts:
      - edition.cnn.com
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
        port:
          number: 443
EOF

 

그리고 두번째는 egress-gateway가 어떻게 트래픽을 포워드할지 설정합니다.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: egressgateway-to-external
spec:
  hosts:
  - edition.cnn.com
  gateways:
  - istio-egressgateway
  tls:
  - match:
    - port: 443
      sniHosts:
      - edition.cnn.com
    route:
    - destination:
        host: edition.cnn.com
        port:
          number: 443
EOF

 

그럼 다음과 같이 egress gateway를 통해서 트래픽을 보내고 모니터링도 할 수 있게됩니다.

 

 

이상으로 egress gateway의 포스팅을 마치고, 추후에는 egress gateway의 다양한 기능도 살펴보도록 하겠습니다.