【问题标题】:Rewriting path when using nginx ingress for path based routing使用 nginx 入口进行基于路径的路由时重写路径
【发布时间】:2021-12-27 17:17:09
【问题描述】:

我正在尝试使用基于路径的路由在 kubernetes 上使用 nginx 入口控制器组合我们的几个微服务。

这是场景:

http://myapi.develop.mydomain.com/data-service/request -> 转到服务名称 http://myapi.develop.mydomain.com/model-service/request -> 转到服务名称

我的问题是,当 url/path 到达后端服务时,它会从请求中获取 url。

所以/data-service/request/data-service/request 的身份点击应用程序并需要它以/request 的身份点击应用程序(但仍以/data-service/request 向用户显示)

尝试从这里查看使用入口重写规则: https://kubernetes.github.io/ingress-nginx/examples/rewrite/

虽然不太确定这是否会改变用户的 url 或只是从入口到服务。我们需要 url 对最终用户保持不变,并且更改只在集群内。

这是我们正在使用的入口 yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapi-ingress
  namespace: mynamespace
  uid: 
  resourceVersion: ''
  generation: 1
  creationTimestamp: '2021-11-16T15:12:42Z'
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  managedFields:
    - manager: kubectl-create
      operation: Update
      apiVersion: networking.k8s.io/v1
      time: '2021-11-16T15:12:42Z'
      fieldsType: FieldsV1
      fieldsV1:
        'f:metadata':
          'f:annotations':
            .: {}
            'f:nginx.ingress.kubernetes.io/rewrite-target': {}
        'f:spec':
          'f:ingressClassName': {}
          'f:rules': {}
    - manager: nginx-ingress
      operation: Update
      apiVersion: networking.k8s.io/v1
      time: '2021-11-16T15:12:42Z'
      fieldsType: FieldsV1
      fieldsV1:
        'f:status':
          'f:loadBalancer':
            'f:ingress': {}
  selfLink: /apis/networking.k8s.io/v1/namespaces/mynamespace/ingresses/myapi-ingress
status:
  loadBalancer:
    ingress:
      - ip: myip
spec:
  ingressClassName: nginx
  rules:
    - host: myapi.mynamespace.mydomain.com
      http:
        paths:
          - path: /data-service(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: data-service
                port:
                  number: 3000
          - path: /model-service(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: model-service
                port:
                  number: 3000

有人指出我可能会出错的地方吗?

【问题讨论】:

  • 我想在本地重现此问题 - 您使用的是哪个 Kubernetes 版本?
  • 刚刚升级到1.21.2
  • 我在本地使用nginx image 进行了尝试,它工作正常。您的应用程序如何检查日志?您能否准确分享您申请的 Ingress 资源 yaml?您能否使用 nginx 图像检查行为(您可以使用 kubectl logs {nginx-pod-name} 查找请求?
  • 还没有快乐。我会尝试获取日志
  • 这方面有什么更新吗?如果答案有帮助,请您更新问题的状态,如果解决了您的问题,请点赞或标记它。这就是 SO 的工作原理。

标签: kubernetes kubernetes-ingress azure-aks nginx-ingress


【解决方案1】:

由于您使用的 API 版本可能存在问题

你的 K8s 支持 Ingress API 版本networking.k8s.io/v1beta1 吗?

networking.k8s.io/v1beta1 insted of networking.k8s.io/v1 和其他小改动

尝试:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2

  name: example
  # namespace: foo
spec:
  rules:
    - host: [your ip address].sslip.io
      http:
        paths:
          - backend:
              serviceName: registry-app-server
              servicePort: 8761
            path: /eureka/(.*)
          - backend:
              serviceName: api-gateway-server
              servicePort: 7000
            path: /api(/|$)(.*)

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 2020-02-27
    • 1970-01-01
    • 2014-09-07
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多