【发布时间】:2019-04-11 10:51:37
【问题描述】:
我正在创建一个配置以在 AWS 上的 Kubernetes 集群中托管一些应用程序。我有两个不同的应用程序,具有单独的服务/pod/选择器,但我想暂时用一个入口公开它们。
所以我创建了以下入口控制器
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /foo
backend:
serviceName: foo
servicePort: 8080
- path: /bar
backend:
serviceName: bar
servicePort: 8080
并且入口从 AWS 获取 ELB 没有任何问题,但是当我尝试浏览应用程序(使用 Tomcat 应用程序服务器的 Java 应用程序)时,我总是收到以下页面
这是经典的旧 Tomcat 欢迎页面,但每个请求总是返回 index.html(未加载 css/img),并且如果我尝试为应用程序使用正确的上下文路径,我会收到此页面。
如果我使用服务 (LoadBalancer) 公开应用程序,我可以在没有这些问题的情况下使用它,所以我认为入口配置有问题。
有什么想法吗?
更新
如果我使用像这样的单一路径的入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: foo
servicePort: 8080
使用 INGRESSHOST url 我可以看到带有 img/css 的 Tomcat 主页,如果我浏览到 INGRESSHOST/APPCONTEXT,我可以毫无问题地使用该应用程序
【问题讨论】:
-
检查您的浏览器网络日志,它尝试从哪个 url 获取资源。
-
唯一正确的请求是主页,其他请求没有正确重写。 index.html img/css 未加载,因为它们使用相对路径
-
服务在访问时会直接响应根路径吗?
-
如果直接暴露,应用程序会回复其上下文路径。如果我删除入口并将服务发布为 LoadBalancer 一切正常。在入口配置中,如果我询问INGRESS_HOST/foo/foocontext,我总是会收到Tomcat 主页面(在INGRESS_HOST/foo 上可用)。对于以 foo 开头的每个请求,我都会收到 Tomcat 索引页
-
第一件事:您在顶部共享的代码是入口资源而不是控制器。如果您也有共享控制器代码,也许会很好。我假设它是
nginx deployment...?
标签: tomcat kubernetes kubernetes-ingress nginx-ingress amazon-eks