V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
idblife
V2EX  ›  Kubernetes

如何从 redis 等外部系统里看到 k8s pod ip

  •  
  •   idblife · 2023-02-22 13:17:51 +08:00 · 2390 次点击
    这是一个创建于 667 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在我们的应用运行在 k8s 的 pod 里,
    redis 上看到的连接 ip 是 pod 的物理宿主机器 ip ,
    通什么能够看到具体哪个应用或者 pod ip 在连接 redis ?
    istio ?
    第 1 条附言  ·  2023-02-23 15:46:33 +08:00
    https://github.com/pixie-io/pixie
    完美解决
    谢谢各位的意见
    26 条回复    2023-02-23 14:54:58 +08:00
    defunct9
        1
    defunct9  
       2023-02-22 13:21:34 +08:00
    看不到啊看不到
    ql562482472
        2
    ql562482472  
       2023-02-22 13:24:48 +08:00
    放进去就行了。
    换种思路想一想,是不是 etcd 里有全部信息?是不是 K8SAPI 就能看到全部信息?
    idblife
        3
    idblife  
    OP
       2023-02-22 13:33:05 +08:00
    @ql562482472
    你知道我在说啥么。。。
    SweetEriri
        4
    SweetEriri  
       2023-02-22 13:38:45 +08:00
    istio 太麻烦了 直接命令或者 api 查询下就行了
    salmon5
        5
    salmon5  
       2023-02-22 13:42:38 +08:00
    写个插件吧,往 redis 塞下 pod 的 ip
    julyclyde
        6
    julyclyde  
       2023-02-22 13:42:46 +08:00
    你的真实需求是什么呢?
    获得了访问 redis 的 pod 的 IP ,然后呢?
    GopherDaily
        7
    GopherDaily  
       2023-02-22 13:47:15 +08:00
    让应用访问访问的时候使用不同的账号。

    你这个不是上层和中层应用的问题了,是 k8s CNI ,阿里云 VPC ,或者 TCP 之类处理的,TCP 从宿主机网卡出,所以 IP 就是宿主机的,虽然不知道具体,但是一般默认都是这样的,建议你走上面的思路
    idblife
        8
    idblife  
    OP
       2023-02-22 13:56:44 +08:00
    @julyclyde
    应用治理
    比如一个 redis 要下线,想找到使用它的所有工程提前通知
    ruanimal
        9
    ruanimal  
       2023-02-22 15:27:11 +08:00
    看描述不是缺注册中心吗
    nilai
        10
    nilai  
       2023-02-22 15:43:00 +08:00
    用 ebpf 的 cni 是否能达到这个效果呢?
    idblife
        11
    idblife  
    OP
       2023-02-22 15:54:04 +08:00
    @ruanimal
    注册中心的话拿到的 pod ip ,redis 看到的是 node ip 。
    注册中心在我描述的场景里有啥作用呢?
    idblife
        12
    idblife  
    OP
       2023-02-22 15:56:42 +08:00
    @nilai
    理论上是可以的,但是换 cni 这个有点太刺激了
    julyclyde
        13
    julyclyde  
       2023-02-22 17:29:20 +08:00
    @idblife 按说如果你的 redis 也在 k8s 集群内,pod 访问过来应该是 pod 自己的 IP 地址吧;经过 node 的 NAT 的时候才会变成 node 的 IP 地址

    redis 下线前清退客户端这个需求,其实是服务治理的问题,我感觉你做反了方向了。
    ql562482472
        14
    ql562482472  
       2023-02-22 17:33:44 +08:00
    @idblife 我看你不太知道我在说啥
    runzhliu
        15
    runzhliu  
       2023-02-22 17:37:21 +08:00   ❤️ 1
    @idblife 听起来怪怪的,注册中心和 redis 都在集群外?三层网络下 pod 流量出去走了 NAT ,redis 看到的是节点 IP 是正常的,如果换 CNI 应该是适合大二层的场景了,或者容器配双网卡,一个三层一个二层。
    victorc
        16
    victorc  
       2023-02-22 17:54:33 +08:00
    @idblife 应用治理 就是在链路 中间加一道 proxy ,在 proxy 里面随便造,istio 本质也是这样做的
    liuhuan475
        17
    liuhuan475  
       2023-02-22 18:35:22 +08:00
    idblife
        18
    idblife  
    OP
       2023-02-22 19:42:32 +08:00
    @runzhliu
    redis 在集群外,注册中心就是 kubernetes 的 etcd 啊
    idblife
        19
    idblife  
    OP
       2023-02-22 20:04:29 +08:00 via iPhone
    @julyclyde
    redis 在 k8s 集群外,要都在集群里就好办了
    bowser1701
        20
    bowser1701  
       2023-02-22 20:46:30 +08:00 via iPhone
    Pod IP 都是动态的,不如用账号做划分
    idblife
        21
    idblife  
    OP
       2023-02-22 21:46:48 +08:00
    @bowser1701
    悄悄地告诉你
    我们 redis 没密码。。。
    samwilson95
        22
    samwilson95  
       2023-02-22 23:04:13 +08:00
    解决方案是有的,原理是 pod 访问外部 k8s 的时候,从 k8s node 出去会做 一次 snat ,转化成 node ip , 所以 redis 看到就是 node ip 了

    如果想让 redis 那边看到 pod ip 的话,首先 出去,比如访问 redis 所在网段的时候 k8s 不要做 snat, 然后 保证 pod 的 IP 能路由到 redis 就可以

    原理是这样,我们云上架构是找云厂商帮忙做的,具体怎么设置我就不清楚了,你搞明白可以分享一下,哈哈
    julyclyde
        23
    julyclyde  
       2023-02-23 08:50:35 +08:00
    @idblife redis 在集群外。那你抓包,人工识别一下访问了啥 KEY ,再反向推测到底是哪个 pod 吧
    idblife
        24
    idblife  
    OP
       2023-02-23 11:10:50 +08:00 via iPhone
    @julyclyde
    上千个微服务,咋能知道具体用啥 key
    bowser1701
        25
    bowser1701  
       2023-02-23 14:16:10 +08:00 via iPhone
    @idblife
    istio 可以实现你的需求, 可以简单把 redis 配置成一个 external name 的 service 然后服务用这个 service 去访问 redis 。或者配置 proxy external service 的规则。

    然后可以在日志或者 trace 里面追踪你的 redis ,看看是哪些服务在访问它,用 pod ip 不太合适,因为是动态的,拿到 pod ip 你得想办法去找到对应的服务。

    但是按照你的上下文,上千个微服务,redis 没有密码,这种设置是很危险的,如果数据被别人写了,都找不到是谁。
    julyclyde
        26
    julyclyde  
       2023-02-23 14:54:58 +08:00
    @idblife 那我觉得你直接关了就行了
    等那些 pod 故障重生,就会去访问新的 redis 的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3536 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:23 · PVG 18:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.