【问题标题】:Exposing Neo4j Bolt using Kubernetes Ingress使用 Kubernetes Ingress 暴露 Neo4j Bolt
【发布时间】:2019-06-16 10:46:29
【问题描述】:

我正在尝试为我们的一些培训构建一个 Neo4j 学习工具。我想使用 Kubernetes 启动 Neo4j Pod 供每个参与者使用。目前我很难使用 Ingress 暴露螺栓端点,我不知道为什么。 这是我的部署配置:

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)。 我错过了什么?

【问题讨论】:

  • 你的集群中有什么入口控制器?
  • nginx 入口
  • 你的意思是“nginx入口控制器”kubernetes.github.io/ingress-nginx
  • 是的,对不起,我虽然它只是被称为“nginx-ingress”

标签: neo4j kubernetes nginx-ingress bolt


【解决方案1】:

nginx-ingress-controller 默认只创建 http(s) 代理。

在您的情况下,您尝试使用不同的协议 (bolt),因此您需要配置入口控制器以使其成为 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 Ingress,这不会被使用。

当然,您必须确保入口控制器正确地公开 7687 端口,就像使用端口 80 和 443 一样,并且您可能必须调整您可能拥有的任何防火墙和负载平衡器的设置。

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

【讨论】:

  • 我会试试的,谢谢!但是,如果我不再使用入口,那么我如何从外部访问该服务,所以我不指定主机?意思是,我必须将 Noe4j 客户端指向什么连接?
  • 您在 Ingress 资源中指定的主机名仅在 http 虚拟主机中才有意义。这里没有 HTTP,因此主机名没有真正意义。您可以使用 somwhow 到达您的入口控制器的任何主机名访问您的 Bolt 端点。请注意,您必须使用端口 7687 而不是 80。
  • 我已经根据我的理解更新了我的配置文件。可悲的是它仍然无法正常工作
  • 如何从集群外部访问入口控制器?
【解决方案2】:

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

【讨论】:

  • 如果我无法让螺栓开始工作,我可能会解决这个问题。但我宁愿使用螺栓
  • 确实通过打开 websocket 并传输 websocket-frames 来在引擎盖下使用螺栓。
  • 哦,是吗?我不知道。太棒了,谢谢
【解决方案3】:

我之前没有在这个上下文中使用过 kubernetes ingress,但是我认为当你使用 HTTP 或 HTTPS 连接到 Neo4J 时,你仍然需要外部可用性来连接到 Bolt 端口(7687)。你的设置允许吗?

【讨论】:

  • 我不确定我是否正确理解了这个问题。我想公开客户端(端口 7474)和螺栓端口(7687),以便参与者可以调用 learn.neo4j.com 获取客户端并将其指向 learn.neo4j.bolt.com 以将其连接到 Neo4j- DB 使用螺栓。所以基本上我需要 7474 和 7687 的外部可用性。
  • 嗨,Urr4 这个问题解决了吗?
猜你喜欢
  • 2019-02-24
  • 2019-06-20
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多