$ oc get pods -w (1)
使用 Source-to-Image (S2I) 构建可重现的、Docker 格式的容器镜像。您可以通过将应用程序源代码注入容器镜像并组装新镜像来创建可立即运行的镜像。新镜像包含基础镜像(构建器)和构建的源代码。
要确定 S2I 流程中故障发生的位置,您可以观察与以下每个 S2I 阶段相关的 Pod 的状态
**在构建配置阶段**,使用构建 Pod 从基础镜像和应用程序源代码创建应用程序容器镜像。
**在部署配置阶段**,使用部署 Pod 从在构建配置阶段构建的应用程序容器镜像部署应用程序 Pod。部署 Pod 还部署其他资源,例如服务和路由。部署配置在构建配置成功后开始。
**在部署 Pod 启动应用程序 Pod 之后**,应用程序故障可能发生在正在运行的应用程序 Pod 中。例如,即使应用程序 Pod 处于`Running`状态,应用程序也可能无法按预期运行。在这种情况下,您可以访问正在运行的应用程序 Pod 以调查 Pod 中的应用程序故障。
在排除 S2I 问题时,请遵循以下策略:
监控构建、部署和应用程序 Pod 状态
确定 S2I 流程中出现问题的阶段
查看与失败阶段对应的日志
S2I 工具按顺序运行构建 Pod 和部署 Pod。部署 Pod 负责根据在构建阶段创建的应用程序容器镜像部署应用程序 Pod。监视构建、部署和应用程序 Pod 状态以确定 S2I 流程中故障发生的位置。然后,相应地关注诊断数据收集。
您已作为拥有cluster-admin
角色的用户访问集群。
您的API服务仍在运行。
您已安装OpenShift CLI (oc
)。
在整个S2I过程中监视Pod状态,以确定故障发生在哪个阶段。
$ oc get pods -w (1)
1 | 使用-w 监视Pod的更改,直到您使用Ctrl+C 退出命令。 |
查看失败Pod的日志以查找错误。
如果构建Pod失败,请查看构建Pod的日志。
$ oc logs -f pod/<application_name>-<build_number>-build
或者,您可以使用 |
如果部署Pod失败,请查看部署Pod的日志。
$ oc logs -f pod/<application_name>-<build_number>-deploy
或者,您可以使用 |
如果应用程序Pod失败,或者应用程序在运行的应用程序Pod中行为异常,请查看应用程序Pod的日志。
$ oc logs -f pod/<application_name>-<build_number>-<random_string>
应用程序故障可能发生在运行的应用程序Pod中。在这些情况下,您可以使用以下策略检索诊断信息。
查看与应用程序Pod相关的事件。
查看应用程序Pod的日志,包括OpenShift日志框架未收集的特定于应用程序的日志文件。
交互式测试应用程序功能并在应用程序容器中运行诊断工具。
您已作为拥有cluster-admin
角色的用户访问集群。
您已安装OpenShift CLI (oc
)。
列出与特定应用程序Pod相关的事件。以下示例检索名为my-app-1-akdlg
的应用程序Pod的事件。
$ oc describe pod/my-app-1-akdlg
查看应用程序Pod的日志。
$ oc logs -f pod/my-app-1-akdlg
查询正在运行的应用程序Pod中的特定日志。发送到stdout的日志由OpenShift日志框架收集,并包含在上一个命令的输出中。以下查询仅适用于未发送到stdout的日志。
如果可以在没有root权限的情况下访问Pod中的应用程序日志,请按如下方式连接日志文件。
$ oc exec my-app-1-akdlg -- cat /var/log/my-application.log
如果需要root访问权限才能查看应用程序日志,您可以启动具有root权限的调试容器,然后从容器内查看日志文件。从项目的DeploymentConfig
对象启动调试容器。Pod用户通常以非root权限运行,但在问题调查期间,使用临时的root权限运行故障排除Pod可能很有用。
$ oc debug dc/my-deployment-configuration --as-root -- cat /var/log/my-application.log
如果您运行 |
在具有交互式shell的应用程序容器中交互式测试应用程序功能并运行诊断工具。
在应用程序容器上启动交互式shell。
$ oc exec -it my-app-1-akdlg /bin/bash
从shell内交互式测试应用程序功能。例如,您可以运行容器的入口点命令并观察结果。然后,直接从命令行测试更改,然后再更新源代码并通过S2I流程重新构建应用程序容器。
运行容器中可用的诊断二进制文件。
运行某些诊断二进制文件需要root权限。在这些情况下,您可以基于有问题的Pod的 |
如果容器中没有诊断二进制文件,您可以使用nsenter
在容器的命名空间中运行主机的诊断二进制文件。以下示例使用主机的ip
二进制文件在容器的命名空间中运行ip ad
。
进入目标节点上的调试会话。此步骤将实例化一个名为<node_name>-debug
的调试Pod。
$ oc debug node/my-cluster-node
将/host
设置为调试shell中的根目录。调试Pod在Pod内的/host
中挂载主机的根文件系统。通过将根目录更改为/host
,您可以运行包含在主机可执行路径中的二进制文件。
# chroot /host
运行Red Hat Enterprise Linux CoreOS (RHCOS)的OpenShift Container Platform 4.17集群节点是不可变的,并依赖于Operators来应用集群更改。不建议使用SSH访问集群节点。但是,如果OpenShift Container Platform API不可用,或者kubelet在目标节点上无法正常运行,则 |
确定目标容器ID。
# crictl ps
确定容器的进程ID。在此示例中,目标容器ID为a7fe32346b120
。
# crictl inspect a7fe32346b120 --output yaml | grep 'pid:' | awk '{print $2}'
使用主机的ip
二进制文件在容器的命名空间中运行ip ad
。此示例使用31150
作为容器的进程ID。nsenter
命令进入目标进程的命名空间并在其命名空间中运行命令。因为此示例中的目标进程是容器的进程ID,所以ip ad
命令是从主机在容器的命名空间中运行的。
# nsenter -n -t 31150 -- ip ad
只有当您使用特权容器(例如调试节点)时,才可以在容器的命名空间中运行主机的诊断二进制文件。 |
有关S2I构建策略的更多详细信息,请参阅源到镜像 (S2I) 构建。