开发者社区> 问答> 正文

为什么ASM内的服务能够访问外部数据库,但认证会失败

已解决

在使用ASM 1.10及之前版本时,如果有多个外部数据库,并且数据库登录的认证信息不同,在业务服务A加入服务网格并注入Sidecar代理后,请求数据库时会提示数据库服务认证失败。

展开
收起
游客rda5n5ukztvu2 2022-10-27 17:00:36 84 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    问题原因

    由于您对集群外部TCP服务(数据库)使用Kubernetes ExternalName类型的Sevice进行了DNS别名声明,业务服务在加入服务网格后,因为缺少集群IP和外部TCP服务做映射,会按照TCP服务对应的端口进行匹配,这样有可能会将业务服务对数据库A的请求路由到数据库B,而这两个数据库登录信息不一样,导致认证失败。

    解决方案

    方案一:升级ASM的版本

    升级ASM至1.11及以上版本,可以解决该问题。具体操作,请参见升级ASM实例版本

    方案二:使用服务条目

    您可以在ASM中创建服务条目,使得网格内的服务通过访问服务条目来访问指定IP的数据库。您也可以将服务条目创建到您指定服务的命名空间下,从而限定服务条目作用范围。

    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择集群与工作负载管理 > 服务条目,然后在右侧页面单击使用YAML创建
    5. 创建页面设置命名空间为istio-system ,选择任意模板,将YAML文本框中的内容替换为以下内容,单击创建

    apiVersion: networking.istio.io/v1beta1kind: ServiceEntrymetadata:  name: mysql-demospec:  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:设置为数据库的端口。
    2022-10-27 17:21:19
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载