Istio メッシュ拡張を使用して移行をサポートする: チュートリアル

このチュートリアルでは、オンプレミス(レガシー)のデータセンターから Google Cloud Platform(GCP)に機能を 1 つずつ移行できるようにするために、サービス メッシュを初期化して構成する方法を説明します。このチュートリアルと付随するコンセプトに関する記事は、サービス メッシュを使用してレガシー環境または GCP に動的にトラフィックをルーティングする必要があるシステム管理者、開発者、エンジニアの方を対象としています。

サービス メッシュを使用すると、ネットワーク機能がサービス機能から切り離されるため、移行作業もリファクタリング作業も複雑さが大幅に軽減されます。さらに、サービス メッシュは負荷分散、トラフィック管理、モニタリング、可観測性にも対応するため、ネットワーク運用の複雑さも軽減されます。

次の図は、サービス メッシュを使用して、レガシー環境内で稼働するマイクロサービスか GCP のいずれかにトラフィックをルーティングする方法を示しています。

サービス メッシュを使用して、レガシー環境内で稼働するマイクロサービスか GCP のいずれかにトラフィックをルーティングする

このチュートリアルでは、次のソフトウェアを使用します。

  • Ubuntu ServerContainer-Optimized OS: このチュートリアルで使用するオペレーティング システム
  • Docker Community Edition: コンテナ化されたワークロードを実行するためのプラットフォーム
  • Docker Compose: Docker アプリを定義して実行する際に使用するツール
  • Helm: Kubernetes アプリをインストールして管理するためのツール
  • Istio: オープンソースのサービス メッシュ
  • Kiali: Istio サービス メッシュを可視化するためのツール
  • Envoy: Istio サービス メッシュに参加する際に使用するサイドカー プロキシ

目標

  • オンプレミスのデータセンターをシミュレートする環境を初期化する。
  • オンプレミスのデータセンターにサンプル ワークロードをデプロイする。
  • オンプレミスのデータセンターで実行中のワークロードをテストする。
  • GCP 上で移行先の環境を構成する。
  • ワークロードをオンプレミスのデータセンターから移行先の環境に移行する。
  • 移行先の環境で実行中のワークロードをテストする。
  • オンプレミスのデータセンターを廃止する。

料金

このチュートリアルでは、以下を含む GCP の課金対象となるコンポーネントを使用しています。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  4. Compute Engine と GKE API を有効にします。

    APIを有効にする

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳しくは、クリーンアップをご覧ください。

環境を準備する

このチュートリアルのほとんどの手順は、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 のバージョン ID を格納する環境変数を初期化します。

    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 のバージョン ID、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"
    

サンプル ワークロード

このチュートリアルで使用する Bookinfo アプリは、書籍情報を表示する、4 層からなる多言語マイクロサービス アプリです。このアプリは Kubernetes 上で稼働するように設計されていますが、最初に Docker と Docker Compose を使用して Compute Engine インスタンス上にデプロイします。Docker Compose で、YAML 記述子を使用してマルチコンテナ アプリを記述します。これにより、単一のコマンドを実行するだけでアプリを起動できます。

このサンプル ワークロードはすでにコンテナ化されていますが、この手法はコンテナ化されていないサービスにも適用できます。その場合、移行を予定しているサービスをコンテナ化するには「モダナイゼーション フレーズ」を追加します。

Bookinfo アプリは、次の 4 つのマイクロサービス コンポーネントからなります。

  • productpage: 書籍情報ページにデータを取り込むために、detailsratingsreviews の各マイクロサービスを呼び出します。
  • details: 書籍に関する情報を提供します。
  • reviews: 書評を格納します。
  • ratings: 書評に伴う書籍ランキング情報を返します。

環境をセットアップする

最初に、このチュートリアルに必要となる次の環境を構成します。

  • オンプレミス(レガシー)のデータセンターをシミュレートする環境
  • 移行先をシミュレートする環境

このチュートリアルは、GCP 以外の環境(オンプレミスや他のクラウド プロバイダ)から GCP に移行できるよう支援することを目的としています。この種の移行では、GCP 以外の環境と GCP 環境の間にセキュアな通信チャネルを設定する必要があるため、ネットワークが複雑になります。

このチュートリアルでは、どちらの環境も GCP 内で実行します。そうすることで、ブートストラップ フェーズが 1 つだけになり、セットアップ プロセスが簡易化されます。

レガシー環境をプロビジョニングする

このセクションでは、GCP 以外の独立した環境をエミュレートする GCP 環境を構成するために、Compute Engine インスタンスを初期化し、移行対象のワークロードをデプロイします。次の図は、レガシー環境のターゲット アーキテクチャを示しています。

レガシー環境をプロビジョニングするためのアーキテクチャ

ファイアウォール ルールを作成する

マイクロサービスとデータベースに対する外部アクセスを許可するファイアウォール ルールを作成します。

  • 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 は、パフォーマンスに影響を与えずにサンプル ワークロードを実行できる、最小のマシンタイプです。このコマンドが完了すると、コンソールに新しいインスタンスの詳細が表示されます。

    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 App をデプロイします。

  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
    

    書籍に関する情報と、関連する評価を示すページが表示されます。

    書籍に関する情報と、関連する書評

移行先のランタイム環境をプロビジョニングする

このセクションでは、GCP で移行先の環境を構成するために、GKE クラスタを初期化し、Istio を使用してレガシー サービスを公開します。次の図は、移行先のランタイム環境のターゲット アーキテクチャを示しています。

移行先の環境をプロビジョニングするためのアーキテクチャ

GKE クラスタを管理するためのサービス アカウントを初期化する

このチュートリアルでは、GKE クラスタ内の Compute Engine インスタンスを管理するためのサービス アカウントを作成します。GKE クラスタノードではデフォルトのサービス アカウントではなく、ここで作成するサービス アカウントを使用します。これにより、デフォルトのサービス アカウントに付与される権限よりも少ない権限に制限できます。

クラスタのセキュリティの強化で説明されているように、サービス アカウントに必要な役割は monitoring.viewermonitoring.metricWriterlogging.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.viewermonitoring.metricWriterlogging.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. 1 つのノードプールと各ゾーン内に単一のノードを持つ、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 分かかります。コマンドが完了すると、コンソールに新しく作成されたクラスタの詳細が表示されます。

    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 のすべてのカスタム リソース定義をブートストラップするための istio-init チャートをインストールします。

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

    このコマンドが完了すると、コンソールに、GKE クラスタにインストールされた新しいオブジェクトの要約が表示されます。

    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 に commit されたことを確認します。

    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 クラスタにインストールされた新しいオブジェクトの要約が表示されます。

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

    この要約に続いて、デプロイ済みのリソースが一覧表示されます。

サービス メッシュに追加する Compute Engine インスタンスは Istio のコントロール プレーン サービス(Pilot、Mixer、Citadel)にアクセスする必要があります。したがって、これらのサービスを istio-ingressgateway サービスと istio-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 メッシュ拡張を構成する

このセクションでは、Compute Engine インスタンスがサービス メッシュに参加できるように、Istio メッシュ拡張を構成します。最初のタスクとして、メッシュと結合させる各 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"'
    

    出力に、dnsmasqistioistio-auth-node-agentsystemd-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 で、Compute Engine インスタンスで実行中のサービスを公開するセレクタなしの Kubernetes サービスを作成します。

    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 インスタンスで現在実行中のサービスごとに、VirtualService と対応するルーティング ルールを構成します。また、Istio Ingress Gateway を介して productpage サービスを公開します。

  1. Cloud Shell で、サービスを公開する Gateway オブジェクトをデプロイします。

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/gateway.yaml
    
  2. Gateway オブジェクトから Compute Engine 内で稼働している productpage インスタンスにトラフィックをルーティングする VirtualService をデプロイします。

    kubectl apply -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/virtualservice-productpage-vm.yaml
    
  3. Compute Engine インスタンスで実行中のサービスごとに、サービス ディスカバリを有効にするための ServiceEntry を作成します。

    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 メッシュ拡張をテストする

Compute Engine インスタンスで実行中のサンプル ワークロードを、Istio を使用して公開する作業が完了したら、その作業結果をテストします。

  1. Cloud Shell で、Istio Ingress Gateway の外部 IP アドレスを調べます。

    kubectl get svc istio-ingressgateway -n istio-system
    
  2. ブラウザを開き、以下の URL に移動します。[EXTERNAL_IP] は、前のステップで確認した IP アドレスです。

    http://[EXTERNAL_IP]/productpage
    

    書籍に関する情報と、関連する評価を示すページが表示されます。

    書籍および関連する評価

サービス メッシュを可視化する

このセクションでは、Kiali を使用してサービス メッシュを視覚的に表示します。

  1. Cloud Shell で、Istio Ingress Gateway の外部 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 ログイン画面で、次の認証情報を使用してログインします。

    • ユーザー名: admin
    • パスワード: admin

    Kiali ログイン画面

  4. サンプル ワークロードのメインページに対するリクエストを複数回実行します。

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

    このコマンドを使用すると、Bookinfo アプリへのトラフィックが生成されます。想定される出力は、各リクエストの HTTP 戻りコード(この例の場合は 200 OK)です。

    200
    200
    200
    [...]
    

    Kiali サービス ダッシュボードに現在のメッシュの図が表示され、Compute Engine で実行中のサービスにルーティングされたすべてのトラフィックが示されます。すべてのトラフィックは、istio-ingressgateway から、Compute Engine インスタンスで実行中のマイクロサービス productpage を指す Kubernetes Service productpage.default.svc.cluster.local にルーティングされています。グラフには他のマイクロサービス(detailsreviewsratings)は表示されません。Docker Compose は、Compute Engine インスタンスでローカルにルーティングを処理しているためです。

    図が表示されない場合は、Kiali ダッシュボードのページを更新してください。

    現在のメッシュを示す図

ワークロードを移行する

このセクションでは、サンプル ワークロードのコンポーネントを Compute Engine インスタンスから GKE クラスタに移行します。サンプル ワークロードのサービスごとに、次の操作を行います。

  1. サービスを実行するポッドを GKE クラスタにデプロイします。
  2. GKE クラスタで実行中のサービスと Compute Engine インスタンスで実行中のサービスとの間でトラフィックを分割するルールを構成します。
  3. Compute Engine インスタンスで実行されているサービスから GKE クラスタへ、徐々にトラフィックを移行します。
  4. Compute Engine インスタンスで実行中のサービスを停止します。

次の図は、このセクションで説明するシステムのターゲット アーキテクチャを示しています。

ワークロードを移行するためのアーキテクチャ

Istio サイドカー インジェクションを有効化する

サービスを Istio サービス メッシュに参加させるためには、サービスごとに Envoy サイドカー プロキシを実行する必要があります。自動サイドカー インジェクションを有効化すると、手動によるポッド構成の編集を回避できます。

  1. Cloud Shell で、Control+C キーを押してトラフィック生成コマンドを停止します。

  2. サービス インスタンスをデプロイする Kubernetes 名前空間で、Istio が管理する自動サイドカー インジェクションを有効化します。

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

GKE クラスタにサービスをデプロイする

このセクションでは、インスタンスを GKE クラスタにデプロイし、それらのインスタンスにトラフィックの一部をルーティングします。

  1. メッシュに他のサービスをデプロイする前に、Cloud Shell で ServiceEntry を削除します。これらのエントリを削除することで、まだ準備ができていないインスタンスにリクエストをルーティングしないようにします。

    kubectl delete -f "$HOME"/solutions-istio-mesh-expansion-migration/kubernetes/bookinfo/istio/serviceentry.yaml
    
  2. productpagedetailsreviewsratings の各マイクロサービスのポッドと 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. Compute Engine マシンで実行中のインスタンスと GKE クラスタで実行中のインスタンスとの間で受信トラフィックを分割するように VirtualService 構成を更新します。

    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. Compute Engine インスタンスで実行中のサービスごとに、サービス ディスカバリを有効にするための ServiceEntry を作成します。

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

次のタスクとして、2 つの環境(Compute Engine と GKE)内のすべてのマイクロサービス インスタンスに送信されるトラフィックを調べて、ハイブリット デプロイを検証します。

Kiali を使用して、サービス メッシュを視覚的に表示します。

  1. Cloud Shell で、Istio Ingress Gateway の外部 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 ログイン画面で、必要に応じて次の認証情報を使用してログインします。

    • ユーザー名: admin
    • パスワード: admin
  4. サンプル ワークロードのメインページに対するリクエストを複数回実行します。

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

    このコマンドを使用すると、Bookinfo アプリへのトラフィックが生成されます。想定される出力は、各リクエストの HTTP 戻りコード(この例の場合は 200 OK)です。

    200
    200
    200
    [...]
    

    Kiali サービス ダッシュボードで、Compute Engine で実行中のマイクロサービス インスタンスと GKE で実行中のマイクロサービス インスタンス(サービス ID の最初の部分に -gke 接尾辞が付加されているもの)との間でほぼ均等にトラフィックが分割されていることを確認できます。これは、VirtualService の各ルートが同じ重みになるよう構成したためです。

    図が表示されない場合は、Kiali ダッシュボードのページを更新してください。

    トラフィックの分割を示すダッシュボード

GKE クラスタにのみトラフィックをルーティングする

GKE クラスタ内の Deployment に問題がなければ、クラスタのみにトラフィックをルーティングするよう Service と VirtualService を更新します。

次の図は、このセクションで説明するシステムのターゲット アーキテクチャを示しています。

GKE クラスタにのみトラフィックをルーティングする

  1. Cloud Shell で、Control+C キーを押してトラフィック生成コマンドを停止します。

  2. GKE クラスタ内のマイクロサービス インスタンスにトラフィックをルーティングするよう Service と VirtualService を更新します。

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

Deployment を検証するには、2 つの環境(Compute Engine と GKE)内のすべてのマイクロサービス インスタンスに送信されるトラフィックを調べます。

Kiali を使用して、サービス メッシュを視覚的に表示します。

  1. Cloud Shell で、Istio Ingress Gateway の外部 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 ログイン画面で、必要に応じて次の認証情報を使用してログインします。

    • ユーザー名: admin
    • パスワード: admin
  4. サンプル ワークロードのメインページに対するリクエストを複数回実行します。

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

    このコマンドを使用すると、Bookinfo アプリへのトラフィックが生成されます。想定される出力は、各リクエストの HTTP 戻りコード(この例の場合は 200 OK)です。

    200
    200
    200
    [...]
    

    Kiali サービス ダッシュボードで、GKE クラスタで実行中のマイクロサービス インスタンス(サービス ID の最初の部分に -gke 接尾辞が付加されているもの)にトラフィックがルーティングされている一方、Compute Engine で実行中のインスタンスにはトラフィックがまったくルーティングされていないことを確認できます。図が表示されない場合は、Kiali ダッシュボードのページを更新してください。各マイクロサービスの 2 つのインスタンス(Compute Engine インスタンスで実行するインスタンスと、GKE クラスタで実行するインスタンス)をデプロイしましたが、GKE クラスタで実行中のマイクロサービス インスタンスにのみトラフィックをルーティングするように VirtualService を構成しました。

    図が表示されない場合は、Kiali ダッシュボードのページを更新してください。

    GKE クラスタで実行中のインスタンスにのみルーティングされるトラフィック

レガシー データセンターを廃止する

すべてのトラフィックが GKE クラスタにルーティングされるようになったため、Compute Engine で実行されているマイクロサービスの ServiceEntry を削除して、Docker Compose を停止できます。

次の図は、このセクションで説明するシステムのターゲット アーキテクチャを示しています。

レガシー データセンターを廃止する際のアーキテクチャ

  1. Cloud Shell で、Control+C キーを押してトラフィック生成コマンドを停止します。

  2. メッシュに他のサービスをデプロイする前に、ServiceEntry を削除します。

    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 でのみ実行)

このセクションでは、Deployment を検証するために、2 つの環境(Compute Engine と GKE)内のすべてのマイクロサービス インスタンスに送信されるトラフィックを調べます。

Kiali を使用して、サービス メッシュを視覚的に表示します。

  1. Cloud Shell で、Istio Ingress Gateway の外部 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 ログイン画面で、必要に応じて次の認証情報を使用してログインします。

    • ユーザー名: admin
    • パスワード: admin
  4. サンプル ワークロードのメインページに対するリクエストを複数回実行します。

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

    このコマンドを使用すると、Bookinfo アプリへのトラフィックが生成されます。想定される出力は、各リクエストの HTTP 戻りコード(この例の場合は 200 OK)です。

    200
    200
    200
    [...]
    

    Kiali サービス ダッシュボードに、GKE クラスタ内のインスタンスを指すサービス(サービス ID の最初の部分に -gke 接尾辞が付加されているもの)のみが表示されるはずです。一方、Compute Engine で実行中のインスタンスを指すサービスはメッシュに含まれなくなっています。これは、関連する ServiceEntry を削除したためです。

    図が表示されない場合は、Kiali ダッシュボードのページを更新してください。

    拡張メッシュを可視化する

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...