使用Kubernetes Ingress公开Neo4j Bolt

时间:2019-06-16 10:46:29

标签: neo4j kubernetes nginx-ingress bolt

我正在尝试为某些培训构建Neo4j学习工具。我想使用Kubernetes为每个参与者使用Neo4j Pod。目前,我很难使用Ingress公开bolt端点,但我不知道为什么。 这是我的部署配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: neo4j
  namespace: learn
  labels:
    app: neo-manager
    type: database
spec:
  replicas: 1
  selector:
    matchLabels:
      app: neo-manager
      type: database
  template:
    metadata:
      labels:
        app: neo-manager
        type: database
    spec:
      containers:
        - name: neo4j
          imagePullPolicy: IfNotPresent
          image: neo4j:3.5.6
          ports:
            - containerPort: 7474
            - containerPort: 7687
              protocol: TCP
---
kind: Service
apiVersion: v1
metadata:
  name: neo4j-service
  namespace: learn
  labels:
    app: neo-manager
    type: database
spec:
  selector:
    app: neo-manager
    type: database
  ports:
    - port: 7687
      targetPort: 7687
      name: bolt
      protocol: TCP
    - port: 7474
      targetPort: 7474
      name: client
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: neo4j-ingress
  namespace: learn
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: learn.neo4j.com
      http:
        paths:
          - path: /
            backend:
              serviceName: neo4j-service
              servicePort: 7474
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: learn
data:
  7687: "learn/neo4j-service:7687"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: learn
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ingress-nginx
  template:
    metadata:
      labels:
        app: ingress-nginx
    spec:
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.9.0-beta.16
          args:
            - /nginx-ingress-controller
            - --tcp-services-configmap=${POD_NAMESPACE}/tcp-services
          env:
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace

客户端暴露得很好,并且可以在learn.neo4j.com下访问,但是我不知道在何处指向使用螺栓连接数据库的对象。无论我如何尝试,都无法说出ServiceUnavailable: Websocket Connection failure(控制台中的WebSocket network error: The operation couldn’t be completed. Connection refused)。 我想念什么?

3 个答案:

答案 0 :(得分:3)

默认情况下,nginx-ingress-controller仅创建http(s)代理。

在您的情况下,您尝试使用其他协议(螺栓),因此您需要配置入口控制器以使其成为TCP代理。

为此,您需要创建一个类似于以下内容的配置映射(在nginx-ingress-controller名称空间中):

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  7687: "<your neo4j namespace>/neo4j-service:7687"

然后,确保您的入口控制器在其命令中具有以下标志:

--tcp-services-configmap tcp-services

这将使您的nginx-ingress控制器使用TCP代理侦听端口7687。

您可以删除neo4j-bolt-ingress入口,该入口将不再使用。

当然,您必须确保入口控制器以与端口80和443相同的方式正确公开7687端口,并且可能必须调整可能具有的所有防火墙和负载平衡器的设置。 / p>

来源:https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/

答案 1 :(得分:1)

默认情况下,它会自动尝试连接到端口7687-如果您输入连接URL http://learn.neo4j.bolt.com:80(或https),则可以正常工作。

答案 2 :(得分:0)

我以前没有在这种情况下使用过kubernetes入口,但是我认为当您使用HTTP或HTTPS连接到Neo4J时,仍然需要外部可用性才能连接到螺栓端口(7687)。您的设置允许吗?