Nginx Ingress 重写规则

Nginx Ingress 重写规则

我有一个在 k8s 上运行的 spring 微服务,有 2 个 API URL。

  1. 第一个是/api/actuator健康检查 - 在端口 9010 上运行
  2. 第二个是/api针对所有其他 API 调用 - 在端口 9000 上运行

我已经创建了ClusterIP服务来在相应的端口上公开它们。

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  ports:
  - name: main-port
    port: 80
    protocol: TCP
    targetPort: 9000
  - name: health-port
    port: 9010
    protocol: TCP
    targetPort: 9010
  selector:
    app: myapp

现在我想在此服务之上创建一个遵循基于路径的路由的入口。

任何类似的请求/myapp/api/actuator/anything都应重写为/api/actuator/anything(与原始请求相同)。

例如/myapp/api/actuator/health应该重写为/api/actuator/health`。

任何类似的请求/myapp/api/anything都应重写为/api/anything(与原始请求相同)。

例如/myapp/api/v1/getID/{id}应该重写为/api/v1/getID/{id}

我在编写重写规则时遇到了困难。到目前为止,我只能想出以下规则:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: gitops-lkart-api
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /api/$1
spec:
 rules:
  - http:
      paths:
      - path: /myapp/api/actuator/(.*)
        backend:
          serviceName: myapp-svc
          servicePort: 9010
  - http:
      paths:
      - path: /myapp/api/(.*)
        backend:
          serviceName: myapp-svc
          servicePort: 80

但这只适用于/api路径,而不适用于执行器。

请建议应该写什么规则来实现这一点?

答案1

这应该有效:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: gitops-lkart-api-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /api/actuator/$1
spec:
 rules:
  - http:
      paths:
      - path: /myapp/api/actuator/(.*)
        backend:
          serviceName: myapp-svc
          servicePort: 9010

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: gitops-lkart-api-2
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /api/$1
spec:
  - http:
      paths:
      - path: /myapp/api/(.*)
        backend:
          serviceName: myapp-svc
          servicePort: 80

您可以创建 2 个独立的入口。

如果流量达到,/myapp/api/actuator/anything它将被重写为/api/actuator/anything

在其他情况下,如果流量达到/myapp/api/anything它将被重写为/api/anything

相关内容