マネージド Cloud Service Mesh の問題の解決

このドキュメントでは、istio.istio-system によって Pod が挿入される際にインストール ツールで生成される HTTP 400 ステータス コードのエラーやクラスタ メンバーシップ エラーなどの、Cloud Service Mesh の一般的な問題とその解決方法について説明します。

Cloud Service Mesh のトラブルシューティングについてサポートが必要な場合は、サポートの利用をご覧ください。

リビジョンが異常(エラー)として報告される

マネージド Cloud Service Mesh のサービス エージェントに必要な Identity and Access Management(IAM)ロールがない場合、一般的な Revision(s) reporting unhealthy エラーが表示されることがあります。これは通常、Terraform、Puppet、CI/CD の再構成によってロールが取り消された場合に発生します。

このエラーのトラブルシューティング手順は、Google Cloud コンソールと Google Cloud CLI のどちらを使用しているかによって異なります。

Google Cloud コンソール

  1. Google Cloud コンソールで、[IAM と管理] > [IAM] に移動します。

  2. [Google 提供のロール付与を含む] を選択します。

  3. [プリンシパル] リストを確認します。

    必要な IAM ロールを持つサービス エージェントがリストに表示されている場合は、正しく構成されています。

    リストにサービス エージェントと必要なロールが含まれていない場合は、次のステップに進みます。

  4. プロジェクトの Anthos Service Mesh サービス エージェントに、Anthos Service Mesh サービス エージェントのロール(roles/anthosservicemesh.serviceAgent)を付与します。手順については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

Google Cloud CLI

  1. Google Cloud CLI で次のコマンドを実行して、必要な IAM ロールが付与されているかどうかを確認します。

    gcloud projects get-iam-policy PROJECT_ID  \
    --flatten="bindings[].members" \
    --filter="bindings.members:serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com AND bindings.role:roles/anthosservicemesh.serviceAgent" \
    --format='table(bindings.role)'
    
  2. ROLE リストを確認します。

    リストにロールが表示されている場合は、正しく構成されています。

    リストにロールが表示されない場合、必要なロールは取り消されています。

  3. サービス エージェントに必要なロールを付与するには、次のコマンドを実行します。

     gcloud projects add-iam-policy-binding PROJECT_ID \
     --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
     --role="roles/anthosservicemesh.serviceAgent"
    

インストール ツールで HTTP 400 エラーが発生する

インストール ツールで、次のような HTTP 400 エラーが発生することがあります。

HealthCheckContainerError, message: Cloud Run error: Container failed to start.
Failed to start and then listen on the port defined by the PORT environment
variable. Logs for this revision might contain more information.

このエラーは、Kubernetes クラスタで Workload Identity を有効にしていない場合に発生することがあります。次のコマンドを使用すると有効にできます。

export CLUSTER_NAME=...
export PROJECT_ID=...
export LOCATION=...
gcloud container clusters update $CLUSTER_NAME --zone $LOCATION \
    --workload-pool=$PROJECT_ID.svc.id.goog

マネージド データプレーンの状態

次のコマンドを実行すると、マネージド データプレーンの状態が表示されます。

gcloud container fleet mesh describe --project PROJECT_ID

次の表に、マネージド データプレーンのすべての状態を示します。

状態 コード 説明
ACTIVE OK マネージド データプレーンは正常に動作しています。
DISABLED DISABLED Namespace またはリビジョンを使用するように構成されていない場合、マネージド データプレーンはこの状態になります。手順に沿って フリート API を介してマネージド Cloud Service Mesh を有効にするか、asmcli を使用してマネージド Cloud Service Mesh をプロビジョニングした後にマネージド データプレーンを有効にします。 マネージド データプレーンのステータス レポートは、名前空間またはリビジョンにアノテーションを付けてマネージド データプレーンを有効にした場合にのみ使用できます。個々の Pod にアノテーションを付けると、それらの Pod は管理されますが、名前空間またはリビジョンにアノテーションがない場合、機能の状態は DISABLED になります。
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED マネージド データプレーンには、アクティブなマネージド Cloud Service Mesh コントロール プレーンが必要です。
PROVISIONING PROVISIONING マネージド データプレーンをプロビジョニングしています。この状態が 10 分以上続く場合は、エラーが発生している可能性があります。サポートにお問い合わせください。
STALLED INTERNAL_ERROR 内部エラーのため、マネージド データプレーンの動作がブロックされています。問題が解決しない場合は、サポートにお問い合わせください
NEEDS_ATTENTION UPGRADE_FAILURES サービスを通常の状態に戻すには、マネージド データプレーンで手動操作が必要です。詳細情報と解決方法については、NEEDS_ATTENTION 状態をご覧ください。

NEEDS_ATTENTION 状態

gcloud container fleet mesh describe コマンドの出力で、マネージド データプレーンの状態が NEEDS_ATTENTION で、コードが UPGRADE_FAILURES の場合、マネージド データプレーンは特定のワークロードのアップグレードに失敗しています。詳細な分析を行うため、マネージド データプレーン サービスは、これらのワークロードに dataplane-upgrade: failed というラベルを付けます。アップグレードするには、プロキシを手動で再起動する必要があります。注意が必要な Pod のリストを取得するには、次のコマンドを実行します。

kubectl get pods --all-namespaces -l dataplane-upgrade=failed

クラスタ メンバーシップ エラー(ID プロバイダが指定されていません)

インストール ツールが次のようなクラスタ メンバーシップ エラーで失敗する場合があります。

asmcli: [ERROR]: Cluster has memberships.hub.gke.io CRD but no identity
provider specified. Please ensure that an identity provider is available for the
registered cluster.

このエラーは、クラスタを登録する前に GKE Workload Identity が有効になっていない場合に発生することがあります。コマンドラインで gcloud container fleet memberships register --enable-workload-identity コマンドを使用して、クラスタを再登録できます。

マネージド コントロール プレーンのステータスを確認する

マネージド コントロール プレーンのステータスを確認するには、gcloud container fleet mesh describe --project FLEET_PROJECT_ID を実行します。

レスポンスの membershipStates[].servicemesh.controlPlaneManagement.details フィールドに特定のエラーが説明されている場合があります。

詳細が必要な場合は、クラスタ内の ControlPlaneRevision カスタム リソースを確認してください。これは、マネージド コントロール プレーンがプロビジョニングされるか、プロビジョニングに失敗すると更新されます。

リソースのステータスを確認するには、NAME を各チャネルに対応する値(asm-managedasm-managed-stableasm-managed-rapid)に置き換えます。

kubectl describe controlplanerevision NAME -n istio-system

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

    Name:         asm-managed

    …

    Status:
      Conditions:
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               The provisioning process has completed successfully
        Reason:                Provisioned
        Status:                True
        Type:                  Reconciled
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has finished
        Reason:                ProvisioningFinished
        Status:                True
        Type:                  ProvisioningFinished
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has not stalled
        Reason:                NotStalled
        Status:                False
        Type:                  Stalled

Reconciled 条件により、マネージド コントロール プレーンが正常に動作しているかどうかを判断します。true の場合、コントロール プレーンは正常に実行されています。 Stalled の場合は、マネージド コントロール プレーンのプロビジョニング プロセスでエラーが検出されたかどうか確認します。Stalled の場合、Message フィールドに特定のエラーに関する詳細情報が含まれています。発生する可能性があるエラーについて詳しくは、Stalled コードをご覧ください。

ControlPlaneRevision の Stalled コード

ControlPlaneRevisions ステータスで Stalled 条件が true になる理由はいくつか考えられます。

理由 メッセージ 説明
PreconditionFailed GKE メンバーシップのみがサポートされていますが、${CLUSTER_NAME} は GKE クラスタではありません。 現在のクラスタは GKE クラスタではないようです。マネージド コントロール プレーンは GKE クラスタ上でのみ機能します。
サポートされていない ControlPlaneRevision 名: ${NAME} ControlPlaneRevision の名前は、次のいずれかにする必要があります。
  • asm-managed
  • asm-managed-rapid
  • asm-managed-stable
サポートされていない ControlPlaneRevision Namespace: ${NAMESPACE} ControlPlaneRevision の Namespace は istio-system である必要があります。
${NAME} の ControlPlaneRevision に対してサポートされていないチャネル: ${CHANNEL}想定される ${OTHER_CHANNEL} ControlPlaneRevision の名前は、以下の ControlPlaneRevision のチャンネルと一致する必要があります。
  • asm-managed -> regular
  • asm-managed-rapid -> rapid
  • asm-managed-stable -> stable
チャンネルは省略できません。空白にすることもできません Channel は、ControlPlaneRevision の必須フィールドです。カスタム リソースがないか、空白になっています。
サポートされていないコントロール プレーン リビジョン タイプ: ${TYPE} managed_service は、ControlPlaneRevisionType フィールドの唯一の許可フィールドです。
サポートされていない Kubernetes バージョン: ${VERSION} Kubernetes バージョン 1.15 以降がサポートされています。
Workload Identity が有効になっていません クラスタで Workload Identity を有効にしてください。
サポートされていないワークロード プール: ${POOL} ワークロード プールは ${PROJECT_ID}.svc.id.goog の形式にする必要があります。
ProvisioningFailed クラスタ リソースの更新中にエラーが発生しました Google は CRD や Webhook などのクラスタ内リソースを更新できませんでした。
MutatingWebhookConfiguration「istiod-asm-managed」には、${EXISTING_URL} という URL の Webhook が含まれていますが、${EXPECTED_URL} が想定されています インストールが中断されないように、Google は既存の Webhook を上書きしません。この動作が必要な場合は、手動で更新してください。
ValidatingWebhookConfiguration ${NAME} には URL が ${EXISTING_URL} の Webhook が含まれていますが、${EXPECTED_URL} が想定されています インストールが中断されないように、Google は既存の Webhook を上書きしません。この動作が必要な場合は、手動で更新してください。

マネージド Cloud Service Mesh が GKE クラスタに接続できない

Google では、2022 年 6 月から 2022 年 9 月の期間に、Google Kubernetes Engine(GKE)上の承認済みネットワーク、Cloud Run、Cloud Functions に関連するセキュリティに関する作業を完了しました。以前にマネージド Cloud Service Mesh を使用していて移行前に使用を停止したプロジェクトには、Cloud Run と GKE 間の通信に必要な API がありません。

このシナリオでは、マネージド Cloud Service Mesh のプロビジョニングが失敗し、Cloud Logging に次のエラー メッセージが表示されます。

Connect Gateway API has not been used in project [*PROJECT_NUMBER*] before or it is disabled.
Enable it by visiting https://console.developers.google.com/apis/api/connectgateway.googleapis.com/overview?project=[*PROJECT_NUMBER*] then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

このメッセージは、次のクエリを使用してフィルタします。

resource.type="istio_control_plane"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
severity=ERROR
jsonPayload.message=~"Connect Gateway API has not been used in project"

その間、サイドカー インジェクションや Cloud Service Mesh 関連の Kubernetes カスタム リソースのデプロイも失敗し、Cloud Logging に次の警告メッセージが表示されます。

Error creating: Internal error occurred: failed calling webhook
"rev.namespace.sidecar-injector.istio.io": failed to call webhook: an error on
the server ("unknown") has prevented the request from succeeding.

このメッセージは、次のクエリを使用してフィルタします。

resource.type="k8s_cluster"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
resource.labels.cluster_name=[*CLUSTER_NAME*]
severity=WARNING
jsonPayload.message=~"Internal error occurred: failed calling webhook"

問題を解決するには:

  1. 必須の connectgateway API を有効にします。

     gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
    
  2. マネージド Cloud Service Mesh を再インストールします

  3. ワークロードでローリング再起動を実行します。

Google Cloud APIs が有効になっていない

マネージド Cloud Service Mesh フリートで TRAFFIC_DIRECTOR コントロール プレーンの実装を使用している場合は、特定の API を有効にする必要があります。

  1. マネージド Cloud Service Mesh を使用していない場合は、「無効化が可能」と記載されている API も含めて、すべての必須の API を有効にします。

    gcloud services enable --project=[*PROJECT_ID*] \
        trafficdirector.googleapis.com \
        networkservices.googleapis.com \
        networksecurity.googleapis.com
    
  2. この変更を元に戻す自動ツールがないことを確認してください。エラーが繰り返し発生する場合は、関連する構成または許可リストを更新します。