本文介绍为什么ASM内的服务能够访问外部数据库,但认证会失败的问题现象、问题原因和解决方案。
问题现象
在使用ASM 1.10及之前版本时,如果有多个外部数据库,并且数据库登录的认证信息不同,在业务服务A加入服务网格并注入Sidecar代理后,请求数据库时会提示数据库服务认证失败。

问题原因
由于您对集群外部TCP服务(数据库)使用Kubernetes ExternalName类型的Sevice进行了DNS别名声明,业务服务在加入服务网格后,因为缺少集群IP和外部TCP服务做映射,会按照TCP服务对应的端口进行匹配,这样有可能会将业务服务对数据库A的请求路由到数据库B,而这两个数据库登录信息不一样,导致认证失败。
解决方案
方案一:升级ASM的版本
升级ASM至1.11及以上版本,可以解决该问题。具体操作,请参见升级ASM实例版本。
方案二:使用服务条目
您可以在ASM中创建服务条目,使得网格内的服务通过访问服务条目来访问指定IP的数据库。您也可以将服务条目创建到您指定服务的命名空间下,从而限定服务条目作用范围。