6.3. OVN-Kubernetes 故障排除
OVN-Kubernetes 具有许多内置健康检查和日志来源。按照这些部分中的说明检查集群。如果需要一个支持问题单,请参阅 支持指南来通过 must-gather
收集其他信息。仅在支持团队要求这样做时,才使用 -- gather_network_logs
。
6.3.1. 使用就绪度探测监控 OVN-Kubernetes 健康状况 复制链接链接已复制到粘贴板!
ovnkube-control-plane
和 ovnkube-node
pod 配置有就绪度探测的容器。
先决条件
-
访问 OpenShift CLI(
oc
)。 -
您可以使用
cluster-admin
权限访问集群。 -
您已安装了
jq
。
流程
运行以下命令,查看
ovnkube-node
就绪度探测的详情:oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node \ -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'
$ oc get pods -n openshift-ovn-kubernetes -l app=ovnkube-node \ -o json | jq '.items[0].spec.containers[] | .name,.readinessProbe'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ovnkube-node
pod 中的北向和南向数据库容器的就绪度探测会检查数据库和ovnkube-controller
容器的健康状态。ovnkube-node
pod 中的ovnkube-controller
容器有一个就绪度探测来验证 OVN-Kubernetes CNI 配置文件是否存在,这代表 pod 没有运行,或者没有准备好接受配置 pod 的请求。使用以下命令,显示命名空间的所有事件,包括探测失败:
oc get events -n openshift-ovn-kubernetes
$ oc get events -n openshift-ovn-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 仅显示特定 pod 的事件:
oc describe pod ovnkube-node-9lqfk -n openshift-ovn-kubernetes
$ oc describe pod ovnkube-node-9lqfk -n openshift-ovn-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示集群网络 Operator 的消息和状态:
oc get co/network -o json | jq '.status.conditions[]'
$ oc get co/network -o json | jq '.status.conditions[]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下脚本,显示
ovnkube-node
pod 中每个容器的就绪状态
:for p in $(oc get pods --selector app=ovnkube-node -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
$ for p in $(oc get pods --selector app=ovnkube-node -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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意预期的是所有容器状态都报告为
true
。就绪度探测失败,将状态设置为false
。
6.3.2. 在控制台中查看 OVN-Kubernetes 警报 复制链接链接已复制到粘贴板!
Alerting UI 提供有关警报及其相关警报规则和静默的详细信息。
先决条件
- 对于您要查看指标的项目,您可以作为开发者或具有查看权限的用户访问集群。
流程 (UI)
-
在 Administrator 视角中,选择 Observe
Alerting。在此视角中,Alerting UI 有三个主要页面,即 Alerts、Silences 和 Alerting Rules 页面。 -
选择 Observe
Alerting Alerting Rules 来查看 OVN-Kubernetes 警报的规则。
6.3.3. 在 CLI 中查看 OVN-Kubernetes 警报 复制链接链接已复制到粘贴板!
您可以从命令行获取有关警报及其监管警报规则和静默的信息。
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 -
已安装 OpenShift CLI(
oc
)。 -
您已安装了
jq
。
流程
运行以下命令,查看活动或触发警报:
运行以下命令设置警报管理器路由环境变量:
ALERT_MANAGER=$(oc get route alertmanager-main -n openshift-monitoring \ -o jsonpath='{@.spec.host}')
$ ALERT_MANAGER=$(oc get route alertmanager-main -n openshift-monitoring \ -o jsonpath='{@.spec.host}')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将
$ALERT_MANAGER
替换为Alertmanager
实例的 URL,向警报管理器路由 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)"'
$ 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)"'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令来查看警报规则:
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")'
$ 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")'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.4. 使用 CLI 查看 OVN-Kubernetes 日志 复制链接链接已复制到粘贴板!
您可以使用 OpenShift CLI (oc
)查看 ovnkube-master
和 ovnkube-node
pod 中每个 pod 的日志。
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 -
访问 OpenShift CLI(
oc
)。 -
您已安装了
jq
。
流程
查看特定 pod 的日志:
oc logs -f <pod_name> -c <container_name> -n <namespace>
$ oc logs -f <pod_name> -c <container_name> -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
-f
- 可选:指定输出是否遵循要写到日志中的内容。
<pod_name>
- 指定 pod 的名称。
<container_name>
- 可选:指定容器的名称。当 pod 具有多个容器时,您必须指定容器名称。
<namespace>
- 指定 pod 运行的命名空间。
例如:
oc logs ovnkube-node-5dx44 -n openshift-ovn-kubernetes
$ oc logs ovnkube-node-5dx44 -n openshift-ovn-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc logs -f ovnkube-node-5dx44 -c ovnkube-controller -n openshift-ovn-kubernetes
$ oc logs -f ovnkube-node-5dx44 -c ovnkube-controller -n openshift-ovn-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出的日志文件内容。
检查
ovnkube-node
pod 中所有容器的最新条目:for p in $(oc get pods --selector app=ovnkube-node -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
$ for p in $(oc get pods --selector app=ovnkube-node -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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令,查看
ovnkube-node
pod 中每个容器的最后 5 行:oc logs -l app=ovnkube-node -n openshift-ovn-kubernetes --all-containers --tail 5
$ oc logs -l app=ovnkube-node -n openshift-ovn-kubernetes --all-containers --tail 5
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.5. 使用 Web 控制台查看 OVN-Kubernetes 日志 复制链接链接已复制到粘贴板!
您可以在 web 控制台中查看 ovnkube-master
和 ovnkube-node
pod 中每个 pod 的日志。
先决条件
-
访问 OpenShift CLI(
oc
)。
流程
-
在 OpenShift Container Platform 控制台中,导航到 Workloads
Pods,或通过您要调查的资源导航到 pod。 -
从下拉菜单中选择
openshift-ovn-kubernetes
项目。 - 点您要调查的 pod 的名称。
-
点 Logs。默认情况下,
ovnkube-master
显示与northd
容器关联的日志。 - 使用向下下拉菜单选择每个容器的日志。
6.3.5.1. 更改 OVN-Kubernetes 日志级别 复制链接链接已复制到粘贴板!
OVN-Kubernetes 的默认日志级别为 4。要调试 OVN-Kubernetes,请将日志级别设置为 5。按照以下步骤增加 OVN-Kubernetes 的日志级别,以帮助您调试问题。
先决条件
-
您可以使用
cluster-admin
权限访问集群。 - 访问 OpenShift Container Platform web 控制台。
流程
运行以下命令,以获取 OVN-Kubernetes 项目中所有 pod 的详细信息:
oc get po -o wide -n openshift-ovn-kubernetes
$ oc get po -o wide -n openshift-ovn-kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建类似以下示例的
ConfigMap
文件,并使用文件名,如env-overrides.yaml
:ConfigMap
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令应用
ConfigMap
文件:oc apply -n openshift-ovn-kubernetes -f env-overrides.yaml
$ oc apply -n openshift-ovn-kubernetes -f env-overrides.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
configmap/env-overrides.yaml created
configmap/env-overrides.yaml created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令重启
ovnkube
pod 以应用新的日志级别:oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-0 -l app=ovnkube-node
$ oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-0 -l app=ovnkube-node
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-2 -l app=ovnkube-node
$ oc delete pod -n openshift-ovn-kubernetes \ --field-selector spec.nodeName=ci-ln-3njdr9b-72292-5nwkp-master-2 -l app=ovnkube-node
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete pod -n openshift-ovn-kubernetes -l app=ovnkube-node
$ oc delete pod -n openshift-ovn-kubernetes -l app=ovnkube-node
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要验证 'ConfigMap'file 是否已应用到特定 pod 的所有节点,请运行以下命令:
oc logs -n openshift-ovn-kubernetes --all-containers --prefix ovnkube-node-<xxxx> | grep -E -m 10 '(Logging config:|vconsole|DBG)'
$ oc logs -n openshift-ovn-kubernetes --all-containers --prefix ovnkube-node-<xxxx> | grep -E -m 10 '(Logging config:|vconsole|DBG)'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<XXXX>
指定上一步中 pod 的随机字符序列。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
可选:运行以下命令来检查
ConfigMap
文件是否已应用:for f in $(oc -n openshift-ovn-kubernetes get po -l 'app=ovnkube-node' --no-headers -o custom-columns=N:.metadata.name) ; do echo "---- $f ----" ; oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $f -- pgrep -a -f init-ovnkube-controller | grep -P -o '^.*loglevel\s+\d' ; done
for f in $(oc -n openshift-ovn-kubernetes get po -l 'app=ovnkube-node' --no-headers -o custom-columns=N:.metadata.name) ; do echo "---- $f ----" ; oc -n openshift-ovn-kubernetes exec -c ovnkube-controller $f -- pgrep -a -f init-ovnkube-controller | grep -P -o '^.*loglevel\s+\d' ; done
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.6. 检查 OVN-Kubernetes pod 网络连接 复制链接链接已复制到粘贴板!
在 OpenShift Container Platform 4.10 及更新的版本中,连接检查控制器会在集群中编配连接验证检查。这包括 Kubernetes API、OpenShift API 和单个节点。连接测试的结果存储在 openshift-network-diagnostics
命名空间中的 PodNetworkConnectivity
对象中。连接测试会每分钟以并行方式执行。
先决条件
-
访问 OpenShift CLI(
oc
)。 -
使用具有
cluster-admin
角色的用户访问集群。 -
您已安装了
jq
。
流程
要列出当前的
PodNetworkConnectivityCheck
对象,请输入以下命令:oc get podnetworkconnectivitychecks -n openshift-network-diagnostics
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令查看每个连接对象的最新成功:
oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.successes[0]'
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.successes[0]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令查看每个连接对象的最新故障:
oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.failures[0]'
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.failures[0]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下命令查看每个连接对象的最新中断:
oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.outages[0]'
$ oc get podnetworkconnectivitychecks -n openshift-network-diagnostics \ -o json | jq '.items[]| .spec.targetEndpoint,.status.outages[0]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 连接检查控制器也会将来自这些检查的指标记录到 Prometheus 中。
运行以下命令来查看所有指标:
oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'
$ oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看源 pod 和 openshift api 服务之间的延迟,持续 5 分钟:
oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'
$ oc exec prometheus-k8s-0 -n openshift-monitoring -- \ promtool query instant http://localhost:9090 \ '{component="openshift-network-diagnostics"}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.3.7. 使用 CLI 检查带有 OVS 抽样的 OVN-Kubernetes 网络流量 复制链接链接已复制到粘贴板!
使用 OVS 抽样检查 OVN-Kubernetes 网络流量只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
OVN-Kubernetes 网络流量可以通过 CLI 来查看以下网络 API 的 OVS 抽样:
-
NetworkPolicy
-
AdminNetworkPolicy
-
BaselineNetworkPolicy
-
UserDefinedNetwork
隔离 -
EgressFirewall
- 多播 ACL。
这些网络事件的脚本可在每个 OVN-Kubernetes 节点的 /usr/bin/ovnkube-observ
路径中找到。
虽然 Network Observability Operator 和检查带有 OVS 抽样的 OVN-Kubernetes 网络流量都适合可调试,但 Network Observability Operator 旨在观察网络事件。另外,使用 CLI 检查带有 OVS 抽样的 OVN-Kubernetes 网络流量可帮助进行数据包追踪;也可以在安装 Network Observability Operator 时使用,但这不是强制要求。
管理员可以添加 --add-ovs-collect
选项来查看节点上的网络流量,或者传递额外的标志来过滤特定 pod 的结果。额外的标记可在带有 OVS 抽样标志"部分的 "OVN-Kubernetes 网络流量中找到。
使用以下步骤通过 CLI 查看 OVN-Kubernetes 网络流量。
先决条件
-
以具有
cluster-admin
权限的用户身份登录集群。 - 您已创建了源 pod 和目标 pod,并在它们之间运行流量。
-
您至少创建了以下网络 API 之一:
NetworkPolicy
、AdminNetworkPolicy
、BaselineNetworkPolicy
、UserDefinedNetwork
隔离、多播或出口防火墙。
流程
要使用 OVS 抽样功能启用
OVNObservability
,请输入以下命令在名为cluster
的FeatureGate
CR 中启用TechPreviewNoUpgrade
功能集:oc patch --type=merge --patch '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' featuregate/cluster
$ oc patch --type=merge --patch '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' featuregate/cluster
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
featuregate.config.openshift.io/cluster patched
featuregate.config.openshift.io/cluster patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令确认启用了
OVNObservability
功能:oc get featuregate cluster -o yaml
$ oc get featuregate cluster -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
featureGates: # ... enabled: - name: OVNObservability
featureGates: # ... enabled: - name: OVNObservability
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令,获取命名空间中的 pod 列表,在其中创建了其中一个相关网络 API。请注意 pod 的
NODE
名称,因为以下步骤中使用它们。oc get pods -n <namespace> -o wide
$ oc get pods -n <namespace> -o wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES destination-pod 1/1 Running 0 53s 10.131.0.23 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none> source-pod 1/1 Running 0 56s 10.131.0.22 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none>
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES destination-pod 1/1 Running 0 53s 10.131.0.23 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none> source-pod 1/1 Running 0 56s 10.131.0.22 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> <none>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令获取 OVN-Kubernetes pod 列表,并找到共享与上一步中的 pod 相同的
NODE
的 pod:oc get pods -n openshift-ovn-kubernetes -o wide
$ oc get pods -n openshift-ovn-kubernetes -o wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME ... READY STATUS RESTARTS AGE IP NODE NOMINATED NODE ovnkube-node-jzn5b 8/8 Running 1 (34m ago) 37m 10.0.128.2 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> ...
NAME ... READY STATUS RESTARTS AGE IP NODE NOMINATED NODE ovnkube-node-jzn5b 8/8 Running 1 (34m ago) 37m 10.0.128.2 ci-ln-1gqp7b2-72292-bb9dv-worker-a-gtmpc <none> ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在
ovnkube-node
pod 中打开 bash shell:oc exec -it <pod_name> -n openshift-ovn-kubernetes -- bash
$ oc exec -it <pod_name> -n openshift-ovn-kubernetes -- bash
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在
ovnkube-node
pod 中,您可以运行ovnkube-observ -add-ovs-collector
脚本来显示使用 OVS 收集器的网络事件。例如:/usr/bin/ovnkube-observ -add-ovs-collector
# /usr/bin/ovnkube-observ -add-ovs-collector
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以通过带有
-filter-src-ip
标志和 pod 的 IP 地址输入以下命令来根据类型(如源 pod)过滤内容。例如:/usr/bin/ovnkube-observ -add-ovs-collector -filter-src-ip <pod_ip_address>
# /usr/bin/ovnkube-observ -add-ovs-collector -filter-src-ip <pod_ip_address>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关可以使用
/usr/bin/ovnkube-observ
传递的标记的完整列表,请参阅 "OVN-Kubernetes 网络流量带有 OVS sampling 标记"。
6.3.7.1. 使用 OVS 抽样标记的 OVN-Kubernetes 网络流量 复制链接链接已复制到粘贴板!
以下标记可用于使用 CLI 查看 OVN-Kubernetes 网络流量。在 ovnkube-node
pod 中打开 bash shell 后,将这些标记附加到终端中的以下语法中:
命令语法
/usr/bin/ovnkube-observ <flag>
# /usr/bin/ovnkube-observ <flag>
标记 | 描述 |
---|---|
|
返回可用于 |
| 添加 OVS 收集器以启用抽样。请谨慎使用。确保其他人没有使用可观察性。 |
|
通过 NBDB 数据丰富样本。默认值为 |
| 仅将数据包过滤到给定目标 IP。 |
| 仅过滤来自给定源 IP 的数据包。 |
| 使用 psample group_id 打印原始示例 Cookie。 |
| 将示例写入的输出文件。 |
| 打印完整接收的数据包.为 false 时,每个示例仅打印源和目标 IP。 |