【问题标题】:How does Ingress request dispatching works in Kubernetes?Ingress 请求调度在 Kubernetes 中是如何工作的?
【发布时间】:2021-08-24 03:21:26
【问题描述】:

我正在做一个项目,我需要一个有角度的前端和一个带有弹簧引导的后端。 我为他们制作了 2 个 docker 映像,并使用如下入口将请求分发到正确的服务:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: smf-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: rest-service
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service: 
                name: ng-service
                port:
                  number: 4200


如您所见,所有匹配 '/api*' 的请求都被重定向到 rest-service,这是我的 spring boot 应用程序。

如果我向入口发出请求,例如“/api/helloworld”,在到达 spring 端点之前如何修改此请求? spring 是否会收到相同的请求,调用映射到 '/api/helloworld' 的端点?

我问这个是因为我在 spring 中将端点映射到 '/api/some_endpoint' ,但是每次我尝试从浏览器访问这些 url 时,我都会得到 spring 错误页面 (404)。 为了实现这种行为,我在我的 Spring Boot 应用程序中设置了以下属性:

server.servlet.context-path=/api

这是错的吗?为什么?你能给我解释一下解决办法吗?

【问题讨论】:

  • 请在您的问题中添加以下输出 kubectl get svc -o wide 和 kubectl get ep

标签: java spring spring-boot docker kubernetes


【解决方案1】:

首先,Kubernetes 不包含 Ingress Controller,因此这一切都特定于 ingress-nginx,我假设您正在运行它,因为您询问的注释特定于该项目。其他 Ingress Controller 的工作方式会有所不同。

也就是说,您可以在https://kubernetes.github.io/ingress-nginx/examples/rewrite/#deployment 找到重写功能的文档。重写是在 Nginx 中实现的,更具体地说,ingress-nginx 控制器获取您所有的 Ingress 对象并生成一个 nginx 配置文件,然后将其移交给普通的标准 nginx 作为代理。

您在那里的行为将等同于s|^/api|/|,但正如文档中所述,该行为在 0.22 版本中发生了变化,因此如果您使用的是较新版本,则可能无法按预期工作。

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 2021-04-29
    • 2019-12-17
    • 2019-09-27
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2021-01-08
    • 2018-02-23
    相关资源
    最近更新 更多