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

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

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

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

マネージド Anthos Service Mesh に、Anthos Service Mesh サービス エージェントの Identity and Access Management(IAM)ロール バインディングを含む必要な Google 管理のサービス アカウントがない場合、一般的な Revision(s) reporting unhealthy エラーが発生することがあります。これは通常、Terraform、Puppet、CI / CD の再構成によって Anthos Service Mesh サービス エージェントのロールの権限が取り消された場合に発生します。

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

Google Cloud コンソール

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

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

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

    必要な IAM ロールがリストに含まれているマネージド サービス アカウントがある場合、正しく構成されています。

    必要な IAM ロールを含むマネージド サービス アカウントがリストに含まれていない場合は、必要な Anthos Service Mesh サービス エージェントの IAM ロール バインディングがマネージド サービス アカウントに存在しません。

  4. Google Cloud コンソールで、Anthos Service Mesh マネージド サービス アカウントに Anthos Service Mesh サービス エージェント(roles/anthosservicemesh.serviceAgent)の IAM ロール バインディングを付与します。

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. 次のコマンドを実行して、適切な IAM ロール バインディングを Anthos Service Mesh マネージド サービス アカウントに割り当てます。

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

istiod.istio-system によって Pod が挿入される

これは、istio-injection: enabled ラベルを置き換えていない場合に発生する可能性があります。

次のコマンドを使用して、変更用 Webhook 構成を確認してください。

kubectl get mutatingwebhookconfiguration

...
istiod-asm-managed

# may include istio-sidecar-injector

kubectl get mutatingwebhookconfiguration   istio-sidecar-injector -o yaml

# Run debug commands
export T=$(echo '{"kind":"TokenRequest","apiVersion":"authentication.k8s.io/v1","spec":{"audiences":["istio-ca"], "expirationSeconds":2592000}}' | kubectl create --raw /api/v1/namespaces/default/serviceaccounts/default/token -f - | jq -j '.status.token')

export INJECT_URL=$(kubectl get mutatingwebhookconfiguration istiod-asmca -o json | jq -r .webhooks[0].clientConfig.url)
export ISTIOD_ADDR=$(echo $INJECT_URL | 'sed s/\/inject.*//')

curl -v -H"Authorization: Bearer $T" $ISTIOD_ADDR/debug/configz

インストール ツールで 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 またはリビジョンを使用するように構成されていない場合、マネージド データプレーンはこの状態になります。手順に沿って Fleet API を介してマネージド Anthos Service Mesh を有効にするか、asmcli を使用してマネージド Anthos Service Mesh をプロビジョニングした後にマネージド データプレーンを有効にします。マネージド データプレーンのステータス レポートは、名前空間またはリビジョンにアノテーションを付けてマネージド データプレーンを有効にした場合にのみ使用できます。個々の Pod にアノテーションを付けると、それらの Pod は管理されますが、名前空間またはリビジョンにアノテーションがない場合、機能の状態は DISABLED になります。
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED マネージド データプレーンには、アクティブなマネージド Anthos 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 を上書きしません。この動作が必要な場合は、手動で更新してください。

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

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

このシナリオでは、マネージド Anthos 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"

その間、サイドカー インジェクションや Anthos 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. マネージド Anthos Service Mesh を再インストールします

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