跳至内容

调试应用程序问题

如果您已部署应用程序但遇到问题,可以使用以下步骤来解决应用程序问题。

检查终端输出

检查您的部署命令输出,查看它是否成功。如果您的部署过程终止,您应该在输出中看到一条错误消息,描述部署失败的原因。

这种故障很可能是由于清单配置错误或命令错误造成的。例如,以下输出表示您必须将路由流量百分比配置为总计 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 和路由的网络配置匹配。VirtualService 目前不公开 Status 字段,因此如果存在一个并且与 Ingress 和路由具有匹配的配置,您可能需要等待一段时间,让这些设置传播。

如果您熟悉 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

如果您看到此条件,请检查以下内容以继续调试

提示

如果您看到其他条件,您可以在 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 共享。了解更多。