Трафик Istio из пространства имен с поддержкой istio в другое пространство имен

Я очень старался, чтобы этот сценарий работал. У меня есть пространства имен:

  • пространство имен: mongodb (Istio отключено, на самом деле это оператор mongodb с кластером)
  • пространство имен: приложение (включен Istio)

Из третьего пространства имен, скажем по умолчанию, я могу достичь конечной точки mongodb с помощью fqnd: mongodb-standalone-0.mongodb-standalone-svc.mongodb.svc.cluster.local

Но из пространства имен приложения, в котором включен istio, я безуспешно пробовал следующее:

Служба внешних имен

kind: "Service"
apiVersion: "v1"
metadata:
  namespace: app
  labels:
    app: mongodb
    service: mongodb
  name: mongodb
spec:
  type: ExternalName
  externalName: mongodb-standalone-0.mongodb-standalone-svc.mongodb.svc.cluster.local
  ports:
  - port: 27017
status:
 loadBalancer: {}
  • ping работает, но трафик на порт 27017 нет

Виртуальный сервис + сервис

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mongodb
spec:
  hosts:
  - mongodb
  tcp:
  - route:
    - destination:
        host: mongodb-standalone-0.mongodb-standalone-svc.mongodb.svc.cluster.local
        subset: v1
--- 
kind: "Service"
apiVersion: "v1"
metadata:
  namespace: app
  labels:
    app: mongodb
    service: mongodb
  name: mongodb
spec:
  ports:
  - name: "tcp-mongodb"
    port: 27017
    targetPort: 27017
status:
 loadBalancer: {}       

Запись в службу:

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: mongodb
spec:
  hosts:
  - mongodb-standalone-0.mongodb-standalone-svc.mongodb.svc.cluster.local
  #- mongodb
  ports:
  - number: 27017
    name: tcp-mongodb
    protocol: TCP
  location: MESH_EXTERNAL
  resolution: DNS
  endpoints:
  - address: mongodb-standalone-0.mongodb-standalone-svc.mongodb.svc.cluster.local

но, похоже, ничто не помогает достичь пространства имен mongodb из пространства имен с поддержкой Istio. Любые идеи?


person Miguel Callejas    schedule 27.07.2020    source источник
comment
Я бы рекомендовал попробовать сделать это без externalName, есть связанный документация о записи службы, где вы можете найти пример для mongodb. Кроме того, посмотрите здесь и здесь.   -  person Jakub    schedule 28.07.2020


Ответы (1)


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

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

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

Дополнительно взгляните на эти ссылки

person Jakub    schedule 03.08.2020