Kubernetes Ingress配置重写问题

时间:2019-04-11 10:51:38

标签: tomcat kubernetes kubernetes-ingress nginx-ingress amazon-eks

我正在创建配置以在AWS的Kubernetes集群中托管一些应用程序。我有两个不同的应用程序,具有单独的服务/容器/选择器,但目前我想通过单个入口公开它们。

所以我创建了以下入口控制器

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 appserver的Java应用程序)时,我总是收到以下页面

Tomcat

这是经典的旧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网址,我可以看到带有img / css的Tomcat主页,如果浏览到INGRESSHOST / APPCONTEXT,则可以毫无问题地使用该应用程序

1 个答案:

答案 0 :(得分:2)

如果您最近更改了nginx-ingress控制器的版本,则可能是最近对其进行了更改。现在,它使用正则表达式重写规则,也许您的重写目标总是被重写为“ /”。我认为这些更改是在一月份在0.22版中引入的。

您的入口的新正确语法为:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - path: /foo(.*)
        backend:
          serviceName: foo
          servicePort: 8080
      - path: /bar(.*)
        backend:
          serviceName: bar
          servicePort: 8080