创建部署问题时,请参考下面模板,你提供的信息越多,越容易及时获得解答。如果未按模板创建问题,管理员有权关闭问题。
确保帖子格式清晰易读,用 markdown code block 语法格式化代码块。
你只花一分钟创建的问题,不能指望别人花上半个小时给你解答。

操作系统信息
虚拟机,Centos8,10C/32G

Kubernetes版本信息
Client Version: version.Info{Major:“1”, Minor:“21”, GitVersion:“v1.21.4+k3s1”, GitCommit:“3e250fdbab72d88f7e6aae57446023a0567ffc97”, GitTreeState:“clean”, BuildDate:“2021-08-19T19:09:53Z”, GoVersion:“go1.16.6”, Compiler:“gc”, Platform:“linux/amd64”}

Server Version: version.Info{Major:“1”, Minor:“21”, GitVersion:“v1.21.4+k3s1”, GitCommit:“3e250fdbab72d88f7e6aae57446023a0567ffc97”, GitTreeState:“clean”, BuildDate:“2021-08-19T19:09:53Z”, GoVersion:“go1.16.6”, Compiler:“gc”, Platform:“linux/amd64”}

容器运行时
Version: 0.1.0

RuntimeName: containerd

RuntimeVersion: v1.4.9-k3s1

RuntimeApiVersion: v1alpha2

KubeSphere版本信息
v3.2

问题是什么
1. 关于集群网关watch的namespace

我在实际使用中发现,不论是集群网关还是项目网关,其watch的namespace都是靠nginx-ingress-controller 的命令行参数 –watch-namespace指定的,而这个值好像是通过gateway和Nginx层层传递下来。

那么作为集群网关,如果watch的是kubesphere-system或kubesphere-controls-system命名空间下的资源,他是如何做到感知到具体业务项目namespace下的ingress的?

我在实际使用中通过集群网关访问业务是404报错。

只有强制指定nginx-ingress-controller命令行参数watch-namespace为空,才能访问到具体项目。

因为我这边看nginx-ingress的代码,指定为空,就是watch all namespace。

2.我们由于某些原因,不定义ingress的域名,直接通过网关ip进行访问,那么如果项目定义的路由路径冲突,集群网关的行为是如何的,官方是如何建议集群网关的使用的,对于集群网关的具体定位是怎样的。

辛苦解答疑惑~多谢

xulai 多谢大佬予以解答,我看到文章有一个地方是这么描述的:

  • 集群和项目级别的网关:这个通过传入参数覆盖默认的 Helm Chart Values 来实现并在代码逻辑里控制,如果启用了集群网关就不能启用项目网关了;若启用了项目网关又启用了集群网关,那么通过两个网关入口都可以访问,只是这样会有两个 Ingress Controller 同时 Watch 相同的 Ingress 对象

    我的问题就在这里,我测试时发现集群网关ingress-controller watch的namespace是kubesphere-controls-system而没有watch各个项目的namespace(或者all-namespace),他是如何watch到其他项目下的ingress对象的呢。


16 天 后

检查下是不是创建集群网关时 gateway CR 中配置出问题了,集群网关的配置中 scope.enabled 应该为 false。集群网关还是项目网关在这儿由 scope.enabled 和 scope.namespace 决定的命令行参数 watch-namespace,你这儿的配置看起来像是 scope.enabled=true scope.namespace=‘’ 的配置导致的结果,这样是会设置 watch-namespace=$(POD_NAMESPACE) 也就是现在你看到的那样。