当前位置: 首页 > 知识库问答 >
问题:

如何在ISTIO中配置TLS发起?

公良信然
2023-03-14

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 
  • 允许流量流出的服务入口。如您所见,我们指定该服务位于mesh外部,并打开了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 origination,是因为我需要在我的虚拟服务中应用重试,我只能通过HTTP路由来实现这一点,否则ISTIO无法看到请求并使用它。

我挠了两天的头,需要帮忙吗

共有3个答案

金毅
2023-03-14

配置TLS起源在这里记录。

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

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

冯胤
2023-03-14

我认为应该是这样:

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,但endpoint地址指向端口443。然后,目标规则对所有目标端口80应用TLS,最终通过群集的终结点转发到端口443。

郜修雅
2023-03-14

追根究底。ISTIO文件记录正确——TLS发起和重试工作符合预期。

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

 类似资料:
  • 我的微服务使用的是最新发布的Spring Boot、Spring WebFlux (Undertow)、Spring Data MongoDB、Spring Cloud网飞和Kotlin... 现在我已经设置了一个演示项目来使用新的功能界面,而不是Spring WebFlux中的注释。将Netty与HTTP一起使用效果很好。但是,我找不到如何使用TLS resp配置Netty的任何信息。HTTPS

  • 我已经阅读了stackoverflow中的相关问题。然而,答案只告诉如何配置身份验证检查。我需要在spring boot中用rsocket加密所有传输的数据。如何在带有SSL/tls的spring boot中使用tls。在如下所示初始化rsocket客户端时,我找不到任何受支持的方法,尽管我知道rsocket-it本身可以支持SSL/TLS。我发现了一些例子:

  • 我们有一个Istio集群,我们正在尝试为Kubernetes配置水平pod自动Scale。我们希望使用请求计数作为HPA的自定义度量。我们如何利用伊斯蒂奥的普罗米修斯来达到同样的目的?

  • DataSource TlsParameters TlsParameters.TlsProtocol (Enum) TlsCertificate TlsSessionTicketKeys CertificateValidationContext CommonTlsContext UpstreamTlsContext DownstreamTlsContext DataSource DataSourc

  • 金属(版本0.7.3) Kubernetes(版本1.12.2) ISTIO(版本1.0.3) 我会从什么起作用开始。 所有补充服务均已部署,大部分正在工作: null 网关 虚拟服务 我仔细检查了一下,这不是DNS的问题,因为我可以通过busybox或使用K8S仪表板进入入口网关的shell

  • 我正在为Istio gRPC开发POC,Istio版本是1.6,但是我看不到任何gRPC流量。 我怀疑我的Istio Gateway或VirtualService遗漏了什么,但我不知道这里出了什么问题?有人能帮我查看yaml文件并纠正我的yaml中缺失或错误的地方吗? 请给予指导,谢谢。