跳至內容

偵錯應用程式問題

如果您已部署應用程式但遇到問題,可以使用下列步驟來疑難排解應用程式。

檢查終端機輸出

檢查您的部署命令輸出,以查看是否成功。如果您的部署程序終止,您應該會在輸出中看到錯誤訊息,說明部署失敗的原因。

此類失敗最可能是因為組態錯誤的資訊清單或錯誤的命令所致。例如,下列輸出表示您必須將路由流量百分比設定為總和為 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 物件的 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/routeserving.knative.dev/routeNamespace 表示 Ingress 資源所在的路由。您的路由和 Ingress 應該會列出。如果您的 Ingress 不存在,則路由控制器會認為您的路由/服務所針對的修訂版本尚未就緒。請繼續閱讀後續章節以診斷修訂版本就緒狀態。

否則,請執行下列命令以查看為您的路由建立的 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 服務的 LoadBalancer 服務。

若要檢查 Ingress 的 IP 位址,請使用

kubectl get svc -n istio-system istio-ingressgateway

如果沒有外部 IP 位址,請使用

kubectl describe svc istio-ingressgateway -n istio-system

查看未佈建 IP 位址的原因。最可能是因為配額問題。

檢查修訂版本狀態

如果您使用 Configuration 設定您的 Route,請執行下列命令以取得為您部署建立的 Revision 名稱(在 Route .yaml 檔案中查閱組態名稱)

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

如果您直接使用 Revision 設定您的 Route,請在 Route yaml 檔案中查閱修訂版本名稱。

然後執行下列命令

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

就緒的 Revisionstatus 中應具有下列條件

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

選擇一個並使用下列命令查看其 status 的詳細資訊。一些有用的欄位為 conditionscontainerStatuses

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

我們使用分析和 Cookie 來瞭解網站流量。您使用我們網站的相關資訊會與 Google 分享,用於該目的。瞭解更多。