본문 바로가기

Cloud/Oracle Cloud Infrastructure (OCI)

OCI상에서 ISTIO를 활용하여 구현한 Service Mesh - #6. 이스티오 데모 - 샘플 어플리케이션 (Bookinfo) 배포

Oracle Cloud Infrastructure (OCI) 에서 이스티오(ISTIO)를 활용한 서비스 메쉬(Service Mesh)에 대한 기술 정리 및 이를 데모로 구현한 내용을 정리합니다.

글 순서

1. Overview

2. 이스티오 작동 방식

3. 이스티오 데모 - 사전 준비

4. 이스티오 데모 - 쿠버네티스 대쉬보드 설치/설정

5. 이스티오 데모 - 이스티오 설치, 엔보이 프록시 주입

6. 이스티오 데모 - 샘플 어플리케이션 (Bookinfo) 배포

7. 이스티오 데모 - 카나리 배포

8. 이스티오 데모 - 결함 주입(Fault Injection)

9. 이스티오 데모 - 서비스 시각화 (프로메테우스)

10. 이스티오 데모 - 서비스 시각화 (그라파나)

11. 이스티오 데모 - 서비스 시각화 (키알리)

12. 이스티오 데모 - 서비스 시각화 (예거)

 

REFERENCES

아래 도서 및 사이트를 참조하여 작성한 문서입니다.

  • 도메인 주도 설계로 시작하는 마이크로 서비스 개발 (위키북스)
  • 쿠버네티스 완벽 가이드 (길벗)
  • Istio로 시작하는 서비스 메시 (에이콘)
  • Isitio Documentation

 

샘플 어플리케이션 배포

데모를 위해 이스티오에서 제공하는 샘플 어플리케이션 Bookinfo를 사용하겠습니다.

Bookinfo는 아래와 같이 개별 Python, Java, Ruby, Node.js 마이크로서비스로 구성된 샘플 어플리케이션입니다. 아래 샘플 어플리케이션을 배포하면 엔보이 프록시도 자동으로 배포될 것입니다.

 

Bookinfo 어플리케이션은 다음과 같이 구성되어 있습니다.

  • productpage: details와 reviews 마이크로서비스를 호출
  • details: 도서 정보
  • reviews: 도서에 대한 리뷰 정보. ratings 마이크로서비스를 호출
  • ratings: 도서 리뷰에 따른 랭킹 정보

 

reviews 마이크로서비스는 3개의 버전을 가지고 있습니다.

  • Version v1: ratings 마이크로서비스를 호출하지 않음
  • Version v2: ratings 마이크로서비스를 호출. 한개에서 다섯개까지의 검은색 별표시로 도서에 대한 평가를 나타냄
  • Version v3: ratings 마이크로서비스를 호출. 한개에서 다섯개까지의 빨간색 별표시로 도서에 대한 평가를 나타냄

 

kubectl 명령으로 Bookinfo 어플리케이션을 배포합니다.

[opc@demo ~]$ kubectl apply -f ~/istio-1.14.1/samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

 

배포된 파드 내용을 확인합니다.

[opc@demo ~]$ kubectl get pods -o wide
NAME                               READY   STATUS    RESTARTS   AGE     IP             NODE          NOMINATED NODE   READINESS GATES
details-v1-7f4669bdd9-gj7ww        2/2     Running   0          2m16s   10.244.1.6     10.0.10.42    <none>           <none>
...
productpage-v1-5586c4d4ff-mdjz2    2/2     Running   0          2m15s   10.244.0.135   10.0.10.35    <none>           <none>
ratings-v1-6cf6bc7c85-gfhdd        2/2     Running   0          2m16s   10.244.0.10    10.0.10.234   <none>           <none>
reviews-v1-7598cc9867-pzq9r        2/2     Running   0          2m16s   10.244.0.134   10.0.10.35    <none>           <none>
reviews-v2-6bdd859457-qplsq        2/2     Running   0          2m16s   10.244.0.9     10.0.10.234   <none>           <none>
reviews-v3-6c98f9d7d7-fp48z        2/2     Running   0          2m16s   10.244.1.7     10.0.10.42    <none>           <none>

 

배포된 서비스 내용을 확인합니다. 마이크로서비스는 디폴트 네임스페이스에, 이스티오 게이트웨이는 istio-system 네임스페이스에 생성되어 있는 것을 알 수 있습니다.

[opc@demo ~]$ kubectl get services
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.96.216.63   <none>        9080/TCP   129m
kubernetes    ClusterIP   10.96.0.1      <none>        443/TCP    3d5h
productpage   ClusterIP   10.96.39.32    <none>        9080/TCP   129m
ratings       ClusterIP   10.96.42.233   <none>        9080/TCP   129m
reviews       ClusterIP   10.96.60.62    <none>        9080/TCP   129m
...

 

OCI 웹콘솔에서 확인해 보면 위 서비스 정보와 같이 로드 밸런서가 생성되어 있습니다.

 

Bookinfo 어플리케이션이 정상 작동하는지에 대해 아래와 같이 curl 명령으로 확인할 수 있습니다.

[opc@demo ~]$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

 

Bookinfo 서비스가 실행되고 있는 것을 확인했습니다. 이제 웹 브라우저와 같은 쿠버네티스 클러스터 외부에서 어플리케이션에 접근할 수 있도록 하겠습니다. 이를 위해서는 이스티오 게이트웨이를 만들어야 합니다.

다음과 같이 해당 매니페스트 파일을 적용해서 이스티오 게이트웨이를 생성합니다. 먼저 매니페스트 파일을 조회해보면 이스티오 인그레스 게이트웨이를 만들고, 들어온 트래픽을 서비스로 라우팅하는 VirtualService를 만드는 것을 알 수 있습니다.

[opc@demo ~]$ cat ~/istio-1.14.1/samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

 

매니페스트 파일을 적용해서 게이트웨이와 VirtaulService를 생성합니다.

[opc@demo ~]$ kubectl apply -f ~/istio-1.14.1/samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

 

생성된 게이트웨이를 확인합니다.

[opc@demo ~]$ kubectl get gateways
NAME               AGE
bookinfo-gateway   21s

 

외부로 노출된 퍼블릭 IP(INGRESS_HOST)와 포트(INGRESS_PORT)를 확인합니다. 퍼블릭 IP는 로드 밸런서에 할당된 퍼블릭 IP이고, 포트는 게이트웨이 생성에서 정의한 포트입니다. 하지만 아래 명령으로도 확인할 수 있습니다.

[opc@demo ~]$ kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
150.230.7.116
[opc@demo ~]$ kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}'
80

 

이제 위에서 확인한 IP, 포트를 통해 아래 URL로 접속해 보면 Bookinfo 어플리케이션에 접속할 수 있습니다.

http://150.230.7.116:80/productpage

 

다음은 쿠버네티스 대쉬보드를 통해 확인한 productpage의 서비스 정보입니다.

 

<END>