Доступ к трафику Bolt из базы данных Neo4j с помощью Kubernetes Ingress - PullRequest
0 голосов
/ 24 января 2019

Прежде чем перейти к вопросу, вот кратко о том, чего я пытаюсь достичь:

У нас более 1000 Neo4J databases. Конечный пользователь может потребовать конкретный экземпляр базы данных. Таким образом, мы запускаем этот конкретный экземпляр Neo4J как докер-контейнер и делаем его доступным для пользователя.

Вопрос:

Для обработки запущенного экземпляра базы данных Neo4J по требованию, У нас есть настройка kubernetes cluster, и мы динамически создаем объекты deployment, service и ingress для этой базы данных Neo4J.

В качестве выходного пользователь получает два URL: один для http и один для bolt.

У нас nginx настроен как Ingress Controller в Kubernetes кластере. Nginx разрешает http и websocket трафик. Протокол болтов должен работать на websocket

Проблема в том, что мы не можем подключиться к базе данных Neo4J, используя bolt, поскольку ingress не может перенаправить запрос с bolt url на запущенный модуль.

Дайте мне знать, если это правильный способ сделать это.

Вот yaml объектов входа, обслуживания и развертывания:

Ingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: neo-sandbox
  annotations:
    kubernetes.io/ingress.class: private
    nginx.ingress.kubernetes.io/rewrite-target: "/"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.org/websocket-services: "neo-sandbox-bolt"
spec:
  rules:
  - host: sandbox.neo.com
    http:
      paths:
      - path: "/22220"
        backend:
          serviceName: neo-sandbox-http
          servicePort: 22220
      - path: "/22221"
        backend:
          serviceName: neo-sandbox-bolt
          servicePort: 22221 

Http_Service.yaml:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: neo-sandbox-http
  name: neo-sandbox-http
spec:
  type: NodePort
  selector:
    app: neo-sandbox
  ports:
  - name: frontend-http-port
    port: 22220
    protocol: TCP
    targetPort: 22220

Bolt_Service.yaml:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: neo-sandbox-bolt
  name: neo-sandbox-bolt
spec:
  type: NodePort
  selector:
    app: neo-sandbox
  ports:
  - name: frontend-bolt-port
    port: 22221
    protocol: TCP
    targetPort: 22221

Deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: neo-sandbox
    version: latest
  name: neo-sandbox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: neo-sandbox
      version: latest
  template:
    metadata:
      labels:
        app: neo-sandbox
        version: latest
    spec:
      containers:
      - env:
        - name: NEO4J_dbms_memory_pagecache_size
          value: 1G
        - name: NEO4J_dbms_memory_heap_maxSize
          value: 3G
        image: <neo4j-docker-image>
        imagePullPolicy: IfNotPresent
        name: neodb
        ports:
        - containerPort: 7474
          protocol: TCP
        - containerPort: 7687
          protocol: TCP
        resources:
          limits:
            cpu: "2"
            memory: 5Gi
          requests:
            cpu: 200m
            memory: 1Gi
      - env:
        - name: FRONTEND_HTTP_PORT
          value: "22220"
        - name: FRONTEND_BOLT_PORT
          value: "22221"
        image: <ha-proxy-docker-image>
        name: proxy
        ports:
        - containerPort: 22220
          protocol: TCP
        - containerPort: 22221
          protocol: TCP
        resources:
          limits:
            cpu: 500m
            memory: 2Gi
          requests:
            cpu: 50m
            memory: 1Gi

Обратите внимание:

1) kubernetes pod запускает два контейнера. Один контейнер запускает стандартный образ докера из Neo4j, а другой контейнер запускает образ HA proxy, который выполняет перенаправление портов (перенаправляет трафик с 22220 на 7474 и 22221 на 7687).

2) Я могу получить доступ к bolt service внутри кластера. Так что проблема на уровне ingress.

Вот URL-адреса, которые получает пользователь:

для HTTP -> sandbox.neo.com/22220

для BOLT -> sandbox.neo.com/22221

3) Параметры конфигурации Nginx можно просмотреть здесь

4) Пример Nginx Websocket: здесь

...