使用 Kubernetes Ingress 访问 Neo4j
Neo4j Helm 图表提供了一个 Helm 图表,允许您使用 Kubernetes Ingress 在端口:80
或:443
上访问 Neo4j。这个 Helm 图表名为neo4j/neo4j-reverse-proxy,从 5.12.0 版本开始在 Neo4j Helm 仓库中可用。有关 Kubernetes Ingress 的更多信息,请参阅Kubernetes 官方文档 → Ingress。
该 Helm 图表创建一个反向代理,它被配置为使用serviceName
、namespace
和domain
值将流量路由到 Neo4j 服务 URL。例如,如果serviceName
是standalone-admin,namespace
是default,domain
是cluster.local,那么 Neo4j 服务 URL 为standalone-admin.default.svc.cluster.local。
对于 Neo4j 集群,可以使用 Neo4j 无头服务将流量路由到集群实例。有关详细信息以及如何安装neo4j/neo4j-cluster-headless-service Helm 图表的详细示例,请参阅使用无头服务访问 Neo4j 集群。
反向代理 Helm 图表创建一个 HTTP 服务器,该服务器根据请求头将请求路由到 Bolt 反向代理或 HTTP 反向代理。在接收到响应后,Bolt 反向代理更新响应以将 Bolt 端口替换为:80
或:443
。
从 5.17.0 版本开始,反向代理 Helm 图表支持为容器定义权限和访问控制设置。确保您不要以 root 用户身份运行 Neo4j。
配置选项
要查看所有可配置选项,请运行以下命令
helm show values neo4j/neo4j-reverse-proxy
# Default values for neo4j reverse proxy helm chart
## @param nameOverride String to partially override common.names.fullname
nameOverride: ""
## @param fullnameOverride String to fully override common.names.fullname
fullnameOverride: ""
# Parameters for reverse proxy
reverseProxy:
image: "neo4j/helm-charts-reverse-proxy:5.17.0"
# Name of the kubernetes service. This service should have the ports 7474 and 7687 open.
# This could be the admin service ex: "standalone-admin" or the loadbalancer service ex: "standalone" created via the neo4j helm chart
# serviceName , namespace , domain together will form the complete k8s service url. Ex: standalone-admin.default.svc.cluster.local
# When used against a cluster ensure the service being used is pointing to all the cluster instances.
# This could be the loadbalancer from neo4j helm chart or the headless service installed via neo4j-headless-service helm chart
serviceName: ""
# default is set to cluster.local
domain: "cluster.local"
# securityContext defines privilege and access control settings for a Container. Making sure that we dont run Neo4j as root user.
containerSecurityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 7474
runAsGroup: 7474
capabilities:
drop: [ "ALL" ]
podSecurityContext:
runAsNonRoot: true
runAsUser: 7474
runAsGroup: 7474
fsGroup: 7474
fsGroupChangePolicy: "Always"
# This assumes ingress-nginx controller or haproxy-ingress-controller is already installed in your kubernetes cluster.
# You can install ingress-nginx by following instructions on this link https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/index.md#quick-start
# You can install haproxy-ingress by following instructions on this link https://haproxy-ingress.github.io/docs/getting-started/
ingress:
enabled: true
#default value is nginx. It can be either nginx or haproxy
className: nginx
annotations: {}
# "demo": "value"
# "demo2": "value2"
host: ""
tls:
enabled: false
config: []
# - secretName: "demo2"
# hosts:
# - localhost
以下步骤假设您已运行 Kubernetes 集群并安装了独立 Neo4j Helm 图表。独立 Neo4j 具有名为standalone-admin的 Neo4j 服务,并且它已打开:7474
和:7687
。要验证这一点,请运行
kubectl get all, pvc, pv, configmaps, secrets
您还需要为 Kubernetes Ingress 准备 Ingress 控制器才能正常工作。以下步骤使用Nginx Ingress 控制器。有关更多信息,请参阅Ingress-Nginx 控制器官方文档。
如果您还没有,可以使用以下命令安装它
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace --set controller.service.externalTrafficPolicy=Local
配置 Kubernetes Ingress
配置您将用来安装反向代理 Helm 图表的ingress-values.yaml文件。
配置ingress-values.yaml文件以在端口:443
上访问 Neo4j
以下示例展示了如何配置ingress-values.yaml文件以在端口:443
上访问 Neo4j
-
创建一个包含 Ingress 自签名证书的 Kubernetes 秘密,然后创建ingress-values.yaml文件。
-
为 Ingress 自签名证书创建一个目录
mkdir certs cd certs
-
创建 Ingress 自签名证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ingress.key -out ingress.cert -subj "/CN=localhost/O=neo4j" -addext "subjectAltName = DNS:localhost"
-
使用 Ingress 自签名证书创建 Kubernetes 秘密
kubectl create secret tls ingress-cert --key /path/to/your/certs/ingress.key --cert /path/to/your/certs/ingress.cert
-
-
使用
serviceName
和secretName
的正确值配置ingress-values.yaml文件。确保secretName
与上一步创建的名称相同。通过将tls.enabled
设置为true
来启用 TLS。reverseProxy: image: neo4j/helm-charts-reverse-proxy:5.12.0 serviceName: "standalone-admin" ingress: enabled: true tls: enabled: true config: - secretName: ingress-cert hosts: - localhost
配置ingress-values.yaml文件以在端口:80
上访问 Neo4j
或者,如果您想在端口:80
上访问 Neo4j,请将tls.enabled
保留为其默认值false
,并使用以下内容创建ingress-values.yaml文件
reverseProxy:
#Use image only when need a specific version or using your internal artifactory.
#Otherwise let it default to what is in the values.yaml
#image: neo4j/helm-charts-reverse-proxy:5.12.0
serviceName: "standalone-admin"
ingress:
enabled: true
tls:
enabled: false
安装反向代理 Helm 图表
使用您创建的ingress-values.yaml文件安装反向代理 Helm 图表
helm install rp neo4j/neo4j-reverse-proxy -f /path/to/your/ingress-values.yaml
通过 Neo4j Browser 访问您的数据
-
获取 Ingress LoadBalancer IP
kubectl get ingress/rp-reverseproxy-ingress -n default -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
-
在https://INGRESS_IP:443或http://INGRESS_IP:80上打开 Neo4j Browser,并使用您的凭据登录。
通过 Cypher Shell 访问您的数据
或者,如果您想仅通过 Nginx Ingress 控制器使用 Cypher Shell 访问您的数据,您需要创建一个configmap
,因为 Cypher Shell 预期使用 TCP 连接,而 Ingress 是 HTTP 连接。有关公开 TCP/UDP 服务的更多信息,请参阅Ingress-Nginx 控制器官方文档 → 公开 TCP 和 UDP 服务。
-
使用以下内容创建一个
configmap
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: ingress-nginx data: 9000: "default/standalone-admin:7687"
-
应用
configmap
kubectl apply -f /path/to/your/nginx-tcp.yaml
-
更新 Ingress 控制器 LoadBalancer 服务以使用端口:9000
-
获取 Ingress 控制器 IP 地址
kubectl get svc -n ingress-nginx
-
打开 Ingress 控制器服务以进行编辑
kubectl edit svc ingress-nginx-controller -n ingress-nginx -o yaml
-
在
spec.ports
部分添加以下行- name: proxied-tcp-9000 port: 9000 protocol: TCP targetPort: 9000
-
保存更改并退出编辑器。
-
-
更新 Ingress 控制器部署以使用
configmap
-
打开 Ingress 控制器部署以进行编辑
kubectl edit deployment ingress-nginx-controller -n ingress-nginx
-
在
spec.template.spec.containers.args
部分添加以下行- --tcp-services-configmap=ingress-nginx/tcp-services
-
保存更改并退出编辑器。
-
通过运行
kubectl get all -n ingress-nginx
来验证更改是否已应用。您应该在 Ingress 控制器部署中看到新的端口:9000。
-
-
获取 Ingress 控制器 IP 地址
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE rp-reverseproxy-igress nginx * 34.89.91.112 80 2m
-
使用 Cypher Shell 连接到 Neo4j 数据库
cypher-shell -a neo4j://34.89.91.112:9000 -u neo4j -p <password>