【问题标题】:Kubernetes(Istio) Mongodb enterprise cluster: HostUnreachable: Connection reset by peerKubernetes(Istio) Mongodb 企业集群:HostUnreachable: Connection reset by peer
【发布时间】:2020-10-09 00:40:07
【问题描述】:

我的 k8 集群中运行着 Istio1.6。在集群中,我还部署了分片 mongodb 集群禁用了 istio-injection

我的应用启用了 istio-injection 有一个不同的命名空间。如果我尝试从 pod 连接到 mongo,我会得到这个 connection reset by peer error

root@mongo:/# mongo "mongodb://mongo-sharded-cluster-mongos-0.mongo-service.mongodb.svc.cluster.local:27017,mongo-sharded-cluster-mongos-1.mongo-service.mongodb.svc.cluster.local:27017/?ssl=false"
MongoDB shell version v4.2.8
connecting to: mongodb://mongo-sharded-cluster-mongos-0.mongo-service.mongodb.svc.cluster.local:27017,mongo-sharded-cluster-mongos-1.mongo-service.mongodb.svc.cluster.local:27017/?compressors=disabled&gssapiServiceName=mongodb&ssl=false
2020-06-18T19:59:14.342+0000 I  NETWORK  [js] DBClientConnection failed to receive message from mongo-sharded-cluster-mongos-0.mongo-service.mongodb.svc.cluster.local:27017 - HostUnreachable: Connection reset by peer
2020-06-18T19:59:14.358+0000 I  NETWORK  [js] DBClientConnection failed to receive message from mongo-sharded-cluster-mongos-1.mongo-service.mongodb.svc.cluster.local:27017 - HostUnreachable: Connection reset by peer
2020-06-18T19:59:14.358+0000 E  QUERY    [js] Error: network error while attempting to run command 'isMaster' on host 'mongo-sharded-cluster-mongos-1.mongo-service.mongodb.svc.cluster.local:27017'  :
connect@src/mongo/shell/mongo.js:341:17
@(connect):2:6
2020-06-18T19:59:14.362+0000 F  -        [main] exception: connect failed
2020-06-18T19:59:14.362+0000 E  -        [main] exiting with code 1

但是如果我禁用 istio-injection 到我的应用程序(pod),那么我可以成功连接并按预期使用 mongo。

是否有解决方法,我想将 istio-proxy 注入我的应用程序/pod 并使用 mongodb?

【问题讨论】:

  • reset by peer 通常表示有意关闭连接。检查您要连接的 mongod 节点的日志,以获取有关原因的线索。

标签: mongodb kubernetes istio


【解决方案1】:

使用 istio 注入数据库很复杂。


我将从检查您的 mtls 开始,如果它是严格的,我会将其更改为 permissive 并检查它是否有效。它很好地描述了here

您会看到请求仍然成功,除了 那些从没有代理的客户端 sleep.legacy 到具有代理的服务器 httpbin.foo 或 httpbin.bar 的请求。这是意料之中的,因为现在严格要求双向 TLS,但没有 sidecar 的工作负载无法遵守。


有没有办法解决这个问题,我想将 istio-proxy 注入我的应用程序/pod 并使用 mongodb?

如果更改 mtls 不起作用,那么在 istio 中您可以在不注入的情况下设置数据库,然后使用 ServiceEntry 对象将其添加到 istio 注册表,以便它能够与其余的 istio 服务进行通信。

要将您的 mongodb 数据库添加到 istio,您可以使用 ServiceEntry

ServiceEntry 允许将额外的条目添加到 Istio 的内部服务注册表中,以便网格中自动发现的服务可以访问/路由到这些手动指定的服务。服务条目描述了服务的属性(DNS 名称、VIP、端口、协议、端点)。这些服务可能在网格外部(例如,Web API)或网格内部服务,它们不属于平台的服务注册表(例如,一组与 Kubernetes 中的服务通信的 VM)。此外,还可以使用workloadSelector 字段动态选择服务条目的端点。这些端点可以是使用 WorkloadEntry 对象或 Kubernetes pod 声明的 VM 工作负载。在单个服务下同时选择 Pod 和 VM 的能力允许将服务从 VM 迁移到 Kubernetes,而无需更改与服务关联的现有 DNS 名称。

ServiceEntry 示例

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc-mongocluster
spec:
  hosts:
  - mymongodb.somedomain # not used
  addresses:
  - 192.192.192.192/24 # VIPs
  ports:
  - number: 27018
    name: mongodb
    protocol: MONGO
  location: MESH_INTERNAL
  resolution: STATIC
  endpoints:
  - address: 2.2.2.2
  - address: 3.3.3.3

如果您启用了 mtls,您还需要 DestinationRule 来定义如何与外部服务通信。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: mtls-mongocluster
spec:
  host: mymongodb.somedomain
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/myclientcert.pem
      privateKey: /etc/certs/client_private_key.pem
      caCertificates: /etc/certs/rootcacerts.pem

另外看看这个文档

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2018-10-15
    • 2012-01-18
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2020-06-18
    • 2013-03-13
    相关资源
    最近更新 更多