マネージド 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 コンソール
Google Cloud コンソールで、[IAM と管理] > [IAM] に移動します。
[Google 提供のロール付与を含む] を選択します。
[プリンシパル] リストを確認します。
必要な IAM ロールを持つサービス エージェントがリストに表示されている場合は、正しく構成されています。
リストにサービス エージェントと必要なロールが含まれていない場合は、次のステップに進みます。
プロジェクトの Cloud Service Mesh サービス エージェントに、Anthos Service Mesh サービス エージェントのロール(
roles/anthosservicemesh.serviceAgent
)を付与します。手順については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
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
リストを確認します。リストにロールが表示されている場合は、正しく構成されています。
リストにロールが表示されない場合、必要なロールは取り消されています。
サービス エージェントに必要なロールを付与するには、次のコマンドを実行します。
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
state
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 を上書きしません。この動作が必要な場合は、手動で更新してください。 | |
ValidationatingWebhookConfiguration ${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 Run 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"
問題を解決するには:
必須の
connectgateway
API を有効にします。gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
ワークロードでローリング再起動を実行します。
Google Cloud APIs が有効になっていない
マネージド Cloud Service Mesh フリートで TRAFFIC_DIRECTOR
コントロール プレーンの実装を使用している場合は、特定の API を有効にする必要があります。
マネージド Cloud Service Mesh を使用していない場合は、「無効化が可能」と記載されている API も含めて、すべての必須の API を有効にします。
gcloud services enable --project=[*PROJECT_ID*] \ trafficdirector.googleapis.com \ networkservices.googleapis.com \ networksecurity.googleapis.com
この変更を元に戻す自動ツールがないことを確認してください。エラーが繰り返し発生する場合は、関連する構成または許可リストを更新します。
NodePool の Workload Identity Federation for GKE が無効になっている
次のコマンドを実行すると、マネージド Cloud Service Mesh の状態が表示されます。
gcloud container fleet mesh describe
メンバーシップの Conditions
フィールドに NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED
エラーコードが表示されることがあります。
membershipStates:
projects/test-project/locations/us-central1/memberships/my-membership:
servicemesh:
conditions:
- code: NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED
details: One or more node pools have workload identity federation disabled.
documentationLink: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
severity: ERROR
controlPlaneManagement:
details:
- code: REVISION_FAILED_PRECONDITION
details: Required in-cluster components are not ready. This will be retried
within 15 minutes.
implementation: TRAFFIC_DIRECTOR
state: FAILED_PRECONDITION
このエラーは、GKE クラスタのすべてのノードプールで Workload Identity Federation が有効になっていない場合に表示されます。これが、Cloud Service Mesh のインストールの前提条件であるためです。
このエラー メッセージを解決するには、すべてのノードプールで Workload Identity Federation を有効にするの手順に沿って操作する必要があります。有効化は、個別のクラスタのケースによって異なる場合があります。
有効にすると、エラー メッセージは自動的に削除され、クラスタは ACTIVE
状態に戻ります。問題が解決せず、さらにサポートが必要な場合は、サポートの利用をご覧ください。