후니의 IT인프라 사전
[KANS-7주차] Istio의 Egress Gateway 본문
해당 내용은 istio egress gateway를 사용하였하였고, 다음 공식문서의 튜토리얼을 따릅니다.
https://istio.io/latest/docs/tasks/traffic-management/egress/egress-gateway/
개요
기본적으로 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의 다양한 기능도 살펴보도록 하겠습니다.