GKE Autopilot クラスタで Cloud Service Mesh をプロビジョニングする


このガイドでは、Google Kubernetes Engine(GKE)Autopilot クラスタでマネージド Cloud Service Mesh を設定する方法について説明します。Cloud Service Mesh は、Istio をベースとしたフルマネージド サービス メッシュです。

このチュートリアルでは、デフォルト設定の単一の GKE Autopilot クラスタで動作するプロダクション レディなサービス メッシュを構成する方法について説明します。環境を設計する際は、Cloud Service Mesh プロビジョニング ガイドを詳細に確認することもおすすめします。

GKE Autopilot でマネージド Cloud Service Mesh を実行するメリット

Autopilot モードで GKE を使用すると、Google によりクラスタの設定と管理が自動的に処理されます。Autopilot モードでは、クラスタの運用が効率化され、アプリケーションに集中できます。同様に、マネージド Cloud Service Mesh は、数ステップでプロビジョニングできるフルマネージド サービス メッシュです。

  • マネージド Cloud Service Mesh は、Fleet API を使用してプロビジョニングできます(istioctl などのクライアントサイド ツールは必要ありません)。
  • Cloud Service Mesh では、昇格した権限をコンテナに付与しなくても、サイドカー プロキシがワークロードに自動的に挿入されます。
  • 追加の構成なしでメッシュとサービスの詳細なダッシュボードを表示し、その指標を使用することでサービスレベル目標(SLO)とアラートを構成して、アプリケーションの健全性をモニタリングできます。
  • マネージド Cloud Service Mesh コントロール プレーンは自動的にアップグレードされ、最新のセキュリティ パッチと機能を確実に利用できます。
  • Cloud Service Mesh マネージド データプレーンは、ワークロードのサイドカー プロキシを自動的にアップグレードするため、プロキシのアップグレードとセキュリティ パッチが利用可能になったときに、サービスを自分で再起動する必要がありません。
  • Cloud Service Mesh はサポートされているプロダクトであり、標準のオープンソースの Istio API を使用して構成できます。サポートされている機能をご覧ください。

目標

  • GKE Autopilot クラスタを作成する
  • Fleet API を使用してマネージド Cloud Service Mesh をプロビジョニングする
  • メッシュの上り(内向き)ゲートウェイを専用の Namespace にデプロイする
  • サンプル アプリケーションをデプロイする
  • Cloud Service Mesh を構成してサービス間通信に厳格な相互 TLS(mTLS)認証を適用する
  • Cloud Service Mesh ダッシュボードを表示してサービスが mTLS で接続していることを確認する

費用

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

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

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

Cloud Shell には、このチュートリアルに必要なソフトウェア(kubectlgcloud CLIHelmTerraform など)がプリインストールされています。Cloud Shell を使用しない場合は、gcloud CLI をインストールする必要があります。

  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. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  10. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.containerAdmin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

環境を設定する

環境の設定には gcloud CLI または Terraform を使用します。

gcloud

  1. 環境変数を設定します。

    PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    
  2. Mesh API を有効にします。

    gcloud services enable mesh.googleapis.com
    

    mesh.googleapis.com を有効にして API を有効にする

    API 目的 無効化が可能か
    meshconfig.googleapis.com Cloud Service Mesh は、Mesh Configuration API を使用して、メッシュから Google Cloud に構成データをリレーします。また、Mesh Configuration API を有効にすると、Google Cloud コンソールの Cloud Service Mesh のページにアクセスして、Cloud Service Mesh 認証局を使用できます。 いいえ
    meshca.googleapis.com マネージド Cloud Service Mesh で使用される Cloud Service Mesh 認証局に関連します。 ×
    container.googleapis.com Google Kubernetes Engine(GKE)クラスタを作成するために必要です。 いいえ
    gkehub.googleapis.com メッシュをフリートとして管理するために必要です。 いいえ
    monitoring.googleapis.com メッシュ ワークロードのテレメトリーをキャプチャするために必要です。 ×
    stackdriver.googleapis.com Service UI を使用するために必要です。 いいえ
    opsconfigmonitoring.googleapis.com Google Cloud 外のクラスタで Service UI を使用するために必要です。 いいえ
    connectgateway.googleapis.com マネージド Cloud Service Mesh コントロール プレーンがメッシュ ワークロードにアクセスできるようにするために必要です。 ○*
    trafficdirector.googleapis.com 高可用性でスケーラブルなマネージド コントロール プレーンを実現します。 ○*
    networkservices.googleapis.com 高可用性でスケーラブルなマネージド コントロール プレーンを実現します。 ○*
    networksecurity.googleapis.com 高可用性でスケーラブルなマネージド コントロール プレーンを実現します。 ○*

Terraform

gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT

GKE クラスタを作成する

Autopilot モードで GKE クラスタを作成する

gcloud

  1. フリートのメンバーとして登録されたクラスタを作成します。

    gcloud container clusters create-auto asm-cluster \
        --location="us-central1" \
        --enable-fleet
    
  2. クラスタがフリートに登録されていることを確認します。

    gcloud container fleet memberships list
    

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

    NAME: asm-cluster
    EXTERNAL_ID:
    LOCATION: us-central1
    

    Cloud Service Mesh を構成するうえで必要になるため、メンバーシップ名をメモします。

Terraform

GKE クラスタの作成には google_container_cluster リソースを使用します。クラスタの作成時にクラスタがフリートに追加されるように、fleet ブロックを設定します。

resource "google_container_cluster" "cluster" {
  name                = "asm-cluster"
  location            = var.region
  deletion_protection = false # Warning: Do not set deletion_protection to false for production clusters

  enable_autopilot = true
  fleet {
    project = data.google_project.project.name
  }
}

data "google_project" "project" {}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

マネージド Cloud Service Mesh をプロビジョニングする

クラスタのフリート メンバーで、servicemesh 機能を使用して、マネージド Cloud Service Mesh をプロビジョニングします。

gcloud

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

    gcloud container fleet mesh enable
    
  2. メッシュの自動管理を有効にします。

    gcloud container fleet mesh update \
        --management=automatic \
        --memberships=MEMBERSHIP_NAME \
        --location=us-central1
    

    MEMBERSHIP_NAME は、クラスタがフリートに登録されていることを確認した際に表示されたメンバーシップ名に置き換えます。

Terraform

Mesh API を有効にするには、google_project_service リソースを使用します。

google_gke_hub_feature リソースと google_gke_hub_feature_membership リソースを使用して、クラスタでマネージド Cloud Service Mesh を構成します。

resource "google_project_service" "mesh_api" {
  service = "mesh.googleapis.com"

  disable_dependent_services = true
}

resource "google_gke_hub_feature" "feature" {
  name     = "servicemesh"
  location = "global"

  depends_on = [
    google_project_service.mesh_api
  ]
}

resource "google_gke_hub_feature_membership" "feature_member" {
  location   = "global"
  feature    = google_gke_hub_feature.feature.name
  membership = google_container_cluster.cluster.fleet.0.membership
  membership_location = google_container_cluster.cluster.location
  mesh {
    management = "MANAGEMENT_AUTOMATIC"
  }
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

コントロール プレーンがアクティブであることを確認する

controlPlaneManagement.stateACTIVE になるまで待ちます。この処理には 15 分ほどかかる場合があります。

watch -n 30 gcloud container fleet mesh describe

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

membershipSpecs:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    mesh:
      management: MANAGEMENT_AUTOMATIC
membershipStates:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    servicemesh:
      controlPlaneManagement:
        details:
        - code: REVISION_READY
          details: 'Ready: asm-managed'
        state: ACTIVE
      dataPlaneManagement:
        details:
        - code: PROVISIONING
          details: Service is provisioning.
        state: PROVISIONING
    state:
      code: OK
      description: 'Revision(s) ready for use: asm-managed.'

Autopilot クラスタはワークロードをデプロイするまでノードをプロビジョニングしないため、上り(内向き)ゲートウェイをデプロイするまで、dataPlaneManagement セクションは PROVISIONING 状態のままです。

メッシュの上り(内向き)ゲートウェイをデプロイする

このセクションでは、サンプル アプリケーションの受信トラフィックを処理するために、メッシュの上り(内向き)ゲートウェイをデプロイします。上り(内向き)ゲートウェイは、メッシュのエッジで動作するロードバランサで、受信または送信 HTTP / TCP 接続を処理します。

ゲートウェイを専用の Namespace にデプロイしてその Deployment にラベルを付け、Cloud Service Mesh コントロール プレーンによって安全に管理され、自動的にアップグレードされるようにします。

  1. クラスタにアクセスできるように認証情報をダウンロードします。

    gcloud container clusters get-credentials asm-cluster --location=us-central1
    
  2. ゲートウェイのデプロイ用の Namespace を作成します。

    kubectl create namespace bank-gateways
    
  3. Cloud Service Mesh コントロール プレーンによってゲートウェイ構成がデプロイに自動的に挿入されるように、Namespace にラベルを追加します。

    kubectl label namespace bank-gateways istio-injection=enabled
    
  4. 上り(内向き)ゲートウェイを Namespace にデプロイします。

    Helm

    helm repo add istio https://istio-release.storage.googleapis.com/charts
    helm repo update
    helm install --wait --namespace bank-gateways \
        --set resources.requests.cpu=250m \
        --set resources.requests.memory=512Mi \
        --set resources.requests.ephemeral-storage=1Gi \
        --set resources.limits.cpu=250m \
        --set resources.limits.memory=512Mi \
        --set resources.limits.ephemeral-storage=1Gi \
        istio-ingressgateway istio/gateway
    

    kubectl

    kubectl apply -n bank-gateways \
        -k https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/samples/gateways/istio-ingressgateway
    kubectl -n bank-gateways wait "deployment/istio-ingressgateway"  \
        --for=condition=available --timeout=240s
    

    本番環境にデプロイする場合は、適切なリソース リクエストを設定してください。GKE Autopilot は、requests に設定されたリソース値のみを考慮します(limits ではありません)。Istio プロジェクトでは、パフォーマンスとスケーラビリティに関する情報を公開しています。

サンプル アプリケーションをデプロイする

  1. デプロイ用の Kubernetes の Namespace を作成します。

    kubectl create namespace bank-sample
    
  2. Cloud Service Mesh によりサンプル Pod にサイドカー プロキシが自動的に挿入されるように、Namespace にラベルを追加します。

    kubectl label namespace bank-sample istio-injection=enabled
    
  3. サンプル アプリケーションをデプロイします。

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml
    kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
    
  4. アプリケーションの準備ができるまで待ちます。これには数分かかります。

    watch kubectl -n bank-sample get pods
    

    アプリケーションの準備が整うと、出力は次のようになります。

    NAME                                 READY   STATUS    RESTARTS   AGE
    accounts-db-0                        2/2     Running   0          2m16s
    balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
    contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
    frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
    ledger-db-0                          2/2     Running   0          3m6s
    ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
    loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
    transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
    userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
    
  5. Istio の Gateway リソースと VirtualService リソースを作成して、上り(内向き)ゲートウェイの背後にあるアプリケーションを公開します。

    kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    
  6. サンプル アプリケーションへのリンクを取得します。

    INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  7. ブラウザで、リンクをクリックしてサンプル アプリケーションを開きます。デフォルトのユーザー名とパスワードでログインしてアプリケーションを表示します。

相互 TLS を適用する

STRICT 相互 TLS(mTLS)モードが有効になっていることを確認します。メッシュのデフォルトの PeerAuthentication ポリシーを istio-system Namespace に適用します。

  1. 次のマニフェストを mesh-peer-authn.yaml として保存します。

    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
      namespace: "istio-system"
    spec:
      mtls:
        mode: STRICT
    
  2. マニフェストをクラスタに適用します。

    kubectl apply -f mesh-peer-authn.yaml
    

この構成をオーバーライドするには、特定の Namespace に PeerAuthentication リソースを作成します。

Cloud Service Mesh ダッシュボードを確認する

  1. Google Cloud コンソールで [Cloud Service Mesh] に移動し、メッシュのダッシュボードを表示します。

    Cloud Service Mesh に移動する

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

    メッシュにあるすべてのマイクロサービスを含む概要の表が表示され、マイクロサービス間の接続が図示されます。各マイクロサービスについて、この表には SRE の「ゴールデン シグナル」のうち 3 つが表示されます。

    • トラフィック - 1 秒あたりのリクエスト数
    • エラー率 - パーセンテージ
    • レイテンシ - ミリ秒

    これらの指標は、マイクロサービスによって処理される実際のトラフィックに基づいています。frontend Service には、サンプル アプリケーションの一部としてデプロイされた loadgenerator クライアントによって、定常的なテスト トラフィックが自動的に送信されます。Cloud Service Mesh は、指標、ログ、トレース(オプション)を Google Cloud Observability に自動的に送信します。

  3. 表内の frontend サービスをクリックすると、サービスの概要ダッシュボードが表示されます。サービスの追加指標に加え、インバウンド接続とアウトバウンド接続のビジュアリゼーションが表示されます。また、サービスのモニタリングとアラート用に、サービスレベル オブジェクト(SLO)を作成することもできます。

mTLS が有効になっていることを確認する

パネルのセキュリティ リンクをクリックすると、frontend サービスのセキュリティの概要が表示されます。表とビジュアリゼーションには、マイクロサービス間のインバウンド接続とアウトバウンド接続のそれぞれに緑色の鍵アイコンが表示されます。このアイコンは、接続が認証と暗号化に mTLS を使用していることを示します。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

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

プロジェクトを削除する

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

個々のリソースを削除する

使用している既存のプロジェクトを削除しない場合は、リソースを個別に削除します。

gcloud

  1. サンプル アプリケーションとゲートウェイを削除します。

    kubectl delete namespace bank-sample
    kubectl delete namespace bank-gateways
    
  2. Cloud Service Mesh をアンインストールする手順を行います。

  3. GKE クラスタを削除します。

    gcloud container clusters delete --region us-central1 asm-cluster --quiet
    

Terraform

Terraform で作成したリソースを削除します。

  terraform destroy

次のステップ