如何在Nginx ingress中处理Kubernetes集群的重定向,其中托管了微服务Swagger?

pbwdgjma  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(128)

bounty将在2小时内到期。回答此问题有资格获得+50信誉奖励。Sammy正在寻找来自信誉良好的来源的答案:期望将获得一个工作路由nginx ingress yaml,它可以按预期进行重写

我正在进行一个新的Kubernetes集群设置。这个设置将在25个不同的Pod中托管大约25个微服务。这些微服务将通过25个不同的NodePort服务公开。为了从外部访问它们,我尝试将nginx ingress与NLB集成(注意:所有这些设置都托管在AWS EKS中)现在,微服务使用swagger,这意味着URL中有重定向。
例如:https://example.com/customerservice -> https://example.com/swagger/index.html(customerservice svc->pod)https://example.com/orderservice -> https://example.com/swagger/index.html(orderservice svc->pod)
其他23项服务也是如此
服务工作的信息或healthpoint如果我输入整个网址如下:
https://example.com/orderservice/v3/info
https://example.com/customerservice/v3/healthcheck
如果我手动输入整个URL,上述端点可以正常工作。但是,用户希望只输入https://example.com/customerservice,它应该重定向到相应的swagger页面,如https://example.com/swagger/index.html
下面是我的ingress YAML文件,它适用于整个URL,如v3/info或healthcheck,但没有正确执行重定向。

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/,这意味着它试图重定向到正确的方向,但只接受一个参数/单词(swagger)**并删除其余的字符串,然后给出404错误

**预期结果:当用户尝试加载https://example.com/customerservice时,它应该重定向到customerservice pod的https://example.com/swagger/index.html**页面,所有其他服务也是如此

p5fdfcr1

p5fdfcr11#

如果有帮助,可以尝试以下YAML文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$3
    nginx.ingress.kubernetes.io/x-forwarded-prefix: /$1
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /()()(.*)
        pathType: Prefix
        backend:
          service:
            name: customerservice-svc
            port:
              number: 80
      - path: /orderservice(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: orderservice-svc
            port:
              number: 80

字符串
你也可以在这个链接上阅读相关的帖子。

2ic8powd

2ic8powd2#

要在Nginx ingress中处理使用Swagger托管微服务的Kubernetes集群的重定向,您需要设置您的ingress规则,以将请求正确重定向到相应的Swagger文档URL。
这意味着更新rewrite-target注解以重定向到swagger index.html
然后使用更高级的nginx配置添加自定义逻辑,使用nginx.ingress.kubernetes.io/configuration-snippet注解完成,该注解将自定义配置添加到Location配置块(如此处所述)。
你的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

字符串
这将把请求从https://example.com/customerservice重写为https://example.com/customerservice/swagger/index.html(特定于客户服务),其他服务也是如此。
你会得到:

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


(To在将其部署到生产环境之前,首先在登台环境中进行测试!)

相关问题