【问题标题】:Unable to connect NodeJs application with Postgres running in Minikube无法将 NodeJs 应用程序与在 Minikube 中运行的 Postgres 连接
【发布时间】:2020-04-20 20:20:23
【问题描述】:

我开始使用 helm 对​​ Kubernetes 进行部署,但在将 Nodejs 应用程序与 postgres DB 连接时我被卡住了。我正在使用 helm 进行到 K8 的部署。

以下是我的应用程序 YAML 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ template "service-chart.fullname" . }}-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: {{ template "service-chart.fullname" . }}-converstionrate
  template:
    metadata:
      labels:
        app: {{ template "service-chart.fullname" . }}-converstionrate
    spec:
      containers:
        - name: {{ template "service-chart.fullname" . }}-converstionrate
          image: <application_image>
          env:
            - name: DB_URL
              value: postgres://{{ template "postgres.fullname" . }}.default.svc.cluster.local:5432/{{ .Values.DbName }}

---

kind: Service
apiVersion: v1
metadata:
  name: {{ template "service-chart.fullname" . }}-service
spec:
  type: NodePort
  selector:
    app: {{ template "service-chart.fullname" . }}-converstionrate
  ports:
    - port: 8080
      targetPort: 3000

下面是我使用 postgres 依赖项的需求文件

dependencies:
  - name: postgresql
    version: "8.1.2"
    repository: "https://kubernetes-charts.storage.googleapis.com/"

以下是我尝试连接到数据库的应用程序代码:-

if (config.use_env_variable) {
  // sequelize = new Sequelize(process.env[config.use_env_variable], config);
  sequelize = new Sequelize(
    process.env.POSTGRES_HOST,
    process.env.POSTGRES_USER,
    process.env.POSTGRES_PASSWORD,
    pocess.env.POSTGRES_DIALECT
  );
} else {
  sequelize = new Sequelize(
    config.database,
    config.username,
    config.password,
    config
  );
}

我无法理解的是如何连接到数据库,就像上面我无法连接的那样。? 有谁能帮帮我吗?

我是掌舵的新手,因此无法弄清楚。我查看了很多博客,但有些博客不清楚需要如何完成。由于数据库在一个 POD 和另一个节点应用程序中运行,所以我如何将它连接在一起。?如何在 yaml 中设置要使用的 DB 环境变量。?

仅供参考 --- 我现在正在使用 minikube 进行部署。

应用程序代码可用:-https://github.com/Vishesh30/Node-express-Postgress-helm

谢谢, 维谢什。

【问题讨论】:

  • 您遇到任何错误吗?如果可以,请在此处添加它们
  • 您的values.yaml 文件怎么样?您可以使用 values.yaml 文件将变量传递给您的服务模板,看看这个link。您使用的是什么 HELM 和 Kubernetes 版本?
  • 您的代码使用的环境变量(POSTGRES_HOST)与您在 Kubernetes YAML 文件 (DB_URL) 中设置的不匹配。您需要进行匹配。
  • @TummalaDhanvi 是的,当我尝试查询数据库时,它给出了错误 { "name": "SequelizeHostNotFoundError", "parent": { "errno": "ENOTFOUND", "code": "ENOTFOUND ”,“系统调用”:“getaddrinfo”,“主机名”:“elder-kudu.default.svc.cluster.local”,“主机”:“elder-kudu.default.svc.cluster.local”,“端口”: 5432 },“原始”:{“errno”:“ENOTFOUND”,“代码”:“ENOTFOUND”,“系统调用”:“getaddrinfo”,“主机名”:“elder-kudu.default.svc.cluster.local”, “主机”:“elder-kudu.default.svc.cluster.local”,“端口”:5432 } }
  • @DavidMaze 。感谢您指出我已经更改了它,但是仍然没有区别。你能告诉我应该从哪里传递 POSTGRES_USER 和 POSTGRES_PASSWORD 的值吗?

标签: postgresql kubernetes kubernetes-helm


【解决方案1】:

正如@David Maze 所提到的,您需要将变量名从DB_URL 修复为POSTGRES_HOST,但我可以看到其他一些内容。

我已尝试重现您的场景,以下对我有用:

您需要从您的 YAML 文件中修复服务 dns:

postgres://{{ template "postgres.fullname" . }}.default.svc.cluster.local:5432/{{ .Values.DbName }}

postgres://{{ template "postgresql.fullname" . }}-postgresql.default.svc.cluster.local:5432/{{ .Values.DbName }}

之后,您需要将主机、数据库用户名和数据库密码传递给您的应用程序,您可以覆盖 postgresql 默认变量(因为它是您应用程序的子图表),如Helm documentaion 中所述并注入使用环境变量给你的容器。

有很多变数,请看这里。

将此值添加给您 values.yaml 以覆盖 postgresql 默认值:

postgresql:
  postgresqlUsername: dbuser 
  postgresqlPassword: secret # just for example

您可以创建一个秘密文件来存储密码:

服务图表/模板/secrets.yaml

apiVersion: v1
kind: Secret
metadata:
  name: dbconnection
type: Opaque
stringData:
  POSTGRES_PASSWORD: {{ .Values.postgresql.postgresqlPassword }

如果您不想将密码保存在文件中,也许您可​​以尝试一些自动化过程来 > 在部署之前重写您的文件。你可以阅读更多关于秘密here.

现在在deployment.yaml 中添加变量,POSTGRES_USERNAME 将从values.yaml 文件中获取,并将值设置为POSTGRES_PASSWORD

          env:
            - name: POSTGRES_HOST 
              value: postgres://{{ template "postgresql.fullname" . }}-postgresql.default.svc.cluster.local:5432/{{ .Values.DbName }}
            - name: POSTGRES_USERNAME
              value: {{ .Values.postgresql.postgresqlUsername }}
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: dbconnection
                  key: POSTGRES_PASSWORD

部署后可以查看容器的环境变量。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2019-06-03
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多