【问题标题】:Kubernetes Ingress path rewritesKubernetes Ingress 路径重写
【发布时间】:2019-03-02 08:29:41
【问题描述】:

我正在为 Kubernetes 上的某些服务运行 Ingress,尽管服务正在重定向到这些集群 IP(有些正确),但我不确定如何正确解析这些基本路径之后的路径,例如,如果我在路径/ 中有Tomcat,在路径/nginx 上有Nginx,/ 之后的任何Tomcat 路径都无法解析,甚至/ 也没有任何Nginx 路径解析。我的ingress.yaml 中已经设置了nginx.ingress.kubernetes.io/rewrite-target: /

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tomcat-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  namespace: kube-system
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: tomcat-deployment-service 
          servicePort: 8080
      - path: /nginx
        backend:
          serviceName: nginx-deployment-service 
          servicePort: 80

如果 Tomcat 需要 /main.css 文件,例如,浏览器会尝试获取 /main.css,但这会返回 default-backend

另外,如果我尝试访问 Nginx 服务器上的 /nginx(试图点击 /),Nginx 会说找不到 /nginx(很明显)。

2019/03/02 08:12:04 [error] 8#8: *343 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.128.0.7, server: localhost, request: "GET /nginx HTTP/1.1", host: "REDACTED_SERVER_IP"
10.128.0.7 - - [02/Mar/2019:08:12:04 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
10.40.1.1 - - [02/Mar/2019:08:12:05 +0000] "GET /nginx HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0" "REDACTED_CLIENT_IP, REDACTED_SERVER_IP"
2019/03/02 08:12:05 [error] 8#8: *344 open() "/usr/share/nginx/html/nginx" failed (2: No such file or directory), client: 10.40.1.1, server: localhost, request: "GET /nginx HTTP/1.1", host: "REDACTED_SERVER_IP"

如何在ingress.yaml 中指定path 之后的路径解析考虑从服务中查看的路径的开始部分?

  1. 如果 Tomcat 的入口路径指向 /tomcat,我如何让 /tomcat/main.css 在 Tomcat 服务器上显示为 /main.css(而不解析为默认支持)?
  2. 如果 Nginx 的入口路径指向 /nginx,我怎样才能让 /nginx 在 Nginx 服务器上显示为 /(而不是显示为 /nginx)?

我认为这是 /rewrite-target 应该做的。

我需要使用通配符吗?

我的入口如下:

Name:             tomcat-ingress
Namespace:        kube-system
Address:          REDACTED_SERVER_IP
Default backend:  default-http-backend:80 (10.40.0.6:8080)
Rules:
  Host  Path  Backends
  ----  ----  --------
  *         
        /        tomcat-deployment-service:8080 (10.40.2.15:8080)
        /nginx   nginx-dep-ser:80 (10.40.0.26:80,10.40.1.46:80)
Annotations:
  ingress.kubernetes.io/url-map:                     k8s-um-kube-system-tomcat-ingress--b0fc8aa23db1001d
  kubectl.kubernetes.io/last-applied-configuration:  {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"nginx.ingress.kubernetes.io/rewrite-target":"/"},"name":"tomcat-ingress","namespace":"kube-system"},"spec":{"rules":[{"http":{"paths":[{"backend":{"serviceName":"tomcat-deployment-service","servicePort":8080},"path":"/"},{"backend":{"serviceName":"nginx-dep-ser","servicePort":80},"path":"/nginx"}]}}]}}

  nginx.ingress.kubernetes.io/rewrite-target:  /
  ingress.kubernetes.io/backends:              {"k8s-be-30985--b0fc8aa23db1001d":"HEALTHY","k8s-be-31229--b0fc8aa23db1001d":"HEALTHY","k8s-be-32736--b0fc8aa23db1001d":"HEALTHY"}
  ingress.kubernetes.io/forwarding-rule:       k8s-fw-kube-system-tomcat-ingress--b0fc8aa23db1001d
  ingress.kubernetes.io/target-proxy:          k8s-tp-kube-system-tomcat-ingress--b0fc8aa23db1001d
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  CREATE  33m                nginx-ingress-controller  Ingress kube-system/tomcat-ingress
  Normal  ADD     33m                loadbalancer-controller   kube-system/tomcat-ingress
  Normal  UPDATE  3m (x65 over 33m)  nginx-ingress-controller  Ingress kube-system/tomcat-ingress
  Normal  CREATE  3m (x31 over 33m)  loadbalancer-controller   ip: REDACTED_SERVER_IP

【问题讨论】:

    标签: kubernetes url-rewriting kubernetes-ingress


    【解决方案1】:

    我假设您拥有最新版本的入口控制器,并且根据documentation

    从版本 0.22.0 开始,使用注解 nginx.ingress.kubernetes.io/rewrite-target 的入口定义与以前的版本不向后兼容。在 0.22.0 及更高版本中,请求 URI 中需要传递到重写路径的任何子字符串都必须在捕获组中明确定义。

    例如:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
      name: tomcat-ingress
      namespace: default 
    spec:
      rules:
      - host: rewrite.bar.com
        http:
          paths:
          - backend:
              serviceName: tomcat-deployment-service
              servicePort: 8080
            path: /tomcat/?(.*)
          - backend:
              serviceName: nginx-deployment-service
              servicePort: 80
            path: /nginx/?(.*)
    

    您当前的配置仅适用于最新版本的入口控制器。

    另一个重要的事情是,Ingress 对象应该与它所引用的服务在同一个命名空间中创建。否则 ingress-nginx 通常会返回 503 Service Temporarily Unavailable 错误。

    并且不允许在serviceName中引用不同命名空间中的服务:

    DNS-1035 标签必须由小写字母数字字符或“-”组成,以字母字符开头,并以字母数字字符结尾(例如,“my-name”或“abc-123”,正则表达式用于验证是 'a-z?')

    【讨论】:

    • with nginx-ingress-controller:0.24.1 - 路径:/后端:服务名称:google-storage-buckets-service servicePort:443 - 路径:/c 后端:服务名称:hello-world-service servicePort: 8080 通过到达my.ip.add.ress/c - 得到两个输出:Hello world!bucket 内容。 stackoverflow.com/questions/55779048/… 尝试使用 /?(.*) - 相同..
    猜你喜欢
    • 2019-05-03
    • 2021-12-17
    • 2018-12-12
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多