Istio 메시 확장을 통한 마이그레이션 배포

Last reviewed 2023-11-02 UTC

이 문서에서는 온프레미스 데이터 센터에서 Google Cloud로의 기능별 마이그레이션을 지원하도록 서비스 메시를 초기화하고 구성하는 방법을 설명합니다. 여기서는 사용자가 관련 참조 아키텍처에 익숙하다고 가정합니다. 이 문서는 트래픽을 원본 환경 또는 Google Cloud로 동적으로 라우팅하는 서비스 메시를 사용하고자 하는 관리자, 개발자, 엔지니어를 대상으로 합니다.

이 배포 가이드는 Google Cloud 이외의 환경(예: 온프레미스 또는 다른 클라우드 제공업체)에서 Google Cloud로의 마이그레이션을 지원하기 위해 제작되었습니다. 이러한 마이그레이션에서는 비 Google Cloud 환경과 Google Cloud 환경 간에 보안 통신 채널을 설정해야 하므로 네트워크 복잡성 계층이 존재합니다.

아키텍처

다음 다이어그램은 서비스 메시를 사용하여 원본 환경에서 실행되는 마이크로서비스 또는 Google Cloud로 트래픽을 라우팅하는 방법을 보여줍니다.

기존 환경에서 실행되는 마이크로서비스 또는 Google Cloud로 트래픽을 라우팅하는 서비스 메시를 사용하는 아키텍처

다이어그램에서 Istio 게이트웨이는 애플리케이션의 마이크로서비스를 연결하는 서비스 메시를 제공합니다. Google Kubernetes Engine(GKE)은 각 마이크로서비스의 경계를 정의하는 컨테이너 역할을 합니다. 자세한 내용은 Istio 메시 확장을 통한 마이그레이션 지원을 참조하세요.

이 배포에서 사용하는 소프트웨어는 다음과 같습니다.

  • Ubuntu ServerContainer-Optimized OS: 이 배포에서 사용되는 운영체제
  • Docker Engine: 컨테이너화된 워크로드를 실행하기 위한 플랫폼
  • Docker Compose: Docker 앱 정의 및 실행을 위한 도구
  • Istio: 오픈소스 서비스 메시
  • Kiali: Istio 서비스 메시를 시각화하기 위한 도구
  • Envoy: 메시에 서비스를 포함하기 위해 Istio에서 사용되는 사이드카 프록시

예시 워크로드

이 배포에서는 도서에 대한 정보를 표시하는 4계층 Polyglot 마이크로서비스 앱인 Bookinfo를 사용합니다. 이 앱은 Kubernetes에서 실행되도록 설계되었지만 Docker 및 Docker Compose를 사용하여 Compute Engine 인스턴스에 배포합니다. Docker Compose에서 YAML 설명어를 사용하여 다중 컨테이너 앱을 설명합니다. 그런 다음 단일 명령어를 실행하여 앱을 시작할 수 있습니다.

이 예시 워크로드는 이미 컨테이너화되었지만 이 접근 방법은 컨테이너화되지 않은 서비스에도 적용됩니다. 그러한 경우 마이그레이션할 서비스를 컨테이너화하는 현대화 단계를 추가할 수 있습니다.

Bookinfo 앱에는 4개의 마이크로서비스 구성요소가 있습니다.

  • productpage: details, ratings, reviews 마이크로서비스를 호출하여 도서 정보 페이지를 채웁니다.
  • details: 도서 관련 정보를 제공합니다.
  • reviews: 도서 리뷰를 포함합니다.
  • ratings: 도서 리뷰에 첨부할 도서 순위 정보를 반환합니다.

Bookinfo 앱 제작자 및 유지관리 담당자들은 Istio 및 해당 기능을 시연하기 위해 이러한 구성요소 중 일부를 여러 버전으로 구현했습니다. 이 배포에서는 각 구성요소의 한 버전만 배포합니다.

목표

  • 온프레미스 데이터 센터를 시뮬레이션하는 환경을 초기화합니다.
  • 온프레미스 데이터 센터에서 예시 워크로드를 배포하고 테스트합니다.
  • Google Cloud에서 대상 환경을 구성합니다.
  • 온프레미스 데이터 센터의 워크로드를 대상 환경으로 마이그레이션합니다.
  • 대상 환경에서 실행되는 워크로드를 테스트합니다.
  • 온프레미스 데이터 센터를 사용 중지합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

개발 환경 준비

이 배포의 대부분 단계는 Cloud Shell에서 수행됩니다.

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  2. Cloud Shell에서 사용 가능한 여유 공간을 확인합니다.

    df -h
    

    이 배포를 완료하려면 약 200MB의 여유 공간이 필요합니다.

  3. 작업 디렉터리를 ${HOME} 디렉터리로 변경합니다.

    cd "${HOME}"
    
  4. 예시 워크로드를 배포하고 구성하기 위한 스크립트 및 매니페스트 파일이 포함된 Git 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/solutions-istio-mesh-expansion-migration
    
  5. 애플리케이션 기본 사용자 인증 정보(ADC)로 인증합니다.

    gcloud auth application-default login
    

    출력에 Application Default Credentials 파일의 경로가 표시됩니다.

    Credentials saved to file:
    [/tmp/tmp.T5Qae7XwAO/application_default_credentials.json]
    

    Application Default Credentials 파일 경로를 기록해 둡니다. 이 사용자 인증 정보는 ADC를 요청하는 모든 라이브러리에서 사용됩니다.

  6. 환경 변수를 초기화합니다.

    APPLICATION_DEFAULT_CREDENTIALS_PATH=APPLICATION_DEFAULT_CREDENTIALS_PATH
    BILLING_ACCOUNT_ID=BILLING_ACCOUNT_ID
    DEFAULT_FOLDER=DEFAULT_FOLDER
    DEFAULT_PROJECT=DEFAULT_PROJECT
    DEFAULT_REGION=DEFAULT_REGION
    DEFAULT_ZONE=DEFAULT_ZONE
    GKE_CLUSTER_NAME=istio-migration
    DEPLOYMENT_DIRECTORY_PATH="$(pwd)"/solutions-istio-mesh-expansion-migration
    ORGANIZATION_ID=ORGANIZATION_ID
    

    다음을 바꿉니다.

    • APPLICATION_DEFAULT_CREDENTIALS_PATH: 이전 단계의 ADC 파일 경로입니다.
    • BILLING_ACCOUNT_ID: 사용할 결제 계정의 ID입니다.
    • DEFAULT_FOLDER: Google Cloud 프로젝트를 만들 Google Cloud 폴더의 ID입니다. Terraform에서 Google Cloud 조직 바로 아래에 Google Cloud 프로젝트를 만들려면 이 문자열을 비워 둡니다.
    • DEFAULT_PROJECT: 이 배포를 완료하기 위해 리소스를 프로비저닝할 Google Cloud 프로젝트의 ID입니다. Terraform은 환경을 프로비저닝할 때 이 프로젝트를 만듭니다.
    • DEFAULT_REGION: 리소스가 프로비저닝되는 기본 리전입니다.
    • DEFAULT_ZONE: 리소스가 프로비저닝되는 기본 영역입니다.
    • ORGANIZATION_ID: Google Cloud 조직의 ID입니다.

환경 프로비저닝

이 섹션에서는 이 배포를 위해 다음 환경을 프로비저닝합니다.

  • 원본 온프레미스 데이터 센터를 시뮬레이션하는 환경
  • 마이그레이션 대상을 시뮬레이션하는 환경

이 배포에서는 두 환경 모두 Google Cloud에서 실행됩니다. 이 접근 방식은 부트스트랩 단계가 하나뿐이므로 설정 프로세스를 간소화하는 데 도움이 됩니다. Terraform을 사용하여 원본 환경과 대상 환경을 자동으로 프로비저닝합니다.

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. Terraform 백엔드 구성을 초기화합니다.

    scripts/init.sh \
    --application-credentials "${APPLICATION_DEFAULT_CREDENTIALS_PATH}" \
    --billing-account-id "${BILLING_ACCOUNT_ID}" \
    --default-folder "${DEFAULT_FOLDER}" \
    --default-project "${DEFAULT_PROJECT}" \
    --default-region "${DEFAULT_REGION}" \
    --default-zone "${DEFAULT_ZONE}" \
    --organization-id "${ORGANIZATION_ID}"
    

    init.sh 스크립트가 다음을 수행합니다.

    • 설명자를 생성하여 Terraform 백엔드를 구성합니다.
    • Terraform 작업 디렉터리를 초기화합니다.
  3. 작업 디렉터리를 terraform 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"/terraform
    
  4. Terraform으로 변경사항을 적용합니다.

    terraform apply
    
  5. 메시지가 표시되면 추천된 변경사항을 검토하고 yes를 입력하여 확인합니다.

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

    Apply complete! Resources: 27 added, 0 changed, 0 destroyed
    

Terraform으로 제안된 변경사항을 적용하여 다음 작업을 자동화합니다.

  • 마이크로서비스와 데이터베이스 및 노드 간 통신에 대한 외부 액세스를 허용하는 방화벽 규칙 만들기
  • Compute Engine 인스턴스가 사용할 서비스 계정을 만들고 사용 설정. 앱을 실행하기 위해 필요한 역할과 액세스 권한으로 서비스 계정을 제한하는 것이 좋습니다. 이 배포에서는 Compute Engine 인스턴스의 서비스 계정에 Compute 뷰어 역할(roles/compute.viewer)만 있으면 됩니다. 이 역할은 Compute Engine 리소스에 대한 읽기 전용 액세스 권한을 제공합니다.
  • 마이그레이션할 워크로드를 원본 환경으로 호스팅할 Compute Engine 인스턴스 프로비저닝 및 구성. Compute Engine 인스턴스를 구성할 때 Docker, Docker Compose, Dnsmasq를 설치하는 시작 스크립트를 제공합니다.
  • 워크로드를 대상 환경으로 호스팅할 GKE 클러스터의 서비스 계정 만들기 및 사용 설정. 이 배포에서는 GKE 클러스터 노드가 사용하는 서비스 계정을 만듭니다. 앱을 실행하는 데 필요한 역할과 액세스 권한으로 서비스 계정을 제한하는 것이 좋습니다. 이 배포에서 GKE 클러스터 노드의 서비스 계정에 필요한 역할은 다음과 같습니다.
  • 워크로드를 대상 환경으로 호스팅할 GKE 클러스터 프로비저닝 및 구성. GKE 클러스터를 프로비저닝하기 위해 Terraform은 kubernetes-engine Terraform 모듈을 사용합니다.

원본 환경에 워크로드 배포

이 배포에서는 마이그레이션할 워크로드로 Istio Bookinfo 앱을 배포합니다. 다음 다이어그램은 원본 환경의 아키텍처를 보여줍니다.

원본 환경의 대상 아키텍처

다이어그램에서 클라이언트는 Compute Engine에서 실행 중인 예시 워크로드에 액세스합니다. 이 예시에서는 복잡성을 줄이기 위해 클라이언트가 단일 Compute Engine 인스턴스에 직접 연결됩니다. 프로덕션 환경에서는 워크로드의 여러 인스턴스를 실행하기 위해 부하 분산 레이어가 필요하기 때문에 이러한 직접 연결은 극히 드뭅니다.

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. Compute Engine 인스턴스에 워크로드를 배포합니다.

    scripts/workloads.sh \
    --deploy-with "COMPOSE" \
    --default-project "${DEFAULT_PROJECT}" \
    --default-region "${DEFAULT_REGION}" \
    --default-zone "${DEFAULT_ZONE}"
    

    workloads.sh 스크립트가 다음을 수행합니다.

    • 기본 프로젝트, 리전, 영역을 구성합니다.
    • Docker Compose 설명어를 Compute Engine 인스턴스에 복사합니다.
    • Docker Compose를 사용하여 예시 워크로드를 배포합니다.

    이전에 Compute Engine 인스턴스로 인증할 SSH 키 파일을 만들지 않았다면 gcloud CLI에 이를 생성하라는 메시지가 표시됩니다.

    출력에 배포 확인과 액세스 방법이 표시됩니다. 출력은 다음과 비슷합니다.

    You can access the workload by loading http://COMPUTE_ENGINE_PRODUCTPAGE_EXTERNAL_IP:9080/productpage
    

    출력에서 COMPUTE_ENGINE_PRODUCTPAGE_EXTERNAL_IP는 워크로드가 제공되는 IP 주소입니다. 이후 단계에서 사용하므로 IP 주소를 기록해 둡니다.

원본 환경에서 배포 테스트

  • 브라우저를 열고 다음 URL로 이동합니다. 여기서 COMPUTE_ENGINE_PRODUCTPAGE_EXTERNAL_IP는 이전 단계의 IP 주소입니다.

    http://COMPUTE_ENGINE_PRODUCTPAGE_EXTERNAL_IP:9080/productpage
    

도서 및 관련 평점에 대한 세부정보가 있는 Bookinfo 페이지가 표시됩니다.

Istio 구성

이 섹션에서는 Istio를 설치하여 Google Cloud에 대상 환경을 구성한 후 Istio를 사용하여 예시 워크로드를 노출합니다. 다음 다이어그램은 대상 환경의 아키텍처를 보여줍니다.

Istio가 설치된 대상 환경

다이어그램에서 Istio는 Compute Engine에서 실행 중인 워크로드를 노출합니다.

Istio 설치

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. Istio를 설치합니다.

    scripts/install-istio.sh \
    --cluster-name "${GKE_CLUSTER_NAME}" \
    --google-cloud-project "${DEFAULT_PROJECT}" \
    --cluster-region "${DEFAULT_REGION}"
    

    install-istio.sh 스크립트가 다음을 수행합니다.

    • Istio 배포판을 다운로드합니다.
    • 대상 환경 GKE 클러스터에 Istio를 설치합니다.
    • 게이트웨이를 배포하여 서비스 메시에 서비스를 노출합니다.
    • Istio를 구성하여 원본 환경을 시뮬레이션하는 Compute Engine 인스턴스로 서비스 메시를 확장합니다.
    • Kiali와 같은 서비스 메시 모니터링 및 시각화 도구를 설치합니다.

    이 명령어가 실행을 완료하면 콘솔에 설치 확인이 표시됩니다. 출력은 다음과 비슷합니다.

    ✔ Istio core installed
    ✔ Istiod installed
    ✔ Ingress gateways installed
    ✔ Egress gateways installed
    ✔ Installation complete
    

Istio 메시 확장 구성

이 섹션에서는 원본 환경을 시뮬레이션하는 Compute Engine 인스턴스를 서비스 메시에 연결합니다. 서비스 메시는 대상 환경으로 마이그레이션할 기존 환경에서 마이크로서비스를 연결합니다. 이 단계에서는 서비스 메시가 비어 있으며 서비스가 등록될 때까지 대기 중입니다. 서비스 메시는 아직 프로덕션 트래픽을 수신하지 않습니다.

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. Compute Engine 인스턴스에 Istio를 설치하고 구성합니다.

    scripts/compute-engine-mesh-expansion-setup.sh \
    --default-project "${DEFAULT_PROJECT}" \
    --default-region "${DEFAULT_REGION}" \
    --default-zone "${DEFAULT_ZONE}"
    

    compute-engine-mesh-expansion-setup.sh 스크립트가 다음을 수행합니다.

    • 원본 환경 Compute Engine 인스턴스에 Istio를 설치합니다.
    • Compute Engine 인스턴스에서 Istio 서비스를 시작합니다.

워크로드 노출

이 섹션에서는 Compute Engine 인스턴스에서 실행 중이고 원본 환경을 Istio 서비스 메시에 시뮬레이션하는 워크로드를 등록합니다.

이 섹션에서 실행하는 workloads.sh 스크립트는 서비스 메시를 사용하여 기존 환경에서 실행 중인 서비스와 대상 환경에서 실행 중인 서비스 간에 프로덕션 트래픽을 분할하는 라우팅 규칙을 설정합니다. 서비스 메시 내부의 트래픽 라우팅은 클라이언트에 투명하기 때문에 라우팅 구성이 변경되었는지 알 수 없습니다.

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. 워크로드를 노출합니다.

    scripts/workloads.sh \
    --default-project "${DEFAULT_PROJECT}" \
    --default-region "${DEFAULT_REGION}" \
    --default-zone "${DEFAULT_ZONE}" \
    --expose-with "ISTIO_COMPUTE_ENGINE"
    
  3. workloads.sh 스크립트가 다음을 수행합니다.

    • 기본 프로젝트, 리전, 영역을 구성합니다.
    • 자동 사이드카 삽입을 사용 설정하여 배포 설명자를 수동으로 편집할 필요가 없습니다.
    • WorkloadEntry 엔드포인트와 해당 서비스를 구성하여 Compute Engine 인스턴스에서 실행되는 워크로드를 메시에 등록합니다.
    • ServiceEntries를 배포하여 Compute Engine 메타데이터 서버Cloud API에 대한 트래픽을 허용합니다.
    • 가상 서비스를 배포하여 Istio 게이트웨이에서 Compute Engine 인스턴스에서 실행 중인 productpage 인스턴스로 트래픽을 라우팅합니다.

    출력에 배포 확인과 액세스 방법이 표시됩니다. 출력은 다음과 비슷합니다.

    You can access the workload by loading http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/productpage
    

    출력에서 ISTIO_INGRESS_GATEWAY_EXTERNAL_IP는 워크로드가 제공되는 IP 주소입니다. 이후 단계에서 사용하므로 IP 주소를 기록해 둡니다.

Istio 메시 확장 테스트

이 섹션에서는 Istio를 사용하여 노출한 Compute Engine 인스턴스에서 실행 중인 예시 워크로드를 테스트합니다.

  • 브라우저를 열고 다음 URL로 이동합니다. 여기서 ISTIO_INGRESS_GATEWAY_EXTERNAL_IP는 이전 단계의 IP 주소입니다.

    http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/productpage
    

이 단계에서 원본 환경 진입점(Compute Engine 인스턴스에 연결)을 계속 사용할 수 있습니다. 프로덕션 환경을 마이그레이션할 때는 부하 분산 레이어의 구성을 업데이트하여 대상 환경으로 트래픽을 점진적으로 리디렉션하는 것이 좋습니다.

서비스 메시 시각화

이 섹션에서는 Kiali를 사용하여 서비스 메시의 시각적 표현을 표시합니다.

  1. 브라우저를 열고 다음 URL로 이동합니다. 여기서 ISTIO_INGRESS_GATEWAY_EXTERNAL_IP는 이전 단계의 IP 주소입니다.

    http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/kiali/console/graph/namespaces/?edges=requestDistribution&graphType=versionedApp&namespaces=default%2Cistio-system&idleNodes=false&duration=60&refresh=15000&operationNodes=false&idleEdges=false&injectServiceNodes=true&layout=dagre
    

    Kiali 서비스 대시보드가 표시됩니다.

  2. Cloud Shell에서 예시 워크로드의 기본 페이지에 대한 요청을 여러 번 실행합니다.

    ISTIO_INGRESS_GATEWAY_EXTERNAL_IP="$(kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    
    for i in {1..10000}; do curl -s -o /dev/null -w "$(date --iso-8601=ns) - %{http_code}\n"  http://"${ISTIO_INGRESS_GATEWAY_EXTERNAL_IP}"/productpage; done
    

    이 요청은 Bookinfo 앱으로 가는 트래픽을 생성합니다. 출력에는 productpage 서비스에 대한 각 HTTP 요청의 타임스탬프 목록과 각 요청의 HTTP 반환 코드(이 경우 200)가 표시됩니다.

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

    2021-06-09T10:16:15,355323181+00:00 - 200
    2021-06-09T10:16:15,355323182+00:00 - 200
    2021-06-09T10:16:15,355323183+00:00 - 200
    [...]
    

    요청을 완료하는 데 시간이 걸리므로 실행 중인 상태로 두고 다음 단계로 진행할 수 있습니다.

  3. 현재 메시의 다이어그램이 Compute Engine에서 실행 중인 서비스로 라우팅되는 트래픽과 함께 Kiali 서비스 대시보드에 표시됩니다. 모든 트래픽은 istio-ingressgateway에서 compute-engine 버전 라벨과 함께 Compute Engine 인스턴스에서 실행되는 productpage 마이크로서비스로 라우팅된 후 kiali 서비스로 라우팅되어 서비스 메시를 시각화합니다.

    Compute Engine에서 실행되는 productpage 마이크로서비스가 Compute Engine에서 실행되는 다른 마이크로서비스에 직접 연결되므로 그래프(details, reviews, ratings)에 다른 서비스가 표시되지 않습니다. productpage 마이크로서비스는 서비스 메시를 거치지 않습니다.

    모든 트래픽이 서비스 메시를 거치도록 하려면 Compute Engine에서 실행되는 워크로드가 서비스 메시의 서비스와 직접 연결하는 대신 가리키도록 다시 구성해야 합니다.

    Kiali 대시보드에 다음 다이어그램이 표시되지 않으면 페이지를 새로고치세요.

    Kiali 대시보드에 트래픽이 라우팅되는 방법이 표시됩니다.

    Kiali 대시보드의 다이어그램은 Compute Engine에서 실행 중인 서비스로 트래픽이 라우팅되는 것을 보여줍니다.

  4. Cloud Shell에서 트래픽 생성 명령어를 중지하려면 Control+C를 누릅니다.

워크로드 마이그레이션

이 섹션에서는 예시 워크로드의 구성요소를 Compute Engine 인스턴스에서 GKE 클러스터로 마이그레이션합니다. 예시 워크로드의 각 마이크로서비스에 대해 다음을 수행합니다.

  • GKE 클러스터에 마이크로서비스 인스턴스를 배포합니다.
  • Compute Engine 및 GKE에서 실행되는 마이크로서비스 인스턴스로 트래픽 라우팅을 시작합니다.

다음 다이어그램은 이 섹션에 설명된 시스템의 아키텍처를 보여줍니다.

Compute Engine 및 GKE의 마이크로서비스 인스턴스로 라우팅되는 트래픽이 있는 대상 아키텍처

다이어그램에서 Cloud Load Balancing이 트래픽을 Istio 게이트웨이로 라우팅하고 이후 Istio가 Compute Engine에서 실행 중인 서비스 또는 GKE에서 실행 중인 서비스로 트래픽을 라우팅합니다.

예시 워크로드의 구성요소를 마이그레이션하려면 다음을 수행합니다.

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. 대상 환경에 워크로드를 배포합니다.

    scripts/workloads.sh \
    --default-project "${DEFAULT_PROJECT}" \
    --default-region "${DEFAULT_REGION}" \
    --default-zone "${DEFAULT_ZONE}" \
    --deploy-with "GKE"
    

    workloads.sh 스크립트가 다음을 수행합니다.

    배포 확인과 액세스 방법이 표시됩니다. 출력은 다음과 비슷합니다.

    You can access the workload by loading http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/productpage
    

서비스 메시는 Compute Engine 인스턴스에서 실행 중인 예시 워크로드와 GKE 클러스터에서 실행 중인 워크로드로 트래픽을 라우팅합니다.

Compute Engine 및 GKE에서 실행되는 워크로드 테스트

이 섹션에서는 Compute Engine 및 GKE에 배포한 예시 워크로드를 테스트합니다.

  • 브라우저를 열고 다음 URL로 이동합니다. 여기서 ISTIO_INGRESS_GATEWAY_EXTERNAL_IP는 이전 단계의 IP 주소입니다.

    http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/productpage
    

    도서 및 관련 평점에 대한 정보가 있는 Bookinfo 페이지가 표시됩니다.

Compute Engine 및 GKE 클러스터에 동일한 버전의 예시 워크로드를 배포했으므로 출력은 이전 테스트와 동일합니다.

서비스 메시 시각화

이 섹션에서는 Kiali를 사용하여 서비스 메시의 시각적 표현을 표시합니다.

  1. 브라우저를 열고 다음 URL로 이동합니다. 여기서 ISTIO_INGRESS_GATEWAY_EXTERNAL_IP는 이전 단계의 IP 주소입니다.

    http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/kiali/console/graph/namespaces/?edges=requestDistribution&graphType=versionedApp&namespaces=default%2Cistio-system&idleNodes=false&duration=60&refresh=15000&operationNodes=false&idleEdges=false&injectServiceNodes=true&layout=dagre
    
  2. Cloud Shell에서 예시 워크로드의 기본 페이지에 대한 요청을 여러 번 실행합니다.

    ISTIO_INGRESS_GATEWAY_EXTERNAL_IP="$(kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    for i in {1..10000}; do curl -s -o /dev/null -w "$(date --iso-8601=ns) - %{http_code}\n"  http://"${ISTIO_INGRESS_GATEWAY_EXTERNAL_IP}"/productpage; done
    

    이 명령어는 Bookinfo 앱으로 가는 트래픽을 생성합니다. 예상되는 출력은 productpage 서비스에 대한 HTTP 요청 날짜 및 각 요청의 HTTP 반환 코드입니다(이 경우 200 OK). 출력은 다음과 비슷합니다.

    2021-06-09T10:16:15,355323181+00:00 - 200
    2021-06-09T10:16:15,355323182+00:00 - 200
    2021-06-09T10:16:15,355323183+00:00 - 200
    [...]
    
  3. 현재 메시의 다이어그램이 Compute Engine 및 GKE에서 실행 중인 서비스로 라우팅되는 트래픽과 함께 Kiali 서비스 대시보드에 표시됩니다.

    각 마이크로서비스 인스턴스에는 버전을 설명하는 라벨이 있습니다.

    • Compute Engine에서 실행되는 인스턴스에는 compute-engine 라벨이 있습니다.
    • GKE에서 실행되는 인스턴스에는 v1 또는 v3 등의 추가 문자열이 있습니다.

    Compute Engine에서 실행되는 인스턴스는 Compute Engine의 다른 인스턴스에 직접 연결되며 서비스 메시를 거치지 않습니다. 따라서 Compute Engine에서 실행 중인 인스턴스에서 다른 인스턴스로 이동하는 트래픽이 표시되지 않습니다.

    Kiali 대시보드에 다음 다이어그램이 표시되지 않으면 페이지를 새로고치세요.

    Kiali 대시보드에 트래픽이 라우팅되는 방법이 표시됩니다.

    Kiali 대시보드의 다이어그램은 Compute Engine에서 실행 중인 서비스와 GKE에서 실행 중인 서비스로 라우팅되는 트래픽을 보여줍니다.

  4. Cloud Shell에서 트래픽 생성 명령어를 중지하려면 Control+C를 누릅니다.

GKE 클러스터로만 트래픽 라우팅

이 섹션에서는 GKE 클러스터에서 실행되는 워크로드 서비스 인스턴스로만 트래픽을 라우팅합니다. 예시 워크로드의 서비스마다 Compute Engine에서 실행 중인 서비스를 가리키는 WorkloadEntry 참조를 삭제합니다. 삭제 시 서비스가 GKE 클러스터에서 실행 중인 마이크로서비스 인스턴스만 선택하며 트래픽이 GKE 클러스터로 라우팅됩니다. 다음 다이어그램은 이 섹션에 설명된 시스템의 아키텍처를 보여줍니다.

트래픽이 GKE 클러스터로 라우팅되는 대상 아키텍처

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. 대상 환경에서만 워크로드를 노출합니다.

    scripts/workloads.sh \
    --default-project "${DEFAULT_PROJECT}" \
    --default-region "${DEFAULT_REGION}" \
    --default-zone "${DEFAULT_ZONE}" \
    --expose-with "GKE_ONLY"
    

    workloads.sh 스크립트는 GKE 클러스터에서 Compute Engine에서 실행 중인 마이크로서비스 인스턴스를 가리키는 WorkloadEntry 참조를 삭제합니다.

    배포 확인과 액세스 방법이 표시됩니다. 출력은 다음과 비슷합니다.

    You can access the workload by loading http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/productpage
    

서비스 항목은 workloadSelector를 사용하여 GKE 클러스터에서 실행 중인 예시 워크로드를 자동으로 선택합니다.

GKE에서 실행되는 워크로드 테스트

  • 브라우저를 열고 다음 URL로 이동합니다. 여기서 ISTIO_INGRESS_GATEWAY_EXTERNAL_IP는 이전 단계의 IP 주소입니다.

    http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/productpage
    

    도서 및 관련 평점에 대한 정보가 있는 Bookinfo 페이지가 표시됩니다.

서비스 메시 시각화

이 섹션에서는 Kiali를 사용하여 서비스 메시의 시각적 표현을 표시합니다.

  1. 브라우저를 열고 다음 URL로 이동합니다. 여기서 ISTIO_INGRESS_GATEWAY_EXTERNAL_IP는 이전 단계의 IP 주소입니다.

    http://ISTIO_INGRESS_GATEWAY_EXTERNAL_IP/kiali/console/graph/namespaces/?edges=requestDistribution&graphType=versionedApp&namespaces=default%2Cistio-system&idleNodes=false&duration=60&refresh=15000&operationNodes=false&idleEdges=false&injectServiceNodes=true&layout=dagre
    
  2. Cloud Shell에서 예시 워크로드의 기본 페이지에 대한 요청을 여러 번 실행합니다.

    ISTIO_INGRESS_GATEWAY_EXTERNAL_IP="$(kubectl get svc istio-ingressgateway -n istio-system -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    for i in {1..10000}; do curl -s -o /dev/null -w "$(date --iso-8601=ns) - %{http_code}\n"  http://"${ISTIO_INGRESS_GATEWAY_EXTERNAL_IP}"/productpage; done
    

    이 명령어는 Bookinfo 앱으로 가는 트래픽을 생성합니다. 예상되는 출력은 productpage 서비스에 대한 HTTP 요청 날짜 및 각 요청의 HTTP 반환 코드입니다(이 경우 200 OK). 출력은 다음과 비슷합니다.

    2021-06-09T10:16:15,355323181+00:00 - 200
    2021-06-09T10:16:15,355323182+00:00 - 200
    2021-06-09T10:16:15,355323183+00:00 - 200
    [...]
    
  3. 현재 메시의 다이어그램이 GKE에서 실행 중인 서비스로 라우팅되는 트래픽과 함께 Kiali 서비스 대시보드에 표시됩니다. 각 마이크로서비스의 두 인스턴스를 배포했습니다. 하나는 Compute Engine 인스턴스에서 실행되고 다른 하나는 GKE 클러스터에서 실행됩니다. 그러나 Compute Engine에서 실행되는 마이크로서비스 인스턴스를 가리키는 WorkloadEntry 참조를 삭제했기 때문에 서비스는 GKE 클러스터에서 실행 중인 마이크로서비스 인스턴스만 선택합니다.

    Kiali 대시보드에 다음 다이어그램이 표시되지 않으면 페이지를 새로고치세요.

    Kiali 대시보드에 트래픽이 라우팅되는 방법이 표시됩니다.

    Kiali 대시보드의 다이어그램은 GKE에서 실행 중인 서비스로 라우팅되는 트래픽을 보여줍니다.

  4. Cloud Shell에서 트래픽 생성 명령어를 중지하려면 Control+C를 누릅니다.

원본 환경 사용 중지

이제 모든 트래픽이 GKE 클러스터로 라우팅되므로 Compute Engine에서 실행 중인 워크로드의 인스턴스를 중지할 수 있습니다.

프로덕션 마이그레이션 중에는 롤백 전략을 위해 원본 데이터 센터를 계속 준비된 상태로 유지합니다. 새 솔루션이 예상대로 작동하고 모든 백업 및 내결함성 메커니즘이 마련되었음을 확인한 이후에만 원본 데이터 센터를 중단하는 과정을 시작하는 것이 좋습니다.

다음 다이어그램은 이 섹션에 설명된 시스템의 아키텍처를 보여줍니다.

Compute Engine에서 실행되는 워크로드 인스턴스가 없는 원본 환경

다이어그램에서 Istio는 GKE에서만 실행되는 서비스로 트래픽을 라우팅하고, Compute Engine에서 실행 중인 워크로드는 중단됩니다.

원본 환경을 중단하려면 다음 안내를 따르세요.

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"
    
  2. 대상 환경에서만 워크로드를 노출합니다.

    scripts/workloads.sh \
    --default-project "${DEFAULT_PROJECT}" \
    --default-region "${DEFAULT_REGION}" \
    --default-zone "${DEFAULT_ZONE}" \
    --deploy-with "GKE_ONLY"
    

    workloads.sh 스크립트는 Compute Engine 인스턴스에서 실행 중인 컨테이너를 중지합니다.

삭제

이 배포에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트는 유지하되 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

  1. Cloud Shell에서 작업 디렉터리를 저장소 디렉터리로 변경합니다.

    cd "${DEPLOYMENT_DIRECTORY_PATH}"/terraform
    
  2. 프로비저닝한 리소스를 삭제합니다.

    terraform destroy -auto-approve
    

다음 단계

  • GKE 자세히 알아보기
  • Istio에 대해 읽어봅니다.
  • 그 밖의 참조 아키텍처, 다이어그램, 튜토리얼, 권장사항을 알아보려면 클라우드 아키텍처 센터를 확인하세요.