mongodb - Kubernetes(Istio) Mongodb 企业集群:HostUnreachable: Connection reset by peer
问题描述
我在我的 k8 集群中运行了 Istio1.6。在集群中,我还部署了禁用 istio-injection 的 sharded mongodb 集群。
而且我的应用程序有一个不同的命名空间,启用了 istio-injection。如果我尝试从 pod 连接到 mongo,我会通过对等错误重置此连接:
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
但是,如果我禁用对我的应用程序(pod)的 istio 注入,那么我可以成功连接并按预期使用 mongo。
有没有办法解决这个问题,我想将 istio-proxy 注入我的应用程序/pod 并使用 mongodb?
解决方案
使用 istio 注入数据库很复杂。
我将从检查您的 mtls 开始,如果它是严格的,我会将其更改为允许并检查它是否有效。这里描述得很好。
您会看到请求仍然成功,除了那些从没有代理的客户端 sleep.legacy 到有代理的服务器 httpbin.foo 或 httpbin.bar 的请求。这是意料之中的,因为现在严格要求双向 TLS,但是没有 sidecar 的工作负载无法遵守。
有没有办法解决这个问题,我想将 istio-proxy 注入我的应用程序/pod 并使用 mongodb?
如果更改 mtls 不起作用,那么在 istio 中您可以在不注入的情况下设置数据库,然后使用 ServiceEntry 对象将其添加到 istio 注册表,以便它能够与其余的 istio 服务进行通信。
要将您的 mongodb 数据库添加到 istio,您可以使用ServiceEntry。
ServiceEntry 允许将其他条目添加到 Istio 的内部服务注册表中,以便网格中自动发现的服务可以访问/路由到这些手动指定的服务。服务条目描述了服务的属性(DNS 名称、VIP、端口、协议、端点)。这些服 此外,还可以使用workloadSelector 字段动态选择服务条目的端点。这些端点可以是使用 WorkloadEntry 对象或 Kubernetes pod 声明的 VM 工作负载。
服务入口示例
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
另外看看这个文档
推荐阅读
- json - Ansible:将 JSON 值分配给变量
- javascript - POST 未使用 AJAX 接收 formData
- python - 提取人口最接近的5个国家
- ember.js - ember-addon - afterInstall 挂钩不会更新我的 ember 应用程序 package.json
- java - 由于错误,Logstash 停止处理:(NameError)无法加载(ext)(org.jruby.ext.openssl.OpenSSL)
- review - My app failed app review because Facebook tested the wrong version. How can I direct them to the right one?
- excel - 加入升序范围之间的所有单元格值
- javascript - 为待办事项添加任务
- scala - 如何使用 SparkContext.submitJob 调用 REST API
- javascript - Typescript动态过滤对象数组