Istio不会通过TLS来源路由到外部HTTPs服务。
我有一个包含两个容器的吊舱: -应用 -ISTIO代理
应用程序调用位于https://someurl.somedomain.com/v1/some-service上的外部第三方API
应用程序通过调用http://someurl.somedomain.com/v1/some-service向该服务发送HTTP请求-请注意,它是HTTP而不是HTTP。
然后我在ISTIO中配置了以下内容:
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: someservice-vs
spec:
hosts:
- someurl.somedomain.com
http:
- match:
- port: 80
route:
- destination:
host: someurl.somedomain.com
port:
number: 443
timeout: 40s
retries:
attempts: 10
perTryTimeout: 4s
retryOn: gateway-error,connect-failure,refused-stream,retriable-4xx,5xx
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: someservice-se
spec:
hosts:
- someurl.somedomain.com
location: MESH_EXTERNAL
ports:
- number: 443
name: http-port-for-tls-origination
protocol: HTTP
- number: 80
name: http-port
protocol: HTTP
resolution: DNS
最后,我有一个目标规则,该规则将简单的TLS应用于出站流量:
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: someservice-destinationrule
spec:
host: someurl.somedomain.com
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
portLevelSettings:
- port:
number: 443
tls:
mode: SIMPLE # initiates HTTPS when accessing someurl.somedomain.com
由于某种原因,该方法不起作用,当我从应用程序容器调用服务时收到404,这表明未通过TLS加密流量。
我使用TLS起源的原因是,我需要在虚拟服务中应用重试,并且只能使用HTTP路由执行此操作,否则ISTIO无法看到请求并使用它。
开始挠头两天,请帮忙:-)
答案 0 :(得分:1)
了解到此。 ISTIO文档是正确的-TLS发起和重试按预期进行。
此问题是由于perTryTimeout值太低引起的。请求未在分配的时间内完成,因此网关超时。它之所以吸引我们,是因为外部服务的性能最近有所下降,因此我们不打算对其进行检查。
答案 1 :(得分:0)
我认为它应该像这样工作:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: someservice-vs
spec:
hosts:
- someurl.somedomain.com
http:
- match:
- port: 80
route:
- destination:
host: someurl.somedomain.com
timeout: 40s
retries:
attempts: 10
perTryTimeout: 4s
retryOn: gateway-error,connect-failure,refused-stream,retriable-4xx,5xx
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: someservice-se
spec:
hosts:
- someurl.somedomain.com
location: MESH_EXTERNAL
ports:
- number: 80
protocol: HTTP
name: http
endpoints:
- address: someurl.somedomain.com
ports:
http: 443
resolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: someservice-destinationrule
spec:
host: someurl.somedomain.com
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
tls:
mode: SIMPLE # initiates HTTPS when accessing someurl.somedomain.com
使ServiceEntry在端口80上侦听,但端点地址指向端口443。 然后DestinationRule对所有以端口80为目标的端口应用TLS,该端口最终通过群集的端点转发到端口443。
答案 2 :(得分:0)
配置TLS起源已记录在here中。
上面显示的配置正确。原来的实际问题是由虚拟服务中的超时不足而不是TLS起源引起的。
https://discuss.istio.io/t/can-i-route-http-traffic-as-https-to-an-external-service/489/8