Istio Ingress Gateway 구성하기

Istio Ingress Gateway 구성하기

이 모듈에서는 Istio ingress gateway를 통해 트래픽이 들어오도록 구성해서 마이크로서비스로 가는 트래픽에 Istio의 제어를 적용하는 방법을 배워요. 지금까지는 Kubernetes Ingress로 외부에서 애플리케이션에 접근했어요.

출처: Istio 문서

본문

지금까지는 Kubernetes Ingress를 사용해서 외부에서 애플리케이션에 접근했어요. 이 모듈에서는 마이크로서비스로 가는 트래픽에 Istio의 제어를 적용하기 위해, 트래픽이 Istio ingress gateway를 통해 들어오도록 구성해요.

  1. 네임스페이스 이름을 NAMESPACE 환경 변수에 저장하세요. 로그에서 마이크로서비스를 구분할 때 필요해요.
$ export NAMESPACE=$(kubectl config view -o jsonpath="{.contexts[?(@.name == \"$(kubectl config current-context)\")].context.namespace}")
$ echo $NAMESPACE
tutorial
  1. Istio ingress gateway의 호스트명을 위한 환경 변수를 만드세요.
$ export MY_INGRESS_GATEWAY_HOST=istio.$NAMESPACE.bookinfo.com
$ echo $MY_INGRESS_GATEWAY_HOST
istio.tutorial.bookinfo.com
  1. 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
  1. "Determining the Ingress IP and ports" 섹션의 지침을 사용해서 INGRESS_HOST와 INGRESS_PORT를 설정하세요.
  2. 이 명령의 출력을 /etc/hosts 파일에 추가하세요.
$ echo $INGRESS_HOST $MY_INGRESS_GATEWAY_HOST
  1. 커맨드 라인에서 애플리케이션의 홈 페이지에 접근하세요.
$ curl -s $MY_INGRESS_GATEWAY_HOST:$INGRESS_PORT/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
  1. 다음 명령의 출력을 브라우저 주소창에 붙여 넣으세요.
$ echo http://$MY_INGRESS_GATEWAY_HOST:$INGRESS_PORT/productpage
  1. 새 터미널 창에서 무한 루프를 설정해서 애플리케이션으로 실제 사용자 트래픽을 시뮬레이션하세요.
$ 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>
...
  1. Kiali 콘솔 my-kiali.io/kiali/console에서 네임스페이스의 그래프를 확인하세요. (my-kiali.io URL은 이전에 설정한 /etc/hosts 파일에 있어야 해요.) 이번에는 트래픽이 두 소스에서 들어오는 걸 볼 수 있어요. 하나는 unknown(Kubernetes Ingress)이고, 다른 하나는 istio-ingressgateway istio-system(Istio Ingress Gateway)이에요.
  2. 이 시점에서 Kubernetes Ingress를 통한 요청 전송을 멈추고 Istio Ingress Gateway만 사용할 수 있어요. 앞선 단계에서 설정한 무한 루프를 중지하세요(터미널 창에서 Ctrl-C). 실제 프로덕션 환경에서는 애플리케이션의 DNS 엔트리를 Istio ingress gateway의 IP를 포함하도록 업데이트하거나 외부 Load Balancer를 구성할 거예요.
  3. Kubernetes Ingress 리소스를 삭제하세요.
$ kubectl delete ingress bookinfo
ingress.extensions "bookinfo" deleted
  1. 새 터미널 창에서 앞서 설명한 대로 실제 사용자 트래픽 시뮬레이션을 다시 시작하세요.
  2. Kiali 콘솔에서 그래프를 확인하세요. 약 1분 후에는 Istio Ingress Gateway가 애플리케이션 트래픽의 단일 소스로 보일 거예요.

이제 Istio로 로깅 구성하기로 넘어갈 준비가 됐어요.

더 알아보기 (Learn more)