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

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

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

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

マネージド データプレーンのステータス

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

kubectl -n istio-system get dataplanecontrol -o custom-columns=REVISION:.spec.revision,STATE:status.state

マネージド データプレーンをデプロイしてから約 10 分後に次のことを確認します。

REVISION            STATE
Regular             Ready

空のステータス

列ヘッダー REVISIONSTATE 以外の出力が表示されていない場合、データプレーン コントローラがクラスタにデプロイされていないことを意味します。この問題を解決するには、次のコマンドを実行して、クラスタがフリートに登録されているかどうかを確認します。

gcloud container hub memberships list --project=PROJECT_ID
  • gcloud コマンドからの出力が空か、クラスタの名前がない場合は、クラスタがフリートに登録されていないことを意味します。この問題を解決するには、インストール ツールを再実行して、コマンドラインに --enable-registration が含まれていることを確認します(ツールの再実行時にも --option cni-managed を追加する必要があります)。

  • 出力にクラスタの名前が含まれている場合は、次のコマンドを実行して、フリートで Anthos Service Mesh を有効にします。

    gcloud alpha container hub mesh enable --project=PROJECT_ID
    

<nil> ステータス

これは CNI DaemonSet に問題があることを示しています。次のコマンドを実行して、CNI DaemonSet が正常に動作していることを確認します。

kubectl get pods -n kube-system -l k8s-app=istio-cni-node

CNI DaemonSet が正常に動作している場合、出力は次のようになります。

NAME                   READY   STATUS    RESTARTS   AGE
istio-cni-node-8w88v   3/3     Running   0          12h
istio-cni-node-c69mn   3/3     Running   0          12h
istio-cni-node-n9pnr   3/3     Running   0          12h
  • CNI Pod が出力にない場合は、インストール ツールを再実行し、--option cni-managed が含まれていることを確認します(ツールの再実行時に、クラスタがフリートに登録されるように --enable-registration も含める必要があります)。

  • CNI Pod が正常でない場合は、Pod の詳細を取得します。次のコマンドで、CNI_POD は正常でない Pod の名前に置き換えます。

    kubectl -n kube-system describe pod CNI_POD
    

    Cloud サポートに連絡して、正常でない Pod の詳細を伝えます。

クラスタ メンバーシップ エラー(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 hub memberships register --enable-workload-identity