从 Pod 访问 HTTPS Istio Ingress Gateway

Accessing HTTPS Istio Ingress Gateway from Pod

我的 kubernetes 集群有一个相当简单的设置,有两个区域:

两个区域都启用了 Istio,其中:

我正在部署 apache HTTPD - 作为低信任度内的反向代理。该计划是让 HTTPD 然后将流量转发到中等信任的 Istio 入口网关。 中等信任度内有一个 Spring 引导应用程序。

所以,可以说,用户正在访问 https://lowtrust.avengers.local/avengers。此请求将由 lowtrust 中的入口网关提供服务,并将在 HTTPD 中结束,然后将请求转发到 mediumtrust 中的入口网关。

LOWTRUST                      MEDIUMTRUST
| GW--> VS-->HTTPD Pod|======>| GW --> VS -->Java Pod|

我创建了一个 github 存储库来证明这一点: https://github.com/alexwibowo/avengersKubernetes

HTTP 代理配置在这里:https://github.com/alexwibowo/avengersKubernetes/blob/main/httpd/conf/proxy.conf

用于低信任度的 Istio 入口网关: https://github.com/alexwibowo/avengersKubernetes/blob/main/kubernetes/avengers/charts/avengers-istio/templates/istio-httpd.yaml

和 mediumtrust 的 istio 入口网关: https://github.com/alexwibowo/avengersKubernetes/blob/main/kubernetes/avengers/charts/avengers-istio/templates/istio-app.yaml

如您所见,两个网关都配置了自己的证书。目前,我有点 'cheat' 通过修改我的 /etc/host 文件使其具有以下内容:

127.0.0.1            lowtrust.avengers.local
<CLUSTER_IP_ADDRESS> mediumtrust.avengers.local

通过这样做,当 HTTPD pod 向 'mediumtrust.avengers.local' 发出请求时,它将被定向到 istio 入口网关(无论如何这是我的理解)。

我听说您实际上可以为我上面描述的场景设置一个双向 TLS。使用这种方法,我不需要在我的 mediumtrust 入口网关中设置证书 - 只需使用 'ISTIO_MUTUAL'。我认为为此,我还需要在 lowtrust 命名空间中设置一个 'proxy' 服务和虚拟服务。然后虚拟服务将管理低信任和中信任之间的通信。但我不是 100% 如何做到这一点。

非常感谢任何帮助/建议!

编辑 1 (2021/07/01) 我一直在阅读有关此主题的更多信息。因此,另一种选择是在 'lowtrust' 命名空间中使用 'ExternalName' 类型的服务。 如果我可以使用类比的话,它将像 'proxy' 一样用于连接到另一个名称空间上的服务。 例如:

apiVersion: v1
kind: Service
metadata:
  name: cr1-avengers-app
  namespace: "lowtrust"
spec:
  type: ExternalName
  externalName: "cr1-avengers-app.mediumtrust.svc.cluster.local
  ports:
    - port: 8081
      targetPort: 8080
      protocol: TCP
      name: http

但是通过使用它,我将有效地绕过我在 mediumtrust 命名空间上定义的 Istio VirtualService、DestinationRule。

我设法在本地解决这个问题的方法是在我的 windows 主机文件中添加一个条目。 例如:

127.0.0.1 lowtrust.avengers.local
10.109.161.243 mediumtrust.avengers.local

10.109.161.243 是我的 istio-ingressgateway 的集群 IP 地址。我从命令行通过 运行 kubectl get svc -n istio-system 得到了这个。

NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                    AGE
istio-ingressgateway   LoadBalancer   10.109.161.243   localhost     15021:30564/TCP,80:31834/TCP,443:31828/TCP,445:32700/TCP,15012:30459/TCP,15443:30397/TCP   21d

我的反向代理配置中也缺少 'SSLProxyEngine' 标志。所以最后我的 VirtualHost 配置如下所示: 例如:

<VirtualHost *:7000>
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLProxyEngine on
    ProxyPass          /avengers        https://mediumtrust.avengers.local/avengers
    ProxyPassReverse   /avengers        https://mediumtrust.avengers.local/avengers

    CustomLog "/tmp/access.log" common
    ErrorLog /tmp/error.log
</VirtualHost>