如何在OpenShift v4 CoreOS节点中运行telnet/tcpdump
从OpenShift 4版本开始,红帽企业Linux CoreOS(RHCOS)是在所有OpenShift Container Platform计算机上运行的推荐和受支持的操作系统。 RHCOS将红帽企业Linux(RHEL)的质量标准与Container Linux的自动远程升级功能结合在一起。
RHCOS不附带yum或者dnf等软件包管理器。该操作系统使用rpm-ostree系统进行事务性升级,其中更新是通过容器镜像交付的,并且是OpenShift容器平台更新过程的一部分。
如果没有OS软件包管理器以及对RPM软件包的直接下载和安装的支持,运行未随OS预先打包的工具的唯一方法就是通过容器。不错的是,CoreOS附带了一个称为工具箱的脚本,该脚本启动了一个容器,可让我们引入自己喜欢的调试或者管理工具。
在OpenShift 4 RHCOS机器中运行工具箱容器
我们可以使用提供的工具箱脚本启动工具箱容器。但是首先要从我们要在容器中运行管理工具的位置访问OpenShift节点。
我们可以使用oc debug命令或者SSH。
--- Access node with SSH -- $ssh theitroad@localhost --- Access node with oc debug command -- $oc debug node/<nodename>
使用oc调试示例进行访问。
$oc debug node/node01.ocp.theitroad.local Starting pod/node01ocptheitroadcom-debug ... To use host binaries, run `chroot /host`
该提示来自一个专用工具容器,该容器将节点根文件系统安装在/host文件夹中,并允许我们从该节点检查文件。
如命令输出所示,我们需要在/hostfolder中启动achrootshell。这将使我们能够在Shell中使用主机二进制文件。
chroot /host
我们将看到如下输出:
chroot /host Pod IP: 10.10.30.235 If you don't see a command prompt, try pressing enter. sh-4.2# chroot /host sh-4.4#
要启动工具箱容器,请使用以下命令。
$/usr/bin/toolbox
第一次运行脚本时,它将把工具箱容器镜像下载到节点。
Trying to pull registry.redhat.io/rhel8/support-tools... Getting image source signatures Copying blob ec1681b6a383 done Copying blob c4d668e229cd done Copying blob 6b1688d3542f done Copying config 50b63c2aff done Writing manifest to image destination Storing signatures 50b63c2aff8c13f9f8594c9eaf5fc961f39c74df6d9c6ddde8ca705f78f3c14d
然后,它与Podman一起旋转容器。
Spawning a container 'toolbox-core' with image 'registry.redhat.io/rhel8/support-tools' Detected RUN label in the container image. Using that as the default... command: podman run -it --name toolbox-core --privileged --ipc=host --net=host --pid=host -e HOST=/host -e NAME=toolbox-core -e IMAGE=registry.redhat.io/rhel8/support-tools:latest -v /run:/run -v /var/log:/var/log -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -v /:/host registry.redhat.io/rhel8/support-tools:latest
在OpenShift v4 CoreOS服务器中运行telnet/tcpdump
一旦进入容器shell,就可以使用yum软件包管理器来安装所需的调试和管理工具。
--- Install network tools -- # yum -y install iproute net-tools --- Install telnet -- # yum -y install telnet --- Install tcpdump -- # yum -y install tcpdump --- Install any other tool -- # yum -y install <packagename>
使用telnet:
# telnet <destinantionhost> <serviceport>
使用tcpdump:
标识接口名称我们需要安装网络工具。
# ip link show | head 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:1a:4a:16:01:73 brd ff:ff:ff:ff:ff:ff 7: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 4e:66:b9:32:0d:26 brd ff:ff:ff:ff:ff:ff 8: br0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 72:d6:df:e8:13:48 brd ff:ff:ff:ff:ff:ff 9: vxlan_sys_4789: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65000 qdisc noqueue master ovs-system state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 4a:c4:7f:c1:85:f7 brd ff:ff:ff:ff:ff:ff
使用tcpdump。
# tcpdump <OPTIONS>
此示例用于捕获来自发往端口443的任何接口的数据包。将输出保存到Node文件系统中的路径中,该路径可在/host目录中访问。
# tcpdump -i any port 443 -s 0 -vv -s 0 -w /host/tmp/testpacketname.pcap
我们可以将其替换为接口名称,例如:
-i ens3
要结束捕获,请按Control-C。
从容器运行tcpdump捕获
打开调试shell或者SSH到运行目标Pod的节点:
$oc debug node/<nodename> --- OR -- $ssh theitroad@localhost
使用crictl ps命令标识目标Pod进程ID的ID:
# crictl ps
我的容器ID是51a17d9a4b376. 让我们将其另存为变量。
container_id="51a17d9a4b376"
获取容器PID:
container_pid=$(crictl inspect --output yaml $container_id | grep 'pid:' | awk '{print }')
确认值:
# echo $container_pid 1124033 # ps 1124033 PID TTY STAT TIME COMMAND 1124033 ? Ss 0:00 /bin/sleep 3650d
我们可以使用以下命令在容器网络名称空间中启动tcpdump。
# nsenter -n -t $container_pid -- tcpdump <OPTIONS> --- Example -- # tcpdump -i any port 443 -s 0 -vv -s 0 -w /host/tmp/testpacketname.pcap
请注意,在运行命令之前,需要将tcpdump安装在容器中。