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

本文介绍为什么ASM内的服务能够访问外部数据库,但认证会失败的问题现象、问题原因和解决方案。

问题现象

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

image

问题原因

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

解决方案

方案一:升级ASM的版本

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

方案二:使用服务条目

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

  1. 登录ASM控制台

  2. 在左侧导航栏,选择服务网格 > 网格管理

  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理

  4. 在网格详情页面左侧导航栏,选择集群与工作负载管理 > 集群外服务(ServiceEntry),然后在右侧页面,单击使用YAML创建

  5. 创建页面设置命名空间为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:设置为数据库的端口。