偵錯應用程式問題¶
如果您已部署應用程式但遇到問題,可以使用下列步驟來疑難排解應用程式。
檢查終端機輸出¶
檢查您的部署命令輸出,以查看是否成功。如果您的部署程序終止,您應該會在輸出中看到錯誤訊息,說明部署失敗的原因。
此類失敗最可能是因為組態錯誤的資訊清單或錯誤的命令所致。例如,下列輸出表示您必須將路由流量百分比設定為總和為 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/route
和 serving.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
就緒的 Revision
在 status
中應具有下列條件
conditions:
- reason: ServiceReady
status: "True"
type: Ready
如果您看到此條件,請檢查下列項目以繼續除錯
檢查 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
的詳細資訊。一些有用的欄位為 conditions
和 containerStatuses
kubectl get pod <pod-name> --output yaml