Не удается установить соединение с 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