Bookinfo 애플리케이션

Bookinfo 애플리케이션 (Bookinfo Application)

이 예제는 다양한 Istio 기능을 시연하는 데 사용되는 네 개의 개별 마이크로서비스로 구성된 샘플 애플리케이션을 배포해요.

출처: Istio 문서

본문

이 애플리케이션은 온라인 서점의 단일 카탈로그 항목처럼 책에 대한 정보를 표시해요. 페이지에는 책에 대한 설명, 책 세부 정보(ISBN, 페이지 수 등), 몇 가지 책 리뷰가 표시돼요.

Bookinfo 애플리케이션은 네 개의 개별 마이크로서비스로 나뉘어요:

  • productpage. productpage 마이크로서비스는 details와 reviews 마이크로서비스를 호출해 페이지를 채워요.
  • details. details 마이크로서비스는 책 정보를 포함해요.
  • reviews. reviews 마이크로서비스는 책 리뷰를 포함해요. 또한 ratings 마이크로서비스를 호출해요.
  • ratings. ratings 마이크로서비스는 책 리뷰에 딸린 책 평점 정보를 포함해요.

reviews 마이크로서비스에는 세 가지 버전이 있어요:

  • 버전 v1은 ratings 서비스를 호출하지 않아요.
  • 버전 v2는 ratings 서비스를 호출하고, 각 평점을 1~5개의 검은 별로 표시해요.
  • 버전 v3는 ratings 서비스를 호출하고, 각 평점을 1~5개의 빨간 별로 표시해요.

애플리케이션의 엔드-투-엔드 아키텍처는 아래와 같아요.

이 애플리케이션은 폴리글랏(polyglot)이에요. 즉 마이크로서비스들이 서로 다른 언어로 작성되어 있어요. 이 서비스들은 Istio에 대한 의존성이 없지만, 특히 reviews 서비스의 서비스·언어·버전의 다양함 덕분에 흥미로운 서비스 메시 예제를 만든다는 점을 주목할 만해요.

시작하기 전에 (Before you begin)

아직 하지 않았다면 설치 가이드의 지침을 따라 Istio를 설정하세요.

애플리케이션 배포하기 (Deploying the application)

샘플을 Istio로 실행하려면 애플리케이션 자체에 대한 변경이 필요 없어요. 대신, 각 서비스 옆에 Envoy 사이드카를 주입해 Istio가 활성화된 환경에서 서비스를 구성하고 실행하기만 하면 돼요. 결과 배포는 다음과 같아 보여요:

모든 마이크로서비스는 서비스에 대한 인바운드·아웃바운드 호출을 가로채는 Envoy 사이드카와 함께 패키징되며, Istio 컨트롤 플레인을 통해 전체 애플리케이션에 대한 라우팅, 텔레메트리 수집, 정책 적용을 외부에서 제어할 수 있는 훅을 제공해요.

애플리케이션 서비스 시작하기 (Start the application services)

  1. Istio 설치의 루트로 디렉터리를 변경하세요.
  2. 기본 Istio 설치는 자동 사이드카 주입을 사용해요. 애플리케이션을 호스팅할 네임스페이스에 istio-injection=enabled로 레이블을 붙이세요:
$ kubectl label namespace default istio-injection=enabled
  1. kubectl 명령으로 애플리케이션을 배포하세요:

Zip

$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@

이 명령은 bookinfo 애플리케이션 아키텍처 다이어그램에 표시된 네 가지 서비스를 모두 실행해요. reviews 서비스의 v1, v2, v3 세 버전이 모두 시작돼요.

  1. 모든 서비스와 파드가 올바르게 정의되고 실행 중인지 확인하세요:
$ kubectl get services
NAME          TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.0.0.31    <none>        9080/TCP   6m
kubernetes    ClusterIP   10.0.0.1     <none>        443/TCP    7d
productpage   ClusterIP   10.0.0.120   <none>        9080/TCP   6m
ratings       ClusterIP   10.0.0.15    <none>        9080/TCP   6m
reviews       ClusterIP   10.0.0.170   <none>        9080/TCP   6m

그리고

$ kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
details-v1-1520924117-48z17      2/2       Running   0          6m
productpage-v1-560495357-jk1lz   2/2       Running   0          6m
ratings-v1-734492171-rnr5l       2/2       Running   0          6m
reviews-v1-874083890-f0qf0       2/2       Running   0          6m
reviews-v2-1343845940-b34q5      2/2       Running   0          6m
reviews-v3-1813607990-8ch52      2/2       Running   0          6m
  1. Bookinfo 애플리케이션이 실행 중인지 확인하려면, 어떤 파드(예: ratings)에서 curl 명령으로 요청을 보내세요:
$ 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>

인그레스 IP와 포트 결정하기 (Determine the ingress IP and port)

이제 Bookinfo 서비스가 실행 중이므로, 쿠버네티스 클러스터 밖(예: 브라우저)에서 애플리케이션에 접근할 수 있게 해야 해요. 이를 위해 게이트웨이가 사용돼요.

  1. Bookinfo 애플리케이션용 게이트웨이를 생성하세요:

다음 명령으로 Istio Gateway를 생성하세요:

Zip

$ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

게이트웨이가 생성되었는지 확인하세요:

$ kubectl get gateway
NAME               AGE
bookinfo-gateway   32s

게이트웨이 접근을 위한 INGRESS_HOST와 INGRESS_PORT 변수를 설정하려면 이 지침을 따르세요. 설정되면 여기로 돌아오세요.

다음 명령으로 Kubernetes Gateway를 생성하세요:

Zip

$ kubectl apply -f @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@
gateway.gateway.networking.k8s.io/bookinfo-gateway created
httproute.gateway.networking.k8s.io/bookinfo created

쿠버네티스 Gateway 리소스를 생성하면 연관된 프록시 서비스도 배포되므로, 다음 명령을 실행해 게이트웨이가 준비될 때까지 기다리세요:

$ kubectl wait --for=condition=programmed gtw bookinfo-gateway

bookinfo 게이트웨이 리소스에서 게이트웨이 주소와 포트를 가져오세요:

$ export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}')
$ export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
  1. GATEWAY_URL을 설정하세요:
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

앱이 클러스터 밖에서 접근 가능한지 확인하기 (Confirm the app is accessible from outside the cluster)

Bookinfo 애플리케이션이 클러스터 밖에서 접근 가능한지 확인하려면 다음 curl 명령을 실행하세요:

$ curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

브라우저를 http://$GATEWAY_URL/productpage로 가리켜 Bookinfo 웹 페이지를 볼 수도 있어요. 페이지를 여러 번 새로고침하면, 아직 Istio로 버전 라우팅을 제어하지 않았으므로 productpage에 reviews의 서로 다른 버전이 라운드 로빈 방식(빨간 별, 검은 별, 별 없음)으로 표시되는 것을 볼 수 있어요.

서비스 버전 정의하기 (Define the service versions)

Istio로 Bookinfo 버전 라우팅을 제어하기 전에, 사용 가능한 버전을 정의해야 해요.

Istio는 destination rules의 subsets을 사용해 서비스의 버전을 정의해요. Bookinfo 서비스의 기본 destination rules를 생성하려면 다음 명령을 실행하세요:

$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@

destination rules가 전파될 때까지 몇 초 기다리세요.

다음 명령으로 destination rules를 표시할 수 있어요:

$ kubectl get destinationrules -o yaml

서비스 버전을 정의하는 데 DestinationRule subsets을 사용하는 Istio API와 달리, 쿠버네티스 Gateway API는 이 목적에 백엔드 서비스 정의를 사용해요.

reviews 서비스의 세 버전에 대한 백엔드 서비스 정의를 생성하려면 다음 명령을 실행하세요:

$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-versions.yaml@

다음은 무엇인가요? (What's next)

이제 이 샘플을 사용해 트래픽 라우팅, 결함 주입, 레이트 리미팅 등 Istio의 기능을 실험할 수 있어요. 관심사에 따라 Istio Tasks 중 하나 이상을 참조하세요. 초보자에게는 Request Routing 구성이 시작하기 좋은 곳이에요.

정리 (Cleanup)

Bookinfo 샘플 실험을 마쳤다면, 다음 명령으로 제거하고 정리하세요:

$ @samples/bookinfo/platform/kube/cleanup.sh@

더 알아보기 (Learn more)