アプリケーションの問題のデバッグ¶
アプリケーションをデプロイしたが問題が発生している場合は、次の手順でアプリケーションのトラブルシューティングを行うことができます。
ターミナル出力を確認する¶
デプロイコマンドの出力を確認して、成功したかどうかを確認します。デプロイプロセスが中断された場合は、デプロイが失敗した理由を説明するエラーメッセージが出力に表示されます。
この種の失敗は、マニフェストの構成ミスか、コマンドの間違いが原因である可能性が最も高くなります。たとえば、次の出力は、ルートトラフィックのパーセントの合計が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