Istio 메시 확장으로 마이그레이션 지원: 가이드

이 가이드에서는 온프레미스(레거시) 데이터 센터에서 Google Cloud Platform(GCP)으로의 기능별 마이그레이션을 지원하도록 서비스 메시를 초기화 및 구성하는 방법을 보여줍니다. 이 가이드 및 부속 개념 문서는 레거시 환경 또는 GCP로 동적으로 트래픽을 라우팅하는 서비스 메시를 사용하고자 하는 시스템 관리자, 개발자, 엔지니어를 대상으로 합니다.

서비스 메시는 서비스 기능으로부터 네트워크 기능을 분리하므로 마이그레이션 작업과 리팩토링 작업의 복잡성을 대폭 줄일 수 있습니다. 또한 부하 분산, 트래픽 관리, 모니터링, 관찰 기능을 제공하므로 네트워크 운영 복잡성도 낮춰줍니다.

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

서비스 메시를 사용하여 레거시 환경 또는 GCP에서 실행 중인 마이크로서비스로 트래픽 라우팅

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

  • Ubuntu Server컨테이너 최적화 OS: 이 가이드에서 사용되는 운영체제
  • Docker Community Edition: 컨테이너화된 작업 부하를 실행하기 위한 플랫폼
  • Docker Compose: Docker 앱 정의 및 실행을 위한 도구
  • Helm: Kubernetes 앱 설치 및 관리를 위한 도구
  • Istio: 오픈소스 서비스 메시
  • Kiali: Istio 서비스 메시를 시각화하기 위한 도구
  • Envoy: Istio 서비스 메시를 조인할 때 사용되는 사이드카 프록시

목표

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

비용

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

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

시작하기 전에

  1. Google 계정에 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Google Cloud Platform 프로젝트를 선택하거나 만듭니다.

    리소스 관리 페이지로 이동

  3. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. Compute Engine and GKE APIs를 사용 설정합니다.

    APIs 사용 설정

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

환경 준비

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

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

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

    cd "$HOME"
    
  3. 데모 앱을 배포하고 구성하기 위한 스크립트 및 매니페스트 파일이 포함된 Git 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/solutions-istio-mesh-expansion-migration
    
  4. 기본 리전 및 영역을 설정합니다.

    gcloud config set compute/region us-east1
    gcloud config set compute/zone us-east1-b
    
  5. Istio 버전 식별자를 저장하는 환경 변수를 초기화합니다.

    export ISTIO_VERSION=1.1.1
    
  6. Istio를 다운로드하고 압축을 풉니다.

    wget https://github.com/istio/istio/releases/download/"$ISTIO_VERSION"/istio-"$ISTIO_VERSION"-linux.tar.gz
    tar -xvzf istio-"$ISTIO_VERSION"-linux.tar.gz
    
  7. Istio의 압축을 푼 경로, Helm 버전 식별자, Helm의 압축을 푼 경로를 저장하는 환경 변수를 초기화합니다.

    ISTIO_PATH="$HOME"/istio-"$ISTIO_VERSION"
    HELM_VERSION=v2.13.0
    HELM_PATH="$HOME"/helm-"$HELM_VERSION"
    
  8. Helm을 다운로드하고 압축을 풉니다.

    wget https://storage.googleapis.com/kubernetes-helm/helm-"$HELM_VERSION"-linux-amd64.tar.gz
    tar -xvzf helm-"$HELM_VERSION"-linux-amd64.tar.gz
    mv linux-amd64 "$HELM_PATH"
    

예시 작업 부하

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

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

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

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

환경 설정

첫 번째 단계는 이 가이드에 필요한 환경을 구성하는 것입니다.

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

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

이 가이드에서는 두 환경 모두 GCP에서 실행됩니다. 따라서 하나의 부트스트랩 단계만 필요하므로 설정 프로세스가 간소화됩니다.

레거시 환경 프로비저닝

이 환경에서는 Compute Engine 인스턴스를 초기화하고 마이그레이션할 작업 부하를 배포하여 별도의 비 GCP 환경을 에뮬레이션하는 GCP 환경을 구성합니다. 다음 다이어그램은 레거시 환경의 대상 아키텍처를 보여줍니다.

레거시 환경 프로비저닝을 위한 아키텍처

방화벽 규칙 만들기

마이크로서비스와 데이터베이스에 대한 외부 액세스를 허용하는 방화벽 규칙을 만듭니다.

  • Cloud Shell에서 노드 간 통신에 필요한 방화벽 규칙을 만듭니다.

    gcloud compute firewall-rules create bookinfo \
        --description="Bookinfo App rules" \
        --action=ALLOW \
        --rules=tcp:9080,tcp:9081,tcp:9082,tcp:9083,tcp:9084 \
        --target-tags=bookinfo-legacy-vm
    

Compute Engine 인스턴스 관리를 위한 서비스 계정 초기화

이 가이드에서는 Compute Engine 인스턴스를 관리할 서비스 계정을 만듭니다. 앱을 실행하기 위해 필요한 역할과 액세스 권한으로만 서비스 계정을 제한하는 것이 좋습니다. 이 가이드에서 서비스 계정에 필요한 유일한 역할은 Compute 뷰어 역할(roles/compute.viewer)입니다. 이 역할은 Compute Engine 리소스에 대한 읽기 전용 액세스 권한을 제공합니다.

  1. Cloud Shell에서 서비스 계정 이름을 저장할 환경 변수를 만듭니다.

    GCE_SERVICE_ACCOUNT_NAME=istio-migration-gce
    
  2. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create "$GCE_SERVICE_ACCOUNT_NAME" --display-name="$GCE_SERVICE_ACCOUNT_NAME"
    
  3. 전체 서비스 계정 이메일 주소를 저장하는 환경 변수를 초기화합니다.

    GCE_SERVICE_ACCOUNT_EMAIL="$(gcloud iam service-accounts list \
        --format='value(email)' \
        --filter=displayName:"$GCE_SERVICE_ACCOUNT_NAME")"
    
  4. compute.viewer 역할을 서비스 계정에 바인딩합니다.

    gcloud projects add-iam-policy-binding "$(gcloud config get-value project 2> /dev/null)" \
        --member serviceAccount:"$GCE_SERVICE_ACCOUNT_EMAIL" \
        --role roles/compute.viewer
    

런타임 환경 초기화

다음 단계는 마이그레이션할 작업 부하를 호스팅하기 위한 Compute Engine 인스턴스를 생성 및 구성하는 것입니다.

  1. Cloud Shell에서 Compute Engine 인스턴스의 이름으로 변수를 초기화하고 내보냅니다.

    export GCE_INSTANCE_NAME=legacy-vm
    
  2. Compute Engine 인스턴스를 만듭니다.

    gcloud compute instances create "$GCE_INSTANCE_NAME" \
        --boot-disk-device-name="$GCE_INSTANCE_NAME" \
        --boot-disk-size=10GB \
        --boot-disk-type=pd-ssd \
        --image-family=ubuntu-1804-lts \
        --image-project=ubuntu-os-cloud \
        --machine-type=n1-standard-1 \
        --metadata-from-file startup-script="$HOME"/solutions-istio-mesh-expansion-migration/gce-startup.sh \
        --scopes=storage-ro,logging-write,monitoring-write,service-control,service-management,trace \
        --service-account="$GCE_SERVICE_ACCOUNT_EMAIL" \
        --tags=bookinfo-legacy-vm
    

    이 명령어에 지정된 n1-standard-1 머신 유형은 성능에 영향을 미치지 않으면서 예시 작업 부하를 실행할 수 있는 최소 머신 유형입니다. 이 명령어가 완료되면 Console에 새 인스턴스에 대한 세부정보가 표시됩니다.

    NAME           ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
    legacy-vm      us-east1-b  n1-standard-1               10.142.0.38  34.73.53.145  RUNNING
    

시작 스크립트는 다음을 수행하여 Compute Engine 인스턴스를 구성합니다.

  • Docker 설치
  • Docker Compose 설치
  • Dnsmasq 설치

레거시 환경에 작업 부하 배포

이 가이드에서는 마이그레이션할 작업 부하로 Istio Bookinfo 앱을 배포합니다.

  1. Cloud Shell에서 Docker Compose 설명어를 Compute Engine 인스턴스로 복사합니다.

    gcloud compute scp --recurse \
    "$HOME"/solutions-istio-mesh-expansion-migration/compose \
    "$GCE_INSTANCE_NAME":/tmp --zone=us-east1-b
    
  2. Docker Compose 설치가 완료될 때까지 기다립니다.

    gcloud compute ssh "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --command='while ! command -v docker-compose; do echo "Waiting for docker-compose to be installed"; sleep 5; done'
    
  3. Docker Compose로 Bookinfo 앱을 시작합니다.

    gcloud compute ssh "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --command='sudo docker-compose -f /tmp/compose/bookinfo.yaml up -d'
    

레거시 환경에서 배포 테스트

예시 작업 부하 구성을 마쳤으므로 이제 테스트할 수 있습니다.

  1. Cloud Shell에서 예시 작업 부하를 실행하는 Compute Engine 인스턴스의 외부 IP 주소를 찾습니다.

    gcloud compute instances describe "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --format='value(networkInterfaces[0].accessConfigs[0].natIP)'
    
  2. 브라우저를 열고 다음 URL로 이동합니다. 여기서 [EXTERNAL_IP]는 이전 단계의 IP 주소입니다.

    http://[EXTERNAL_IP]:9083/productpage
    

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

    도서 및 관련 평점에 대한 세부정보

대상 런타임 환경 프로비저닝

이 섹션에서는 GKE 클러스터를 초기화하고 Istio를 사용하여 레거시 서비스를 노출하여 GCP에 대상 환경을 구성합니다. 다음 다이어그램은 대상 런타임 환경의 대상 아키텍처를 보여줍니다.

대상 런타임 환경 프로비저닝을 위한 아키텍처

GKE 클러스터를 관리하기 위한 서비스 계정 초기화

이 가이드에서는 GKE 클러스터에서 Compute Engine 인스턴스를 관리하기 위한 서비스 계정을 만듭니다. 여기서는 기본 서비스 계정에 부여되는 권한보다 적은 권한을 제공하고자 하므로 GKE 클러스터 노드는 기본 서비스 계정 대신 이 서비스 계정을 사용합니다.

서비스 계정에 필요한 역할은 클러스터 보안 강화에 설명된 대로 monitoring.viewer, monitoring.metricWriter, logging.logWriter입니다.

  1. Cloud Shell에서 서비스 계정 이름을 저장할 환경 변수를 만듭니다.

    GKE_SERVICE_ACCOUNT_NAME=istio-migration-gke
    
  2. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create "$GKE_SERVICE_ACCOUNT_NAME" \
        --display-name="$GKE_SERVICE_ACCOUNT_NAME"
    
  3. 서비스 계정의 이메일 계정 이름을 저장하는 환경 변수를 초기화합니다.

    GKE_SERVICE_ACCOUNT_EMAIL="$(gcloud iam service-accounts list \
        --format='value(email)' \
        --filter=displayName:"$GKE_SERVICE_ACCOUNT_NAME")"
    
  4. 서비스 계정에 monitoring.viewer, monitoring.metricWriter, logging.logWriter 역할을 부여합니다.

    gcloud projects add-iam-policy-binding \
        "$(gcloud config get-value project 2> /dev/null)" \
        --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \
        --role roles/monitoring.viewer
    gcloud projects add-iam-policy-binding \
        "$(gcloud config get-value project 2> /dev/null)" \
        --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \
        --role roles/monitoring.metricWriter
    gcloud projects add-iam-policy-binding \
        "$(gcloud config get-value project 2> /dev/null)" \
        --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \
        --role roles/logging.logWriter
    

GKE 클러스터 준비

이 섹션에서는 GKE 클러스터를 실행하고 Istio를 설치하고 Istio 서비스를 노출하고 클러스터 구성을 완료합니다. 첫 단계는 GKE 클러스터를 만들어 실행하는 것입니다.

  1. Cloud Shell에서 GKE 클러스터 이름을 저장하는 환경 변수를 초기화하고 내보냅니다.

    export GKE_CLUSTER_NAME=istio-migration
    
  2. 각 영역에 하나의 노드 풀과 하나의 노드가 있는 리전별 GKE 클러스터를 만듭니다.

    gcloud container clusters create "$GKE_CLUSTER_NAME" \
        --addons=HorizontalPodAutoscaling,HttpLoadBalancing \
        --enable-autoupgrade \
        --enable-network-policy \
        --enable-ip-alias \
        --machine-type=n1-standard-4 \
        --metadata disable-legacy-endpoints=true \
        --node-locations us-east1-b,us-east1-c,us-east1-d \
        --no-enable-legacy-authorization \
        --no-enable-basic-auth \
        --no-issue-client-certificate \
        --num-nodes=1 \
        --region us-east1 \
        --service-account="$GKE_SERVICE_ACCOUNT_EMAIL"
    

    이 명령어는 이름이 istio-migration인 GKE 클러스터를 만듭니다. 이 명령어를 실행하는 데는 최대 5분이 걸릴 수 있습니다. 명령어가 완료되면 새로 만들어진 클러스터에 대한 세부정보가 Console에 표시됩니다.

    NAME             LOCATION  MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
    istio-migration  us-east1  1.11.7-gke.4    35.196.136.88  n1-standard-8  1.11.7-gke.4  3          RUNNING
    

다음으로 Helm을 사용하여 클러스터에 Istio를 설치합니다.

  1. Cloud Shell에서 Istio 네임스페이스 이름을 저장하는 환경 변수를 초기화하고 내보냅니다.

    export ISTIO_NAMESPACE=istio-system
    
  2. Istio 네임스페이스를 만듭니다.

    kubectl apply -f "$ISTIO_PATH"/install/kubernetes/namespace.yaml
    
  3. Helm의 서비 부분인 Tiller에서 사용할 Kubernetes 서비스 계정을 만듭니다.

    kubectl apply -f "$ISTIO_PATH"/install/kubernetes/helm/helm-service-account.yaml
    
  4. 클러스터에 Tiller를 설치합니다.

    "$HELM_PATH"/helm init --service-account tiller
    
  5. istio-init 차트를 설치하여 모든 Istio의 커스텀 리소스 정의를 부트스트랩합니다.

    "$HELM_PATH"/helm install "$ISTIO_PATH"/install/kubernetes/helm/istio-init --name istio-init --namespace "$ISTIO_NAMESPACE"
    

    이 명령어가 완료되면 GKE 클러스터에 설치된 새 객체에 관한 요약이 Console에 표시됩니다.

    NAME:   istio-init
    LAST DEPLOYED: Wed Mar 20 11:39:12 2019
    NAMESPACE: istio-system
    STATUS: DEPLOYED
    RESOURCES:
    ==> v1/ClusterRole
    NAME                     AGE
    istio-init-istio-system  1s
    ==> v1/ClusterRoleBinding
    NAME                                        AGE
    istio-init-admin-role-binding-istio-system  1s
    ==> v1/ConfigMap
    NAME          DATA  AGE
    istio-crd-10  1     1s
    istio-crd-11  1     1s
    ==> v1/Job
    NAME               COMPLETIONS  DURATION  AGE
    istio-init-crd-10  0/1          1s        1s
    istio-init-crd-11  0/1          1s        1s
    ==> v1/Pod(related)
    NAME                     READY  STATUS             RESTARTS  AGE
    istio-init-crd-10-2s28z  0/1    ContainerCreating  0         1s
    istio-init-crd-11-28n9r  0/1    ContainerCreating  0         1s
    ==> v1/ServiceAccount
    NAME                        SECRETS  AGE
    istio-init-service-account  1        1s
    
  6. Istio CRD가 Kubernetes api-server에 커밋되었는지 확인합니다.

    kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l
    

    예상되는 출력은 53입니다.

  7. Istio 차트를 설치합니다.

    "$HELM_PATH"/helm install "$ISTIO_PATH"/install/kubernetes/helm/istio \
        --name istio \
        --namespace "$ISTIO_NAMESPACE" \
        --set gateways.istio-ilbgateway.enabled=true \
        --set global.meshExpansion.enabled=true \
        --set global.meshExpansion.useILB=true \
        --set grafana.enabled=true \
        --set kiali.enabled=true \
        --set kiali.createDemoSecret=true \
        --set kiali.dashboard.grafanaURL=http://grafana:3000 \
        --set prometheus.enabled=true \
        --set tracing.enabled=true
    

    이 명령어를 실행하는 데는 최대 2분이 걸릴 수 있습니다. 명령어가 완료되면 GKE 클러스터에 설치된 새 객체에 관한 요약이 Console에 표시됩니다.

    NAME:   istio
    LAST DEPLOYED: Wed Mar 20 11:43:08 2019
    NAMESPACE: istio-system
    STATUS: DEPLOYED
    RESOURCES:
    

    이 요약 다음에 배포된 리소스 목록이 표시됩니다.

서비스 메시에 추가하려는 Compute Engine 인스턴스에는 Istio 제어 영역 서비스(Pilot, Mixer, Citadel)에 대한 액세스 권한이 필요하므로 istio-ingressgatewayistio-ilbgateway 서비스를 통해 이러한 서비스를 노출해야 합니다. 또한 클러스터에서 실행되는 서비스에 대한 이름을 확인하기 위해 서버에 쿼리할 수 있도록 내부 부하 분산기를 사용하여 Kubernetes DNS 서버를 노출해야 합니다. 또한 Kiali를 노출하여 서비스 메시를 시각화해야 합니다.

  1. Cloud Shell에서 Kubernetes DNS 서버를 노출할 내부 부하 분산기를 만듭니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/kube-dns-ilb.yaml
    
  2. 이름이 kube-dns-ilb인 서비스 객체에 외부 IP 주소가 할당될 때까지 기다립니다.

    kubectl get svc kube-dns-ilb -n kube-system --watch
    

    출력에 EXTERNAL-IP의 IP 주소가 표시됩니다.

    NAME           TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    kube-dns-ilb   LoadBalancer   10.35.252.144   10.128.0.3    53:31054/UDP   4d
    

    명령어를 중지하려면 Control+C를 누릅니다.

  3. 이름이 istio-ingressgateway인 서비스 객체에 외부 IP 주소가 할당될 때까지 기다립니다.

    kubectl get svc istio-ingressgateway -n "$ISTIO_NAMESPACE" --watch
    

    출력에 EXTERNAL-IP의 IP 주소가 표시됩니다.

    NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)                                                                                                                   AGE
    istio-ingressgateway   LoadBalancer   10.48.2.195   34.73.84.179   80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31145/TCP,8060:30381/TCP,853:30784/TCP,15030:32124/TCP,15031:32703/TCP   4d
    

    명령어를 중지하려면 Control+C를 누릅니다.

  4. 이름이 istio-ilbgateway인 서비스 객체에 외부 IP 주소가 할당될 때까지 기다립니다.

    kubectl get svc istio-ilbgateway -n "$ISTIO_NAMESPACE" --watch
    

    출력에 EXTERNAL-IP의 IP 주소가 표시됩니다.

    NAME               TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                         AGE
    istio-ilbgateway   LoadBalancer   10.48.14.190   10.142.0.31   15011:30805/TCP,15010:31082/TCP,8060:30953/TCP,5353:30536/TCP   2m
    

    명령어를 중지하려면 Control+C를 누릅니다.

  5. GatewayVirtualService와 함께 Kiali를 노출합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/kiali.yaml
    

Istio 메시 확장 구성

이 섹션에서는 Istio 메시 확장을 구성하여 Compute Engine 인스턴스가 서비스 메시에 조인할 수 있도록 합니다. 첫 번째 작업은 구성 파일을 만들어 메시에 조인하려는 각 Compute Engine 인스턴스에 배포하는 것입니다.

  1. Cloud Shell에서 기본 네임스페이스 이름을 저장하는 환경 변수를 초기화하고 내보냅니다.

    export SERVICE_NAMESPACE=default
    
  2. Istio에 사용되는 서비스 계정의 키를 추출합니다.

    "$ISTIO_PATH"/install/tools/setupMeshEx.sh machineCerts default "$SERVICE_NAMESPACE" all
    
  3. 구성 생성 스크립트를 위한 옵션을 저장하는 환경 변수를 초기화하고 내보냅니다.

    export GCP_OPTS="--region $(gcloud config get-value compute/region 2> /dev/null)"
    
  4. 클러스터 환경 구성 생성 스크립트를 실행합니다.

    "$ISTIO_PATH"/install/tools/setupMeshEx.sh generateClusterEnv "$GKE_CLUSTER_NAME"
    
  5. DNS 구성 생성 스크립트를 실행합니다.

    "$HOME"/solutions-istio-mesh-expansion-migration/gce-mesh-expansion-setup.sh
    

다음으로, 메시에 조인할 Compute Engine 인스턴스를 구성합니다.

  1. GCP_OPTS 변수를 설정 해제하여 초기화 스크립트에서 기본값을 선택하도록 합니다.

    unset GCP_OPTS
    
  2. 설치 스크립트의 경로를 저장하는 환경 변수를 초기화하고 내보냅니다.

    export SETUP_ISTIO_VM_SCRIPT="$ISTIO_PATH"/install/tools/setupIstioVM.sh
    
  3. Compute Engine 인스턴스 초기화를 위한 Istio 버전 설명어를 준비합니다.

    cp "$ISTIO_PATH"/istio.VERSION "$HOME"
    
  4. 클러스터 환경 구성 생성 스크립트를 실행합니다.

    "$ISTIO_PATH"/install/tools/setupMeshEx.sh gceMachineSetup "$GCE_INSTANCE_NAME"
    
  5. 인바운드 서비스에 Envoy 사이드카를 사용할 로컬 포트를 구성합니다.

    gcloud compute ssh "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --command='sudo sed -i -e "\$aISTIO_INBOUND_PORTS=9081,9082,9083,9084" /var/lib/istio/envoy/sidecar.env'
    
  6. 클러스터의 네임스페이스를 구성합니다.

    gcloud compute ssh "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --command='sudo sed -i -e "\$aISTIO_NAMESPACE='"$SERVICE_NAMESPACE"'" /var/lib/istio/envoy/sidecar.env'
    
  7. Istio를 다시 시작합니다.

    gcloud compute ssh "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --command='sudo systemctl restart istio'
    
  8. Istio가 올바르게 시작되었는지 확인합니다.

    gcloud compute ssh "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --command='sudo systemctl --type=service --state=running list-units | grep "dnsmasq\|istio\|systemd-resolved"'
    

    출력에 dnsmasq, istio, istio-auth-node-agent, systemd-resolved 서비스가 로드 및 활성화되어 실행 중임이 표시됩니다.

    dnsmasq.service                  loaded active running dnsmasq - A lightweight DHCP and caching DNS server
    istio-auth-node-agent.service    loaded active running istio-auth-node-agent: The Istio auth node agent
    istio.service                    loaded active running istio-sidecar: The Istio sidecar
    systemd-resolved.service         loaded active running Network Name Resolution
    

다음으로 Istio 서비스 메시의 Compute Engine 인스턴스에서 실행되는 서비스를 추가합니다.

  1. Cloud Shell에서 선택기 없는 Kubernetes 서비스를 만들어 Compute Engine 인스턴스에서 실행 중인 서비스를 노출합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/selectorless-services.yaml
    
  2. 예시 작업 부하가 실행 중인 Compute Engine 인스턴스의 IP 주소를 저장하는 환경 변수를 초기화합니다.

    GCE_INSTANCE_IP="$(gcloud compute instances describe "$GCE_INSTANCE_NAME" --format='value(networkInterfaces[].networkIP)')"
    
  3. 메시에 서비스를 등록합니다.

    "$ISTIO_PATH"/bin/istioctl register details "$GCE_INSTANCE_IP" http:9082 -n "$SERVICE_NAMESPACE"
    "$ISTIO_PATH"/bin/istioctl register productpage "$GCE_INSTANCE_IP" http:9083 -n "$SERVICE_NAMESPACE"
    "$ISTIO_PATH"/bin/istioctl register ratings "$GCE_INSTANCE_IP" http:9081 -n "$SERVICE_NAMESPACE"
    "$ISTIO_PATH"/bin/istioctl register reviews "$GCE_INSTANCE_IP" http:9084 -n "$SERVICE_NAMESPACE"
    

마지막으로, 현재 Compute Engine 인스턴스에서 실행 중인 메시의 서비스를 위한 VirtualServices와 해당 라우팅 경로를 구성합니다. 또한 Istio 인그레스 게이트웨이를 통해 productpage 서비스를 노출합니다.

  1. Cloud Shell에서 게이트웨이 객체를 배포하여 서비스를 노출합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/gateway.yaml
    
  2. 게이트웨이 객체에서 Compute Engine에서 실행 중인 productpage 인스턴스로 트래픽을 라우팅하는 VirtualService를 배포합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/virtualservice-productpage-vm.yaml
    
  3. ServiceEntries를 만들어 Compute Engine 인스턴스에서 실행 중인 서비스에 대한 서비스 검색을 사용 설정합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/serviceentry.yaml
    
  4. 이름이 istio-ingressgateway인 서비스 객체에 외부 IP 주소가 할당될 때까지 기다립니다.

    kubectl get svc istio-ingressgateway -n istio-system --watch
    

    출력에 EXTERNAL-IP에 대한 IP 주소가 있어야 합니다.

    NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)                                                                                                                   AGE
    istio-ingressgateway   LoadBalancer   10.48.2.195   34.73.84.179   80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31145/TCP,8060:30381/TCP,853:30784/TCP,15030:32124/TCP,15031:32703/TCP   4d
    
  5. 이름이 bookinfo-gateway인 게이트웨이 객체가 생성되었는지 확인합니다.

    kubectl get gateway --watch
    

    출력에서 게이트웨이 객체 목록에 bookinfo-gateway가 있어야 합니다.

    NAME               AGE
    bookinfo-gateway   3h
    

Istio 메시 확장 테스트

Istio를 사용하여 Compute Engine 인스턴스에서 실행 중인 예시 작업 부하를 노출했으므로 이제 테스트할 수 있습니다.

  1. Cloud Shell에서 Istio 인그레스 게이트웨이의 외부 IP 주소를 찾습니다.

    kubectl get svc istio-ingressgateway -n istio-system
    
  2. 브라우저를 열고 다음 URL로 이동합니다. 여기서 [EXTERNAL_IP]는 이전 단계의 IP 주소입니다.

    http://[EXTERNAL_IP]/productpage
    

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

    도서 및 관련 평점

서비스 메시 시각화

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

  1. Cloud Shell에서 Istio 인그레스 게이트웨이의 외부 IP 주소를 찾습니다.

    kubectl get svc istio-ingressgateway -n istio-system
        EXTERNAL_IP="$(kubectl get svc istio-ingressgateway -n istio-system -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")"
    
  2. 브라우저를 열고 다음 URL로 이동합니다. 여기서 [EXTERNAL_IP]는 이전 단계의 IP 주소입니다.

    http://[EXTERNAL_IP]:15029/kiali/console/graph/namespaces/?  edges=requestsPercentOfTotal&graphType=versionedApp&namespaces=default&injectServiceNodes=true&duration=60&pi=5000&layout=dagre
    
  3. Kiali 로그인 화면에서 다음 사용자 인증 정보를 사용하여 로그인합니다.

    • Username(사용자 이름): admin
    • Password(비밀번호): admin

    Kiali 로그인 화면

  4. 예시 작업 부하의 기본 페이지에 대한 요청을 여러 번 실행합니다.

    for i in {1..10000}; do curl -s -o /dev/null -w "%{http_code}\n"  http://"$EXTERNAL_IP"/productpage; done
    

    이 명령어를 사용하여 Bookinfo 앱으로 가는 트래픽을 생성합니다. 예상되는 출력은 각 요청(이 경우 200 OK)의 HTTP 반환 코드 목록입니다.

    200
    200
    200
    [...]
    

    현재 메시의 다이어그램이 Compute Engine에서 실행 중인 서비스로 라우팅되는 모든 트래픽과 함께 Kiali 서비스 대시보드에 표시됩니다. 모든 트래픽은 istio-ingressgateway에서 Kubernetes 서비스 productpage.default.svc.cluster.local로 라우팅되며, Compute Engine 인스턴스에서 실행 중인 productpage 마이크로서비스를 가리킵니다. Docker Compose가 Compute Engine 인스턴스에서 로컬로 라우팅을 처리하고 있으므로 그래프에 다른 마이크로서비스는 표시되지 않습니다(details, reviews, ratings).

    다이어그램이 보이지 않는 경우 Kiali 대시보드 페이지를 새로고치세요.

    현재 메시의 다이어그램

작업 부하 마이그레이션

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

  1. GKE 클러스터에서 서비스를 실행하는 pod를 배포합니다.
  2. GKE 클러스터에서 실행 중인 서비스와 Compute Engine 인스턴스에서 실행 중인 서비스 간에 트래픽을 분할하는 규칙을 구성합니다.
  3. Compute Engine 인스턴스에서 실행 중인 서비스에서 GKE 클러스터로 점진적으로 트래픽을 마이그레이션합니다.
  4. Compute Engine 인스턴스에서 실행 중인 서비스를 중지합니다.

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

작업 부하 마이그레이션을 위한 아키텍처

Istio 사이드카 주입 사용 설정

각 서비스에는 Istio 서비스 메시에 조인하기 위해 실행 중인 Envoy 사이드카 프록시가 필요합니다. 자동 사이드카 주입을 사용 설정하면 pod 구성을 수동으로 편집할 필요가 없습니다.

  1. Cloud Shell에서 Control+C를 눌러 트래픽 생성 명령어를 중지합니다.

  2. 서비스 인스턴스를 배포할 Kubernetes 네임스페이스에서 Istio 관리 자동 사이드카 주입을 사용 설정합니다.

    kubectl label namespace "$SERVICE_NAMESPACE" istio-injection=enabled
    

GKE 클러스터에 서비스 배포

이 섹션에서는 GKE 클러스터에 인스턴스를 배포하고 트래픽 일부를 이 인스턴스로 라우팅합니다.

  1. 메시에 다른 서비스를 배포하기 전에 Cloud Shell에서 ServiceEntries를 삭제합니다. 이러한 항목을 삭제하면 아직 준비되지 않은 인스턴스로 요청을 라우팅하는 경우가 방지됩니다.

    kubectl delete -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/serviceentry.yaml
    
  2. productpage, details, reviews, ratings 마이크로서비스에 대한 pod와 Kubernetes 서비스를 클러스터에 배포합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/productpage.yaml
    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/details.yaml
    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/ratings.yaml
    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/reviews.yaml
    
  3. VirtualServices 구성을 업데이트하여 Compute Engine 머신에서 실행 중인 인스턴스와 GKE 클러스터에서 실행 중인 인스턴스 간에 수신 트래픽을 분할합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/virtualservice-productpage-split.yaml
    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/virtualservice-details-split.yaml
    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/virtualservice-ratings-split.yaml
    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/virtualservice-reviews-split.yaml
    
  4. ServiceEntries를 만들어 Compute Engine 인스턴스에서 실행 중인 서비스에 대한 서비스 검색을 사용 설정합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/serviceentry.yaml
    

다음 작업은 두 환경(Compute Engine 및 GKE)의 모든 마이크로서비스 인스턴스로 전달된 트래픽을 검사하여 하이브리드 배포를 검증하는 것입니다.

Kiali를 사용하여 서비스 메시의 시각적 표현을 볼 수 있습니다.

  1. Cloud Shell에서 Istio 인그레스 게이트웨이의 외부 IP 주소를 찾습니다.

    kubectl get svc istio-ingressgateway -n istio-system
    EXTERNAL_IP="$(kubectl get svc istio-ingressgateway -n istio-system -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")"
    
  2. 브라우저를 열고 다음 URL로 이동합니다. 여기서 [EXTERNAL_IP]는 이전 단계의 IP 주소입니다.

    http://[EXTERNAL_IP]:15029/kiali/console/graph/namespaces/?edges=requestsPercentOfTotal&graphType=versionedApp&namespaces=default&injectServiceNodes=true&duration=60&pi=5000&layout=dagre
    
  3. 필요한 경우 Kiali 로그인 화면에서 다음 사용자 인증 정보로 로그인합니다.

    • Username(사용자 이름): admin
    • Password(비밀번호): admin
  4. 예시 작업 부하의 기본 페이지에 대한 요청을 여러 번 실행합니다.

    for i in {1..10000}; do curl -s -o /dev/null -w "%{http_code}\n"  http://"$EXTERNAL_IP"/productpage; done
    

    이 명령어를 사용하여 Bookinfo 앱으로 가는 트래픽을 생성합니다. 예상되는 출력은 각 요청(이 경우 200 OK)의 HTTP 반환 코드 목록입니다.

    200
    200
    200
    [...]
    

    Kiali 서비스 대시보드에서 Compute Engine에서 실행 중인 마이크로서비스 인스턴스와 GKE에서 실행 중인 인스턴스(서비스 식별자의 첫 부분에 -gke 서픽스가 있음) 간에 트래픽이 거의 균등하게 분할되는 것을 볼 수 있을 것입니다. VirtualService의 경로를 동일한 가중치를 갖도록 구성했기 때문입니다.

    다이어그램이 보이지 않는 경우 Kiali 대시보드 페이지를 새로고치세요.

    트래픽 분할을 보여주는 대시보드

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

GKE 클러스터의 배포에 자신이 생기면 서비스 및 VirtualServices를 업데이트하여 클러스터로만 트래픽을 라우팅할 수 있습니다.

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

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

  1. Cloud Shell에서 Control+C를 눌러 트래픽 생성 명령어를 중지합니다.

  2. 서비스 및 VirtualServices를 업데이트하여 GKE 클러스터의 마이크로서비스 인스턴스로 트래픽을 라우팅합니다.

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/virtualservice-gke.yaml
    

배포를 검증하려면 두 환경(Compute Engine와 GKE)의 모든 마이크로서비스 인스턴스로 전달된 트래픽을 검사합니다.

Kiali를 사용하여 서비스 메시의 시각적 표현을 볼 수 있습니다.

  1. Cloud Shell에서 Istio 인그레스 게이트웨이의 외부 IP 주소를 찾습니다.

    kubectl get svc istio-ingressgateway -n istio-system
    EXTERNAL_IP="$(kubectl get svc istio-ingressgateway -n istio-system -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")"
    
  2. 브라우저를 열고 다음 URL로 이동합니다. 여기서 [EXTERNAL_IP]는 이전 단계의 IP 주소입니다.

    http://[EXTERNAL_IP]:15029/kiali/console/graph/namespaces/?edges=requestsPercentOfTotal&graphType=versionedApp&namespaces=default&injectServiceNodes=true&duration=60&pi=5000&layout=dagre

  3. 필요한 경우 Kiali 로그인 화면에서 다음 사용자 인증 정보로 로그인합니다.

    • Username(사용자 이름): admin
    • Password(비밀번호): admin
  4. 예시 작업 부하의 기본 페이지에 대한 요청을 여러 번 실행합니다.

    for i in {1..10000}; do curl -s -o /dev/null -w "%{http_code}\n"  http://"$EXTERNAL_IP"/productpage; done
    

    이 명령어를 사용하여 Bookinfo 앱으로 가는 트래픽을 생성합니다. 예상되는 출력은 각 요청(이 경우 200 OK)의 HTTP 반환 코드 목록입니다.

    200
    200
    200
    [...]
    

    Kiali 서비스 대시보드를 열면 GKE 클러스터에서 실행 중인 마이크로서비스 인스턴스(서비스 식별자의 첫 부분에 -gke 서픽스가 있음)로 트래픽이 라우팅되고 있지만 Compute Engine에서 실행 중인 인스턴스로는 라우팅되는 트래픽이 없음을 볼 수 있을 것입니다. 다이어그램이 보이지 않는 경우 Kiali 대시보드 페이지를 새로고치세요. 각 마이크로서비스의 두 인스턴스를 배포하면서(하나는 Compute Engine 인스턴스에서 실행, 다른 하나는 GKE 클러스터에서 실행) GKE에서 실행 중인 마이크로서비스 인스턴스로만 트래픽을 라우팅하도록 VirtualServices를 구성했습니다.

    다이어그램이 보이지 않는 경우 Kiali 대시보드 페이지를 새로고치세요.

    GKE 클러스터에서 실행되는 인스턴스로만 라우팅되는 트래픽

레거시 데이터 센터 사용 중지

모든 트래픽이 GKE 클러스터로 라우팅되므로 이제 Compute Engine에서 실행 중인 마이크로서비스의 ServiceEntries를 삭제하고 Docker Compose를 중지할 수 있습니다.

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

레거시 데이터 센터 사용 중지 아키텍처

  1. Cloud Shell에서 Control+C를 눌러 트래픽 생성 명령어를 중지합니다.

  2. 메시에 다른 서비스를 배포하기 전에 ServiceEntries를 삭제합니다.

    kubectl delete -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/serviceentry.yaml
    
  3. Docker Compose와 함께 실행 중인 예시 작업 부하를 중지합니다.

    gcloud compute ssh "$GCE_INSTANCE_NAME" \
        --zone=us-east1-b \
        --command='sudo docker-compose -f /tmp/compose/bookinfo.yaml down --remove-orphans -v'
    

확장된 메시 시각화 - GKE에서만 실행

이 섹션에서는 두 환경(Compute Engine 및 GKE)의 모든 마이크로서비스 인스턴스로 전달된 트래픽을 검사하여 배포를 검증합니다.

Kiali를 사용하여 서비스 메시의 시각적 표현을 볼 수 있습니다.

  1. Cloud Shell에서 Istio 인그레스 게이트웨이의 외부 IP 주소를 찾습니다.

    kubectl get svc istio-ingressgateway -n istio-system
    EXTERNAL_IP="$(kubectl get svc istio-ingressgateway -n istio-system -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")"
    
  2. 브라우저를 열고 다음 URL로 이동합니다. 여기서 [EXTERNAL_IP]는 이전 단계의 IP 주소입니다.

    http://[EXTERNAL_IP]:15029/kiali/console/graph/namespaces/?edges=requestsPercentOfTotal&graphType=versionedApp&namespaces=default&injectServiceNodes=true&duration=60&pi=5000&layout=dagre
    
  3. 필요한 경우 Kiali 로그인 화면에서 다음 사용자 인증 정보로 로그인합니다.

    • Username(사용자 이름): admin
    • Password(비밀번호): admin
  4. 예시 작업 부하의 기본 페이지에 대한 요청을 여러 번 실행합니다.

    for i in {1..10000}; do curl -s -o /dev/null -w "%{http_code}\n"  http://"$EXTERNAL_IP"/productpage; done
    

    이 명령어를 사용하여 Bookinfo 앱으로 가는 트래픽을 생성합니다. 예상되는 출력은 각 요청(이 경우 200 OK)의 HTTP 반환 코드 목록입니다.

    200
    200
    200
    [...]
    

    Kiali 서비스 대시보드에서 GKE 클러스터의 인스턴스를 가리키는 서비스(서비스 식별자의 첫 부분에 -gke 서픽스가 있음)만 볼 수 있습니다. 관련 ServiceEntries를 삭제했으므로 Compute Engine에서 실행 중인 인스턴스를 가리키는 서비스는 더 이상 메시의 일부가 아닙니다.

    다이어그램이 보이지 않는 경우 Kiali 대시보드 페이지를 새로고치세요.

    확장된 메시 시각화

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  1. GCP Console에서 프로젝트 페이지로 이동합니다.

    프로젝트 페이지로 이동

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

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...