使用 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 图表创建一个反向代理,它被配置为使用serviceNamenamespacedomain值将流量路由到 Neo4j 服务 URL。例如,如果serviceNamestandalone-adminnamespacedefaultdomaincluster.local,那么 Neo4j 服务 URL 为standalone-admin.default.svc.cluster.local
对于 Neo4j 集群,可以使用 Neo4j 无头服务将流量路由到集群实例。有关详细信息以及如何安装neo4j/neo4j-cluster-headless-service Helm 图表的详细示例,请参阅使用无头服务访问 Neo4j 集群

reverse proxy
图 1. 反向代理流程图

反向代理 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

  1. 创建一个包含 Ingress 自签名证书的 Kubernetes 秘密,然后创建ingress-values.yaml文件。

    1. 为 Ingress 自签名证书创建一个目录

      mkdir certs
      cd certs
    2. 创建 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"
    3. 使用 Ingress 自签名证书创建 Kubernetes 秘密

      kubectl create secret tls ingress-cert --key /path/to/your/certs/ingress.key --cert /path/to/your/certs/ingress.cert
  2. 使用serviceNamesecretName的正确值配置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 访问您的数据

  1. 获取 Ingress LoadBalancer IP

    kubectl get ingress/rp-reverseproxy-ingress -n default -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
  2. https://INGRESS_IP:443http://INGRESS_IP:80上打开 Neo4j Browser,并使用您的凭据登录。

通过 Cypher Shell 访问您的数据

或者,如果您想仅通过 Nginx Ingress 控制器使用 Cypher Shell 访问您的数据,您需要创建一个configmap,因为 Cypher Shell 预期使用 TCP 连接,而 Ingress 是 HTTP 连接。有关公开 TCP/UDP 服务的更多信息,请参阅Ingress-Nginx 控制器官方文档 → 公开 TCP 和 UDP 服务

  1. 使用以下内容创建一个configmap

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: tcp-services
      namespace: ingress-nginx
    data:
      9000: "default/standalone-admin:7687"
  2. 应用configmap

    kubectl apply -f /path/to/your/nginx-tcp.yaml
  3. 更新 Ingress 控制器 LoadBalancer 服务以使用端口:9000

    1. 获取 Ingress 控制器 IP 地址

      kubectl get svc -n ingress-nginx
    2. 打开 Ingress 控制器服务以进行编辑

      kubectl edit svc ingress-nginx-controller -n ingress-nginx -o yaml
    3. spec.ports部分添加以下行

      - name: proxied-tcp-9000
        port: 9000
        protocol: TCP
        targetPort: 9000
    4. 保存更改并退出编辑器。

  4. 更新 Ingress 控制器部署以使用configmap

    1. 打开 Ingress 控制器部署以进行编辑

      kubectl edit deployment ingress-nginx-controller -n ingress-nginx
    2. spec.template.spec.containers.args部分添加以下行

      - --tcp-services-configmap=ingress-nginx/tcp-services
    3. 保存更改并退出编辑器。

    4. 通过运行kubectl get all -n ingress-nginx来验证更改是否已应用。您应该在 Ingress 控制器部署中看到新的端口:9000

  5. 获取 Ingress 控制器 IP 地址

    kubectl get ingress
    NAME                     CLASS    HOSTS   ADDRESS        PORTS   AGE
    rp-reverseproxy-igress   nginx    *       34.89.91.112   80      2m
  6. 使用 Cypher Shell 连接到 Neo4j 数据库

    cypher-shell -a neo4j://34.89.91.112:9000 -u neo4j -p <password>