容器连通性(容器到某个网络是否畅通)检查方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
helenfrank
V2EX    Kubernetes

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

  •  
  •   helenfrank 2024-01-18 10:34:10 +08:00 3191 次点击
    这是一个创建于 698 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前远程对 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 上的工具)

    还有啥比较好的方案吗
    39 条回复    2024-01-19 12:17:18 +08:00
    Nooooobycat
        1
    Nooooobycat  
       2024-01-18 10:37:12 +08:00
    直接与这个地址建立 Socket 连接就行了。 上面开进程去验证属于脱裤子放屁

    package main

    import (
    "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
    }
    helenfrank
        2
    helenfrank  
    OP
       2024-01-18 10:41:57 +08:00
    @Nooooobycat #1 并不是这样, 我是在做上层云平台的功能, 这个功能是为了检查运行中的 pod 到某个网络是否畅通
    latteczy
        3
    latteczy  
       2024-01-18 10:44:56 +08:00
    sidecar?
    helenfrank
        4
    helenfrank  
    OP
       2024-01-18 10:47:42 +08:00
    @latteczy #3 见第二条, 目前没上 istio, 所以...
    lntouchables
        5
    lntouchables  
       2024-01-18 10:55:58 +08:00
    在上家公司也有做过这种需求,用的 nsenter ,如果 k8s 版本支持的话可以看一下 kubectl-debug
    lujiaosama
        6
    lujiaosama  
       2024-01-18 10:59:41 +08:00
    插眼. 确实是个问题. 进到容器没 PING, CURL 还测不了接口是否联通.
    leonshaw
        7
    leonshaw  
       2024-01-18 11:13:29 +08:00
    就走 2
    ysicing
        8
    ysicing  
       2024-01-18 11:22:31 +08:00
    lrh3321
        9
    lrh3321  
       2024-01-18 11:37:51 +08:00 via Android
    nsenter

    或者把容器的网络命名空间 mount 到 /run/netns/NAME 下,然后
    ip netns exec NAME cmd....
    julyclyde
        10
    julyclyde  
       2024-01-18 12:22:30 +08:00
    @helenfrank 如果存在“有时候通”那你应该去解决网络的问题啊,而不是每次运行的时候检查一下啊
    Frankcox
        11
    Frankcox  
       2024-01-18 13:06:49 +08:00
    在存量镜像没法修改的情况下,就用 2 的 sidecar 呗,sidecar 是一种模式,不一定跟 istio 绑定,你可以自己用 go 写一个小程序,或者就提前封装好一个镜像+bash 脚本。然后在集群部署个 mutating webhook ,当指定 deployment 部署时,自动通过 webhook 把这个 container 注入到 deployment 中。
    Frankcox
        12
    Frankcox  
       2024-01-18 13:07:33 +08:00
    @Frankcox 另外看这个帖子学到了 nsenter ,挺好的东西
    helenfrank
        13
    helenfrank  
    OP
       2024-01-18 13:35:52 +08:00
    @julyclyde #10 不是每次运行(我理解你的意思是启动)的时候, 是在正常运行时, 出现了一些服务不可用, 项目组成员可以通过云平台先检查下是不是网络问题
    helenfrank
        14
    helenfrank  
    OP
       2024-01-18 13:37:15 +08:00
    @Frankcox #11 是的, 理解你的想法, 并且实践过, 如我在 2 里所提到的(侵入性较大, 且更占资源)
    fengxsong
        15
    fengxsong  
       2024-01-18 13:48:56 +08:00
    这个不是监控要做的事吗。。
    helenfrank
        16
    helenfrank  
    OP
       2024-01-18 13:54:31 +08:00
    @fengxsong #15 需求是可以把这个功能给到项目组成员, 让他们在运行中可以检查到某个网络是否通畅, 进而可以反馈给管理网络的人, 毕竟谁知道项目组的人想访问哪个网络呢
    edsion996
        17
    edsion996  
       2024-01-18 14:18:38 +08:00 via Android
    之前看过一个观点是这个容器里运行的程序是什么语言,就用对应的语言开发一个/ping 接口或者脚本来检查该程序是否在运行,我觉得这也是个办法。一般这种逻辑也不会太复杂,定制化也容易。
    helenfrank
        18
    helenfrank  
    OP
       2024-01-18 14:22:32 +08:00
    @zjb861107 #17 你对需求理解的有误差, 想要的是测试 pod 到某个网络是否通畅, 不是检测 pod 正常运行
    yimiaoxiehou
        19
    yimiaoxiehou  
       2024-01-18 14:34:42 +08:00   1
    在所属节点创建一个特权 pod ,在 pod 中使用 nsenter -t { PID } -n { CMD } 检测
    huanghanzhilian
        20
    huanghanzhilian  
       2024-01-18 14:37:47 +08:00
    我也用到了 docker ,挺吃力的,不过部署成功了

    我开源了一个精美的电商开源项目,如果对你有帮助,请在 github 上帮我点亮星星,这会是对我莫大的鼓励。
    在线体验: http://shop.huanghanlian.com
    开源项目 传送门: https://github.com/huanghanzhilian/c-shopping
    yimiaoxiehou
        21
    yimiaoxiehou  
       2024-01-18 14:39:06 +08:00
    @huanghanzhilian 机器人?
    helenfrank
        22
    helenfrank  
    OP
       2024-01-18 15:12:39 +08:00
    @yimiaoxiehou #19 这个方案不错
    helenfrank
        23
    helenfrank  
    OP
       2024-01-18 15:15:00 +08:00
    @yimiaoxiehou #19 和第三种方案差别不大
    CivAx
        24
    CivAx  
       2024-01-18 15:42:54 +08:00
    unix 经典问题,无网络工具如何测网,经典回答永远是 /dev/tcp
    CivAx
        25
    CivAx  
       2024-01-18 15:52:30 +08:00   1
    纯 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
        26
    cheng6563  
       2024-01-18 16:00:35 +08:00
    1 就行了,把所有工具自己打包一下完事,或者完全自己写个单文件工具
    yimiaoxiehou
        27
    yimiaoxiehou  
       2024-01-18 16:13:52 +08:00
    @helenfrank 可以避免需要 ssh 进入 node ,也可以避免 node 没有对应工具
    mightybruce
        28
    mightybruce  
       2024-01-18 16:29:52 +08:00
    容器网络是 linux 的特性,linux 没有/dev/tcp

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

    无 shell 或工具的 pod 调试就是 nsenter
    CivAx
        29
    CivAx  
       2024-01-18 16:35:08 +08:00 via iPhone
    @mightybruce 只要基础镜像是 bash fs 有 bash 就有 tcp ,op 都能 exec 进容器调 nc 了很自然能调到 tcp
    helenfrank
        30
    helenfrank  
    OP
       2024-01-18 16:48:01 +08:00
    @CivAx #29 貌似并不如你所言, 我找了个是 bash 的容器, 并没有/dev/tcp, 我自己的 arch or mac 上面也没有/dev/tcp
    helenfrank
        31
    helenfrank  
    OP
       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
        32
    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
        33
    naison  
       2024-01-18 17:23:34 +08:00
    可以尝试使用 kubevpn https://github.com/kubenetworks/kubevpn ,本地直接链接到 k8s 网络,在本地直接 ping pod ip
    ethsol
        34
    ethsol  
       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
        35
    CivAx  
       2024-01-18 18:34:07 +08:00 via iPhone
    @zong400 我在 Ubuntu @ WSL 拉起没问题,但我 uname -r 看内核是 MS 自己编译的,我这边没有其他的 Ubuntu 环境。
    julyclyde
        36
    julyclyde  
       2024-01-18 18:42:50 +08:00
    @mightybruce /dev/tcp 是 bash 的
    julyclyde
        37
    julyclyde  
       2024-01-18 18:44:28 +08:00
    @helenfrank 故障时检查,我以前一般都是 kubectl exec 进去查看的
    但是如果遇到某些洁癖的人,把 image 里各种工具软件都删了,那算没办法了……
    yingqiuQAQ
        38
    yingqiuQAQ  
       2024-01-18 20:16:57 +08:00
    nicolaka github 这个工具用起来挺方便
    julyclyde
        39
    julyclyde  
       2024-01-19 12:17:18 +08:00
    你这么惨,该不会是 shopee 或者腾讯 teg 的吧?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2903 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 14:13 PVG 22:13 LAX 06:13 JFK 09:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86