Cloud Service Mesh と gcloud CLI を使用して GKE クラスタを作成する

このチュートリアルでは、Google Kubernetes Engine(GKE)Fleet API を使用して、新しい GKE パブリック クラスタでマネージド Cloud Service Mesh をプロビジョニングします。このチュートリアルでは、次の手順について説明します。

  1. Google Cloud プロジェクトを構成する。
  2. Cloud Service Mesh で必要な最小数の vCPU で GKE クラスタを作成する。
  3. プロジェクトのフリートに GKE クラスタを登録する。
  4. Fleet API を使用してクラスタにマネージド Cloud Service Mesh をプロビジョニングする。
  5. Ingress ゲートウェイをデプロイしてアプリケーションを公開する。
  6. サンプル アプリケーションをデプロイして、 Google Cloud コンソールの Cloud Service Mesh ダッシュボードにテレメトリー データを表示できるようにする。
  7. サンプル アプリケーションを公開してアクセスする。

Fleet API

このガイドは、GKE クラスタおよび一緒に管理できる他のリソースの論理グループであるフリートに精通していることを前提としています。フリートは GKE の概念であり、Kubernetes の概念ではありません。クラスタをフリートに登録すると、gcloud container fleet mesh update コマンドを使用して、そのクラスタにマネージド Cloud Service Mesh をプロビジョニングできます。このチュートリアルを始める際に有効にする Fleet API(gkehub.googleapis.com)により、フリートの使用が有効になります。

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このクイックスタートの終了後、クラスタを削除するとそれ以上の請求が発生しなくなります。詳細については、クリーンアップをご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.

    Enable the APIs

  8. プロジェクト ID をメモします。
  9. 必要なツールをインストールする

    このツールは、Cloud Shell またはローカルマシンで実行できます。Cloud Shell で必要なすべてのツールがプリインストールされます。

    Cloud Shell

    Cloud Shell は、Debian ベースの Linux オペレーティング システムを実行している g1-small Compute Engine 仮想マシン(VM)をプロビジョニングします。Cloud Shell を使用する利点は次のとおりです。

    • Cloud Shell には、gcloudkubectlgit、必要な他のコマンドライン ツールが含まれています。

    • Cloud Shell の $HOME ディレクトリには 5 GB の永続ストレージ スペースがあります。

    • テキスト エディタを選択できます。

      • コードエディタ。Cloud Shell ウィンドウの上部にある をクリックしてアクセスします。

      • Emacs、Vim、Nano。Cloud Shell のコマンドラインからアクセスします。

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    ローカル PC

    1. 次のツールがインストールされていることを確認してください。

    2. Google Cloud CLI で認証します。

      gcloud auth login --project PROJECT_ID
      
    3. コンポーネントを更新します。

      gcloud components update
      

    GKE クラスタを作成する

    1. 次のコマンドを実行して、Cloud Service Mesh に必要な最小数の vCPU でクラスタを作成します。コマンドのプレースホルダを次の情報に置き換えます。

      • CLUSTER_NAME: クラスタの名前。名前には、小文字の英数字と - のみを使用できます。先頭には英字、末尾には英数字を使用し、40 文字以下にする必要があります。
      • PROJECT_ID: クラスタが作成されるプロジェクト ID。
      • CLUSTER_LOCATION: クラスタのゾーンus-central1-a など)。
      gcloud container clusters create CLUSTER_NAME \
          --project=PROJECT_ID \
          --zone=CLUSTER_LOCATION \
          --machine-type=e2-standard-4 \
          --num-nodes=2 \
          --workload-pool=PROJECT_ID.svc.id.goog
      

      クラスタの作成には数分かかります。クラスタの作成中、gcloud コマンドから次の内容が出力されます。

      Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
      

      作成に成功すると、次のような出力が表示されます。

      Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done.
      Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
      To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID
      kubeconfig entry generated for CLUSTER_NAME.
      NAME: CLUSTER_NAME
      LOCATION: CLUSTER_LOCATION
      MASTER_VERSION: 1.20.10-gke.1600
      MASTER_IP: 198.51.100.1
      MACHINE_TYPE: e2-standard-4
      NODE_VERSION: 1.20.10-gke.1600
      NUM_NODES: 2
      STATUS: RUNNING
      
    2. クラスタとのやり取りに必要な認証情報を取得します。

      gcloud container clusters get-credentials CLUSTER_NAME \
          --project=PROJECT_ID \
          --zone=CLUSTER_LOCATION
      

      予想される出力:

      Fetching cluster endpoint and auth data.
      kubeconfig entry generated for CLUSTER_NAME.
      
    3. kubectl の現在のコンテキストをクラスタに設定します。

      kubectl config set-context CLUSTER_NAME
      

      予想される出力:

      Context "CLUSTER_NAME" created.
      

    Cloud Service Mesh をプロビジョニングする

    クラスタを作成してからこのページを閉じていない場合、プレースホルダには、gcloud container clusters create コマンドに入力した値が設定されています。

    1. プロジェクトのフリートで Cloud Service Mesh を有効にします。

      gcloud container fleet mesh enable --project PROJECT_ID
      

      出力は次のようになります。

      Waiting for Feature Service Mesh to be created...done.
      
    2. プロジェクトのフリートにクラスタを登録します。

      gcloud container fleet memberships register CLUSTER_NAME-membership \
        --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \
        --enable-workload-identity \
        --project PROJECT_ID
      

      出力は次のようになります。

       Waiting for membership to be created...done.
       Finished registering to the Fleet.
      
    3. Fleet API を使用して、クラスタにマネージド Cloud Service Mesh をプロビジョニングします。

      gcloud container fleet mesh update \
        --management automatic \
        --memberships CLUSTER_NAME-membership \
        --project PROJECT_ID
      

      出力は次のようになります。

      Waiting for Feature Service Mesh to be updated...done.
      
    4. クラスタでマネージド Cloud Service Mesh が有効になり、使用可能な状態になっていることを確認します。

      gcloud container fleet mesh describe --project PROJECT_ID
      

      Cloud Service Mesh がプロビジョニングされ、クラスタで使用可能な状態になるまでに 10 分ほどかかることがあります。controlPlaneManagement.state: DISABLED または controlPlaneManagement.state: PROVISIONING が表示された場合は、controlPlaneManagement.state: ACTIVE が表示されるまで、数分ごとに前のコマンドを再実行する必要があります。

      出力は次のようになります。

      createTime: '2022-07-06T01:05:39.110120474Z'
      membershipSpecs:
        projects/123456789123/locations/global/memberships/your-cluster-membership:
          mesh:
            management: MANAGEMENT_AUTOMATIC
      membershipStates:
        projects/123456789123/locations/global/memberships/your-cluster-membership:
          servicemesh:
            controlPlaneManagement:
              details:
              - code: REVISION_READY
                details: 'Ready: asm-managed'
              state: ACTIVE
            dataPlaneManagement:
              details:
              - code: OK
                details: Service is running.
              state: ACTIVE
          state:
            code: OK
            description: 'Revision(s) ready for use: asm-managed.'
            updateTime: '2022-07-06T01:19:24.243993678Z'
      name: projects/your-project-id/locations/global/features/servicemesh
      resourceState:
        state: ACTIVE
      spec: {}
      state:
        state: {}
      updateTime: '2022-07-06T01:19:27.475885687Z'
      

    サンプルコードをダウンロードする

    このチュートリアルで使用するサンプルコードを含む git リポジトリのクローンを作成します。

       git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git
    

    このチュートリアルの以降のセクションでは、DIR_PATH 変数を使用します。クローンを作成した anthos-service-mesh-packages リポジトリのパス(例: ./anthos-service-mesh-packages)にこの変数を設定します。

    Ingress ゲートウェイをデプロイする

    Cloud Service Mesh には、サービス メッシュの一部としてゲートウェイをデプロイし、管理するためのオプションがあります。ゲートウェイでは、メッシュのエッジで動作し、受信または送信 HTTP / TCP 接続を処理するロードバランサを記述します。ゲートウェイは、メッシュ内外に送信されるトラフィックをきめ細かく制御する Envoy プロキシです。

    1. Ingress ゲートウェイの名前空間をまだ作成していない場合は作成します。ゲートウェイはユーザー ワークロードであり、コントロール プレーンの名前空間にデプロイすることはおすすめしません。GATEWAY_NAMESPACE は、名前空間の名前に置き換えます。

      kubectl create namespace GATEWAY_NAMESPACE
      

      予想される出力:

      namespace/GATEWAY_NAMESPACE created
      
    2. ゲートウェイで自動挿入を有効にします。必要な手順は、ゲートウェイの Namespace でデフォルトのインジェクション ラベル(例: istio-injection=enabled)とリビジョン ラベルのどちらを使用するかによって異なります。デフォルトのリビジョンタグとリビジョン ラベルは、サイドカー インジェクタ Webhook によって使用され、挿入されたプロキシを特定のコントロール プレーンのリビジョンに関連付けます。

      デフォルトのインジェクション ラベル

      デフォルトのインジェクション ラベルを名前空間に適用します。

      kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
      

      リビジョン ラベル

      1. 次のコマンドを使用して、istiod のリビジョン ラベルを探します。

        kubectl get deploy -n istio-system -l app=istiod -o \
          "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
        

        このコマンドは、Cloud Service Mesh バージョンに対応するリビジョン ラベル(asm-11910-9 など)を出力します。

      2. リビジョン ラベルを Namespace に適用します。次のコマンドで、REVISION は前の手順でメモした istiod リビジョン ラベルの値です。

        kubectl label namespace GATEWAY_NAMESPACE \
          istio.io/rev=REVISION --overwrite
        

        予想される出力:

        namespace/GATEWAY_NAMESPACE labeled
        

      出力中のメッセージ "istio.io/rev" not found は無視します。このメッセージは、今まで Namespace に istio.io/rev ラベルが付いていなかったことを意味しており、Cloud Service Mesh の新規インストールや新規デプロイでは想定される状態です。Namespace に istio.io/revistio-injection の両方のラベルがあると自動挿入が失敗するため、Cloud Service Mesh ドキュメント内のすべての kubectl label コマンドで両方のラベルを明示的に指定します。

      ゲートウェイの Namespace にラベルが付いていないと、ゲートウェイが auto イメージを pull するときに istio-ingressgateway Pod が ImagePullBackOff エラーで失敗します。このイメージは Webhook で置き換える必要があります。

    3. anthos-service-mesh-packages リポジトリからサンプルの Ingress ゲートウェイ .yaml 構成ファイルをダウンロードします。

    4. サンプルの Ingress ゲートウェイ .yaml 構成をそのまま適用するか、必要に応じて変更します。

      kubectl apply -n GATEWAY_NAMESPACE \
        -f CONFIG_PATH/istio-ingressgateway
      

      予想される出力:

      deployment.apps/istio-ingressgateway created
      poddisruptionbudget.policy/istio-ingressgateway created
      horizontalpodautoscaler.autoscaling/istio-ingressgateway created
      role.rbac.authorization.k8s.io/istio-ingressgateway created
      rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created
      service/istio-ingressgateway created
      serviceaccount/istio-ingressgateway created
      

    ゲートウェイのベスト プラクティスの詳細を確認してください。

    Online Boutique のサンプルをデプロイする

    anthos-service-mesh-packages リポジトリの Online Boutique サンプル アプリケーションは、microservices-demo リポジトリの元のマニフェスト セットから変更されています。ベスト プラクティスに従い、各サービスは、一意のサービス アカウントを持つ個別の名前空間にデプロイします。

    1. アプリケーションの名前空間を作成します。

      kubectl apply -f \
        DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
      

      予想される出力:

      namespace/ad created
      namespace/cart created
      namespace/checkout created
      namespace/currency created
      namespace/email created
      namespace/frontend created
      namespace/loadgenerator created
      namespace/payment created
      namespace/product-catalog created
      namespace/recommendation created
      namespace/shipping created
      
    2. 自動サイドカー インジェクション(自動挿入)を有効にします。必要なコマンドは、デフォルトのインジェクション ラベルistio-injection=enabled など)を使用するか、Ingress ゲートウェイ Namespace にアノテーションを付けるのに使用したリビジョン ラベルを使用するかによって異なります。

      デフォルトのインジェクション ラベル

      デフォルトのインジェクション ラベルを Namespace に適用します。次のコマンドで、GATEWAY_NAMESPACE は、Ingress ゲートウェイ名前空間にアノテーションを付ける際に使用した値です。

      for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
        kubectl label namespace $ns istio-injection=enabled istio.io/rev-
      done;
      

      予想される出力:

      namespace/ad labeled
      namespace/cart labeled
      namespace/checkout labeled
      namespace/currency labeled
      namespace/email labeled
      namespace/frontend labeled
      namespace/loadgenerator labeled
      namespace/payment labeled
      namespace/product-catalog labeled
      namespace/recommendation labeled
      namespace/shipping labeled
      

      リビジョン ラベル

      アプリケーションの名前空間にリビジョン ラベルを適用します。次のコマンドで、REVISION は、Ingress ゲートウェイ Namespace にアノテーションを付ける際に使用した値です。

      for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do
        kubectl label namespace $ns istio.io/rev=REVISION --overwrite
      done;
      

      予想される出力:

      namespace/ad labeled
      namespace/cart labeled
      namespace/checkout labeled
      namespace/currency labeled
      namespace/email labeled
      namespace/frontend labeled
      namespace/loadgenerator labeled
      namespace/payment labeled
      namespace/product-catalog labeled
      namespace/recommendation labeled
      namespace/shipping labeled
      
    3. サンプル アプリケーションをクラスタにデプロイします。

      1. サービス アカウントとデプロイを作成します。

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
        

        予想される出力:

        serviceaccount/ad created
        deployment.apps/adservice created
        serviceaccount/cart created
        deployment.apps/cartservice created
        serviceaccount/checkout created
        deployment.apps/checkoutservice created
        serviceaccount/currency created
        deployment.apps/currencyservice created
        serviceaccount/email created
        deployment.apps/emailservice created
        serviceaccount/frontend created
        deployment.apps/frontend created
        serviceaccount/loadgenerator created
        deployment.apps/loadgenerator created
        serviceaccount/payment created
        deployment.apps/paymentservice created
        serviceaccount/product-catalog created
        deployment.apps/productcatalogservice created
        serviceaccount/recommendation created
        deployment.apps/recommendationservice created
        serviceaccount/shipping created
        deployment.apps/shippingservice created
        
      2. サービスを作成します。

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/kubernetes-manifests/services
        

        予想される出力:

        service/adservice created
        service/cartservice created
        service/checkoutservice created
        service/currencyservice created
        service/emailservice created
        service/frontend created
        service/frontend-external created
        service/paymentservice created
        service/productcatalogservice created
        service/recommendationservice created
        service/shippingservice created
        
      3. サービス エントリを作成します。

        kubectl apply -f \
         DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
        

        予想される出力:

        serviceentry.networking.istio.io/allow-egress-googleapis created
        serviceentry.networking.istio.io/allow-egress-google-metadata created
        

    アプリケーションの公開とアクセス

    アプリケーションを公開するには、いくつかの方法があります。このガイドでは、上記でデプロイした Ingress ゲートウェイを使用します。Online Boutique アプリケーションを公開するその他の方法については、Online Boutique サンプル アプリケーションのデプロイガイドのアプリケーションの公開とアクセスのセクションをご覧ください。

    1. フロントエンド サービス用の GatewayVirtualService をデプロイします

      kubectl apply -f \
          DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
      

      予想される出力:

      gateway.networking.istio.io/frontend-gateway created
      virtualservice.networking.istio.io/frontend-ingress created
      
    2. Ingress ゲートウェイの外部 IP アドレスを取得します。プレースホルダは、次の情報に置き換えます。

      • GATEWAY_SERVICE_NAME: Ingress ゲートウェイ サービスの名前。変更せずにサンプル ゲートウェイをデプロイした場合は、istio-ingressgateway になります。
      • GATEWAY_NAMESPACE: Ingress ゲートウェイをデプロイした名前空間。
      kubectl get service GATEWAY_SERVICE_NAME \
          -n GATEWAY_NAMESPACE
      

      出力は次のようになります。

      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

      この例では、Ingress ゲートウェイの IP アドレスは 35.239.7.64 です。

    3. ブラウザでアプリケーションに移動して、インストールを確認します。

      http://EXTERNAL_IP/
      

    サービス メッシュ ダッシュボードを表示する

    サイドカー プロキシが挿入されたクラスタにワークロードをデプロイすると、 Google Cloud コンソールの Cloud Service Mesh ページで、Cloud Service Mesh が提供するすべてのオブザーバビリティ機能を確認できます。ワークロードをデプロイした後、Google Cloud コンソールにテレメトリー データが表示されるまでに 1~2 分ほどかかります。

    Google Cloud コンソールでの Cloud Service Mesh へのアクセスは、Identity and Access Management(IAM)によって制御されます。Cloud Service Mesh のページにアクセスするには、プロジェクト オーナーがユーザーに対してプロジェクト編集者または閲覧者のロール、またはより限定的なロール( Google Cloud コンソールでの Cloud Service Mesh に対するアクセスを制御するを参照)を付与する必要があります。

    1. Google Cloud コンソールで、[Cloud Service Mesh] に移動します。

      [Cloud Service Mesh] に移動する

    2. メニューバーのプルダウン リストから Google Cloud プロジェクトを選択します。

    3. 複数のサービス メッシュがある場合は、[サービス メッシュ] プルダウン リストからメッシュを選択します。

    詳細については、 Google Cloud コンソールでの Cloud Service Mesh の確認をご覧ください。

    クリーンアップ

    クリーンアップの前に、相互 TLS の詳細を確認される場合は、Cloud Service Mesh の例: mTLS をご覧ください。

    • クラスタを維持して Online Boutique のサンプルを削除するには:

      1. アプリケーションの名前空間を削除します。

        kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
        

        予想される出力:

        namespace "ad" deleted
        namespace "cart" deleted
        namespace "checkout" deleted
        namespace "currency" deleted
        namespace "email" deleted
        namespace "frontend" deleted
        namespace "loadgenerator" deleted
        namespace "payment" deleted
        namespace "product-catalog" deleted
        namespace "recommendation" deleted
        namespace "shipping" deleted
        
      2. サービス エントリを削除します。

        kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
        

        予想される出力:

        serviceentry.networking.istio.io "allow-egress-googleapis" deleted
        serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
        
    • 追加料金の発生を回避するには、クラスタを削除します。

      1. 次のコマンドを実行します。

        gcloud container clusters delete CLUSTER_NAME \
            --project=PROJECT_ID \
            --zone=CLUSTER_LOCATION
        
      2. [Do you want to continue (Y/n)?] というプロンプトが表示されたら「y」と入力します。

        数分後、次の出力が表示されます。

        Deleting cluster CLUSTER_NAME...done.
        Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
        

    次のステップ