コンテンツにスキップ

アプリケーションの問題のデバッグ

アプリケーションをデプロイしたが問題が発生している場合は、次の手順でアプリケーションのトラブルシューティングを行うことができます。

ターミナル出力を確認する

デプロイコマンドの出力を確認して、成功したかどうかを確認します。デプロイプロセスが中断された場合は、デプロイが失敗した理由を説明するエラーメッセージが出力に表示されます。

この種の失敗は、マニフェストの構成ミスか、コマンドの間違いが原因である可能性が最も高くなります。たとえば、次の出力は、ルートトラフィックのパーセントの合計が100になるように構成する必要があることを示しています

Error from server (InternalError): error when applying patch:
{"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"serving.knative.dev/v1\",\"kind\":\"Route\",\"metadata\":{\"annotations\":{},\"name\":\"route-example\",\"namespace\":\"default\"},\"spec\":{\"traffic\":[{\"configurationName\":\"configuration-example\",\"percent\":50}]}}\n"}},"spec":{"traffic":[{"configurationName":"configuration-example","percent":50}]}}
to:
&{0xc421d98240 0xc421e77490 default route-example STDIN 0xc421db0488 264682 false}
for: "STDIN": Internal error occurred: admission webhook "webhook.knative.dev" denied the request: mutation failed: The route must have traffic percent sum equal to 100.
ERROR: Non-zero return code '1' from command: Process exited with status 1

Routeのステータスを確認する

次のコマンドを実行して、アプリケーションをデプロイした`Route`オブジェクトの`status`を取得します

kubectl get route <route-name> --output yaml

`status`の`conditions`には、失敗した場合の理由が示されます。詳細については、Knativeのエラー条件とレポートを参照してください。

Ingress/Istioのルーティングを確認する

すべてのIngressリソースと対応するラベルをリストするには、次のコマンドを実行します

kubectl get ingresses.networking.internal.knative.dev -o=custom-columns='NAME:.metadata.name,LABELS:.metadata.labels'
NAME            LABELS
helloworld-go   map[serving.knative.dev/route:helloworld-go serving.knative.dev/routeNamespace:default serving.knative.dev/service:helloworld-go]

ラベル`serving.knative.dev/route`と`serving.knative.dev/routeNamespace`は、Ingressリソースが存在するRouteを示します。RouteとIngressがリストされている必要があります。Ingressが存在しない場合、ルートコントローラーは、Route/ServiceによってターゲットにされているRevisionの準備ができていないと考えています。後続のセクションに進み、Revisionの準備完了ステータスを診断してください。

それ以外の場合は、次のコマンドを実行して、Route用に作成されたClusterIngressを確認します

kubectl get ingresses.networking.internal.knative.dev <INGRESS_NAME> --output yaml

特に、`status:`セクションを確認します。Ingressが正常に機能している場合は、`type=Ready`の条件で`status=True`になっているはずです。それ以外の場合は、エラーメッセージが表示されます。

Ingressが`Ready`ステータスを示している場合は、対応するVirtualServiceがあるはずです。次のコマンドを実行します

kubectl get virtualservice -l networking.internal.knative.dev/ingress=<INGRESS_NAME> -n <INGRESS_NAMESPACE> --output yaml

VirtualServiceのネットワーク構成は、IngressおよびRouteの構成と一致する必要があります。VirtualServiceは現在、ステータスフィールドを公開していないため、存在し、IngressおよびRouteと一致する構成がある場合は、これらの設定が伝播するまで少し待つ必要があるかもしれません。

Istioと`istioctl`に精通している場合は、`istioctl`を使用して、Istioのガイドを参照して詳しく調べることができます。

Ingressステータスを確認する

Knativeは、`istio-ingressgateway` Serviceという名前のLoadBalancerサービスを使用します。

IngressのIPアドレスを確認するには、次を使用します

kubectl get svc -n istio-system istio-ingressgateway

外部IPアドレスがない場合は、次を使用します

kubectl describe svc istio-ingressgateway -n istio-system

IPアドレスがプロビジョニングされなかった理由を確認します。ほとんどの場合、クォータの問題が原因です。

Revisionステータスを確認する

`Route`を`Configuration`で構成する場合は、次のコマンドを実行して、デプロイ用に作成された`Revision`の名前を取得します(`Route` .yamlファイルで構成名を参照します)

kubectl get configuration <configuration-name> --output jsonpath="{.status.latestCreatedRevisionName}"

`Route`を`Revision`で直接構成する場合は、`Route` yamlファイルでリビジョン名を参照します。

次に、次のコマンドを実行します

kubectl get revision <revision-name> --output yaml

準備完了の`Revision`には、`status`に次の条件が必要です

conditions:
  - reason: ServiceReady
    status: "True"
    type: Ready

この条件が表示された場合は、次のチェックを行ってデバッグを続けます

ヒント

他の条件が表示される場合は、Knativeのエラー条件とレポートで条件の意味を調べることができます。別の方法として、Podステータスを確認することもできます。

Podステータスを確認する

すべてのデプロイメントの`Pod`を取得するには

kubectl get pods

このコマンドは、簡単なステータスを含むすべての`Pod`をリストする必要があります。例

NAME                                                      READY     STATUS             RESTARTS   AGE
configuration-example-00001-deployment-659747ff99-9bvr4   2/2       Running            0          3h
configuration-example-00002-deployment-5f475b7849-gxcht   1/2       CrashLoopBackOff   2          36s

1つを選択し、次のコマンドを使用して、その`status`の詳細情報を確認します。役立つフィールドは、`conditions`と`containerStatuses`です

kubectl get pod <pod-name> --output yaml

サイトのトラフィックを理解するために、分析とクッキーを使用しています。お客様のサイトの使用に関する情報は、その目的のためにGoogleと共有されます。詳しくはこちら。