访问 Neo4j

在 Kubernetes 上运行的 Neo4j 可通过 Kubernetes 服务访问。Neo4j 具有许多用于不同应用程序和操作目的的不同接口。有关更多详细信息,请参阅 Neo4j 端口

支持的 Kubernetes 服务

Neo4j 支持以下 Kubernetes 服务

  • 默认服务 — 用于应用程序 neo4j/bolthttp(s) 连接到 Neo4j 数据库的 ClusterIP 服务,源自 Kubernetes 集群内部。

  • 管理员服务 — 包含所有 Neo4j 端口以进行 Kubernetes 内部 Neo4j 管理员连接的“无头”(仅限 DNS)服务。它仅在 Kubernetes 集群内部可用,并且应保护对它的访问。管理员服务可用于 Neo4j DBMS 管理、执行备份和收集指标。

  • 内部服务 — 包含 Neo4j 集群所需所有 Neo4j 端口的“无头”(仅限 DNS)内部服务。

  • Neo4j — 用于源自 Kubernetes 集群外部的应用程序 neo4j/bolthttp(s) 连接的 LoadBalancer 服务。

以下是每个 Neo4j 接口和部署类型的默认 Kubernetes 服务列表

Neo4j 接口 默认端口 默认服务 管理员服务 Neo4j 服务

Bolt(neo4j://bolt:// 协议)

7687

*

Neo4j 浏览器 HTTP

7474

*

Neo4j 浏览器 HTTPS

7473

*

Neo4j Cypher HTTP API

7474

*

Neo4j Cypher HTTPS API

7473

*

Neo4j 备份

6362

但可配置

石墨监控

2003

普罗米修斯指标

2004

Java 管理扩展 (JMX)

3637

但可配置

Neo4j 接口 默认端口 默认服务 管理员服务 内部服务 Neo4j 服务

Bolt(neo4j://bolt:// 协议)

7687

*

Neo4j 浏览器 HTTP

7474

*

Neo4j 浏览器 HTTPS

7473

*

Neo4j Cypher HTTP API

7474

*

Neo4j Cypher HTTPS API

7473

*

Neo4j 备份

6362

石墨监控

2003

但可配置

但可配置

普罗米修斯指标

2004

但可配置

但可配置

Java 管理扩展 (JMX)

3637

但可配置

但可配置

集群发现管理

5000

集群事务

6000

集群 RAFT

7000

集群路由连接器

7688

*管理员服务绕过运行状况检查。这允许在数据库处于不健康状态时将其用于建立管理连接。但是,您不能将其用于连接来自需要数据库处于健康状态的应用程序的连接。

在 Kubernetes 内部访问 Neo4j 的应用程序

使用 DNS 访问 Neo4j

要从同一 Kubernetes 集群中的应用程序访问 Neo4j,请使用 Neo4j 服务 DNS 地址 <release-name>.<namespace>.svc.<cluster domain>

默认集群域为 cluster.local,默认命名空间为 default。通常,Neo4j 服务 DNS 地址为 <release-name>.default.svc.cluster.local

例如,如果在 default 命名空间中使用发行版名称 my-release,则集群的 DNS 地址将为 my-release.default.svc.cluster.local,并且与 Neo4j 驱动程序一起使用的 bolt 地址将为 neo4j://my-release.default.svc.cluster.local:7687

要允许在 Kubernetes 内部运行的应用程序访问 Neo4j 集群,您还可以使用通过 neo4j/neo4j-cluster-headless-service Helm 图表安装的 Neo4j 无头服务。有关更多信息和详细示例,请参阅 使用无头服务访问 Neo4j 集群

使用 K8s 标签选择器访问 Neo4j

或者,可以使用 Kubernetes 服务发现通过搜索标签选择器来定位 Kubernetes 中的 Neo4j 服务(默认)。

helm.neo4j.com/service=default/admin/internals,helm.neo4j.com/instance=<release-name>

例如

# install neo4j
helm install "my-release" …
# lookup installed service
kubectl get service -l helm.neo4j.com/service=default,helm.neo4j.com/instance=my-release
helm.neo4j.com/service=neo4j,helm.neo4j.com/instance=<release-name>

以下是查找已安装服务的示例

# Neo4j service:

kubectl get service -l helm.neo4j.com/service=default,helm.neo4j.com/instance=my-release

# Admin service:

kubectl get service -l helm.neo4j.com/service=admin,helm.neo4j.com/instance=my-release

# internals service:

kubectl get service -l helm.neo4j.com/service=internals,helm.neo4j.com/instance=my-release

从 Kubernetes 外部访问 Neo4j 的应用程序

要从 Kubernetes 集群外部的应用程序访问 Neo4j,您可以使用 LoadBalancer 服务或 Ingress 控制器。

使用 LoadBalancer 访问 Neo4j

Neo4j Helm 图表提供了一个 LoadBalancer 服务,用于从 Kubernetes 集群外部访问 Neo4j。安装 Neo4j Helm 图表时,默认情况下会创建 LoadBalancer 服务。LoadBalancer 服务配置为默认情况下公开 Neo4j 端口 7687747474736362(备份)。

可以使用 kubectl 找到 LoadBalancer 的外部 IP。

  • 服务名称基于 neo4j.name 的值——<my-neo4j-name>-lb-neo4j

    kubectl get service `<my-neo4j-name>-lb-neo4j` -ocustom-columns=ip:.status.loadBalancer.ingress[].ip
  • 使用标签选择器

    kubectl get service -l helm.neo4j.com/service=neo4j,helm.neo4j.com/name=<release-name> -ocustom-columns=ip:.status.loadBalancer.ingress[].ip

如果使用的 Kubernetes LoadBalancer 实现支持设置静态 IP,则可以通过设置 externalService.loadBalancerIP 在 Neo4j Helm 发行版中配置 LoadBalancer 的 IP 地址。如果未显式设置静态 IP 地址,则 Kubernetes 不保证动态分配的 IP 地址不会更改。

在互联网上公开 Neo4j 数据库时,建议使用静态 IP 并为公开的服务配置 SSL。有关更多信息,请参阅 配置 SSL

如果具有静态 IP,则可以将 DNS 与其关联并获取受信任的证书。

可以通过更改 services.neo4j 对象在 Helm 发行版中配置在外部服务上公开的端口。默认值为

services:
  neo4j:
     annotations: { }
     loadBalancerIP: NULL
     ports:
       http:
         enabled: true
         # uncomment to publish http on port 80 (neo4j default is 7474)
         # port: 80
         # targetPort: 7474
         # name: http
       https:
         enabled: true
        # uncomment to publish http on port 443 (neo4j default is 7473)
        # port: 443
        # targetPort: 7473
        # name: https
       bolt:
         enabled: true
        # Uncomment to explicitly specify the port to publish Neo4j Bolt (7687 is the default)
        # port: 7687
        # targetPort: 7687
        # name: tcp-bolt
       backup:
         enabled: false
        # Uncomment to explicitly specify the port to publish Neo4j Backup (6362 is the default)
        # port: 6362
        # targetPort: 6362
        # name: tcp-backup

services.neo4j 对象上禁用/启用端口会将其从负载均衡器中删除,但不会影响它在 Neo4j 中是否被禁用/启用。

除非在 Neo4j 配置中强制执行 SSL-with-client-auth,否则备份不安全。

有关详细示例,请参阅 从 Kubernetes 外部访问 Neo4j 集群

自定义 Kubernetes 资源

Neo4j Helm 图表创建各种 Kubernetes 资源。其中一些可以通过向 helm 部署值文件添加额外的配置来进行自定义。

以下是支持的 K8s 资源自定义列表

自定义 values.yaml 字段 类型

为 Neo4j Pod 设置 pod 安全上下文

securityContext

PodSecurityContext

向服务添加注释

services.default.annotations

ClusterIP 服务的注释对象。

services.admin.annotations

无头(DNS)服务的注释对象。

services.neo4j.annotations

LoadBalancer 服务的注释对象。

自定义 values.yaml 字段 类型

为 Neo4j Pod 设置 pod 安全上下文

securityContext

PodSecurityContext

向服务添加注释

services.default.annotations

ClusterIP 服务的注释对象。

services.admin.annotations

无头(DNS)服务的注释对象。

services.internal.annotations

内部服务的注释对象。

向负载均衡器服务添加注释

services.neo4j.annotations

LoadBalancer 服务的注释对象。

访问 Neo4j 以进行 DBMS 管理和监控

Neo4j Helm 图表创建管理员服务以用于 Neo4j 管理。管理员服务是 Kubernetes 中的“无头”服务,不依赖于 Neo4j 健康检查。因此,即使 Neo4j 不健康,它也允许连接到 Neo4j。通常,这对于应用程序来说是不希望的,但对于管理和调试很有用。

使用 DNS 访问 Neo4j

要访问 Kubernetes 内部的管理员服务,请使用 DNS 地址 <release-name>-admin.<namespace>.svc.<cluster domain>

例如,如果在 default 命名空间中使用发行版名称 my-release,则集群的 DNS 地址将为 my-release-admin.default.svc.cluster.local

管理员服务可用于访问一系列 Neo4j 接口

  • Neo4j Bolt,用于通过 Cypher 命令进行 Neo4j 管理。

  • Neo4j Backup,用于执行数据库备份。

  • Graphite,用于指标收集。

  • Prometheus,用于指标收集。

  • Java Management Extensions (JMX),用于指标收集和 JVM 管理。

使用 kubectl 访问 Neo4j 以进行故障排除

要获取用于故障排除的交互式 cypher-shell 控制台,请使用以下命令

kubectl run -it --rm --image neo4j:5.25.1 cypher-shell -- cypher-shell -a bolt://my-release-admin.default.svc.cluster.local

通常,neo4j:// 协议用于连接到 Neo4j。但是,出于故障排除的目的,使用直接的 bolt:// 协议,因为它允许在某些情况下建立连接,而在这些情况下,neo4j:// 连接将无法成功。