25.3. OVN-Kubernetes 故障排除

OVN-Kubernetes 具有许多内置健康检查和日志来源。

25.3.1. 使用就绪度探测监控 OVN-Kubernetes 健康状况

ovnkube-masterovnkube-node pod 配置有就绪度探测的容器。

先决条件

  • 访问 OpenShift CLI (oc)。
  • 您可以使用 cluster-admin 权限访问集群。
  • 您已安装了 jq

流程

  1. 运行以下命令,查看 ovnkube-master 就绪度探测的详情:

    $ oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-master \
    -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'

    ovnkube-master pod 中北向和南向数据库容器的就绪度探测会检查托管数据库的 Raft 集群的健康状态。

  2. 运行以下命令,查看 ovnkube-node 就绪度探测的详情:

    $ oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-master \
    -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'

    ovnkube-node pod 中的 ovnkube-node 容器有一个就绪度探测来验证 ovn-kubernetes CNI 配置文件是否存在,而这代表 pod 没有运行,或者没有准备好接受配置 Pod 的请求。

  3. 使用以下命令,显示命名空间的所有事件,包括探测失败:

    $ oc get events -n openshift-ovn-kubernetes
  4. 仅显示此 pod 的事件:

    $ oc describe pod ovnkube-master-tp2z8 -n openshift-ovn-kubernetes
  5. 显示集群网络 Operator 的消息和状态:

    $ oc get co/network -o json | jq '.status.conditions[]'
  6. 运行以下命令,显示 ovnkube-master pod 中每个容器的 就绪 状态 :

    $ for p in $(oc get pods --selector app=ovnkube-master -n openshift-ovn-kubernetes \
    -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); do echo === $p ===;  \
    oc get pods -n openshift-ovn-kubernetes $p -o json | jq '.status.containerStatuses[] | .name, .ready'; \
    done
    注意

    预期的是所有容器状态都报告为 true。就绪度探测失败,将状态设置为 false

25.3.2. 在控制台中查看 OVN-Kubernetes 警报

Alerting UI 提供有关警报及其相关警报规则和静默的详细信息。

先决条件

  • 对于您要查看指标的项目,您可以作为开发者或具有查看权限的用户访问集群。

流程 (UI)

  1. Administrator 视角中,选择 ObserveAlerting。在此视角中,Alerting UI 中的三个主要页面是 AlertsSilencesAlerting Rules 页面。
  2. 选择 ObserveAlertingAlerting Rules 来查看 OVN-Kubernetes 警报的规则。

25.3.3. 在 CLI 中查看 OVN-Kubernetes 警报

您可以从命令行获取有关警报及其监管警报规则和静默的信息。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 安装了 OpenShift CLI (oc)。
  • 您已安装了 jq

流程

  1. 运行以下命令,查看活动或触发警报:

    1. 运行以下命令设置警报管理器路由环境变量:

      $ ALERT_MANAGER=$(oc get route alertmanager-main -n openshift-monitoring \
      -o jsonpath='{@.spec.host}')
    2. 运行以下命令,使用请求特定字段的正确授权详情向警报管理器路由 API 发出 curl 请求:

      $ curl -s -k -H "Authorization: Bearer \
      $(oc create token prometheus-k8s -n openshift-monitoring)" \
      https://$ALERT_MANAGER/api/v1/alerts \
      | jq '.data[] | "\(.labels.severity) \(.labels.alertname) \(.labels.pod) \(.labels.container) \(.labels.endpoint) \(.labels.instance)"'
  2. 运行以下命令来查看警报规则:

    $ oc -n openshift-monitoring exec -c prometheus prometheus-k8s-0 -- curl -s 'http://localhost:9090/api/v1/rules' | jq '.data.groups[].rules[] | select(((.name|contains("ovn")) or (.name|contains("OVN")) or (.name|contains("Ovn")) or (.name|contains("North")) or (.name|contains("South"))) and .type=="alerting")'

25.3.4. 使用 CLI 查看 OVN-Kubernetes 日志

您可以使用 OpenShift CLI (oc)查看 ovnkube-masterovnkube-node pod 中各个 pod 的日志。

先决条件

  • 使用具有 cluster-admin 角色的用户访问集群。
  • 访问 OpenShift CLI (oc)。
  • 您已安装了 jq

流程

  1. 查看特定 pod 的日志:

    $ oc logs -f <pod_name> -c <container_name> -n <namespace>

    其中:

    -f
    可选:指定输出是否遵循要写到日志中的内容。
    <pod_name>
    指定 pod 的名称。
    <container_name>
    可选:指定容器的名称。当 pod 具有多个容器时,您必须指定容器名称。
    <namespace>
    指定 pod 运行的命名空间。

    例如:

    $ oc logs ovnkube-master-7h4q7 -n openshift-ovn-kubernetes
    $ oc logs -f ovnkube-master-7h4q7 -n openshift-ovn-kubernetes -c ovn-dbchecker

    输出的日志文件内容。

  2. 检查 ovnkube-master pod 中所有容器的最新条目:

    $ for p in $(oc get pods --selector app=ovnkube-master -n openshift-ovn-kubernetes \
    -o jsonpath='{range.items[*]}{" "}{.metadata.name}'); \
    do echo === $p ===; for container in $(oc get pods -n openshift-ovn-kubernetes $p \
    -o json | jq -r '.status.containerStatuses[] | .name');do echo ---$container---; \
    oc logs -c $container $p -n openshift-ovn-kubernetes --tail=5; done; done
  3. 使用以下命令,查看 ovnkube-master pod 中每个容器的最后 5 行:

    $ oc logs -l app=ovnkube-master -n openshift-ovn-kubernetes --all-containers --tail 5

25.3.5. 使用 Web 控制台查看 OVN-Kubernetes 日志

您可以在 web 控制台中查看 ovnkube-masterovnkube-node pod 中的各个容器集的日志。

先决条件

  • 访问 OpenShift CLI (oc)。

流程

  1. 在 OpenShift Container Platform 控制台中,进入到 WorkloadsPods,或通过您要调查的资源进入到 pod。
  2. 从下拉菜单中选择 openshift-ovn-kubernetes 项目。
  3. 点您要调查的 pod 的名称。
  4. Logs。默认情况下,ovnkube-master 显示与 northd 容器关联的日志。
  5. 使用向下下拉菜单选择每个容器的日志。

25.3.5.1. 更改 OVN-Kubernetes 日志级别

OVN-Kubernetes 的默认日志级别为 2。要调试 OVN-Kubernetes 将日志级别设置为 5。按照以下步骤增加 OVN-Kubernetes 的日志级别,以帮助您调试问题。

先决条件

  • 您可以使用 cluster-admin 权限访问集群。
  • 访问 OpenShift Container Platform web 控制台。

流程

  1. 运行以下命令,以获取 OVN-Kubernetes 项目中所有 pod 的详细信息:

    $ oc get po -o wide -n openshift-ovn-kubernetes

    输出示例

    NAME                   READY   STATUS    RESTARTS      AGE   IP             NODE                           NOMINATED NODE   READINESS GATES
    ovnkube-master-84nc9   6/6     Running   0             50m   10.0.134.156   ip-10-0-134-156.ec2.internal   <none>           <none>
    ovnkube-master-gmlqv   6/6     Running   0             50m   10.0.209.180   ip-10-0-209-180.ec2.internal   <none>           <none>
    ovnkube-master-nhts2   6/6     Running   1 (48m ago)   50m   10.0.147.31    ip-10-0-147-31.ec2.internal    <none>           <none>
    ovnkube-node-2cbh8     5/5     Running   0             43m   10.0.217.114   ip-10-0-217-114.ec2.internal   <none>           <none>
    ovnkube-node-6fvzl     5/5     Running   0             50m   10.0.147.31    ip-10-0-147-31.ec2.internal    <none>           <none>
    ovnkube-node-f4lzz     5/5     Running   0             24m   10.0.146.76    ip-10-0-146-76.ec2.internal    <none>           <none>
    ovnkube-node-jf67d     5/5     Running   0             50m   10.0.209.180   ip-10-0-209-180.ec2.internal   <none>           <none>
    ovnkube-node-np9mf     5/5     Running   0             40m   10.0.165.191   ip-10-0-165-191.ec2.internal   <none>           <none>
    ovnkube-node-qjldg     5/5     Running   0             50m   10.0.134.156   ip-10-0-134-156.ec2.internal   <none>           <none>

  2. 创建类似以下示例的 ConfigMap 文件,并使用文件名,如 env-overrides.yaml

    ConfigMap 文件示例

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: env-overrides
      namespace: openshift-ovn-kubernetes
    data:
      ip-10-0-217-114.ec2.internal: | 1
        # This sets the log level for the ovn-kubernetes node process:
        OVN_KUBE_LOG_LEVEL=5
        # You might also/instead want to enable debug logging for ovn-controller:
        OVN_LOG_LEVEL=dbg
      ip-10-0-209-180.ec2.internal: |
        # This sets the log level for the ovn-kubernetes node process:
        OVN_KUBE_LOG_LEVEL=5
        # You might also/instead want to enable debug logging for ovn-controller:
        OVN_LOG_LEVEL=dbg
      _master: | 2
        # This sets the log level for the ovn-kubernetes master process as well as the ovn-dbchecker:
        OVN_KUBE_LOG_LEVEL=5
        # You might also/instead want to enable debug logging for northd, nbdb and sbdb on all masters:
        OVN_LOG_LEVEL=dbg

    1
    指定要设置 debug 日志级别的节点名称。
    2
    指定 _master 来设置 ovnkube-master 组件的日志级别。
  3. 使用以下命令应用 ConfigMap 文件:

    $ oc apply -n openshift-ovn-kubernetes -f env-overrides.yaml

    输出示例

    configmap/env-overrides.yaml created

  4. 使用以下命令重启 ovnkube pod 以应用新的日志级别:

    $ oc delete pod -n openshift-ovn-kubernetes \
    --field-selector spec.nodeName=ip-10-0-217-114.ec2.internal -l app=ovnkube-node
    $ oc delete pod -n openshift-ovn-kubernetes \
    --field-selector spec.nodeName=ip-10-0-209-180.ec2.internal -l app=ovnkube-node
    $ oc delete pod -n openshift-ovn-kubernetes -l app=ovnkube-master

25.3.6. 检查 OVN-Kubernetes pod 网络连接

在 OpenShift Container Platform 4.10 及更新的版本中,连接检查控制器会在集群中编配连接验证检查。这包括 Kubernetes API、OpenShift API 和单个节点。连接测试的结果存储在 openshift-network-diagnostics 命名空间中的 PodNetworkConnectivity 对象中。连接测试会每分钟以并行方式执行。

先决条件

  • 访问 OpenShift CLI (oc)。
  • 使用具有 cluster-admin 角色的用户访问集群。
  • 您已安装了 jq

流程

  1. 要列出当前的 PodNetworkConnectivityCheck 对象,请输入以下命令:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics
  2. 使用以下命令查看每个连接对象的最新成功:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \
    -o json | jq '.items[]| .spec.targetEndpoint,.status.successes[0]'
  3. 使用以下命令查看每个连接对象的最新故障:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \
    -o json | jq '.items[]| .spec.targetEndpoint,.status.failures[0]'
  4. 使用以下命令查看每个连接对象的最新中断:

    $ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \
    -o json | jq '.items[]| .spec.targetEndpoint,.status.outages[0]'

    连接检查控制器也会将来自这些检查的指标记录到 Prometheus 中。

  5. 运行以下命令来查看所有指标:

    $ oc exec prometheus-k8s-0 -n openshift-monitoring -- \
    promtool query instant  http://localhost:9090 \
    '{component="openshift-network-diagnostics"}'
  6. 查看源 pod 和 openshift api 服务之间的延迟,持续 5 分钟:

    $ oc exec prometheus-k8s-0 -n openshift-monitoring -- \
    promtool query instant  http://localhost:9090 \
    '{component="openshift-network-diagnostics"}'

25.3.7. 其他资源