オブザーバビリティの問題のトラブルシューティング

このページでは、Google Cloud コンソールの Anthos Service Mesh ページの問題のトラブルシューティング方法について説明します。

サービスリストに特定のサービスが表示されない

リストにサービスがない場合は、Kubernetes サービス構成がクラスタに存在していることを確認してください。

すべての Kubernetes サービスのリストを取得するには:

 kubectl get services --all-namespaces

特定の名前空間内の Kubernetes サービスのリストを取得するには:

kubectl get services -n YOUR_NAMESPACE

サービスのテレメトリー データがない、または正しくない

デフォルトでは、Anthos Service Mesh をインストールすると、Google Cloud プロジェクトで Cloud Monitoring と Cloud Logging が有効になります。テレメトリー データを報告するため、サービス Pod を呼び出す各サイドカー プロキシが Cloud Monitoring API と Cloud Logging API を呼び出します。ワークロードをデプロイしてから Google Cloud コンソールにテレメトリー データが表示されるまでに 1~2 分かかります。Anthos Service Mesh は、サービス ダッシュボードを自動的に最新の状態に保ちます。

  • 指標の場合、サイドカー プロキシは約 1 分ごとに Cloud Monitoring API を呼び出します。

  • トポロジグラフを更新する場合は、サイドカー プロキシが約 1 分ごとに増分レポートを、約 10 分ごとに完全なレポートを送信します。

  • ロギングの場合、サイドカー プロキシは約 10 秒ごとに Cloud Logging API を呼び出します。

  • トレースの場合、Cloud Trace を有効にする必要があります。トレースは、構成したサンプリング頻度でレポートされます(通常は 100 リクエストごとに 1 回)。

Anthos Service Mesh 指標ページに表示されるのは、HTTP サービスの指標のみです。指標が表示されない場合は、次の点を確認してください。

サイドカー プロキシが挿入されたことを確認する

アプリケーションのサービスの名前空間内のすべての Pod にサイドカー プロキシが挿入されていることを確認します。

kubectl get pod -n YOUR_NAMESPACE --all

次に前のコマンドの出力例を示します。ここで、READY 列はワークロードごとに 2 つのコンテナ(プライマリ コンテナとサイドカー プロキシのコンテナ)があることを示しています。

NAME                    READY   STATUS    RESTARTS   AGE
YOUR_WORKLOAD           2/2     Running   0          20s
...

コンテナが 2 つ表示されない場合は、名前空間に istio-injection=enabled ラベルが付いていることを確認します。これは、自動サイドカー インジェクションが有効であることを示します。

  kubectl get ns --show-labels

出力例:

NAME              STATUS   AGE   LABELS
default           Active   35m   istio-injection=enabled
istio-system      Active   34m   istio-injection=disabled,istio-operator-managed=Reconcile
  • istio-injection=enabled ラベルが表示されない場合は、次のコマンドを実行して、自動サイドカー インジェクションを有効にします。

    kubectl label namespace YOUR_NAMESPACE istio-injection=enabled --overwrite
  • istio-injection=enabled ラベルが表示され、ワークロードが存在する既存の Google Kubernetes Engine クラスタに Anthos Service Mesh をインストールした場合は、サイドカー プロキシを挿入または現在の Anthos Service Mesh バージョンで更新するために実行中の Pod を再起動する必要があります。詳細については、既存の Pod のサイドカーの更新をご覧ください。

Kubernetes Service のポート名を確認する

Kubernetes Service のポート名をチェックして、Anthos Service Mesh がサービスを HTTP サービスとみなしていることを確認します。Anthos Service Mesh に含めるには、サービスポートに名前を付ける必要があります。名前にはポートのプロトコルを含める必要があります。次に例を示します。

apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http

サービスポート名には、name: protocol[-suffix] の構文で接尾辞を含めることができます。ここで、角かっこはダッシュで始まるオプションの接尾辞を示します。次に例を示します。

kind: Service
metadata:
  name: myservice
spec:
  ports:
  - number: 3306
    name: mysql
  - number: 80
    name: http-web

指標を Google Cloud コンソールに表示するには、サービスポートに httphttp2grpc のいずれかのプロトコルを指定する必要があります。https プロトコルによって名づけられたサービスポートは tcp として扱われ、これらのサービスの指標は表示されません。

必要な API が有効であることを確認する

Anthos Service Mesh には、テレメトリーを報告して表示するための API がいくつか必要です。gcloud services list コマンドを使用すると、プロジェクトで利用できる API を確認できます。また、必要な API をすべて有効にして確実に入手することもできます。

  1. Google Cloud CLI のデフォルト プロジェクトを設定します。

    gcloud config set project YOUR_PROJECT_ID
  2. 必要な API をすべて有効にします。

    gcloud services enable \
       container.googleapis.com \
       compute.googleapis.com \
       monitoring.googleapis.com \
       logging.googleapis.com \
       meshca.googleapis.com \
       meshtelemetry.googleapis.com \
       meshconfig.googleapis.com \
       iamcredentials.googleapis.com \
       anthos.googleapis.com

ASM Mesh Data Plane Service Account があることを確認する

  1. Google Cloud コンソールで [IAM] ページを開きます。

    [IAM] ページを開く

  2. プロジェクトを選択します。

  3. メンバーリストで、ASM Mesh Data Plane Service Account という名前のサービス アカウントを探します。

  4. サービス アカウントがない場合は作成します。

    curl --request POST \
      --header "Authorization: Bearer $(gcloud auth print-access-token)" \
      --data '' \
      https://meshconfig.googleapis.com/v1alpha1/projects/YOUR_PROJECT_ID:initialize

ワークロードが実行されていることを確認する

  1. Google Cloud コンソールで、GKE の [ワークロード] ページを開きます。

    GKE ワークロードを開く

  2. プロジェクトを選択します。

  3. クラスタのフィルタを追加します。アプリケーションと Anthos Service Mesh のすべてのワークロードが稼働中で、ステータスが OK であることを確認します。リソース(CPU、メモリなど)の制限により、ワークロードが失敗する可能性があります。その場合、より多くのリソースでクラスタをアップグレードする必要があります。詳細については、クラスタのサイズ変更をご覧ください。

アプリケーションがリクエストを処理していることを確認する

アプリケーションが実際にリクエストを送信していることを確認します。QPS が低くても、トラフィックを受信している必要があります。

トポロジグラフに表示がない

トポロジグラフにサービスが表示されず、エラー メッセージ No data available to graph. Check your filters and try again が表示される場合は、次の点を確認してください。

メッシュ ID を確認する

クラスタに正しい mesh_id ラベルがあることを確認します。

  1. プロジェクト番号を取得します。これは、プロジェクトを作成するときに自動的に生成される一意の番号です。

  2. クラスタに mesh_id: proj-PROJECT_NUMBER の形式の mesh_id ラベルがあることを確認します。

    mesh_id ラベルがないか、正しくない場合は、修正します。詳細については、既存のクラスタのラベルの追加または更新をご覧ください。

  3. 次の環境変数を設定します。

    • プロジェクト ID を設定します。

      export PROJECT_ID=YOUR_PROJECT_ID
    • プロジェクト番号を設定します。

      export PROJECT_NUMBER=YOUR_PROJECT_NUMBER
    • クラスタ名を設定します。

      export CLUSTER_NAME=YOUR_CLUSTER_NAME
    • CLUSTER_LOCATION をクラスタのゾーンまたはリージョンに設定します。

      export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION
    • ワークロード プールを設定します。

      export WORKLOAD_POOL=${PROJECT_ID}.svc.id.goog
    • メッシュ ID を設定します。

      export MESH_ID="proj-${PROJECT_NUMBER}"
  4. 以前に使用したのと同じオプションを使用して Anthos Service Mesh を再デプロイします。

  5. Anthos Service Mesh をインストールする前にクラスタで実行されていたワークロードの場合、現在の Anthos Service Mesh を使用するように、サイドカー プロキシを更新する必要があります。

    kubectl rollout restart YOUR_DEPLOYMENT -n YOUR_NAMESPACE