Open sunnyramsey opened 2 years ago
正常情况下应该总是会添加所有Service和Pod的路由规则的,和选择哪一种DNS Mode无关。
可以提供一下 --debug 参数的日志,观察一下日志中添加的路由IP段是否覆盖了所需的Pod和Service的IP地址。
如果确实没有覆盖,在查明原因之前,可以先通过 ktctl config set connect.include-ips=<所需的IP段>
命令设置默认包含的额外IP段地址,可以免去每次执行connect命令时使用--includeIps
参数。
正常情况下应该总是会添加所有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[0m [33mDBG[0m Found domain themis.xxxxxx. (1) in dns (127.0.0.1:38204)
[90m8:39PM[0m [33mDBG[0m Empty answer for domain lookup themis.xxxxxxxx. (28)`
我遗漏了cache里面是有对type进行区分的。误以为是dns有问题,所以我把dnsMode切成了hosts模式,这时候日志上面确实看到了跨命名空间的service被加入到本地的dns记录里面去了。
但是路由规则上面确实只加了指定namespace下面的servcei ip 和 pod id `[90m8:38PM[0m [33mDBG[0m Service CIDR are: [7.53.27.157/32]
[90m8:38PM[0m [33mDBG[0m Pod CIDR are: [7.57.1.0/24]
[90m8:38PM[0m [33mDBG[0m Using cluster IP 7.32.252.54
[90m8:38PM[0m [33mDBG[0m Cluster CIDR are: [7.53.27.157/32 7.57.1.0/24]
[90m8:38PM[0m [32mINF[0m Adding route to 7.53.27.157/32
[90m8:38PM[0m [33mDBG[0m Task /sbin/ifconfig with args [ifconfig utun4 inet 7.53.27.157/32 7.53.27.157]
[90m8:38PM[0m [33mDBG[0m Task /sbin/route with args [route add -net 7.53.27.157/32 -interface utun4]
[90m8:38PM[0m [32mINF[0m Adding route to 7.57.1.0/24
[90m8:38PM[0m [33mDBG[0m Task /sbin/ifconfig with args [ifconfig utun4 add 7.57.1.0/24 7.57.1.0]
[90m8:38PM[0m [33mDBG[0m Task /sbin/route with args [route add -net 7.57.1.0/24 -interface utun4]
[90m8:38PM[0m [33mDBG[0m Task /usr/sbin/netstat with args [netstat -rn]
[90m8:38PM[0m [32mINF[0m Route to tun device completed
[90m8:38PM[0m [32mINF[0m Setting up dns in local mode
[90m8:38PM[0m [33mDBG[0m Service found: iris.ncc-iris-testing 7.53.27.157`
所以DNS看起来是正常的,但是跨命名空间的Namespace的路由并没有被添加进去,当我手动添加以后,访问就成功了。 注意到cidr.go文件中的getServiceIps只会获取指定ns的serviceip? 顺便,因为我们是共享集群,对namespace有权限的管理,实际上如果获取所有ns下面的service的话似乎也不太可行,所以是不是可以通过什么参数来指定ns来设置route呢。
目前的逻辑是会先尝试在集群范围内查询Service的IP地址,如果权限不足,就默认只查询当前Namespace内的Service IP地址。
这里可以考虑加增加一个--includeNamespaces
参数,来处理介于两者之间的情况,也就是说具有除当前Namespace以外的某些Namespace的权限,但又不具有整个集群权限。放到下个版本里吧。
另外注意到ShadowPod会配置一个AUDIT_WRITE,集群有特殊的限制不允许这个Capability,注释掉以后能够正常工作,这个配置是否是必须的呢?
当设定dnsMode的为多个命名空间时,只会添加dns记录,但不会自动为非Shadow Pod所在Namespace的其他Namespace添加service和pod的route规则,会导致无法在本地访问其他命名空间服务。 需要手动增加路由规则,是否可以在setupTunRoute中增加其他命名空间的路由规则解析并添加?