kubernetes 配置Istio使用新的HTTPS连接到外部服务

qlzsbp2j  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(173)

我有一个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

bybem2ql

bybem2ql1#

Istio中出现的404错误主要是由于Istio官方故障排除文档中提到的以下原因

  • 网关到虚拟服务TLS不匹配
  • 使用相同TLS证书配置多个网关时
    在您的情况下,可能是由于网关与虚拟服务TLS不匹配而导致的,原因是您试图在同一虚拟服务中使用两种不同类型的路由规则。有两种类型的不匹配会导致这些404错误
  • 网关TLS终止:在这种情况下,TLS将被网关终止,而可能在VirtualService中配置了基于TLS的路由。这可以通过使用istioctl proxy-config routes命令来验证。
  • 网关TLS直通:当http流量与VirtualService通过网关传递的TLS流量匹配时,会发生这种情况。这可以通过使用istioctl proxy-config listeneristioctl proxy-config route命令来验证。
    请按照上面嵌入的official documentation了解有关如何修复这些问题的详细信息。
    注意:命令取自Istio官方文档。
wpcxdonn

wpcxdonn2#

下面是我最终发现可以工作的配置。
需要注意的关键事项:

  • DestinationRule tls模式SIMPLE是“打开”TLS发起的模式
  • 端口号选择DestinationRule应用于哪些通信
  • 因此,它必须与其他配置中的端口号相匹配(见下文)
  • 端口号在以下所有位置必须相同:
  • DestinationRule trafficPolicy.portLevelSettings
  • VirtualService http.route.destination
  • ServiceEntry端口号
  • ServiceEntry端口。协议似乎无关紧要

上面使用的实际端口号无关紧要。如果您使用端口433以外的其他端口,请将443的targetPort添加到ServiceEntry。这会在连接到外部服务之前将端口号更改为HTTPS的标准443。(下面,为了简单起见,我在任何地方都使用了443。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
  gateways:
    - ...
  hosts:
    - my-service.domain.com
  http:
    - name: "internal-routes"
      match:
        - uri:
            prefix: "/internal"
      route:
        - destination:
            host: my-service.my-ns.svc.cluster.local
    - name: "external-routes"
      match:
        - uri:
            prefix: "/external"
      rewrite:
        authority: external.otherdomain.com
      route:
        - destination:
            host: external.otherdomain.com
            port:
              number: 443 # Can be anything
                          # Must match DestinationRule and ServiceEntry
                          # Can be overridden by ServiceEntry targetPort
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
spec:
  host: external.otherdomain.com
  trafficPolicy:
    portLevelSettings:
      - port:
          number: 443  # selects traffic on port 443 to host above
        tls:
          mode: SIMPLE # turns on TLS origination for selected traffic
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
spec:
  hosts:
    - external.otherdomain.com
  ports:
    - number: 443       # specifies that host above accepts traffic on this port
      name: http        # ignored
      protocol: HTTPS   # ignored
      # targetPort: 443 # only needed if not 443 above
  location: MESH_EXTERNAL
  resolution: DNS

相关问题