如何处理托管有微服务 swagger 的 Kubernetes 集群的 nginx 入口中的重定向?

问题描述 投票:0回答:1

我正在研究新的 Kubernetes 集群设置。此设置将在 25 个不同的 Pod 中托管大约 25 个微服务。这些将通过 25 个不同的 NodePort 服务公开。为了从外部访问它们,我尝试将 nginx 入口与 NLB 集成(注意:所有这些设置都托管在 AWS EKS 中) 现在,微服务使用 swagger,这意味着 URL 中有重定向。

例如:https://example.com/customerservice -> https://example.com/swagger/index.html(客户服务 svc->pod) https://example.com/orderservice -> https://example.com/swagger/index.html(orderservice svc->pod)

其余 23 项服务依此类推

如果我输入如下所示的整个 URL,这些服务适用于信息或健康点:

https://example.com/orderservice/v3/info

https://example.com/customerservice/v3/healthcheck

如果我手动输入整个 URL,上述端点可以正常工作。但是,用户期望仅输入 https://example.com/customerservice,并且应该重定向到相应的 swagger 页面,如下所示 https://example.com/swagger/index.html

下面是我的入口 YAML 文件,它适用于 v3/info 或 healthcheck 等整个 URL,但无法正确执行重定向。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
  labels:
    app: trial-ingress
  name: trial-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          service:
            name: customerservice-svc
            port:
              number: 80
        path: /customerservice(/|$)(.*)
        pathType: Prefix
      - backend:
          service:
            name: orderservice-svc
            port:
              number: 80
        path: /orderservice(/|$)(.*)
        pathType: Prefix

如果我使用上述入口并尝试加载 https://example.com/customerservice 那么它会将我重定向到 https://example.com/swagger/ 这意味着它正在尝试重定向方向正确,但只接受 一个参数/单词(招摇) 并删除字符串的其余部分,然后给出 404 错误

预期结果:当用户尝试加载https://example.com/customerservice时,它应该重定向到https://example.com/swagger/index.html页面的

customerservice 
pod 以及所有其他服务类似

kubernetes swagger microservices kubernetes-ingress nginx-ingress
1个回答
0
投票

要使用 Swagger 处理托管微服务的 Kubernetes 集群的 nginx 入口中的重定向,您需要设置 入口规则 以将请求正确重定向到相应的 Swagger 文档 URL。

这意味着更新

rewrite-target
注释 以重定向到 swagger
index.html

然后使用更高级的 nginx 配置添加自定义逻辑,使用
nginx.ingress.kubernetes.io/configuration-snippet
注释
完成,它将自定义配置添加到位置配置块(如此处提到)。

您的 Ingress YAML 将是:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /swagger/index.html
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^(/customerservice)$ $1/ redirect;
      rewrite ^(/orderservice)$ $1/ redirect;
      # Add similar rewrite rules for other services
  labels:
    app: trial-ingress
  name: trial-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          service:
            name: customerservice-svc
            port:
              number: 80
        path: /customerservice(/|$)(.*)
        pathType: Prefix
      - backend:
          service:
            name: orderservice-svc
            port:
              number: 80
        path: /orderservice(/|$)(.*)
        pathType: Prefix
      # Add paths for other services

你会得到:

 ┌─────────────┐       ┌─────────────┐       ┌─────────────────────┐
 │             │       │             │       │                     │
 │    User     │──────►│     NLB     │──────►│  NGINX Ingress      │
 │             │       │             │       │                     │
 └─────────────┘       └─────────────┘       └─────────────────────┘
                                                           │
                                                           │
                                                           ▼
 ┌───────────────────────────────────────────────────────────────────┐
 │                               Microservices in Pods               │
 │                                                                   │
 │   /customerservice ────────────► (Customer Service Pod Swagger)   │
 │                                                                   │
 │   /orderservice    ────────────► (Order Service Pod Swagger)      │
 │                                                                   │
 │                                  (Other Services)                 │
 └───────────────────────────────────────────────────────────────────┘

(在将其部署到生产环境之前,首先要在临时环境中进行测试!)

© www.soinside.com 2019 - 2024. All rights reserved.