マネージド 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 コマンドを使用して、クラスタを再登録できます。

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 を上書きしません。この動作が必要な場合は、手動で更新してください。