如何在OpenShift v4 CoreOS节点中运行telnet/tcpdump

时间:2020-02-23 14:31:48  来源:igfitidea点击:

从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安装在容器中。