alibaba / kt-connect

A toolkit for Integrating with your kubernetes dev environment more efficiently
https://alibaba.github.io/kt-connect/#/
GNU General Public License v3.0
1.51k stars 231 forks source link

tun2socks模式下的跨命名空间访问 #333

Open sunnyramsey opened 2 years ago

sunnyramsey commented 2 years ago

当设定dnsMode的为多个命名空间时,只会添加dns记录,但不会自动为非Shadow Pod所在Namespace的其他Namespace添加service和pod的route规则,会导致无法在本地访问其他命名空间服务。 需要手动增加路由规则,是否可以在setupTunRoute中增加其他命名空间的路由规则解析并添加?

linfan commented 2 years ago

正常情况下应该总是会添加所有Service和Pod的路由规则的,和选择哪一种DNS Mode无关。

可以提供一下 --debug 参数的日志,观察一下日志中添加的路由IP段是否覆盖了所需的Pod和Service的IP地址。

如果确实没有覆盖,在查明原因之前,可以先通过 ktctl config set connect.include-ips=<所需的IP段> 命令设置默认包含的额外IP段地址,可以免去每次执行connect命令时使用--includeIps参数。

sunnyramsey commented 2 years ago

正常情况下应该总是会添加所有Service和Pod的路由规则的,和选择哪一种DNS Mode无关。

可以提供一下 --debug 参数的日志,观察一下日志中添加的路由IP段是否覆盖了所需的Pod和Service的IP地址。

如果确实没有覆盖,在查明原因之前,可以先通过 ktctl config set connect.include-ips=<所需的IP段> 命令设置默认包含的额外IP段地址,可以免去每次执行connect命令时使用--includeIps参数。

背景是这样的,首先我设置了namespace的参数,想要在本地去访问跨命名空间的服务,这时候观察到ShadowPod会去解析跨命名空间服务的DNS,我观察到这里会做多次的dnslookup,不同的type,但是当type=1(A)的时候DNS查询有结果,type=28(AAA)的时候DNS查询结果为空(Empty answer for domain lookup)。 `[90m8:39PM DBG Found domain themis.xxxxxx. (1) in dns (127.0.0.1:38204)

8:39PM DBG Empty answer for domain lookup themis.xxxxxxxx. (28)`

我遗漏了cache里面是有对type进行区分的。误以为是dns有问题,所以我把dnsMode切成了hosts模式,这时候日志上面确实看到了跨命名空间的service被加入到本地的dns记录里面去了。

但是路由规则上面确实只加了指定namespace下面的servcei ip 和 pod id `[90m8:38PM DBG Service CIDR are: [7.53.27.157/32]

8:38PM DBG Pod CIDR are: [7.57.1.0/24]

8:38PM DBG Using cluster IP 7.32.252.54

8:38PM DBG Cluster CIDR are: [7.53.27.157/32 7.57.1.0/24]

8:38PM INF Adding route to 7.53.27.157/32

8:38PM DBG Task /sbin/ifconfig with args [ifconfig utun4 inet 7.53.27.157/32 7.53.27.157]

8:38PM DBG Task /sbin/route with args [route add -net 7.53.27.157/32 -interface utun4]

8:38PM INF Adding route to 7.57.1.0/24

8:38PM DBG Task /sbin/ifconfig with args [ifconfig utun4 add 7.57.1.0/24 7.57.1.0]

8:38PM DBG Task /sbin/route with args [route add -net 7.57.1.0/24 -interface utun4]

8:38PM DBG Task /usr/sbin/netstat with args [netstat -rn]

8:38PM INF Route to tun device completed

8:38PM INF Setting up dns in local mode

8:38PM DBG Service found: iris.ncc-iris-testing 7.53.27.157`

所以DNS看起来是正常的,但是跨命名空间的Namespace的路由并没有被添加进去,当我手动添加以后,访问就成功了。 注意到cidr.go文件中的getServiceIps只会获取指定ns的serviceip? 顺便,因为我们是共享集群,对namespace有权限的管理,实际上如果获取所有ns下面的service的话似乎也不太可行,所以是不是可以通过什么参数来指定ns来设置route呢。

linfan commented 2 years ago

目前的逻辑是会先尝试在集群范围内查询Service的IP地址,如果权限不足,就默认只查询当前Namespace内的Service IP地址。

这里可以考虑加增加一个--includeNamespaces参数,来处理介于两者之间的情况,也就是说具有除当前Namespace以外的某些Namespace的权限,但又不具有整个集群权限。放到下个版本里吧。

sunnyramsey commented 2 years ago

另外注意到ShadowPod会配置一个AUDIT_WRITE,集群有特殊的限制不允许这个Capability,注释掉以后能够正常工作,这个配置是否是必须的呢?