【问题标题】:How to connect postgresql from app using helm and kubernetes?如何使用 helm 和 kubernetes 从应用程序连接 postgresql?
【发布时间】:2020-06-15 18:31:00
【问题描述】:

对于部署在 --dev namespace 中的应用程序如何连接到我使用 helm 和 --database namespace 独立部署的 postgreSQL 数据库,我真的很苦恼。到目前为止我所做的如下。

Database 和 myapp 部署了不同的命名空间。我只是从一些示例中复制了名称PGHOST,PGPASSWORD,但我不确定我应该在哪里使用这个名称,并且它必须在 postgreSQL 的某个地方相同吗?

我应该注意连接数据库的其他任何事情还是有什么不是最佳实践?我应该在 jdbc url 中添加命名空间吗?

在本地,我们使用以下参数连接到数据库,但是在我们通过 helm 部署应用程序后应该怎么做?我们正在使用 sequelize 作为客户端库

const connectionString = postgres://${global.config.database_username}:${global.config.database_password}@${global.config.database_host}:${global.config.database_port}/${global.config.database_name};

postgres 值

## Specify PGDATABASE
##
DBName: db

在我部署了 postgres 之后;

  # of replicas: 3
  service name:  my-postgres-postgresql-helm
  service port:  64000
  database name: db
  database user: admin
  jdbc url:      jdbc:postgresql://my-postgres-postgresql-helm:port

deployment.yaml

        - name: PGHOST
          valueFrom:
            configMapKeyRef:
              name: {{ .Release.Name }}-configmap
              key: jdbc-url
        - name: PGDATABASE
          value: {{ .Values.postgres.database name | quote }}
        - name: PGPASSWORD
          value: "64000"
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: {{ template "my-mp.name" . }}
              key: POSTGRES_PASSWORD

configmaps.yaml

apiVersion: v1
kind: ConfigMap
metadata:
    name: {{ .Release.Name }}-configmap
    labels:
        app.kubernetes.io/name: {{ include "my-mp.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
        app.kubernetes.io/managed-by: {{ .Release.Service }}
        helm.sh/chart: {{ include "my-mp.chart" . }}
data:
  jdbc-url: jdbc:postgresql://my-postgres-postgresql-helm..

values.yaml

postgres:
  service name:  my-postgres-postgresql-helm
  service port:  64000
  database name: db
  database user: admin

【问题讨论】:

    标签: postgresql kubernetes kubernetes-helm


    【解决方案1】:

    这是您关于 jdbc url jdbc url:jdbc:postgresql://my-postgre 的问题中的错字吗?您提到服务名称是my-postgres-postgresql-helm,因此 jdbc url 应该类似于:jdbc:postgresql://my-postgres-postgresql-helm.database。请注意附加到服务名称的.database!由于您的应用程序 pod 在不同的命名空间中运行,因此您应该在服务名称的末尾附加命名空间名称。如果它们在同一个命名空间中,您将不需要它。

    现在,如果这不能解决问题,调试问题,如果我是你,我会这样做:

    1. 检查是否有任何对命名空间级别添加限制的网络策略;即只允许特定命名空间甚至 pod 之间的流量,这可能会阻止来自应用程序 pod 的流量到达您的 postgres pod。
    2. 确保您的 Service for postgres pod 正确。也就是说,描述服务应该将 Pod 的 IP 列为 Endpoints。如果不检查服务的标签选择器并确保它使用与 postgres pod 相同的标签。
    3. 在您的 pod 中执行并检查您的应用程序 pod 是否能够使用服务名称(即my-postgres-postgresql-helm.database)通过 nslookup 访问该服务。

    如果所有这些测试都是积极的并且有效,那么很可能是其他一些配置问题。如果这能解决您的问题和 GL,请告诉我。

    【讨论】:

    • 是的,这是一个错字。所以我唯一在 jdbc url 末尾添加命名空间的方法是什么?实际上我的问题也是为了澄清我的配置中是否一切正常
    • 你有一个 postgres pod 在一个端口上接收流量和一个暴露该 pod 的服务。您的应用程序在其配置中使用服务的主机名 (servicename.namespacename) 来访问 postgres pod。一般来说,这看起来像是一个正确的配置。检查命名空间名称,如果解决了,请告诉我。
    • 所以我的困惑是我应该在哪里进行应用程序的更改?在 service.yaml?my-postgres-postgresql-helm-database 中。所以我的事情最后必须是这样的
    • 您的应用正在从 ConfigMap 中获取值; postgres 数据库的主机名。因此,只需将配置映射更新为具有 my-postgres-postgresql-helm.database 即可,一切正常,这也是正确的做法。
    • 感谢您的回复 Amudhan.. 实际上根据您的回复,我在 postgres values.yaml 中指定如下规则 ingress: - from: - podSelector: matchLabels: app: db 。我应该添加这个标签 deployment.yaml 和其余的 yaml 或 deployment.yaml 就足够了吗?
    【解决方案2】:

    如果我理解正确,您的数据库和应用程序位于不同的命名空间中,命名空间的意义在于隔离。 如果确实需要访问,可以使用 DNS 自动生成的条目 servicename.namespace.svc.cluster.local

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-30
      • 2021-08-29
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 2020-05-23
      • 2021-12-28
      相关资源
      最近更新 更多