Не удается установить соединение с Flask Postgres с Kubernetes и Docker

Выпуск:

Мой API фляги не может подключиться к моему экземпляру Postgres. Я убедился, что база данных и API работают как и ожидалось, развертывания и службы работают в Kubernetes. Это должно быть само соединение. Соединение определено внутри конфигурационного файла Flask, так что, возможно, я неправильно его указываю? Я в недоумении, чтобы предпринять следующие шаги.

ошибка

Это ошибка, которую я вижу, когда проверяю журналы модуля, специфичного для API, который пытается связаться с postgres.

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection timed out
       Is the server running on host "postgres" (198.105.244.228) and accepting
       TCP/IP connections on port 5432?

Информация о стеке

  • Minikube
  • Kubernetes
  • докер
  • колба
  • Postgres
  • SQLAlchemy

Колба /Config.py

SQLALCHEMY_DATABASE_URI = 'postgres://postgres:postgres@postgres:5432/postgres', Это идентично тому, что я использовал с Docker Compose до перехода на Kubernetes.

Kubernetes / Postgres-кластер-ф-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: postgres-cluster-ip-service
spec:
  type: ClusterIP
  selector:
    component: postgres
  ports:
    - port: 5432
      targetPort: 5432

Kubernetes / Postgres-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      component: postgres
  template:
    metadata:
      labels:
        component: postgres
    spec:
      volumes:
        - name: postgres-storage
          persistentVolumeClaim:
            claimName: database-persistent-volume-claim
      imagePullSecrets:
        - name: regcred
      containers:
        - name: postgres
          image: my/image-db
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_PASSWORD
              value: postgres
            - name: POSTGRES_USER
              value: postgres
          volumeMounts:
            - name: postgres-storage
              mountPath: /var/lib/postgresql/data
              subPath: postgres

Kuberenetes / база-стойкий объем претензия

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: database-persistent-volume-claim
spec:
  # Access mode gets some instance of storage.
  # ReadWriteOncence means that it can be used by a single node.
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      # find a storage option that has at least 2 gigs of space
      storage: 2Gi

Рад добавить любые другие файлы, которые помогут!

2 ответа

Решение

Имя Сервиса - это имя хоста, поэтому вы должны подключаться к postgres-cluster-ip-service.default.svc.cluster.local (менять default если вы развертываете в другое пространство имен Kubernetes). Ваше сообщение об ошибке выглядит так, как будто вы подключаетесь к другой системе с именем postgres вне вашей кластерной среды.

Просто добавьте к правильному ответу @David выше для тех, кто ищет:

Формат для SQLALCHEMY_DATABASE_URI:

schema://username:password@SERVER:PORT/databasename

Моя причина была неудачной, потому что я думал, что мое имя сервера было Postgres, как определено моим файлом Kubernetes postgres-deploy. Однако у меня был отдельный "сервисный" файл под названием postgres-cluster-ip-service. Как только я установил это имя в качестве имени сервера, соединение начало работать. Убедитесь, что вы указываете сервер не непосредственно на сервер, а на IP-службу, расположенную перед ним для Kubernetes.

Пример:

postgres://username:password@postgres-cluster-ip-service:5432/databasename

Другие вопросы по тегам