我有一个VirtualService,它根据HTTP路由前缀在内部Service和外部ServiceEntry之间拆分流量。
外部服务需要HTTPS流量。
我使用curl测试路由,如下所示:
curl https://my-service.domain.com/internal-route -> should go to internal service
curl https://my-service.domain.com/external-route -> should go to external service
字符串
目前为止我所尝试的:
1.对内部和外部服务使用HTTP路由。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
gateways:
- ...
hosts:
- my-service.domain.com
http:
- match:
- uri:
prefix: /internal-route
route:
- destination:
host: my-service.my-ns.svc.cluster.local
- match:
- uri:
prefix: /external-route
route:
- destination:
host: external-service.otherdomain.com
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
spec:
hosts:
- external-service.otherdomain.com
ports:
- number: 443
name: https
protocol: HTTP
location: MESH_EXTERNAL
resolution: DNS
型
当我尝试这样做时,外部服务指示HTTP流量正在发送到其HTTPS端口(443)。这是有意义的,因为Istio正在终止TLS连接并使用HTTP将请求转发到外部服务。
1.在同一个VirtualService中使用“tls”匹配类型(用于外部服务)和“http”路由(用于内部服务)。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
gateways:
- ...
hosts:
- my-service.domain.com
http:
- match:
- uri:
prefix: /internal-route
route:
- destination:
host: my-service.my-ns.svc.cluster.local
tls:
- match:
- port: 443
sniHosts:
- my-service.domain.com
route:
- destination:
host: external-service.otherdomain.com
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
spec:
hosts:
- external-service.otherdomain.com
ports:
- number: 443
name: https
protocol: TLS
location: MESH_EXTERNAL
resolution: DNS
型
这导致Istio在我尝试到达一个应该去往外部服务的路由时返回HTTP 404。
1.与上面相同,ServiceEntry protocol
设置为HTTP而不是TLS。
如何配置Istio终止TLS连接,然后使用HTTPS(通过新的TLS连接)向外部服务发送流量?
编辑1:
我在Istio文档(one和两个)中发现,这应该可以通过添加DestinationRule
来实现,但这似乎没有任何效果。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: tls-foo
spec:
host: external-service.otherdomain.com
trafficPolicy:
portLevelSettings:
- port:
number: 80
tls:
mode: SIMPLE
型
2条答案
按热度按时间bybem2ql1#
Istio中出现的404错误主要是由于Istio官方故障排除文档中提到的以下原因
在您的情况下,可能是由于网关与虚拟服务TLS不匹配而导致的,原因是您试图在同一虚拟服务中使用两种不同类型的路由规则。有两种类型的不匹配会导致这些404错误
istioctl proxy-config routes
命令来验证。istioctl proxy-config listener
和istioctl proxy-config route
命令来验证。请按照上面嵌入的official documentation了解有关如何修复这些问题的详细信息。
注意:命令取自Istio官方文档。
wpcxdonn2#
下面是我最终发现可以工作的配置。
需要注意的关键事项:
DestinationRule
tls模式SIMPLE
是“打开”TLS发起的模式DestinationRule
应用于哪些通信DestinationRule
trafficPolicy.portLevelSettingsVirtualService
http.route.destinationServiceEntry
端口号ServiceEntry
端口。协议似乎无关紧要上面使用的实际端口号无关紧要。如果您使用端口433以外的其他端口,请将443的
targetPort
添加到ServiceEntry
。这会在连接到外部服务之前将端口号更改为HTTPS的标准443。(下面,为了简单起见,我在任何地方都使用了443。