AKS集群中无法创建指向KubeSphere的Nginx Ingress路由
问题根因
- 你当前
ks-console服务类型为LoadBalancer,AKS会自动为该类型服务创建独立公网负载均衡器,也就是你看到的20.248.217.111这个额外IP,这就是额外产生成本的原因,和你使用Ingress统一入口的目标冲突。 - 现有Ingress规则配置错误:全路径(
/及所有子路径)都转发到ks-console后端,导致Azure负载均衡器发往Ingress控制器的/healthz健康检查请求也被转发给ks-console,ks-console无该接口因此返回302重定向,就是你日志里反复出现的302记录来源,长期会导致LB判定后端实例不健康。 - 现有规则未配置你需要的路径前缀分流逻辑,无法实现
/ksconsole访问Kubesphere、/tekton-dashboard访问Tekton的需求,且rewrite规则引用的$2捕获组不存在,规则不生效。
修复步骤
1. 回收ks-console的独立LB
将ks-console服务类型从LoadBalancer改为ClusterIP,AKS会自动回收对应的独立公网LB。后续所有需要通过Ingress暴露的服务,都使用ClusterIP类型即可,无需再创建LoadBalancer类型服务。
执行命令直接修改:
kubectl patch svc ks-console -n kubesphere-system -p '{"spec":{"type":"ClusterIP"}}'
2. 替换为正确的Ingress规则
删除你之前创建的错误Ingress资源,新建如下配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: shared-app-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/use-regex: "true" # 让/healthz请求由Ingress控制器直接响应,不转发到后端,解决健康检查异常问题 nginx.ingress.kubernetes.io/server-snippet: | location = /healthz { return 200 "ok"; add_header Content-Type text/plain; } spec: ingressClassName: nginx rules: - http: paths: # Kubesphere控制台路由 - path: /ksconsole(/|$)(.*) pathType: Prefix backend: service: name: ks-console port: number: 80 # 重写路径:去掉/ksconsole前缀后转发给后端 nginx.ingress.kubernetes.io/rewrite-target: /$2 # Tekton仪表盘路由,请替换为你环境中实际的服务名和端口 - path: /tekton-dashboard(/|$)(.*) pathType: Prefix backend: service: name: tekton-dashboard port: number: 9097 nginx.ingress.kubernetes.io/rewrite-target: /$2
注意:Kubesphere和Tekton默认配置下可能存在静态资源路径硬编码问题,需要在对应服务启动参数中配置base路径为
/ksconsole/和/tekton-dashboard/,否则访问时会出现静态资源404。
3. 验证效果
- 等待1-2分钟配置生效后,访问Ingress控制器的公网IP
20.92.133.79/healthz,应返回ok状态码200,控制器日志中不会再出现健康检查请求转发到ks-console的302记录。 - 访问
http://20.92.133.79/ksconsole可打开Kubesphere控制台,访问http://20.92.133.79/tekton-dashboard可打开Tekton仪表盘。 - 后续新增需要暴露的服务,只需在上述Ingress中新增对应path规则即可,整个集群仅保留Ingress控制器这一个公网LB,不会再产生额外LB成本。
日志说明
你之前看到的日志均为Azure LB的正常健康检查流量:源IP10.240.0.4是Azure LB的内部代理地址,请求路径为/healthz,User-Agent为Load Balancer Agent,因之前的Ingress规则匹配所有路径,该请求被转发到ks-console后端,ks-console收到未知路径请求返回302重定向,不属于业务服务报错。
内容的提问来源于stack exchange,提问作者hungrylearnerbenicewithme
相关产品推荐
相关产品推荐

