在处理要传递到 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 应用程序网关?因为当然负载均衡器对我有用,但这个不行。
您的入口是正确的。您需要定义并应用一个 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: /
根据 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/
。
参考资料: