首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes Ingress路径重写

Kubernetes Ingress路径重写
EN

Stack Overflow用户
提问于 2019-03-02 08:29:41
回答 1查看 13.5K关注 0票数 8

我正在对Kubernetes上的一些服务运行Ingress,虽然服务正在重新定向到那些集群in (有点正确),但我不知道如何正确解析那些基本路径之后的路径,例如,如果/路径中有Tomcat和路径/nginx上的Nginx,那么在/之后的任何Tomcat路径都不会解析,甚至/也不会解析任何Nginx路径。我已经在我的nginx.ingress.kubernetes.io/rewrite-target: /中设置了ingress.yaml

代码语言:javascript
复制
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 (显然)。

代码语言:javascript
复制
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"

在从服务中查看路径的起始部分之后,如何在指定的path ingress.yaml 解析之后创建路径?

  1. 如果Tomcat是通过/tomcat路径进入的,我如何使/tomcat/main.css在Tomcat服务器上显示为/main.css (而不是解析为默认回退)?
  2. 如果Nginx是进入/nginx的路径,我如何使/nginx在Nginx服务器上显示为/ (而不是以/nginx的形式出现)?

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

我需要使用通配符还是什么的?

我的入口处如下:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-03-07 13:03:09

我假设您有最近版本的入口控制器,并且根据文档

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

例如:

代码语言:javascript
复制
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/?(.*)

您的当前配置仅适用于最新版本的入口控制器,对于//nginx目的地非常有效。

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

而且它不允许引用serviceName中不同名称空间中的服务

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54956632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档