我有一种情况,我不确定我是否做错了什么,或者用例是否完全没有得到Istio的支持。这是我的设计:
我有一个连接到VirtualService的Gateway,以使某些API在外部可用,例如api1.example.com。VirtualService连接到执行某些请求预处理(一些条件URL重写)的Service。现在有一个棘手的部分:服务应该将请求转发到某个API管理解决方案,该API管理解决方案运行在同一个集群上,在不同的命名空间中运行,并且不启用Istio。总的来说,这是可行的,但我有一些额外的要求困扰着我。API管理需要知道请求最初发送到哪个端点(以应用正确的规则),因此当我将请求从服务转发到API管理荚时,HTTP报头仍然应该是Host。这就是它崩溃的地方,我只得到了502 Bad Gateway错误。
现在,这是完整的设置,但我认为您可以将其归结为下面的设置(不幸的是,我目前无法访问某个集群,在那里我可以创建和测试一些最小的工作示例):
pod1在启用Istio的namespace1中运行pod2在禁用Istio的情况下在namespace2中运行,并公开为service2现在,来自pod1的工作如下:
wget -qO- http://service2.namespace2.svc.cluster.local但以下情况并非如此:
wget -qO- --header 'Host: api1.example.com' http://service2.namespace2.svc.cluster.local任何帮助或暗示都是非常感谢的!
提出了以下问题的最新情况:
wget -qO- http://service2.namespace2.svc.cluster.local时,pod2接收请求,当我读取Host头时,它就是service2.namespace2.svc.cluster.localwget -qO- --header 'Host: api1.example.com' http://service2.namespace2.svc.cluster.local时,请求根本就不会到达pod2istioctl proxy-config listeners pod1显示了以下内容( pod1中的服务运行在端口1024,pod2中的服务运行在端口80上)ADDRESS PORT TYPE
100.96.4.131 1024 HTTP
100.96.4.131 15020 TCP
100.69.164.43 443 TCP
10.250.0.42 10250 TCP
10.250.0.47 10250 TCP
100.64.124.217 443 TCP
100.67.245.255 15011 TCP
10.250.0.46 10250 TCP
10.250.0.48 10250 TCP
10.250.0.9 10250 TCP
10.250.0.24 10250 TCP
10.250.0.50 10250 TCP
100.64.124.217 15032 TCP
100.64.0.1 443 TCP
10.250.0.108 10250 TCP
100.64.0.10 53 TCP
10.250.0.34 10250 TCP
10.250.0.8 10250 TCP
10.250.0.37 10250 TCP
100.64.124.217 15029 TCP
10.250.0.30 10250 TCP
10.250.0.36 10250 TCP
10.250.0.105 10250 TCP
100.64.124.217 15031 TCP
100.64.124.217 15030 TCP
10.250.0.92 10250 TCP
100.66.112.190 443 TCP
100.68.34.255 44134 TCP
100.64.124.217 15443 TCP
10.250.0.91 10250 TCP
10.250.0.97 10250 TCP
0.0.0.0 443 TCP
10.250.0.10 10250 TCP
10.250.0.45 10250 TCP
0.0.0.0 9943 TCP
100.64.132.219 9115 TCP
0.0.0.0 10249 TCP
100.70.99.95 443 TCP
100.65.54.197 26379 TCP
100.64.0.10 9153 TCP
0.0.0.0 9090 TCP
0.0.0.0 15014 TCP
100.71.44.89 6789 TCP
100.70.253.4 2020 TCP
0.0.0.0 9094 TCP
100.67.56.56 443 TCP
100.65.133.0 4314 TCP
0.0.0.0 4005 TCP
100.70.229.77 9411 TCP
0.0.0.0 9901 TCP
100.71.167.108 443 TCP
100.69.145.185 9093 TCP
100.70.32.142 443 TCP
100.66.233.175 42422 TCP
0.0.0.0 8080 TCP
100.69.114.203 6789 TCP
100.70.144.106 3300 TCP
0.0.0.0 20001 TCP
0.0.0.0 4004 TCP
0.0.0.0 9093 TCP
100.67.179.223 9000 TCP
100.70.18.125 3300 TCP
100.64.255.234 9090 TCP
100.66.197.157 9710 TCP
100.67.193.139 3300 TCP
100.69.114.203 3300 TCP
0.0.0.0 16909 TCP
0.0.0.0 3000 TCP
0.0.0.0 15004 TCP
100.68.54.218 9115 TCP
0.0.0.0 8060 TCP
0.0.0.0 8008 TCP
100.70.162.45 9115 TCP
0.0.0.0 15010 TCP
0.0.0.0 10054 TCP
100.65.13.208 5473 TCP
100.67.193.139 6789 TCP
100.71.44.89 3300 TCP
100.70.18.125 6789 TCP
100.67.56.56 8081 TCP
0.0.0.0 9411 TCP
0.0.0.0 2379 TCP
100.66.228.227 8081 TCP
0.0.0.0 9091 TCP
0.0.0.0 5556 TCP
100.64.124.217 15020 TCP
100.68.245.60 7000 TCP
0.0.0.0 9283 TCP
0.0.0.0 80 TCP
0.0.0.0 3100 TCP
100.66.228.227 8080 TCP
100.70.144.106 6789 TCP
0.0.0.0 1024 TCP
100.70.229.77 14268 TCP
0.0.0.0 15019 TCP
0.0.0.0 5558 TCP
100.70.229.77 14267 TCP
100.67.17.80 9100 TCP
0.0.0.0 15001 TCP
0.0.0.0 15006 TCP
100.96.1.142 443 TCP
0.0.0.0 15090 HTTP发布于 2020-08-12 11:33:02
为了能够在istio注入的服务和外部服务( istio Mesh)之间进行通信,您需要使用ServiceEntry对象。
根据istio 文档
ServiceEntry允许向Istio的内部服务注册中心添加额外的条目,这样在mesh中自动发现的服务就可以访问/路由到这些手动指定的服务。服务条目描述服务的属性(DNS名称、VIP、端口、协议、端点)。这些服务可以是网格之外的服务(例如,web ),也可以是不属于平台服务注册中心一部分的网格内部服务(例如,一组在Kubernetes中与服务对话的VM)。此外,还可以使用workloadSelector字段动态地选择服务条目的端点。这些端点可以是使用WorkloadEntry对象或Kubernetes荚声明的VM工作负载。在单个服务下同时选择pods和VM的能力允许将服务从VM迁移到Kubernetes,而不必更改与服务关联的现有DNS名称。
就像你提到的:
在启用Istio的情况下在namespace1中运行的pod1
pod2,在禁用Istio的情况下在namespace2中运行,并公开为service2
在这个场景中,service2将需要一个ServiceEntry对象来将其添加到Istio注册中心。这将使service2可以像在Istio中一样被使用。请注意,需要特使代理的istio特性不会适用于此服务,因为它实际上没有注入istio。
我建议遵循这个istio 访问外部服务指南。
https://stackoverflow.com/questions/62620648
复制相似问题