使用 Kubernetes Ingress 公开 Neo4j Bolt
Exposing Neo4j Bolt using Kubernetes Ingress
我正在尝试为我们的一些培训构建一个 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
下访问,但我不知道将其指向何处以使用 bolt 连接到数据库。无论我尝试什么,它都不会说 ServiceUnavailable: Websocket Connection failure
(控制台中的 WebSocket network error: The operation couldn’t be completed. Connection refused
)。
我错过了什么?
我以前没有在这种情况下使用过 kubernetes 入口,但我认为当你使用 HTTP 或 HTTPS 连接到 Neo4J 时,你仍然需要外部可用性来连接到螺栓端口 (7687)。您的设置允许吗?
默认情况下它会自动尝试连接到端口 7687 - 如果您输入连接 url http://learn.neo4j.bolt.com:80
(或 https),它会工作。
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,它不会被使用。
当然,您必须确保入口控制器以与端口 80 和 443 相同的方式正确公开 7687 端口,并且您可能必须调整您可能拥有的任何防火墙和负载平衡器的设置.
来源:https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/
我正在尝试为我们的一些培训构建一个 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
下访问,但我不知道将其指向何处以使用 bolt 连接到数据库。无论我尝试什么,它都不会说 ServiceUnavailable: Websocket Connection failure
(控制台中的 WebSocket network error: The operation couldn’t be completed. Connection refused
)。
我错过了什么?
我以前没有在这种情况下使用过 kubernetes 入口,但我认为当你使用 HTTP 或 HTTPS 连接到 Neo4J 时,你仍然需要外部可用性来连接到螺栓端口 (7687)。您的设置允许吗?
默认情况下它会自动尝试连接到端口 7687 - 如果您输入连接 url http://learn.neo4j.bolt.com:80
(或 https),它会工作。
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,它不会被使用。
当然,您必须确保入口控制器以与端口 80 和 443 相同的方式正确公开 7687 端口,并且您可能必须调整您可能拥有的任何防火墙和负载平衡器的设置.
来源:https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/