Neo4j 集群的外部访问
本章介绍了如何在 Kubernetes 中将来自外部世界或互联网的流量路由到运行在 4.3.0 或更高版本的 Neo4j 集群。
如果您运行的是低于 4.3.0 版本的 Neo4j,则这些说明不适用。请参阅客户端路由的外部访问说明
概览
默认情况下,使用 Neo4j Labs Helm chart 安装 Neo4j 时,创建的服务都无法从 Kubernetes 集群外部访问。要从 Kubernetes 集群外部访问 Neo4j,我们需要一个客户端可以连接的外部有效的 DNS 名称或 IP 地址。该外部地址需要将查询定向到在 Neo4j 核心节点上进行负载均衡的 Kubernetes LoadBalancer 服务。
对于 Neo4j 来说,type: LoadBalancer 的 Service 是唯一合适的选项。Ingress 不能使用,因为 Neo4j 的驱动协议在 TCP 层通信,而大多数 Ingress 只支持 HTTP 通信。Node Port 服务不能与静态 IP 地址关联,这使得设置 DNS 和 SSL 非常困难。使用 NodePort 还可能给某些期望使用端口 7687 特别与 Neo4j 通信的 Neo4j 应用程序带来配置挑战。因此,我们建议仅使用 LoadBalancer 服务。 |
为入站集群流量创建静态 IP 地址
我正在使用 GCP,所以是这样做的。这里的重点是,在 GCP 上区域必须与您的 GKE 区域匹配,并且网络层级必须是 premium。在其他云上,概念步骤是相同的,但细节会有所不同:您只需要为整个 Neo4j 集群分配 1 个静态 IP 地址。
# Customize these next 2 for the region of your GKE cluster,
# and your GCP project ID
REGION=us-central1
PROJECT=my-gcp-project-id
gcloud compute addresses create \
neo4j-static-ip --project=$PROJECT \
--network-tier=PREMIUM --region=$REGION
echo "IP:"
gcloud compute addresses describe neo4j-static-ip \
--region=$REGION --project=$PROJECT --format=json | jq -r '.address'
如果您在 Azure 上执行此操作,请注意静态 IP 地址必须与您的 Kubernetes 集群位于同一资源组中,并且可以使用 az network public-ip create 命令创建(仅一个示例):az network public-ip create -g resource_group_name -n core01 --sku standard --dns-name neo4jcluster --allocation-method Static
。使用的 Azure SKU 必须是 standard,您所需的资源组可以在 Kubernetes Load Balancer 中找到,该 Load Balancer 是[按照 Azure 教程](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough)为您设置的。
在本教程的剩余部分,我们假设我分配的核心 IP 地址如下
export IP=35.202.123.82
外部访问
几分钟后,您将拥有一个完全形成的集群,其 Pods 显示准备就绪,并且可以从 Kubernetes 内部连接,但是它尚未能从 Kubernetes 集群外部访问。所以我们接下来需要做的就是创建一个负载均衡器,并将 loadBalancerIP
设置为我们在上一步中保留的静态 IP 地址。
提供了 load-balancer.yaml
文件作为模板,以下是为指定的静态 IP 地址创建一个文件的方法
export DEPLOYMENT=graph
# Reuse IP from the earlier step here.
# These *must be IP addresses* and not hostnames, because we're
# assigning load balancer IP addresses to bind to.
echo $DEPLOYMENT with IP $IP ;
cat tools/external-exposure/load-balancer.yaml | envsubst | kubectl apply -f -
在这些服务中,我们使用 externalTrafficPolicy: Local
。以避免 Kubernetes 内部额外的网络跳转增加延迟。请参阅 kubernetes 文档以获取有关此主题的更多信息。
还有其他选项,例如 nginx-ingress 控制器,它可以配置为支持 TCP 连接,但在本指南中,我们旨在提供使用标准 Kubernetes 资源类型可以实现的最简单的方法。
潜在的障碍:在 GKE 上,将静态 IP 与负载均衡器关联所需的唯一设置是 YAML 中的 loadBalancerIP 字段。在其他云上,可能还需要额外的步骤来将静态 IP 分配给 Kubernetes 集群。请查阅您所使用的云文档。 |
总结
我们可以这样验证我们的服务是否运行良好
$ kubectl get service | grep neo4j-external
zeke-neo4j-external LoadBalancer 10.0.5.183 35.202.123.82 7687:30529/TCP,74.3.140843/TCP,7473:30325/TCP 115s
完成所有这些步骤后,您应该会得到一个正确暴露的集群。我们可以这样恢复密码,并连接到静态 IP。
export NEO4J_PASSWORD=$(kubectl get secrets graph-neo4j-secrets -o yaml | grep password | sed 's/.*: //' | base64 -d)
cypher-shell -a neo4j://34.66.183.174:7687 -u neo4j -p "$NEO4J_PASSWORD"
此外,由于我们暴露了端口 7474,您可以访问任何静态 IP 的 7474 端口,从而打开 Neo4j Browser 并能够连接。
安全性:这些方法在传输您的 Neo4j 凭据时未加密。为了保护与 Neo4j 的通信安全,您还必须设置 SSL。 |
下一步
-
如果您有静态 IP,当然可以将其与 DNS 关联。
-
设置好 DNS 后,您可以获取签名的 SSL 证书。SSL 证书可以直接与 Neo4j 一起使用(请参阅 Neo4j 操作手册的SSL 框架部分)。或者,在许多情况下,SSL 证书可以注册到负载均衡器而不是直接用于 Neo4j。
-
这样,您就可以使用 https 和 neo4j+s 协议与 Neo4j 通信。