具有相互 tls 的外部数据库的 Istio ServiceEntry,无法连接到数据库服务

Istio ServiceEntry for outside db with mutual tls, cannot connect to db service

我正在使用 istio 1.0.2 版本istio-demo-auth.yaml,我在 k8s 集群外有一个 mssql 数据库,我想从 istio 注入服务连接它。我尝试使用此 Consuming External TCP Services 博客,但服务无法连接到外部 mssql 实例。服务入口如下:

---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: mssql-entry
  namespace: multitenancy
spec:
  hosts:
  - mssql-master
  addresses:
  - $outside-db-ip/32
  ports:
  - number: 2433
    name: db
    protocol: TCP
  location: MESH_EXTERNAL
  resolution: STATIC
  endpoints:
  - address: $outside-db-ip
    ports:
      tcp: 2433

---
apiVersion: v1
kind: Service
metadata:
  name: mssql-master
  namespace: multitenancy
  labels:
    app: v1
spec:
  ports:
    - port: 2433
      targetPort: 2433
      protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
  name: mssql-master
  namespace: multitenancy
subsets:
  - addresses:
    - ip: $outside-db-ip
    ports:
    - port: 2433
      protocol: TCP

服务日志显示“登录前错误:主机 mssql-master 端口 2433 读取登录前响应时出错:连接重置 ClientConnectionId:”,似乎根本没有到达 mssql。如何为相互 tls 服务配置外部集群数据库?

如@SmileSees 所述,该问题已通过禁用目标 mssql 实例的双向 TLS 身份验证得到解决。由于数据库实例位于 Istio 网格之外,并且没有为该服务注入 sidecar Envoy,因此未建立 TLS 安全连接。

您可以考虑使用 SPIFFE 框架来保护异构环境中的服务。

进一步研究的参考链接:

  1. Mutual TLS authentication
  2. Authorization policy
  3. Istio security vs SPIFFE