5.9. 从 OpenShift Container Platform 节点或容器收集网络追踪(trace)
在调查与网络相关的 OpenShift Container Platform 问题时,红帽可能会从特定的 OpenShift Container Platform 集群节点或从特定容器请求网络数据包追踪。在 OpenShift Container Platform 中捕获网络 trace 的建议方法是通过 debug pod。
先决条件
-
您可以使用具有
cluster-admin角色的用户访问集群。 -
已安装 OpenShift CLI(
oc)。 - 您已有一个红帽支持问题单 ID。
- 您有红帽标准订阅或高级订阅。
- 您有红帽客户门户网站帐户。
- 您需要有到主机的 SSH 访问权限。
流程
获取集群节点列表:
oc get nodes
$ oc get nodesCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在目标节点上进入一个 debug 会话。此步骤被实例化为一个名为
<node_name>-debug的 debug pod:oc debug node/my-cluster-node
$ oc debug node/my-cluster-nodeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
/host设为 debug shell 中的根目录。debug pod 在 pod 中的/host中挂载主机的 root 文件系统。将根目录改为/host,您可以运行主机可执行路径中包含的二进制文件:chroot /host
# chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意运行 Red Hat Enterprise Linux CoreOS (RHCOS) 的 OpenShift Container Platform 4.17 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用 SSH 访问集群节点。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,
oc操作将会受到影响。在这种情况下,可以使用ssh core@<node>.<cluster_name>.<base_domain>来访问节点。在
chroot环境控制台中获取节点接口名称:ip ad
# ip adCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启动
toolbox容器,其中包括运行sosreport所需的二进制文件和插件:toolbox
# toolboxCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果一个已存在的
toolboxpod 已在运行,则toolbox命令会输出'toolbox-' already exists.Trying to start….要避免tcpdump出现问题,请使用podman rm toolbox-删除正在运行的 toolbox 容器,并生成新 toolbox 容器。在集群节点中启动
tcpdump会话,并将输出重定向到捕获文件中。这个示例使用ens5作为接口名称:tcpdump -nn -s 0 -i ens5 -w /host/var/tmp/my-cluster-node_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap
$ tcpdump -nn -s 0 -i ens5 -w /host/var/tmp/my-cluster-node_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
tcpdump捕获文件路径在chroot环境之外,因为 toolbox 容器会在/host中挂载主机的根目录。
如果节点上的特定容器需要
tcpdump捕获,请按照以下步骤操作。确定目标容器 ID。
chroot host命令先于这一步中的crictl命令,因为 toolbox 容器在/host中挂载主机的根目录:chroot /host crictl ps
# chroot /host crictl psCopy to Clipboard Copied! Toggle word wrap Toggle overflow 确定容器的进程 ID。在本例中,容器 ID 是
a7fe32346b120:chroot /host crictl inspect --output yaml a7fe32346b120 | grep 'pid' | awk '{print $2}'# chroot /host crictl inspect --output yaml a7fe32346b120 | grep 'pid' | awk '{print $2}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在容器上启动
tcpdump会话,并将输出重定向到捕获文件中。本例使用49628作为容器的进程 ID,ens5是接口名称。nsenter命令进入目标进程的命名空间并在命名空间中运行命令。因为本例中的目标进程是一个容器的进程 ID,tcpdump命令从主机在容器的命名空间中运行:nsenter -n -t 49628 -- tcpdump -nn -i ens5 -w /host/var/tmp/my-cluster-node-my-container_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap
# nsenter -n -t 49628 -- tcpdump -nn -i ens5 -w /host/var/tmp/my-cluster-node-my-container_$(date +%d_%m_%Y-%H_%M_%S-%Z).pcap1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
tcpdump捕获文件路径在chroot环境之外,因为 toolbox 容器会在/host中挂载主机的根目录。
使用以下方法之一向红帽支持提供
tcpdump捕获文件进行分析。将文件上传到现有红帽支持问题单中。
运行
oc debug node/<node_name>命令调整sosreport归档,并将输出重定向到文件中。此命令假设您已退出以前的oc debug会话:oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/my-tcpdump-capture-file.pcap' > /tmp/my-tcpdump-capture-file.pcap
$ oc debug node/my-cluster-node -- bash -c 'cat /host/var/tmp/my-tcpdump-capture-file.pcap' > /tmp/my-tcpdump-capture-file.pcap1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- debug 容器将主机的根目录挂载到
/host。在指定用于连接的目标文件时,引用 debug 容器的根目录的绝对路径,包括/host。
注意运行 Red Hat Enterprise Linux CoreOS (RHCOS) 的 OpenShift Container Platform 4.17 集群节点不可变,它依赖于 Operator 来应用集群更改。不建议使用
scp从集群节点传输tcpdump捕获文件。但是,如果 OpenShift Container Platform API 不可用,或 kubelet 在目标节点上无法正常工作,oc操作将会受到影响。在这种情况下,可以运行scp core@<node>.<cluster_name>.<base_domain>:<file_path> <local_path>从一个节点复制tcpdump捕获文件。- 在红帽客户门户网站的 Customer Support 页面中进入现有的支持问题单。
- 选择 Attach files 并按提示上传该文件。