Kubernetes (Istio) Корпоративный кластер Mongodb: HostUnreachable: сброс соединения одноранговым узлом - PullRequest
0 голосов
/ 18 июня 2020

У меня Istio1.6 работает в моем кластере k8. В кластере я также развернул сегментированный кластер mongodb с отключенной istio-инъекцией .

И у меня есть другое пространство имен для моего приложения с включенной istio-инъекцией . И из модуля, если я пытаюсь подключиться к мону go, я получаю это сброс соединения из-за ошибки узла :

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-инъекцию в свое приложение (модуль), тогда я могу успешно подключиться и использовать mon go, как и ожидалось.

Есть ли решение для этого, я хотел бы, чтобы istio-proxy был внедрен в мое приложение / под и использовал mongodb?

1 Ответ

0 голосов
/ 19 июня 2020

Внедрение баз данных с помощью istio сложно.


Я бы начал с проверки вашего mtls, если он СТРОГО, я бы изменил его на разрешающий и проверил, работает ли он. Это хорошо описано здесь .

Вы видите, что запросы все еще выполняются успешно, за исключением запросов от клиента, у которого нет прокси, sleep.legacy, к серверу с прокси, httpbin.foo или httpbin.bar. Это ожидается, потому что теперь строго требуется взаимный TLS , но рабочая нагрузка без сопутствующего элемента не может соответствовать.


Есть ли решение для этого, я хотел бы istio-proxy внедрен в мое приложение / под и использует mongodb?

Если изменение mtls не сработает, то в istio вы можете настроить базу данных без инъекции, а затем добавить ее в реестр istio с помощью объекта ServiceEntry чтобы он мог взаимодействовать с остальными службами istio.

Чтобы добавить вашу базу данных mongodb в istio, вы можете использовать ServiceEntry .

ServiceEntry позволяет добавлять дополнительные записи во внутреннем реестре служб Istio, чтобы автоматически обнаруженные службы в me sh могли обращаться к этим службам, указанным вручную, или направлять их. Запись службы описывает свойства службы (имя DNS, виртуальные IP-адреса, порты, протоколы, конечные точки). Эти службы могут быть внешними по отношению к me sh (например, веб-API) или me sh -внутренние службы, которые не являются частью реестра служб платформы (например, набор виртуальных машин, взаимодействующих со службами в Kubernetes). Кроме того, конечные точки записи службы также можно динамически выбирать с помощью поля workloadSelector. Эти конечные точки могут быть рабочими нагрузками виртуальных машин, объявленными с помощью объекта WorkloadEntry или модулей Kubernetes. Возможность выбора модулей и виртуальных машин в рамках одного сервиса позволяет переносить сервисы с виртуальных машин на 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

Дополнительно ознакомьтесь с этой документацией

...