调试应用问题¶
如果您已部署应用程序但遇到问题,可以使用以下步骤进行故障排查。
检查终端输出¶
检查部署命令的输出,以确定是否成功。如果部署过程被终止,您应该会在输出中看到一条错误消息,描述部署失败的原因。
此种失败最可能的原因是配置错误的 manifest 或错误的命令。例如,以下输出说明您必须配置 Route 的流量百分比总和为 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 当前不公开 Status 字段,因此如果存在一个与 Ingress 和 Route 配置匹配的 VirtualService,您可能需要稍等片刻,以便这些设置能够传播。
如果您熟悉 Istio 和 istioctl,可以尝试使用 istioctl 根据 Istio 指南进行更深入的查看。
检查 Ingress 状态¶
Knative 使用一个名为 istio-ingressgateway Service 的负载均衡器。
要检查 Ingress 的 IP 地址,请使用:
kubectl get svc -n istio-system istio-ingressgateway
如果没有外部 IP 地址,请使用:
kubectl describe svc istio-ingressgateway -n istio-system
以查看 IP 地址未被分配的原因。最可能的原因是配额问题。
检查 Revision 状态¶
如果您使用 Configuration 配置您的 Route,请运行以下命令以获取为您部署创建的 Revision 的名称(在 Route .yaml 文件中查找配置名称)。
kubectl get configuration <configuration-name> --output jsonpath="{.status.latestCreatedRevisionName}"
如果您直接使用 Revision 配置您的 Route,请在 Route yaml 文件中查找 Revision 名称。
然后运行以下命令:
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