Как подключить postgresql из приложения, используя helm и kubernetes? - PullRequest
0 голосов
/ 03 марта 2020

Я действительно пытаюсь понять, как мое приложение, развернутое в --dev namespace, может подключиться к базе данных postgreSQL, которую я развернул независимо, используя helm с --database namespace. Пока что я сделал следующее:

База данных и myapp развернули другое пространство имен. Я просто скопировал имя PGHOST,PGPASSWORD из некоторых примеров, но я не уверен, где я должен использовать это имя, и должно ли оно быть где-то в postgreSQL?

Должен ли я позаботиться о чем-нибудь еще для подключения к базе данных или есть что-то, что не является лучшей практикой? Должен ли я добавить пространство имен в jdb c 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

deploy.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

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Это опечатка в вашем вопросе о jdb c url jdb c url: jdbc:postgresql://my-postgre? Вы упомянули, что имя службы my-postgres-postgresql-helm и, следовательно, URL-адрес jdb c должен выглядеть примерно так: jdbc:postgresql://my-postgres-postgresql-helm.database. Обратите внимание на .database, добавленный к названию услуги! Поскольку модуль приложения работает в другом пространстве имен, вы должны добавить имя пространства имен в конце имени службы. Если бы они были в одном и том же пространстве имен, вам бы это не понадобилось.

Теперь, если это не поможет, для устранения проблем я бы на вашем месте:

  1. Проверьте, существуют ли какие-либо сетевые политики, которые добавляют ограничения на уровне пространства имен; это позволяет traffi c только между указанными c пространствами имен или даже модулями, что может препятствовать тому, чтобы traffi c из модуля приложения достигал вашего postgres модуля.
  2. Убедитесь, что ваш Сервис для postgres стручок правильный. То есть описание службы должно указывать IP-адрес модуля в качестве конечных точек. Если нет, проверьте селектор меток Сервиса и убедитесь, что он использует те же метки, что и postgres pod.
  3. Exe c в вашем модуле, и проверьте, может ли ваш модуль приложения получить доступ к службе через nslookup, используя имя службы, то есть my-postgres-postgresql-helm.database.

Если все эти тесты являются положительными и работают, то, скорее всего, это другая проблема конфигурации. Дайте мне знать, если это решит вашу проблему и GL.

0 голосов
/ 03 марта 2020

Если я правильно понимаю, у вас есть база данных и приложение в разных пространствах имен, и смысл пространства имен состоит в том, чтобы изолировать. Если вам действительно нужен доступ к нему, вы можете использовать автоматически сгенерированную запись DNS servicename.namespace.sv c .cluster.local

...