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

Kubernetes多路径重写
EN

Stack Overflow用户
提问于 2022-01-21 00:34:22
回答 1查看 2.7K关注 0票数 2

好吧,这个问题的各种排列都被问到了,我觉得问这个问题很糟糕;我正在认输,我很好奇是否有人能给我指明正确的方向(或者指出我错了)。我继续尝试了一些来自文档的示例,但是没有结果(见下文)。

我正在尝试使用一个侵入控制器将流量路由到Kubernetes下的适当位置。

服务器设置

我有一个服务器、myserver.com和三个服务运行在:

myserver.com/services/

myserver.com/services/service_1/

myserver.com/services/service_2/

请注意,我没有(故意)对myserver.com/做任何事情。

在这三个地方的每一个地方,都有一个网络应用程序在运行。例如,myserver.com/services/service_2需要在myserver.com/services/service_2/static/css加载css文件,等等.

库伯奈特斯

为了管理网络,我使用了一个Kubernetes Ingress控制器,我在下面定义了这个控制器。CORS注释并不是非常相关的,但是为了消除任何混乱,我已经将它们包括进来了。

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myServices
  namespace: myServices
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, OPTIONS"
    nginx.ingress.kubernetes.io/cors-allow-origin: '$http_origin'
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/use-regex: "true"

spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - myserver.com
  rules:
  - host: myserver.com
    http:
      paths:
      - path: /services
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
      - path: /services/service_1(/|$)
        pathType: Prefix
        backend:
          service:
            name: web-service-1
            port:
              number: 80
      - path: /services/service_2(/|$)
        pathType: Prefix
        backend:
          service:
            name: web-service-2
            port:
              number: 80

目标

我注意到一件有用的事情就是给出一些路径示例。从下面的例子看,路径看起来并没有那么复杂。我想这就是我想要的。请注意,我希望每个服务能够解析其css和图像文件。

代码语言:javascript
复制
myserver.com/services -> myserver.com/services
myserver.com/services/xxx/xxx -> myserver.com/services/xxx/xxx
myserver.com/services/service_1 -> myserver.com/services/service_1
myserver.com/services/service_1/xxx/xxx -> myserver.com/services/service_1/xxx/xxx
myserver.com/services/service_2/xxx/xxx -> myserver.com/services/service_2/xxx/xxx

尝试

我知道这个问题与nginx.ingress.kubernetes.io/rewrite-target规则及其与我定义的路径的交互有很大关系。

我知道我不想要nginx.ingress.kubernetes.io/rewrite-target: $1,因为当我访问myserver.com/services时,它给了我500个

我知道我不想要nginx.ingress.kubernetes.io/rewrite-target: $1/$2,因为当我访问myserver.com/services/service_1时,我实际上得到了页面上呈现的myserver.com/services的部分内容。

所以尝试1

我还试图从问题中复制已接受的解决方案。

在这个尝试中我设定

nginx.ingress.kubernetes.io/rewrite-target: "/$1"和服务路径之一

- path: /(services/service_1(?:/|$).*)

当我访问myserver.com/services/service_1/xyz时,会呈现来自myserver.com/services/service_1的HTML。

结束语

路径重写和路径规则有些不太正确。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-21 20:34:50

您在最近的评论中报告的问题可以通过查看nginx-ingress文档中的重写示例来解决。

rewrite-target注释配置入口,以便将匹配的路径重写到该值。由于您已经指定了/的静态值,任何与您的入口规则相匹配的内容都将被重写为/,这正是您所看到的行为。

解决方案是捕获我们所关心的路径的一部分,然后在rewrite-target注释中使用它。例如:

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myservices
  annotations:
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, OPTIONS"
    nginx.ingress.kubernetes.io/cors-allow-origin: '$http_origin'
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"

spec:
  ingressClassName: nginx
  rules:
  - host: myserver.com
    http:
      paths:
      - path: /services/service_1(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: webservice-service1
            port:
              number: 80
      - path: /services/service_2(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: webservice-service2
            port:
              number: 80
      - path: /services(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: webservice
            port:
              number: 80

在这里,我们修改了匹配表达式,使它们看起来像:

代码语言:javascript
复制
      - path: /services/service_1(/|$)(.*)

第二个捕获组(.*)捕获匹配路径部分之后的所有内容。然后在rewrite-target注释中使用捕获组($2,因为它是第二个组):

代码语言:javascript
复制
    nginx.ingress.kubernetes.io/rewrite-target: /$2

在配置就绪后,对/services/service_2的请求将导致:

代码语言:javascript
复制
This is service2.

但是,对/services/service_2/foo/bar的请求会导致:

代码语言:javascript
复制
<html><head><title>404 Not Found</title></head><body>
<h1>Not Found</h1>
The URL you requested (/foo/bar) was not found.
<hr>
</body></html>

查看后端服务器日志,我们看到:

代码语言:javascript
复制
10.42.0.32 - - [21/Jan/2022:20:33:23 +0000] "GET / HTTP/1.1" 200 211 "" "curl/7.79.1"
10.42.0.32 - - [21/Jan/2022:20:33:45 +0000] "GET /foo/bar HTTP/1.1" 404 311 "" "curl/7.79.1"

我更新了我的示例库以匹配此配置。

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

https://stackoverflow.com/questions/70795048

复制
相关文章

相似问题

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