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 クラスタと一緒に管理できる他のリソースの論理グループであるフリートに精通していることを前提としています。フリートは 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 をメモします。

必要なツールをインストールする

このツールは、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. ゲートウェイで自動挿入を有効にします。必要な手順は、ゲートウェイの名前空間でデフォルトのインジェクション ラベル(例: 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-1232-2)を出力します。

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

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

      予想される出力:

      namespace/GATEWAY_NAMESPACE labeled
      

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

    ゲートウェイの名前空間にラベルが付いていない場合、ゲートウェイが 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 ゲートウェイ名前空間にアノテーションを付けるのに使用したリビジョン ラベルのどちらを使用するかによって異なります。

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

    デフォルトのインジェクション ラベルを名前空間に適用します。 次のコマンドで、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 ゲートウェイ名前空間にアノテーションを付ける際に使用した値と同じです。

    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].
      

次のステップ