容器连通性(容器到某个网络是否畅通)检查方案
目前远程对 pod 的网络连通性 检查有啥比较好的方案吗, 地址可以是 domain, domain:port, ip, ip:port1. client-go 调 exec 执行 curl, ping, nc (我目前使用的方案, 但存在存量镜像没有这些工具)2. 再挂个工具 container (侵入性较大, 且更占资源)3. nsenter (需要连接 node, docker inspect 获取 Pid, client-go 获取 pod dns 地址, 依赖于 node 上的工具)还有啥比较好的方案吗
直接与这个地址建立 Socket 连接就行了。 上面开进程去验证属于脱裤子放屁package mainimport ( "fmt" "net" "time")func connectTCP(address string) bool { // 设置连接超时时间 timeout := 5 * time.Second // 尝试建立连接 conn, err := net.DialTimeout("tcp", address, timeout) // 检查是否出现错误 if err != nil { fmt.Println("连接失败:", err) return false } // 关闭连接 defer conn.Close() fmt.Println("连接成功") return true}
#1 并不是这样, 我是在做上层云平台的功能, 这个功能是为了检查运行中的 pod 到某个网络是否畅通
sidecar?
#3 见第二条, 目前没上 istio, 所以...
在上家公司也有做过这种需求,用的 nsenter ,如果 k8s 版本支持的话可以看一下 kubectl-debug
插眼. 确实是个问题. 进到容器没 PING, CURL 还测不了接口是否联通.
就走 2
openkruise.io/zh/docs/user-manuals/sidecarset我觉得这个挺合适的
nsenter 或者把容器的网络命名空间 mount 到 /run/netns/NAME 下,然后ip netns exec NAME cmd....
如果存在“有时候通”那你应该去解决网络的问题啊,而不是每次运行的时候检查一下啊
在存量镜像没法修改的情况下,就用 2 的 sidecar 呗,sidecar 是一种模式,不一定跟 istio 绑定,你可以自己用 go 写一个小程序,或者就提前封装好一个镜像+bash 脚本。然后在集群部署个 mutating webhook ,当指定 deployment 部署时,自动通过 webhook 把这个 container 注入到 deployment 中。
另外看这个帖子学到了 nsenter ,挺好的东西
#10 不是每次运行(我理解你的意思是启动)的时候, 是在正常运行时, 出现了一些服务不可用, 项目组成员可以通过云平台先检查下是不是网络问题
#11 是的, 理解你的想法, 并且实践过, 如我在 2 里所提到的(侵入性较大, 且更占资源)
这个不是监控要做的事吗。。
#15 需求是可以把这个功能给到项目组成员, 让他们在运行中可以检查到某个网络是否通畅, 进而可以反馈给管理网络的人, 毕竟谁知道项目组的人想访问哪个网络呢
之前看过一个观点是这个容器里运行的程序是什么语言,就用对应的语言开发一个/ping 接口或者脚本来检查该程序是否在运行,我觉得这也是个办法。一般这种逻辑也不会太复杂,定制化也容易。
#17 你对需求理解的有误差, 想要的是测试 pod 到某个网络是否通畅, 不是检测 pod 正常运行
在所属节点创建一个特权 pod ,在 pod 中使用 nsenter -t { PID } -n { CMD } 检测
我也用到了 docker ,挺吃力的,不过部署成功了我开源了一个精美的电商开源项目,如果对你有帮助,请在 github 上帮我点亮星星,这会是对我莫大的鼓励。在线体验: shop.huanghanlian.com开源项目 传送门: github.com/huanghanzhilian/c-shopping
机器人?
#19 这个方案不错
#19 和第三种方案差别不大
unix 经典问题,无网络工具如何测网,经典回答永远是 /dev/tcp
纯 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"
1 就行了,把所有工具自己打包一下完事,或者完全自己写个单文件工具
可以避免需要 ssh 进入 node ,也可以避免 node 没有对应工具
容器网络是 linux 的特性,linux 没有/dev/tcp另外容器网络是在命名空间中的无 shell 或工具的 pod 调试就是 nsenter
只要基础镜像是 bash fs 有 bash 就有 tcp ,op 都能 exec 进容器调 nc 了很自然能调到 tcp
#29 貌似并不如你所言, 我找了个是 bash 的容器, 并没有/dev/tcp, 我自己的 arch or mac 上面也没有/dev/tcp
#30 验证arch:bash❯ exec 9<> /dev/tcp/www.baidu.com/443zsh: no such file or directory: /dev/tcp/www.baidu.com/443
macbashexec 9<> /dev/tcp/www.baidu.com/443zsh: no such file or directory: /dev/tcp/www.baidu.com/443
#31 /dev/tcp 要 redirect 调用,本身并不存在这个文件,具体 lib 在 /proc/net/tcp 。如果你在本机 docker run ,/proc 会受宿主机影响,你可以 uname -r 看看内核,我这会儿没在 Arm Mac 旁边,没法验证你这个场景。Redirect: www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections deployment apiVersion: v1kind: Podmetadata: name: arch namespace: defaultspec: 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 createdroot@WSL [17:13:47] :~ # kubectl get pod NAME READY STATUS RESTARTS AGEarch 0/1 ContainerCreating 0 4sroot@WSL [17:14:03] :~ # kubectl get pod NAME READY STATUS RESTARTS AGEarch 1/1 Running 0 19sroot@WSL [17:14:05] :~ # kubectl exec -it arch -- bash[root@arch /]# cat /etc/issue Arch Linux \r (\l)[root@arch /]# uname -r6.1.59[root@arch /]# echo < /dev/tcp/8.8.8.8/53 && echo "ok" || echo "fail"ok[root@arch /]#
可以尝试使用 kubevpn github.com/kubenetworks/kubevpn ,本地直接链接到 k8s 网络,在本地直接 ping pod ip
宿主是 ubuntu 貌似不行/app $ exec 9<> /dev/tcp/127.0.0.1/80sh: can't create /dev/tcp/127.0.0.1/80: nonexistent directory/app $ /app $ uname -r5.15.0-60-generic
我在 Ubuntu @ WSL 拉起没问题,但我 uname -r 看内核是 MS 自己编译的,我这边没有其他的 Ubuntu 环境。
/dev/tcp 是 bash 的
故障时检查,我以前一般都是 kubectl exec 进去查看的但是如果遇到某些洁癖的人,把 image 里各种工具软件都删了,那算没办法了……
nicolaka github 这个工具用起来挺方便
现在不都是流媒体了吗,开个会员就完事,在 NAS 上看还没弹幕,为什么还要影音服务。下载的需求也非常少了 因为我要看的是高码率、4K HDR 、导演剪辑版的影视作品,而不是…
大家推荐下 java saas 开源系统 不好招 go 人的话建议还是 java 。。起码好招人。。 saas 果断 java 写业务还是 Java 吧,小城市还是 Ja…
从诺基亚、谷歌类原生、三星 one ui 用过来,在用国产中国版定制系统,那叫一个难受。关闭应用安装扫描还得登录帐号?允许第三方 app (我用谷歌文件极客)安装未知应用也得登…