使用Kubernetes Ingress从Neo4j DB访问Bolt通信

时间:2019-01-24 12:30:40

标签: neo4j kubernetes kubernetes-ingress nginx-ingress bolt

在开始提问之前,这里简要介绍一下我要实现的目标:

我们有1000多个Neo4J databases。最终用户可以要求特定的数据库实例。因此,我们将特定的Neo4J实例作为docker容器运行,并将其提供给用户。

问题:

对于处理Neo4J数据库的按需运行实例, 我们设置了kubernetes cluster,并为那个Neo4J数据库动态创建了deploymentserviceingress对象。

作为输出用户,您将收到两个URL:一个用于http,一个用于bolt

我们在nginx集群中将Ingress Controller设置为KubernetesNginx允许httpwebsocket流量。 Bolt protocol应该在websocket上工作

问题是,我们无法使用bolt连接到Neo4J数据库,因为ingress无法将请求从bolt url重定向到Pod运行中。

让我知道这是否是正确的方法。

这里是入口,服务和部署对象的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的标准docker映像,一个容器运行执行端口重定向的HA proxy映像(将流量从22220重定向到7474,将22221重定向到7687

2)我可以访问集群中的bolt service。因此问题出在ingress级别。

以下是用户收到的URL:

用于HTTP-> sandbox.neo.com/22220

for螺栓-> sandbox.neo.com/22221

3)可以浏览Nginx配置选项here

4)Nginx Websocket示例为here

0 个答案:

没有答案