5

Istio 不会通过 TLS 发起路由到外部 HTTPs 服务。

我有一个包含两个容器的 pod: - 应用程序 - ISTIO 代理

应用程序调用位于https://someurl.somedomain.com/v1/some-service上的外部第三方 API

应用程序通过调用http://someurl.somedomain.com/v1/some-service向该服务发送 HTTP 请求- 注意它是 HTTP 而不是 HTTPs。

然后我在 ISTIO 中配置了以下内容:

  • 将 HTTP 流量路由到端口 443 的虚拟服务:
---
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 
  • 允许流量流出的服务入口。如您所见,我们指定服务在网格外部,我们打开了 443 和 80,两者都使用 HTTP,但 443 配置为 TLS 发起。
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 无法看到请求并使用它。

两天来一直在挠头,需要一些帮助:-)

4

3 回答 3

2

到了这个底线。ISTIO 文档是正确的 - TLS 发起和重试按预期工作。

该问题是由 perTryTimeout 值过低引起的。请求未在分配的时间内完成,因此网关超时。它让我们失望了,因为最近外部服务的性能下降了,我们没有想到要检查它。

于 2019-05-16T14:28:44.750 回答
1

我认为它应该像这样工作:

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。

于 2019-05-16T05:51:17.127 回答
0

此处记录了配置 TLS 发起。

上面显示的配置是正确的。事实证明,实际问题是由虚拟服务中的超时不足引起的,而不是 TLS 的起源。

https://discuss.istio.io/t/can-i-route-http-traffic-as-https-to-an-external-service/489/8

于 2019-05-16T15:41:02.853 回答