이 페이지에서는 Cloud Service Mesh를 시연하기 위해 샘플 애플리케이션을 배포하는 방법을 설명합니다. Cloud Service Mesh를 설치하지 않은 경우 설치 가이드를 참조하세요.
Cloud Service Mesh와 함께 몇 가지 샘플 애플리케이션이 설치됩니다. 이 가이드에서는 BookInfo 샘플을 배포하는 과정을 안내합니다. 모두 Cloud Service Mesh를 사용하여 관리되는 웹 제품 페이지, 도서 세부정보, 리뷰(여러 버전의 리뷰 서비스 사용), 평점을 제공하는 4가지 서비스로 구성된 간단한 샘플 Bookstore 애플리케이션입니다. 이 예시에서 사용된 소스 코드 및 다른 모든 파일은 samples/bookinfo의 Cloud Service Mesh 설치 디렉터리에서 찾을 수 있습니다.
사이드카 자동 삽입 사용 설정
사이드카 자동 삽입을 사용 설정하려면 사이드카 인젝터 웹훅이 삽입된 사이드카를 특정 컨트롤 플레인 버전과 연결하도록 네임스페이스에 라벨을 지정해야 합니다. 기본 태그를 설정한 경우 기본 삽입 라벨로 네임스페이스에 라벨을 지정하세요.
그렇지 않으면 버전 라벨로 네임스페이스에 라벨을 지정합니다. 또한 추가하는 라벨은 관리형 Cloud Service Mesh를 배포했거나 클러스터 내 컨트롤 플레인을 설치했는지에 따라 달라집니다.
출력에서 "istio-injection not found" 메시지는 무시해도 됩니다. 즉, 네임스페이스에 이전에 istio-injection 라벨이 사용되지 않았으며, Cloud Service Mesh를 새로 설치하거나 새로 배포해야 합니다. 네임스페이스에 istio-injection 및 버전 라벨이 모두 포함된 경우 자동 삽입 동작이 정의되지 않으므로 Cloud Service Mesh 문서의 모든 kubectl label 명령어가 명시적으로 하나만 설정되었는지 확인합니다.
애플리케이션 배포
이제 자동 삽입이 default 네임스페이스에 사용 설정되었으므로, BookInfo 애플리케이션의 서비스를 배포하면 사이드카 프록시가 각 서비스와 함께 삽입됩니다.
Cloud Service Mesh가 설치된 컴퓨터의 명령줄에서 Cloud Service Mesh 설치 디렉터리의 루트로 이동합니다. 필요한 경우 설치 파일을 다운로드합니다.
Google Distributed Cloud에 Cloud Service Mesh를 설치한 경우 Cloud Service Mesh를 설치한 후에 구성한 인그레스 게이트웨이의 외부 IP 주소를 가져옵니다.
GKE에 Cloud Service Mesh를 설치한 경우 다음과 같이 인그레스 게이트웨이의 외부 IP 주소를 가져옵니다.
kubectl get service istio-ingressgateway -n istio-system
출력:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
이 예시에서 인그레스 서비스의 IP 주소는 35.239.7.64입니다.
애플리케이션 시험 사용
curl을 사용하여 BookInfo 앱이 실행되는지 확인합니다.
curl -I http://EXTERNAL_IP/productpage
응답에 200이 표시되면 애플리케이션이 Cloud Service Mesh와 함께 올바르게 작동되고 있음을 나타냅니다.
BookInfo 웹페이지를 보려면 브라우저에 다음 주소를 입력합니다.
http://EXTERNAL_IP/productpage
페이지를 여러 번 새로고침하면 여러 버전의 리뷰가 제품 페이지에 라운드 로빈 스타일로 표시됩니다(빨간색 별, 검은색 별, 별 없음).
이제 트래픽을 생성하는 애플리케이션이 있으므로 Google Cloud 콘솔에서 Cloud Service Mesh 페이지를 탐색하여 측정항목과 기타 관측 가능성 기능을 확인할 수 있습니다.
삭제
Bookinfo 샘플의 실험이 끝나면 클러스터에서 삭제합니다.
다음 스크립트를 사용하여 Bookinfo를 제거합니다.
samples/bookinfo/platform/kube/cleanup.sh
종료를 확인합니다.
kubectl get virtualservices #-- there should be no virtual services
kubectl get destinationrules #-- there should be no destination rules
kubectl get gateway #-- there should be no gateway
kubectl get pods #-- the Bookinfo pods should be deleted
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["이해하기 어려움","hardToUnderstand","thumb-down"],["잘못된 정보 또는 샘플 코드","incorrectInformationOrSampleCode","thumb-down"],["필요한 정보/샘플이 없음","missingTheInformationSamplesINeed","thumb-down"],["번역 문제","translationIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-08-20(UTC)"],[],[],null,["Deploying the Bookinfo sample\n\nThis page explains how to deploy a sample application to demonstrate\nCloud Service Mesh. If you haven't installed Cloud Service Mesh, see the\n[Installation guide](/service-mesh/v1.20/docs/unified-install/install-anthos-service-mesh).\n\nSeveral sample applications come with the Cloud Service Mesh installation. This\nguide walks you through deploying the\n[BookInfo](https://istio.io/v1.26/docs/examples/bookinfo/)\nsample. This is a simple mock bookstore application made up of four services\nthat provide a web product page, book details, reviews (with several versions of\nthe review service), and ratings---all managed using Cloud Service Mesh. You can\nfind the source code and all the other files used in this example in your\nCloud Service Mesh installation's directory in `samples/bookinfo`.\n\nEnabling sidecar auto-injection\n\nTo enable sidecar auto-injection, you must label your namespaces so that the\nsidecar injector webhook associate injected sidecars with a particular control\nplane revision. If you set up the default tag, then label your namespaces with\nthe\n[default injection labels](/service-mesh/docs/managed/select-a-release-channel#how-to-select-a-release-channel).\nOtherwise, label your namespaces with the\n[revision label](/service-mesh/v1.20/docs/revisions-overview). Additionally, the label that\nyou add also depends on whether you deployed\n[managed Cloud Service Mesh](/service-mesh/docs/managed/provision-managed-anthos-service-mesh)\nor installed the [in-cluster control plane](/service-mesh/v1.20/docs/unified-install/install-anthos-service-mesh). \n\nManaged\n\n1. You can either use the default injection label or the revision label for your namespace\n\n Default injection labels\n\n Apply the default injection label to the namespace. \n\n kubectl label namespace \u003cvar translate=\"no\"\u003eNAMESPACE\u003c/var\u003e istio-injection=enabled istio.io/rev-\n\n Revision label\n\n Before you deploy applications, remove any previous `istio-injection` labels\n from their namespaces and set the `istio.io/rev=`\u003cvar label=\"revision\" scope=\"MCP_RELEASE_CHANNEL\" class=\"edit\" translate=\"no\"\u003eREVISION_LABEL\u003c/var\u003e label instead.\n\n\n To change it to a specific revision label, click `REVISION_LABEL`, and replace\n it with the applicable label: `asm-managed-rapid` for rapid channel, `asm-managed` for\n regular channel, or `asm-managed-stable` for stable channel.\n\n The revision label corresponds to a [release channel](/service-mesh/v1.20/docs/release-channels-managed-control-plane):\n\n | Revision label | Channel |\n |----------------------|---------|\n | `asm-managed` | Regular |\n | `asm-managed-rapid` | Rapid |\n | `asm-managed-stable` | Stable |\n\n kubectl label namespace \u003cvar label=\"namespace\" translate=\"no\"\u003eNAMESPACE\u003c/var\u003e istio-injection- istio.io/rev=\u003cvar label=\"revision\" scope=\"MCP_RELEASE_CHANNEL\" translate=\"no\"\u003eREVISION_LABEL\u003c/var\u003e --overwrite\n\n | **Note:** You can ignore any `label \"istio-injection\" not found` errors.\n2. If you also deployed the optional\n [managed data plane](/service-mesh/docs/managed/provision-managed-anthos-service-mesh#managed_data_plane),\n annotate the `NAMESPACE`namespace as follows:\n\n kubectl annotate --overwrite namespace \u003cvar translate=\"no\"\u003eNAMESPACE\u003c/var\u003e \\\n mesh.cloud.google.com/proxy='{\"managed\":\"true\"}'\n\nIn-cluster\n\n1. Use the following command to locate the label on `istiod`:\n\n kubectl -n istio-system get pods -l app=istiod --show-labels\n\n The output looks similar to the following: \n\n NAME READY STATUS RESTARTS AGE LABELS\n istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-1264-1,istio=istiod,pod-template-hash=5788d57586\n istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-1264-1,istio=istiod,pod-template-hash=5788d57586\n\n In the output, under the `LABELS` column, note the value of the `istiod`\n revision label, which follows the prefix `istio.io/rev=`. In this\n example, the value is `asm-1264-1`.\n\n\n | **Note:** You can substitute `istio.io/rev` with the `istio-injection=enabled` label if the [default tag](https://istio.io/latest/docs/setup/upgrade/canary/#default-tag) is configured. Verify the default tag exists by running ` istioctl tag list` with the `istioctl` from \u003cvar translate=\"no\"\u003eOUTPUT_DIR\u003c/var\u003e.\n\n \u003cbr /\u003e\n\n2. Apply the revision label to the default namespace. In the following command,\n \u003cvar translate=\"no\"\u003eREVISION\u003c/var\u003e is the value of the `istiod` revision label\n that you noted in the previous step.\n\n kubectl label namespace default istio-injection- istio.io/rev=\u003cvar translate=\"no\"\u003eREVISION\u003c/var\u003e --overwrite\n\n\n You can ignore the message `\"istio-injection not found\"` in the\n output. That means that the namespace didn't previously have the\n `istio-injection` label, which you should expect in new\n installations of Cloud Service Mesh or new deployments. Because auto-injection\n behavior is undefined when a namespace has both the `istio-injection`\n and the revision label, all `kubectl label` commands in the\n Cloud Service Mesh documentation explicitly ensure that only one is set.\n\nDeploying the application\n\nNow that auto-injection is enabled on the `default` namespace, when you deploy\nthe BookInfo application's services, sidecar proxies are injected alongside each\nservice.\n\n1. On the command line on the computer where you installed Cloud Service Mesh, go to\n the root of the Cloud Service Mesh installation directory. If you need to,\n [download the installation file](/service-mesh/v1.20/docs/downloading-istioctl).\n\n2. Deploy your application to the default namespace using `kubectl`:\n\n kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml\n\n3. Confirm that the application has been deployed correctly by running the\n following commands:\n\n kubectl get services\n\n Output: \n\n ```\n NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n details 10.0.0.31 \u003cnone\u003e 9080/TCP 6m\n kubernetes 10.0.0.1 \u003cnone\u003e 443/TCP 7d\n productpage 10.0.0.120 \u003cnone\u003e 9080/TCP 6m\n ratings 10.0.0.15 \u003cnone\u003e 9080/TCP 6m\n reviews 10.0.0.170 \u003cnone\u003e 9080/TCP 6m\n ```\n\n and \n\n kubectl get pod\n\n Output: \n\n ```\n NAME READY STATUS RESTARTS AGE\n details-v1-1520924117-48z17 2/2 Running 0 6m\n productpage-v1-560495357-jk1lz 2/2 Running 0 6m\n ratings-v1-734492171-rnr5l 2/2 Running 0 6m\n reviews-v1-874083890-f0qf0 2/2 Running 0 6m\n reviews-v2-1343845940-b34q5 2/2 Running 0 6m\n reviews-v3-1813607990-8ch52 2/2 Running 0 6m\n ```\n4. Finally, define the ingress gateway routing for the application:\n\n kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml\n\n Output: \n\n ```\n gateway.networking.istio.io/bookinfo-gateway created\n virtualservice.networking.istio.io/bookinfo created\n ```\n\nValidating the application deployment\n\nTo see if the BookInfo application is working, you need to send traffic to\nthe ingress gateway.\n\n- If you installed Cloud Service Mesh on Google Distributed Cloud, get the external\n IP address for the ingress gateway that you\n [configured](/service-mesh/v1.20/docs/unified-install/external-ip-load-balance)\n after installing Cloud Service Mesh\n\n- If you installed Cloud Service Mesh on GKE, get the external IP\n address of the ingress gateway as follows:\n\n kubectl get service istio-ingressgateway -n istio-system\n\n Output: \n\n ```\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m\n ```\n\n In this example, the IP address of the ingress service is `35.239.7.64`.\n\nTrying the application\n\n1. Check that the BookInfo app is running with `curl`:\n\n curl -I http://\u003cvar translate=\"no\"\u003eEXTERNAL_IP\u003c/var\u003e/productpage\n\n If the response shows `200`, it means the application is working properly\n with Cloud Service Mesh.\n2. To view the BookInfo web page, enter the following address in your browser:\n\n http://\u003cvar translate=\"no\"\u003eEXTERNAL_IP\u003c/var\u003e/productpage\n\n If you refresh the page several times, you should see different versions of\n reviews shown in the product page, presented in a round robin style\n (red stars, black stars, no stars).\n\nNow that you have an application that is generating traffic, you can\n[explore the Cloud Service Mesh pages](/service-mesh/v1.20/docs/observability/explore-dashboard)\nin the Google Cloud console to see metrics and the other observability\nfeatures.\n\nCleaning up\n\nWhen you are finished experimenting with the Bookinfo sample, remove it from\nyour cluster.\n\n1. Uninstall Bookinfo using the following script:\n\n samples/bookinfo/platform/kube/cleanup.sh\n\n2. Confirm shutdown:\n\n kubectl get virtualservices #-- there should be no virtual services\n kubectl get destinationrules #-- there should be no destination rules\n kubectl get gateway #-- there should be no gateway\n kubectl get pods #-- the Bookinfo pods should be deleted\n\nWhat's next\n\n[Learn more about the Bookinfo sample](https://archive.istio.io/v1.26/docs/examples/bookinfo/)."]]