Bookinfo 샘플 배포

이 페이지에서는 Cloud Service Mesh를 시연하기 위해 샘플 애플리케이션을 배포하는 방법을 설명합니다. Cloud Service Mesh에 온보딩하지 않은 경우 온보딩 가이드를 참고하세요.

Cloud Service Mesh와 함께 몇 가지 샘플 애플리케이션이 설치됩니다. 이 가이드에서는 BookInfo 샘플을 배포하는 과정을 안내합니다. 모두 Cloud Service Mesh를 사용하여 관리되는 웹 제품 페이지, 도서 세부정보, 리뷰(여러 버전의 리뷰 서비스 사용), 평점을 제공하는 4가지 서비스로 구성된 간단한 샘플 Bookstore 애플리케이션입니다. 이 예시에서 사용된 소스 코드 및 다른 모든 파일은 samples/bookinfo의 Cloud Service Mesh 설치 디렉터리에서 찾을 수 있습니다.

샘플 이미지의 네트워크 액세스

asmcli 도구는 핵심 메시 설치 중에 Docker Hub (docker.io)에서 아무것도 확인하거나 가져오지 않습니다. 하지만 설치 후 서드 파티 컨테이너 이미지를 배포하면 Kubelet이 Docker Hub 및 Docker Hub의 지원 Cloudflare CDN에서 샘플 애플리케이션 이미지를 가져옵니다.

제한된 네트워크 또는 에어갭 네트워크에서는 명시적으로 수용하지 않는 한 이러한 이미지 가져오기가 실패합니다.

이미지 풀을 수용하려면 다음 방법 중 하나를 선택하세요.

  • 이그레스 트래픽 허용

    다음 도메인에 대한 HTTPS (포트 443) 이그레스를 허용하도록 방화벽 또는 프록시를 업데이트합니다. Docker Hub는 HTTP 307 리디렉션을 사용하여 이미지 레이어를 제공하므로 Cloudflare 도메인이 필요합니다.

    • docker.io
    • hub.docker.com
    • *.cloudflarestorage.com
  • 비공개 레지스트리에 미러링

    완전히 제한된 환경의 경우 방화벽 포트를 열지 마세요. 대신 필요한 샘플 이미지를 내부 레지스트리에 미러링하고 내부 레지스트리를 사용하도록 클러스터를 구성합니다.

    GDC 환경에서 이를 설정하는 방법에 관한 자세한 내용은 컨테이너 이미지에 레지스트리 미러 사용을 참고하세요.

사이드카 자동 삽입 사용 설정

  1. 네임스페이스의 삽입을 사용 설정합니다. 이 단계는 컨트롤 플레인 구현에 따라 다릅니다.

    관리형(TD)

    1. 기본 삽입 라벨을 네임스페이스에 적용합니다.
    kubectl label namespace default \
        istio.io/rev- istio-injection=enabled --overwrite
    

    관리형(Istiod)

    권장: 다음 명령어를 실행하여 네임스페이스에 기본 삽입 라벨을 적용합니다.

      kubectl label namespace default \
          istio.io/rev- istio-injection=enabled --overwrite
    

    관리형 Istiod 컨트롤 플레인이 있는 기존 사용자: 기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입은 지원됩니다. 다음 안내를 따르세요.

    1. 다음 명령어를 실행하여 사용 가능한 출시 채널을 찾습니다.

      kubectl -n istio-system get controlplanerevision
      

      출력은 다음과 비슷합니다.

      NAME                AGE
      asm-managed-rapid   6d7h
      

      참고: 위 목록에 두 개의 컨트롤 플레인 버전이 표시되면 하나를 삭제합니다. 클러스터에 여러 컨트롤 플레인 채널을 두는 방식은 지원되지 않습니다.

      출력에서 NAME 열 아래의 값은 Cloud Service Mesh 버전에 사용 가능한 출시 채널에 해당하는 버전 라벨입니다.

    2. 네임스페이스에 버전 라벨을 적용합니다.

      kubectl label namespace default \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    클러스터 내

    권장: 다음 명령어를 실행하여 네임스페이스에 기본 삽입 라벨을 적용합니다.

      kubectl label namespace default \
          istio.io/rev- istio-injection=enabled --overwrite
    

    기본 삽입을 사용하는 것이 좋지만 버전 기반 삽입이 지원됩니다. 다음 안내를 따르세요.

    1. 다음 명령어를 사용하여 istiod에서 버전 라벨을 찾습니다.

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 네임스페이스에 버전 라벨을 적용합니다. 다음 명령어에서 REVISION_LABEL은 이전 단계에서 확인한 istiod 버전 라벨의 값입니다.

      kubectl label namespace default \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

애플리케이션 배포

이제 자동 삽입이 default 네임스페이스에 사용 설정되었으므로, BookInfo 애플리케이션의 서비스를 배포하면 사이드카 프록시가 각 서비스와 함께 삽입됩니다.

  1. Cloud Service Mesh가 설치된 컴퓨터의 명령줄에서 Cloud Service Mesh 설치 디렉터리의 루트로 이동합니다. 필요한 경우 Bookinfo 샘플 애플리케이션이 포함된 클러스터 내 설치 파일을 다운로드하고 압축을 풉니다.

  2. kubectl을 사용하여 애플리케이션을 기본 네임스페이스에 배포합니다.

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    
  3. 다음 명령어를 실행하여 애플리케이션이 올바르게 배포되었는지 확인합니다.

    kubectl get services
    

    출력:

    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    kubectl get pod
    

    출력:

    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
  4. 마지막으로 애플리케이션에 대해 인그레스 게이트웨이 라우팅을 정의합니다.

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

    출력:

    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created

애플리케이션 배포 검증

BookInfo 애플리케이션이 작동하는지 확인하려면 인그레스 게이트웨이로 트래픽을 보내야 합니다.

  • VMware용 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입니다.

애플리케이션 시험 사용

  1. curl을 사용하여 BookInfo 앱이 실행되는지 확인합니다.

    curl -I http://EXTERNAL_IP/productpage
    

    응답에 200이 표시되면 애플리케이션이 Cloud Service Mesh와 함께 올바르게 작동되고 있음을 나타냅니다.

  2. BookInfo 웹페이지를 보려면 브라우저에 다음 주소를 입력합니다.

    http://EXTERNAL_IP/productpage
    

    페이지를 여러 번 새로고침하면 여러 버전의 리뷰가 제품 페이지에 라운드 로빈 스타일로 표시됩니다(빨간색 별, 검은색 별, 별 없음).

이제 트래픽을 생성하는 애플리케이션이 있으므로 Google Cloud 콘솔에서 Cloud Service Mesh 페이지를 탐색하여 측정항목과 기타 관측 가능성 기능을 확인할 수 있습니다.

삭제

Bookinfo 샘플의 실험이 끝나면 클러스터에서 삭제합니다.

  1. 다음 스크립트를 사용하여 Bookinfo를 제거합니다.

    samples/bookinfo/platform/kube/cleanup.sh
    
  2. 종료를 확인합니다.

    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
    

다음 단계

Bookinfo 샘플 자세히 알아보기