使用 Kubernetes Ingress 访问 Neo4j

Helm chart neo4j/neo4j-reverse-proxy 允许您使用 Kubernetes Ingress 通过端口 :80:443 访问 Neo4j。有关 Kubernetes Ingress 的更多信息,请参阅Kubernetes 官方文档 → Ingress

该 Helm chart 创建一个反向代理,该代理配置为使用 serviceNamenamespacedomain 值将流量路由到 Neo4j 服务 URL。例如,如果 serviceNamestandalone-adminnamespacedefault,并且 domaincluster.local,则 Neo4j 服务 URL 为 standalone-admin.default.svc.cluster.local
对于 Neo4j 集群,Neo4j 无头服务可用于将流量路由到集群实例。有关如何安装 neo4j/neo4j-cluster-headless-service Helm chart 的更多信息和详细示例,请参阅使用无头服务访问 Neo4j 集群

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

反向代理 Helm chart 创建一个 HTTP 服务器,该服务器根据请求头将请求路由到 Bolt 反向代理或 HTTP 反向代理。收到响应后,Bolt 反向代理会更新响应,将 Bolt 端口替换为 :80:443

反向代理 Helm chart 支持为容器定义权限和访问控制设置。请确保不要以 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.26.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 chart。独立的 Neo4j 有一个名为 standalone-admin 的 Neo4j 服务,并且已打开 :7474:7687 端口。要验证这一点,请运行

kubectl get all, pvc, pv, configmaps, secrets

您还需要一个 Ingress 控制器才能使 Kubernetes Ingress 工作。以下步骤使用 Nginx Ingress Controller。有关更多信息,请参阅Ingress-Nginx Controller 官方文档

如果您没有,可以使用以下命令安装它

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 chart 的 ingress-values.yaml 文件。

配置 ingress-values.yaml 文件以通过端口 :443 访问 Neo4j

以下示例展示了如何配置 ingress-values.yaml 文件以通过端口 :443 访问 Neo4j

  1. 创建包含 Ingress 自签名证书的 Kubernetes secret,然后创建 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 secret

      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.26.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.26.0
    serviceName: "standalone-admin"
    ingress:
        enabled: true
        tls:
            enabled: false

安装反向代理 Helm chart

使用您已创建的 ingress-values.yaml 文件安装反向代理 Helm chart

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 Controller 使用 Cypher Shell 访问数据,则需要创建一个 configmap,因为 Cypher Shell 预期是 TCP 连接而 Ingress 是 HTTP 连接。有关公开 TCP/UDP 服务的更多信息,请参阅Ingress-Nginx Controller 官方文档 → 公开 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>
© . All rights reserved.