容器连通性(容器到某个网络是否畅通)检查方案

2024-01-18 10:34:10 +08:00
 helenfrank
目前远程对 pod 的网络连通性 检查有啥比较好的方案吗, 地址可以是 domain, domain:port, ip, ip:port
1. client-go 调 exec 执行 curl, ping, nc (我目前使用的方案, 但存在存量镜像没有这些工具)
2. 再挂个工具 container (侵入性较大, 且更占资源)
3. nsenter (需要连接 node, docker inspect 获取 Pid, client-go 获取 pod dns 地址, 依赖于 node 上的工具)

还有啥比较好的方案吗
3004 次点击
所在节点    Kubernetes
39 条回复
yimiaoxiehou
2024-01-18 14:39:06 +08:00
@huanghanzhilian 机器人?
helenfrank
2024-01-18 15:12:39 +08:00
@yimiaoxiehou #19 这个方案不错
helenfrank
2024-01-18 15:15:00 +08:00
@yimiaoxiehou #19 和第三种方案差别不大
CivAx
2024-01-18 15:42:54 +08:00
unix 经典问题,无网络工具如何测网,经典回答永远是 /dev/tcp
CivAx
2024-01-18 15:52:30 +08:00
纯 IP:exec 9<> /dev/tcp/127.0.0.1/80

可以顺便验证 DNS:exec 9<> /dev/tcp/www.baidu.com/443

别忘了 exec 9>&-,不然就要等 CLOSE_WAIT 超时了。

或者 echo < /dev/tcp/127.0.0.1/7777 && echo "ok" || echo "fail"
cheng6563
2024-01-18 16:00:35 +08:00
1 就行了,把所有工具自己打包一下完事,或者完全自己写个单文件工具
yimiaoxiehou
2024-01-18 16:13:52 +08:00
@helenfrank 可以避免需要 ssh 进入 node ,也可以避免 node 没有对应工具
mightybruce
2024-01-18 16:29:52 +08:00
容器网络是 linux 的特性,linux 没有/dev/tcp

另外容器网络是在命名空间中的

无 shell 或工具的 pod 调试就是 nsenter
CivAx
2024-01-18 16:35:08 +08:00
@mightybruce 只要基础镜像是 bash fs 有 bash 就有 tcp ,op 都能 exec 进容器调 nc 了很自然能调到 tcp
helenfrank
2024-01-18 16:48:01 +08:00
@CivAx #29 貌似并不如你所言, 我找了个是 bash 的容器, 并没有/dev/tcp, 我自己的 arch or mac 上面也没有/dev/tcp
helenfrank
2024-01-18 16:56:28 +08:00
@helenfrank #30 验证

arch:
```bash
❯ exec 9<> /dev/tcp/www.baidu.com/443
zsh: no such file or directory: /dev/tcp/www.baidu.com/443
```

mac
```bash
exec 9<> /dev/tcp/www.baidu.com/443
zsh: no such file or directory: /dev/tcp/www.baidu.com/443
```
CivAx
2024-01-18 17:22:43 +08:00
@helenfrank #31 /dev/tcp 要 redirect 调用,本身并不存在这个文件,具体 lib 在 /proc/net/tcp 。如果你在本机 docker run ,/proc 会受宿主机影响,你可以 uname -r 看看内核,我这会儿没在 Arm Mac 旁边,没法验证你这个场景。

Redirect: https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections

``` deployment
apiVersion: v1
kind: Pod
metadata:
name: arch
namespace: default
spec:
containers:
- image: docker.io/library/archlinux
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: arch
restartPolicy: Always
```
root@WSL [17:13:39] :~ # kubectl apply -f deployment.yaml
pod/arch created

root@WSL [17:13:47] :~ # kubectl get pod
NAME READY STATUS RESTARTS AGE
arch 0/1 ContainerCreating 0 4s

root@WSL [17:14:03] :~ # kubectl get pod
NAME READY STATUS RESTARTS AGE
arch 1/1 Running 0 19s

root@WSL [17:14:05] :~ # kubectl exec -it arch -- bash

[root@arch /]# cat /etc/issue
Arch Linux \r (\l)

[root@arch /]# uname -r
6.1.59

[root@arch /]# echo < /dev/tcp/8.8.8.8/53 && echo "ok" || echo "fail"

ok
[root@arch /]#
naison
2024-01-18 17:23:34 +08:00
可以尝试使用 kubevpn https://github.com/kubenetworks/kubevpn ,本地直接链接到 k8s 网络,在本地直接 ping pod ip
zong400
2024-01-18 18:14:53 +08:00
@CivAx 宿主是 ubuntu 貌似不行
```
/app $ exec 9<> /dev/tcp/127.0.0.1/80
sh: can't create /dev/tcp/127.0.0.1/80: nonexistent directory
/app $
/app $ uname -r
5.15.0-60-generic
```
CivAx
2024-01-18 18:34:07 +08:00
@zong400 我在 Ubuntu @ WSL 拉起没问题,但我 uname -r 看内核是 MS 自己编译的,我这边没有其他的 Ubuntu 环境。
julyclyde
2024-01-18 18:42:50 +08:00
@mightybruce /dev/tcp 是 bash 的
julyclyde
2024-01-18 18:44:28 +08:00
@helenfrank 故障时检查,我以前一般都是 kubectl exec 进去查看的
但是如果遇到某些洁癖的人,把 image 里各种工具软件都删了,那算没办法了……
yingqiuQAQ
2024-01-18 20:16:57 +08:00
nicolaka github 这个工具用起来挺方便
julyclyde
2024-01-19 12:17:18 +08:00
你这么惨,该不会是 shopee 或者腾讯 teg 的吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1009587

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX