我正在使用带有流量管理的 Kubernetes 和 Istio。所有后端 API 终结点都以/api/**
开头,后跟特定 URI,前端服务除外。前端服务没有任何常规 uri 前缀。
我想要实现的是VirtualService
istio 使用一个正则表达式,该表达式基本上说,如果请求的 uri 不以/api/
开头,则让它由前端服务提供服务。
这是我的VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: {{ .Release.Name }}-frontend-ingress
namespace: default
spec:
hosts:
{{ include "application.domain" . }}
gateways:
- iprocure-gateway
http:
- match:
- uri:
regex: '^(?!/api/).*'
route:
- destination:
host: {{ printf "%s.%s.svc.cluster.local" .Values.frontendService.serviceName .Release.Name }}
port:
number: {{ .Values.frontendService.service.port }}
我可以用来使所有不以 开头的请求/api/
由前端服务提供服务的regex
值是什么
参见 Istio 1.4.x 升级说明,标题为"正则表达式引擎更改"。 Envoy 已迁移到不支持负面前瞻的 Google Re2"安全"正则表达式引擎。可以通过环境变量选择退出 Pilot,但在将来的版本中将被删除。 除了编写长正则表达式之外,我还没有找到长期的解决方案。
对于您的特定情况,请尝试
regex: "^/((a$)|(ap$)|(api$)|([^a].*)|(a[^p].*)|(ap[^i].*)|(api[^/].*))"
请尝试从正则表达式中删除单引号:字段,从其他 github 帖子中删除它们未被使用。
虚拟服务使用 ECMAscript 样式,因此当您添加单引号时,它会逐字搜索它们之间的字符串