GKE 用 Anthos Service Mesh クイックスタート

このチュートリアルでは、Google 提供のツール(asmcli)を使用して、Anthos Service Mesh 1.11.8-asm.4 を新しい Google Kubernetes Engine(GKE)クラスタにインストールします。このチュートリアルでは、次のことについて説明します。

  1. Google Cloud プロジェクトを構成する。
  2. Anthos Service Mesh で必要な、最小限の vCPU を使用して GKE クラスタを作成する。
  3. クラスタ内コントロール プレーンを使用して、Anthos Service Mesh をインストールする。
  4. サンプル アプリケーションをデプロイして、Google Cloud コンソールの Anthos Service Mesh ダッシュボードにテレメトリー データを表示できるようにする。
  5. サンプル アプリケーションを公開してアクセスする。

このクイックスタートでは、説明をわかりやすくするため、次の方法を選択しています。

  1. Anthos Service Mesh 認証局を有効にする(Mesh CA)
  2. Ingress ゲートウェイをデプロイしてアプリケーションを公開する

費用

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

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

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

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Kubernetes Engine API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Kubernetes Engine API を有効にします。

    API を有効にする

  8. プロジェクト ID をメモします。

Anthos Service Mesh には他の API も必要ですが、asmcli により、API が自動的に有効になります。課金費用を抑えるため、asmcli スクリプトは GKE Enterprise API を有効にしません。GKE Enterprise API が有効になっている場合、Google Cloud コンソールにはいくつかの違いがあります。詳細については、GKE Enterprise と Anthos Service Mesh の UI の違いをご覧ください。

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

ツールは、Cloud Shell か、Linux を実行するローカルマシンで実行できます。Cloud Shell で必要なすべてのツールがプリインストールされます。macOS には bash の古いバージョンが付属しているため、サポートされませんので注意してください。

Cloud Shell

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

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

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

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

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

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

Cloud Shell を使用するには:

  1. Google Cloud コンソールに移動します。
  2. Google Cloud プロジェクトを選択します。
  3. Google Cloud コンソール ウィンドウの上部にある [Cloud Shell をアクティブにする] ボタンをクリックします。

    Google Cloud Platform コンソール

    Google Cloud コンソールの一番下にある新しいフレームの中で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。

    Cloud Shell セッション

ローカル Linux コンピュータ

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

  2. gcloud CLI を使用して認証します。

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

    gcloud components update
    
  4. kpt から検出できるように、パスに git を設定します。

GKE クラスタを作成する

  1. 次のコマンドを実行して、Anthos 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.
    

asmcli をダウンロードする

このセクションでは、asmcli のダウンロード方法について説明します。

  1. Anthos Service Mesh 1.11.8 をインストールするバージョンを現在の作業ディレクトリにダウンロードします。

    curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.11 > asmcli
    

    予想される出力:

    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
    100  167k  100  167k    0     0   701k      0 --:--:-- --:--:-- --:--:--  701k
    
  2. スクリプトを実行可能にします。

    chmod +x asmcli
    

Anthos Service Mesh をインストールする

Anthos Service Mesh は、次のオプションを指定して asmcli ツールを実行し、前に作成したクラスタにインストールします。クラスタを作成してからこのページを閉じていない場合、プレースホルダには、gcloud container clusters create コマンドに入力した値が設定されています。

./asmcli install \
  --project_id PROJECT_ID \
  --cluster_name CLUSTER_NAME \
  --cluster_location CLUSTER_LOCATION \
  --fleet_id FLEET_PROJECT_ID \
  --output_dir DIR_PATH \
  --enable_all  \
  --ca mesh_ca
  • --project_id--cluster_name--cluster_location: クラスタが属するプロジェクト ID、クラスタ名、クラスタゾーンまたはリージョンを指定します。
  • --fleet_id: フリート ホスト プロジェクトのプロジェクト ID。このオプションを指定しない場合、asmcli は、クラスタ登録時にクラスタが作成されたプロジェクトを使用します。
  • --output_dir: asmclianthos-service-mesh パッケージをダウンロードして、istioctl、サンプル、マニフェストを含むインストール ファイルを抽出するディレクトリを指定する場合に指定します。それ以外の場合、asmcli はファイルを tmp ディレクトリにダウンロードします。相対パスまたはフルパスを指定できます。環境変数 $PWD はここでは機能しません。
  • --enable_all: スクリプトが次の処理を行います。
    • 必要な IAM 権限を付与する。
    • 必要な Google API を有効にする。
    • メッシュを識別するラベルをクラスタに設定する。
    • クラスタを登録する(まだ登録されていない場合)。

    asmcli ツールが完了するまで、数分かかる場合があります。このツールは、進捗状況がわかるように情報メッセージを出力します。

    インストール成功時に予想される出力:

    asmcli: Successfully installed ASM.
    

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

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

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

      kubectl create namespace GATEWAY_NAMESPACE
      

      予想される出力:

      namespace/GATEWAY_NAMESPACE created
      
    2. ゲートウェイの名前空間にリビジョン ラベルを適用することで、ゲートウェイで自動インジェクションを有効にします。リビジョン ラベルは、サイドカー インジェクタ Webhook によって使用され、挿入されたプロキシを特定のコントロール プレーン リビジョンに関連付けます。

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

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

        このコマンドは、Anthos Service Mesh バージョンに対応するリビジョン ラベル(例: asm-1118-4)を出力します。

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

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

        予想される出力:

        namespace/GATEWAY_NAMESPACE labeled
        
    3. samples/gateways/istio-ingressgateway/ ディレクトリにある Ingress ゲートウェイ構成のサンプルをそのままデプロイするか、必要に応じて変更します。

      kubectl apply -n GATEWAY_NAMESPACE \
        -f DIR_PATH/samples/gateways/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. 自動サイドカー インジェクション(自動挿入)を有効にします。ここで使用されるリビジョン ラベルは、Ingress ゲートウェイ名前空間にアノテーションを付ける際に使用したものと同じです。アプリケーションの名前空間にリビジョン ラベルを適用します。次のコマンドで、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 コンソールの Anthos Service Mesh ページで、Anthos Service Mesh が提供するすべてのオブザーバビリティ機能を確認できます。ワークロードをデプロイした後、Google Cloud コンソールにテレメトリー データが表示されるまでに 1~2 分ほどかかることがあります。

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

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

      Anthos の [サービス メッシュ] に移動する

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

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

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

    クリーンアップ

    クリーンアップの前に、相互 TLS の詳細を確認される場合は、Anthos 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].
        

    次のステップ

    以下の詳細を確認する