Azure 应用程序网关相当于 NGINX Ingress 中的 URL 重写

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

在处理要传递到 Azure 应用程序网关入口控制器的 nginx 入口项目时,我遇到了将此表示法从路径传递到应用程序网关入口控制器的问题。这里是 nginx 文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-trackingservice
  namespace: trackingserviceespaceuat
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /trackingserviceapi(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: trackingservice
            port:
              number: 80

然后我想将此符号传递给入口控制器应用程序网关

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-trackingservice
  namespace: trackingserviceespace
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/"
spec:
  tls:
    - hosts:
      - essoftware.online
      secretName: tlscertn
  rules:
  - host: essoftware.online
    http:
      paths:
      - path: /trackingserviceapi(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: trackingservice
            port:
              number: 80

然后我意识到关于 nginx 的两个重要的事情

nginx.ingress.kubernetes.io/rewrite-target: /$2
  - path: /trackingserviceapi(/|$)(.*)    

如何将其迁移到 Azure 应用程序网关?因为当然负载均衡器对我有用,但这个不行。

azure kubernetes-ingress azure-aks nginx-ingress azure-application-gateway
1个回答
0
投票

您的入口是正确的。您需要定义并应用一个 Ingress Extension 或 AzureApplicationGatewayRewrite 资源。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-app-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/"
spec:
  rules:
  - host: essoftware.online
    http:
      paths:
      - path: /trackingserviceapi(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: trackingservice
            port:
              number: 80

现在我们也有两种类型 一种是Ingress-extension,当您需要扩展现有入口资源的功能、添加更复杂的路由、重写或标头操作规则时使用。

apiVersion: appgw.ingress.k8s.io/v1
kind: IngressExtension
metadata:
  name: sample-app-rewrite
  namespace: default
spec:
  ingressRef:
    name: sample-app-ingress
  rules:
    - name: rewrite-rule
      priority: 100
      match:
        pathMatch: 
          type: Exact
          value: /trackingserviceapi(/|$)(.*)
      actions:
        - type: ReplacePrefixMatch
          newPrefix: /

另一个是 AzureApplicationGatewayRewrite,当您专门使用 Azure 应用程序网关入口控制器并需要定义应用程序网关将强制执行的 URL 重写规则时,将使用它。看起来像这样-

apiVersion: appgw.ingress.azure.io/v1
kind: AzureApplicationGatewayRewrite
metadata:
  name: sample-app-rewrite
  namespace: default
spec:
  rewriteRules:
    - name: rewrite-rule
      pathRule:
        pathPattern: /trackingserviceapi(/|$)(.*)
      backendPath: /

enter image description here

enter image description here

根据 MS-Azure 应用程序网关容器允许您重写客户端请求的 URL,包括请求的主机名和/或路径。当容器应用网关向后端目标发起请求时,请求中会包含新重写的URL来发起请求。可以使用 Azure 应用程序网关容器的 Ingress API 或网关 API 的 URL 重写功能。对于 Ingress API,您需要定义一个

IngressExtension
资源,用
ReplacePrefixMatch
定义重写。对于网关 API,您需要定义一个
HTTPRoute
资源,该资源具有对
URLRewrite
路径的过滤器。要从 NGINX Ingress 迁移到 Azure 应用程序网关入口控制器,可以将
nginx.ingress.kubernetes.io/rewrite-target
注释替换为
appgw.ingress.kubernetes.io/backend-path-prefix
注释。例如,如果
nginx.ingress.kubernetes.io/rewrite-target
注释设置为
/foo/$1
,则可以将其替换为
appgw.ingress.kubernetes.io/backend-path-prefix: /foo/

参考资料:

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