このドキュメントでは、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 コンソール
Google Cloud コンソールで、[IAM と管理] > [IAM] に移動します。
[Google 提供のロール付与を含む] を選択します。
[プリンシパル] リストを確認します。
必要な IAM ロールがリストに含まれているマネージド サービス アカウントがある場合、正しく構成されています。
必要な IAM ロールを含むマネージド サービス アカウントがリストに含まれていない場合は、必要な Anthos Service Mesh サービス エージェントの IAM ロール バインディングがマネージド サービス アカウントに存在しません。
Google Cloud コンソールで、Anthos Service Mesh マネージド サービス アカウントに Anthos Service Mesh サービス エージェント(
roles/anthosservicemesh.serviceAgent
)の IAM ロール バインディングを付与します。
Google Cloud CLI
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)'
ROLE
リストを確認します。リストにロールが表示されている場合は、正しく構成されています。
リストにロールがない場合、マネージド サービス アカウントのロールはすべて取り消されています。
次のコマンドを実行して、適切な 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-managed
、asm-managed-stable
、asm-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 の名前は、次のいずれかにする必要があります。
|
|
サポートされていない ControlPlaneRevision Namespace: ${NAMESPACE} | ControlPlaneRevision の Namespace は istio-system である必要があります。 |
|
${NAME} の ControlPlaneRevision に対してサポートされていないチャネル: ${CHANNEL}想定される ${OTHER_CHANNEL} | ControlPlaneRevision の名前は、以下の ControlPlaneRevision のチャンネルと一致する必要があります。
|
|
チャンネルは省略できません。空白にすることもできません | 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"
問題を解決するには:
必須の
connectgateway
API を有効にします。gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
ワークロードでローリング再起動を実行します。