调试应用程序问题¶
如果您已部署应用程序但遇到问题,可以使用以下步骤来解决应用程序问题。
检查终端输出¶
检查您的部署命令输出,查看它是否成功。如果您的部署过程终止,您应该在输出中看到一条错误消息,描述部署失败的原因。
这种故障很可能是由于清单配置错误或命令错误造成的。例如,以下输出表示您必须将路由流量百分比配置为总计 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 和路由的网络配置匹配。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
如果您看到此条件,请检查以下内容以继续调试
检查 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