我们的集群中有两个服务位于同一个名称空间中,每个服务都使用自己的数据库,如下所示:

我们为每个数据库添加了两个ServiceEntry:
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: service-1
namespace: mynamespace
spec:
exportTo:
- "."
hosts:
- service1-db.xxx.com
ports:
- number: 5432
name: tcp
protocol: tcp
resolution: DNS
location: MESH_EXTERNAL
...
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: service-2
namespace: mynamespace
spec:
exportTo:
- "."
hosts:
- service2-db.xxx.com
ports:
- number: 5432
name: tcp
protocol: tcp
resolution: DNS
location: MESH_EXTERNAL
...结果的交互如下所示,这不是预期的:

我们遗漏了什么线索吗?
发布于 2019-11-26 14:29:37
因此,在最后,ServiceEntry不只是基于主机名工作,而是需要地址。
以下是行之有效的方法:
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: service-1
namespace: mynamespace
spec:
exportTo:
- "."
hosts:
- service1-db.xxx.com
addresses:
- xx.xx.xx.xx/32
ports:
- number: 5432
name: tcp
protocol: tcp
resolution: NONE
location: MESH_EXTERNAL
...
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: service-2
namespace: mynamespace
spec:
exportTo:
- "."
hosts:
- service2-db.xxx.com
addresses:
- xx.xx.xx.yy/32
ports:
- number: 5432
name: tcp
protocol: tcp
resolution: NONE
location: MESH_EXTERNAL
...以下是文献资料的摘录,这些摘录使我们得出了这个结论。
如果地址字段为空,则将仅根据目标端口标识通信量。在这种情况下,mesh中的任何其他服务都不能共享正在访问服务的端口。 注意,当解析设置为DNS类型且未指定端点时,主机字段将用作要将通信量路由到的端点的DNS名称。
注意:虽然这帮助解决了这个特殊的实例,但它打开了另一个处理动态ip地址的问题,比如一些试图访问AWS机密管理器的应用程序。这些服务的ip地址不断变化,因此无法将其绑定到服务条目。因此,我们只为已知的外部通信量添加了服务条目,并允许其他信息未知。在Kiali (Istio的可视化器)中,这些“未知数”被显示为PassThroughClusters,这很烦人,但只有一半的问题。
https://stackoverflow.com/questions/58958939
复制相似问题