从 Pod 访问 HTTPS Istio Ingress Gateway
Accessing HTTPS Istio Ingress Gateway from Pod
我的 kubernetes 集群有一个相当简单的设置,有两个区域:
- 信任度低(public 面对)
- 中等信任度(非 public)
两个区域都启用了 Istio,其中:
- 启用了 SSL 的入口网关。为了在我的本地 docker 桌面中进行测试,我将端口 443 用于 public 面向,将端口 443 用于中等信任
- 虚拟服务
- 目标规则
我正在部署 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>
我的 kubernetes 集群有一个相当简单的设置,有两个区域:
- 信任度低(public 面对)
- 中等信任度(非 public)
两个区域都启用了 Istio,其中:
- 启用了 SSL 的入口网关。为了在我的本地 docker 桌面中进行测试,我将端口 443 用于 public 面向,将端口 443 用于中等信任
- 虚拟服务
- 目标规则
我正在部署 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>