需要帮助将节点与Kubernetes连接到Neo4j数据库

时间:2017-07-19 21:45:52

标签: node.js docker neo4j kubernetes

目前,我正在获取节点无法连接到数据库的ECONNREFUSED。我不确定数据库主机应该在哪里结束。我应该使用localhost:7474127.0.0.1:74740.0.0.0:7474,还是我应该使用一些在我获取Kubernetes pod时生成的主机,我可以以某种方式传入?例如像$(minikube ip) = 192.168.90.100:7474,但对于我的数据库?是否有包含我应该从某个地方拉出的数据库主机的ENV?

const neo4jDatabase = connect({
  server: 'http://<what goes here!?>:7474',
  user: process.env.DB_USER,
  pass: process.env.DB_PASS,
});

我似乎已经使用下面的.yml配置运行了pod,但我不确定neo4j是否正确。

NAME                     READY     STATUS    RESTARTS   AGE
neo4j-4166717986-8qbwq   1/1       Running   0          41m
node-481322091-g27md     1/1       Running   0          11m

node.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: node
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: node
        tier: backend
        track: stable
    spec:
      containers:
        - name: node
          image: "myapp"
          ports:
            - name: nodeport
              containerPort: 8080
          env:
           - name: DB_USER
             valueFrom:
               configMapKeyRef:
                 name: config
                 key: db_user
           - name: DB_PASS
             valueFrom:
               configMapKeyRef:
                 name: config
                 key: db_pass
---
apiVersion: v1
kind: Service
metadata:
  name: node
spec:
  selector:
    app: node
    tier: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort:
  type: LoadBalancer

neo4j.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: neo4j
spec:
  template:
    metadata:
      labels:
        run: neo4j
    spec:
      containers:
        - name: neo4j
          image: "my-neo4j"
          ports:
            - containerPort: 7474
---
apiVersion: v1
kind: Service
metadata:
  name: neo4j
  labels:
    run: neo4j
spec:
  selector:
    run: neo4j
  ports:
    - port: 7474
      targetPort: 7474
      protocol: TCP

1 个答案:

答案 0 :(得分:1)

Kubernetes的一个鲜为人知的特性可能就是在运行的pod中注入了一些 magic 环境变量。

在您的特定情况下,pods为命名空间中的每个服务都有一个环境变量。格式如下:

<your service>_SERVICE_HOST
<your service name>_SERVICE_PORT_EXPOSED_PORT

您可以通过使用kubectl exec -ti <your pod id> sh附加到正在运行的pod并发出printenv命令来验证这是真的。

请注意,如果服务是在pod之后创建的,则必须删除包含kubectl delete pod <your pod id>的pod以强制重新创建(和注入)环境变量。

在您的情况下,最终代码将如下所示:

const serviceHost = process.ENV.NEO4J_SERVICE_HOST;
const servicePort = process.ENV.NEO4J_SERVICE_PORT_EXPOSED_PORT;
const neo4jDatabase = connect({
  server: `http://${serviceHost}:${servicePort}`,
  user: process.env.DB_USER,
  pass: process.env.DB_PASS,
});