Istio Ingress Gateway 구성하기
Istio Ingress Gateway 구성하기
이 모듈에서는 Istio ingress gateway를 통해 트래픽이 들어오도록 구성해서 마이크로서비스로 가는 트래픽에 Istio의 제어를 적용하는 방법을 배워요. 지금까지는 Kubernetes Ingress로 외부에서 애플리케이션에 접근했어요.
출처: Istio 문서
본문
지금까지는 Kubernetes Ingress를 사용해서 외부에서 애플리케이션에 접근했어요. 이 모듈에서는 마이크로서비스로 가는 트래픽에 Istio의 제어를 적용하기 위해, 트래픽이 Istio ingress gateway를 통해 들어오도록 구성해요.
- 네임스페이스 이름을 NAMESPACE 환경 변수에 저장하세요. 로그에서 마이크로서비스를 구분할 때 필요해요.
$ export NAMESPACE=$(kubectl config view -o jsonpath="{.contexts[?(@.name == \"$(kubectl config current-context)\")].context.namespace}")
$ echo $NAMESPACE
tutorial
- Istio ingress gateway의 호스트명을 위한 환경 변수를 만드세요.
$ export MY_INGRESS_GATEWAY_HOST=istio.$NAMESPACE.bookinfo.com
$ echo $MY_INGRESS_GATEWAY_HOST
istio.tutorial.bookinfo.com
- Istio ingress gateway를 구성하세요.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- $MY_INGRESS_GATEWAY_HOST
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- $MY_INGRESS_GATEWAY_HOST
gateways:
- bookinfo-gateway.$NAMESPACE.svc.cluster.local
http:
- match:
- uri:
exact: /productpage
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /static
route:
- destination:
host: productpage
port:
number: 9080
EOF
- "Determining the Ingress IP and ports" 섹션의 지침을 사용해서 INGRESS_HOST와 INGRESS_PORT를 설정하세요.
- 이 명령의 출력을
/etc/hosts파일에 추가하세요.
$ echo $INGRESS_HOST $MY_INGRESS_GATEWAY_HOST
- 커맨드 라인에서 애플리케이션의 홈 페이지에 접근하세요.
$ curl -s $MY_INGRESS_GATEWAY_HOST:$INGRESS_PORT/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
- 다음 명령의 출력을 브라우저 주소창에 붙여 넣으세요.
$ echo http://$MY_INGRESS_GATEWAY_HOST:$INGRESS_PORT/productpage
- 새 터미널 창에서 무한 루프를 설정해서 애플리케이션으로 실제 사용자 트래픽을 시뮬레이션하세요.
$ while :; do curl -s <output of the previous command> | grep -o "<title>.*</title>"; sleep 1; done
<title>Simple Bookstore App</title>
<title>Simple Bookstore App</title>
<title>Simple Bookstore App</title>
<title>Simple Bookstore App</title>
...
- Kiali 콘솔
my-kiali.io/kiali/console에서 네임스페이스의 그래프를 확인하세요. (my-kiali.io URL은 이전에 설정한/etc/hosts파일에 있어야 해요.) 이번에는 트래픽이 두 소스에서 들어오는 걸 볼 수 있어요. 하나는 unknown(Kubernetes Ingress)이고, 다른 하나는 istio-ingressgateway istio-system(Istio Ingress Gateway)이에요. - 이 시점에서 Kubernetes Ingress를 통한 요청 전송을 멈추고 Istio Ingress Gateway만 사용할 수 있어요. 앞선 단계에서 설정한 무한 루프를 중지하세요(터미널 창에서 Ctrl-C). 실제 프로덕션 환경에서는 애플리케이션의 DNS 엔트리를 Istio ingress gateway의 IP를 포함하도록 업데이트하거나 외부 Load Balancer를 구성할 거예요.
- Kubernetes Ingress 리소스를 삭제하세요.
$ kubectl delete ingress bookinfo
ingress.extensions "bookinfo" deleted
- 새 터미널 창에서 앞서 설명한 대로 실제 사용자 트래픽 시뮬레이션을 다시 시작하세요.
- Kiali 콘솔에서 그래프를 확인하세요. 약 1분 후에는 Istio Ingress Gateway가 애플리케이션 트래픽의 단일 소스로 보일 거예요.
이제 Istio로 로깅 구성하기로 넘어갈 준비가 됐어요.