K8s中Consul UI通过Nginx Ingress挂载/consul路径异常求助
问题描述
您好,这可能是重复问题,但我查阅相关解答后仍未找到问题所在,故在此求助(已参考issue#758但方案无效)。
现有环境
已部署带有metallb负载均衡器和Nginx Ingress Controller的K8s集群。
预期效果
通过Helm安装Consul后,Consul UI可通过myweb.mydomain.com/consul访问。
当前问题
访问myweb.mydomain.com/consul时出现错误:Invalid URL path: if attempting to use the HTTP API, ensure the path starts with '/v1/';但将Ingress路径改为/后,myweb.mydomain.com可正常显示Consul UI。
环境版本信息
K8s版本
$ kubectl version Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.10", GitCommit:"a7a32748b5c60445c4c7ee904caf01b91f2dbb71", GitTreeState:"clean", BuildDate:"2022-02-16T11:24:04Z", GoVersion:"go1.16.14", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.10", GitCommit:"a7a32748b5c60445c4c7ee904caf01b91f2dbb71", GitTreeState:"clean", BuildDate:"2022-02-16T11:18:16Z", GoVersion:"go1.16.14", Compiler:"gc", Platform:"linux/amd64"}
Helm部署的Chart版本
$ helm list -A (Trimmed output) NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION consul consul 1 2022-08-22 19:42:43.496703951 +0000 UTC deployed consul-0.46.1 1.12.3 nginx-stable nginx-stable 1 2022-08-03 22:33:45.242779695 +0000 UTC deployed nginx-ingress-0.14.0 2.3.0
Consul Helm配置(values.yaml)
global: name: consul ui: ingress: enabled: true hosts: - backend: port: name: 80 service: name: consul-ui host: myweb.mydomain.com pathType: ImplementationSpecific paths: - /consul ingressClassName: nginx
Helm命令行部署方式
helm install consul hashicorp/consul --set global.name=consul \ --create-namespace --namespace consul \ --set ui.ingress.enabled=true \ --set 'ui.ingress.hosts[0].host=myweb.mydomain.com' \ --set 'ui.ingress.hosts[0].paths[0]=/consul' \ --set 'ui.ingress.ingressClassName=nginx' \ --set 'ui.ingress.hosts[0].backend.service.name=consul-ui' \ --set 'ui.ingress.hosts[0].backend.port.name=80' \ --set 'ui.ingress.hosts[0].pathType=ImplementationSpecific'
请问我的配置哪里出现了问题?盼复。
解决方案
问题出在Consul UI未配置路径前缀,导致它仍以根路径/加载静态资源和API请求,而Ingress转发过来的请求基于/consul,两者路径不匹配引发错误。需要做两处修改:
- 配置Consul UI的路径前缀:添加
ui.pathPrefix: /consul,告诉Consul UI所有资源和API请求都基于/consul路径。 - 调整Ingress路径匹配规则:将路径改为
/consul/*,确保所有子路径的请求都能转发到Consul UI服务。
修改后的values.yaml
global: name: consul ui: pathPrefix: /consul ingress: enabled: true hosts: - backend: port: name: 80 service: name: consul-ui host: myweb.mydomain.com pathType: ImplementationSpecific paths: - /consul/* ingressClassName: nginx
修改后的Helm部署命令
helm install consul hashicorp/consul --set global.name=consul \ --create-namespace --namespace consul \ --set ui.ingress.enabled=true \ --set 'ui.ingress.hosts[0].host=myweb.mydomain.com' \ --set 'ui.ingress.hosts[0].paths[0]=/consul/*' \ --set 'ui.ingress.ingressClassName=nginx' \ --set 'ui.ingress.hosts[0].backend.service.name=consul-ui' \ --set 'ui.ingress.hosts[0].backend.port.name=80' \ --set 'ui.ingress.hosts[0].pathType=ImplementationSpecific' \ --set ui.pathPrefix=/consul
修改完成后,重新部署Consul:
helm upgrade consul hashicorp/consul --namespace consul -f values.yaml
此时访问myweb.mydomain.com/consul就能正常加载Consul UI了。
内容的提问来源于stack exchange,提问作者neo3matrix
相关产品推荐
相关产品推荐

