如何在ISTIO中配置TLS起源?

时间:2019-05-09 08:38:44

标签: kubernetes istio envoyproxy

Istio不会通过TLS来源路由到外部HTTPs服务。

我有一个包含两个容器的吊舱: -应用 -ISTIO代理

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

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

然后我在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无法看到请求并使用它。

开始挠头两天,请帮忙:-)

3 个答案:

答案 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