本文介绍为什么ASM内的服务能够访问外部数据库,但认证会失败的问题现象、问题原因和解决方案。
问题现象
在使用ASM 1.10及之前版本时,如果有多个外部数据库,并且数据库登录的认证信息不同,在业务服务A加入服务网格并注入Sidecar代理后,请求数据库时会提示数据库服务认证失败。
问题原因
由于您对集群外部TCP服务(数据库)使用Kubernetes ExternalName类型的Service进行了DNS别名声明,业务服务在加入服务网格后,因为缺少集群IP和外部TCP服务做映射,会按照TCP服务对应的端口进行匹配,这样有可能会将业务服务对数据库A的请求路由到数据库B,而这两个数据库登录信息不一样,导致认证失败。
解决方案
方案一:升级ASM的版本
升级ASM至1.11及以上版本,可以解决该问题。具体操作,请参见升级步骤。
方案二:使用服务条目
您可以在ASM中创建服务条目,使得网格内的服务通过访问服务条目来访问指定IP的数据库。您也可以将服务条目创建到您指定服务的命名空间下,从而限定服务条目的作用范围。
登录ASM控制台。
在左侧导航栏,选择 。
在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
在网格详情页面左侧导航栏,选择 ,然后在右侧页面,单击使用YAML创建。
在创建页面设置命名空间为istio-system,选择任意模板,将YAML文本框中的内容替换为以下内容,单击创建。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: mysql-demo spec: addresses: - 172.1.xx.xx endpoints: - address: 172.1.xx.xx hosts: - test-mysql.com location: MESH_EXTERNAL ports: - name: tcp number: 3306 protocol: TCP resolution: STATIC
addresses:设置为数据库的IP地址。
number:设置为数据库的端口。
文档内容是否对您有帮助?