首页 > 解决方案 > 使用 Istio 时如何正确地 HTTPS 保护应用程序?

问题描述

我目前正试图围绕 kubernetes 应用程序与 Istio 结合的典型应用程序流程的外观。

因此,对于我的应用程序,我在 Kubernetes 集群中托管了一个 asp.net 应用程序,并在顶部添加了 Istio。这是我的网关和虚拟服务:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: appgateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
      tls:
        httpsRedirect: true
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
        privateKey: /etc/istio/ingressgateway-certs/tls.key
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: appvservice
spec:
  hosts:
    - "*"
  gateways:
    - appgateway
  tls:
    - match:
        - port: 443
          sniHosts:
            - "*"
      route:
        - destination:
            host: frontendservice.default.svc.cluster.local
            port:
              number: 443

这是我在阅读 Istio 文档后得出的结论。

请注意,myfrontendservice是一个非常基本的 ClusterIP 服务路由到 Asp.Net 应用程序,该应用程序还提供标准的 80 / 443 端口。

我现在有几个问题:

我想象它会像这样工作:

  1. 请求进来。如果它在端口 80 上,则向客户端发送重定向以发送 https 请求。如果它在端口 443 上,则允许该请求。
  2. VirtualService 提供了关于端口 443 上的请求应该发生什么的指令,并将其转发给服务。
  3. 该服务现在将请求转发到我的应用程序的 443 端口。

在此先感谢 - 我刚刚学习 Istio,我有点困惑为什么我看似正确的设置在这里不起作用。

标签: kubernetesistio

解决方案


您的网关终止 TLS 连接,但您的 VirtualService 配置为接受带有 TLSRoute的未终止的 TLS 连接。

比较没有 TLS 终止的示例和终止 TLS的示例。最有可能的是,“默认”设置是终止 TLS 连接并使用HTTPRoute配置 VirtualService 。


推荐阅读