您好,我们测试环境部署的是一个3节点集群,在自己的项目下需要设置网络隔离,限制外部访问,但在测试过程中发现,如我在该项目下部署了nginx,并使用NodePort方式来允许外网访问,未打开网络隔离之前访问均正常;但打开网络隔离后,使用集群节点IP+NodePort无法访问(telnet测试):

备注:192.168.2.112为我外部访问ip,192.168.2.122为我的master节点IP,30285为nginx的NodePort

master ~]# telnet 192.168.2.122 30285
Trying 192.168.2.122...

于是添加网络隔离规则,设置如下:

添加后依然无法访问:

目前存在以下疑问:

  • 1,打开网络隔离后为什么会对集群的节点Ip的访问造成隔离?
  • 2,如果通过设置ip白名单的方式允许外网访问,但添加后依然无法访问,是规则设置有错误还是什么原因?
  • 3,目前尚未找到针对该功能设置的文档,能否详细的介绍一下?
  • Feynmanduanjiong 回复了此帖
  • jasonhe 可以使用namespace下的网络隔离。 我明白你的疑惑。 你这里默认的应该是calico的ipip模式, 那么你应该加的是tunl0这个网卡上的ip地址。 通过node port方式暴露服务, 麻烦的一点就是不同插件他的src ip变化方式不一样。

    jasonhe 目前有三篇网络隔离的文档,在英文文档搜索 Network 的前三篇,你先参考一下是否可以解决你的疑问:

    jasonhe 这个应该是因为默认通过nodeport访问, 外部进来的流量会做snat, 将源ip地址转换成节点的ip地址, 你可以通过通过设置cidr放行node节点ip。 具体你可以阅读上面评论发的文章

      duanjiong 设置了以下两个放行策略:

      备注:192.168.2.122为master的ip地址;192.168.2.112为外网访问地址,

      现在的问题是,发现只有访问nginx pod所在节点 ip+NodePort 时可以正常访问,但是使用master节点IP+NodePode就访问不了,service.spec:. externalTrafficPolicy:设置为了Local也不行?不知道导致master访问不通原因是什么?

        jasonhe 设置externalTrafficPolicy为local时, 你外部访问node port时, 流量只会在本地,不会转发到其他节点, 可能你pod不在你访问的节点上。 另外你浏览器所在主机的ip是啥?

          duanjiong 你要对外暴露的服务都是http的, 那么我建议你可以通过ingress的方式暴露, 然后打开网络隔离, 就只用放开ingress所在namespace的进入就可以了, 这种方式比你直接使用nodeport规则好控制些。

          可以参考这里https://kubesphere.io/docs/project-administration/project-network-isolation/#best-practice

            duanjiong 我的集群是1 master+2node,是使用kubesphere 3.0 搭建的,测试nginx pod在node2上,外网访问地址是192.168.2.112;calico是默认的模式,没修改过;采用NodePort方式暴漏服务,是没法使用namespace下的网络隔离功能吗?比较疑惑具体怎么实现?

              jasonhe 可以使用namespace下的网络隔离。 我明白你的疑惑。 你这里默认的应该是calico的ipip模式, 那么你应该加的是tunl0这个网卡上的ip地址。 通过node port方式暴露服务, 麻烦的一点就是不同插件他的src ip变化方式不一样。

                duanjiong 你好,测试了下网络隔离地址在IPIP网络模式下配置成tunl0的地址,可以使用master的ip+NodePort进行访问,由于对calico的网络了解不太深入,理解的不是太好;感谢您的回复!

                9 天 后

                @duanjiong 您好,在测试网络隔离—->设置集群外部ip地址—–>出口功能时,发现一个问题,在该namesace下部署一个测试用的busybox,在busybox中ping 在普通虚拟机上部署的mysql数据库Ip:3306;没有设置出口规则时,可以正常的ping通,但在出口添加了mysql所在虚拟机的Ip和3306端口后,反而从busybox中无法ping通了!

                   这与我在文档中和设置规则说明中看到和理解的有出入:
                   > https://kubesphere.io/docs/project-administration/project-network-isolation/#best-practice
                When network isolation is turned on, egress traffic will be allowed by default, while ingress traffic will be denied for different projects. But when you add an egress network policy, only traffic that matches your policy will be allowed to go out.

                包括在admin账户下的生成的网络策略详情中查看:

                从这些内容描述来看,该设置更像是一个白名单,默认是允许访问所有ip,添加后是允许访问列表中的ip;但通过实际设置后发现,更像是一个黑名单,设置后不允许访问所设置的Ip,所以该出口设置存在疑问,是理解错误还是实际设置中存在问题,麻烦给予回复,谢谢!