×

检查终端输出

您可以检查部署命令输出以查看部署是否成功。如果您的部署过程已终止,您应该在输出中看到一条错误消息,其中描述了部署失败的原因。此类失败很可能是由于清单配置错误或命令无效造成的。

步骤
  • 打开您部署和管理应用程序的客户端上的命令输出。以下示例是您在 `oc apply` 命令失败后可能看到的错误。

    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

    此输出表明您必须将路由流量百分比配置为等于 100。

检查 Pod 状态

您可能需要检查 `Pod` 对象的状态以确定无服务器应用程序的问题。

步骤
  1. 通过运行以下命令列出部署的所有 Pod:

    $ oc get pods
    示例输出
    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

    在输出中,您可以看到所有 Pod 及其状态的相关数据。

  2. 通过运行以下命令查看 Pod 状态的详细信息:

    示例输出
    $ oc get pod <pod_name> --output yaml

    在输出中,`conditions` 和 `containerStatuses` 字段可能对调试特别有用。

检查 Revision 状态

您可能需要检查 revision 的状态以确定无服务器应用程序的问题。

步骤
  1. 如果您使用 `Configuration` 对象配置路由,请通过运行以下命令获取为您的部署创建的 `Revision` 对象的名称:

    $ oc get configuration <configuration_name> --output jsonpath="{.status.latestCreatedRevisionName}"

    您可以在 `Route.yaml` 文件中找到配置名称,该文件通过定义 OpenShift `Route` 资源来指定路由设置。

    如果您直接使用 revision 配置路由,请在 `Route.yaml` 文件中查找 revision 名称。

  2. 通过运行以下命令查询 revision 的状态:

    $ oc get revision <revision-name> --output yaml

    准备就绪的 revision 应该在其状态中具有 `reason: ServiceReady`、`status: "True"` 和 `type: Ready` 条件。如果存在这些条件,您可能需要检查 Pod 状态或 Istio 路由。否则,资源状态包含错误消息。

其他资源

检查 Ingress 状态

您可能需要检查 Ingress 的状态以确定无服务器应用程序的问题。

步骤
  • 通过运行以下命令检查 Ingress 的 IP 地址:

    $ oc get svc -n istio-system istio-ingressgateway

    `istio-ingressgateway` 服务是 Knative 使用的 `LoadBalancer` 服务。

    如果没有外部IP地址,请运行以下命令

    $ oc describe svc istio-ingressgateway -n istio-system

    此命令会打印未分配IP地址的原因。大多数情况下,这是由于配额问题导致的。

检查路由状态

在某些情况下,Route 对象存在问题。您可以使用 OpenShift CLI (oc) 检查其状态。

步骤
  • 运行以下命令查看您部署应用程序时使用的 Route 对象的状态

    $ oc get route <route_name> --output yaml

    <route_name> 替换为您 Route 对象的名称。

    如果发生故障,status 对象中的 conditions 对象会说明原因。

检查 Ingress 和 Istio 路由

有时,当 Istio 用作 Ingress 层时,Ingress 和 Istio 路由会出现问题。您可以使用 OpenShift CLI (oc) 查看其详细信息。

步骤
  1. 运行以下命令列出所有 Ingress 资源及其相应的标签

    $ oc 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 资源所在的 Route。您的 Route 和 Ingress 应该列在其中。

    如果您的 Ingress 不存在,则路由控制器会认为您的 RouteService 对象的目标 Revision 对象未准备好。请继续执行其他调试步骤以诊断 Revision 的就绪状态。

  2. 如果列出了您的 Ingress,请运行以下命令检查为您的路由创建的 ClusterIngress 对象

    $ oc get ingresses.networking.internal.knative.dev <ingress_name> --output yaml

    在输出的状态部分,如果 type=Ready 的条件状态为 True,则表示 Ingress 运行正常。否则,输出中将包含错误消息。

  3. 如果 Ingress 状态为 Ready,则存在相应的 VirtualService 对象。运行以下命令验证 VirtualService 对象的配置

    $ oc get virtualservice -l networking.internal.knative.dev/ingress=<ingress_name> -n <ingress_namespace> --output yaml

    VirtualService 对象中的网络配置必须与 IngressRoute 对象的网络配置匹配。由于 VirtualService 对象不公开 Status 字段,您可能需要等待其设置传播。