用Kubernetes Inress揭露Neo4j螺栓

rryofs0p  于 2022-10-21  发布在  Kubernetes
关注(0)|答案(4)|浏览(195)

我正在尝试为我们的一些培训构建一个Neo4j学习工具。我想使用Kubernetes为每个参与者启动一个Neo4j Pod来使用。目前,我在使用Inress暴露螺栓终结点时遇到困难,我不知道为什么。以下是我的部署配置:

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)。我遗漏了什么?

6yjfywim

6yjfywim1#

默认情况下,nginx-ingress-controller仅创建http(S)代理。
在您的例子中,您正在尝试使用不同的协议(螺栓),因此您需要配置您的入口控制器以使其成为一个TCP代理。
为此,您需要创建一个如下所示的配置Map(在nginx-inress-control命名空间中):

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-inress控制器使用一个TCP代理监听端口7687。
您可以删除neo4j-bolt-ingress Inress,这将不会被使用。
当然,您必须确保入口控制器正确地公开7687端口,就像它对端口80和443所做的那样,并且可能必须调整您可能拥有的任何防火墙和负载均衡器的设置。
来源:https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/

oxiaedzo

oxiaedzo2#

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

tzcvj98z

tzcvj98z3#

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

uemypmqf

uemypmqf4#

尝试在您的入口中使用多路径Map:

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: /browser
            backend:
              serviceName: neo4j-service
              servicePort: 7474
          - path: /
            backend:
              serviceName: neo4j-service
              servicePort: 7687

然后,您应该能够访问位于learn.neo4j.com/browser的UI。螺栓连接URL必须指定为:
Bolt+s://learn.neo4j.com:443/

相关问题