Postgresql Flask Postgres与Kubernetes和Docker的连接失败
问题: 我的flask API无法连接到我的Postgres实例。我已经验证了数据库和api都能按预期独立工作,部署和服务都在kubernetes中运行。它必须是连接本身。连接是在Flask配置文件中定义的,所以我可能没有正确指定它?我不知下一步该怎么办 错误 这是我在检查特定于API的pod日志时看到的错误,该API正试图联系postgresPostgresql Flask Postgres与Kubernetes和Docker的连接失败,postgresql,docker,flask,kubernetes,minikube,Postgresql,Docker,Flask,Kubernetes,Minikube,问题: 我的flask API无法连接到我的Postgres实例。我已经验证了数据库和api都能按预期独立工作,部署和服务都在kubernetes中运行。它必须是连接本身。连接是在Flask配置文件中定义的,所以我可能没有正确指定它?我不知下一步该怎么办 错误 这是我在检查特定于API的pod日志时看到的错误,该API正试图联系postgres sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not conne
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?
堆栈信息
- 米尼库贝
- 库伯内特斯
- 码头工人
- 烧瓶
- 博士后
- 炼金术
SQLALCHEMY\u数据库postgres://postgres:postgres@postgres:5432/postgres'
。这与切换到Kubernetes之前我在Docker Compose中使用的相同
Kubernetes/postgres集群ip服务.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres-cluster-ip-service
spec:
type: ClusterIP
selector:
component: postgres
ports:
- port: 5432
targetPort: 5432
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
Kubernetes/postgres部署。yaml
apiVersion: v1
kind: Service
metadata:
name: postgres-cluster-ip-service
spec:
type: ClusterIP
selector:
component: postgres
ports:
- port: 5432
targetPort: 5432
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
很高兴添加任何其他有帮助的文件 服务的名称是主机名,因此您应该连接到
postgres cluster ip Service.default.svc.cluster.local
(如果要部署到不同的Kubernetes命名空间,请更改default
)。您的错误消息看起来好像您正在连接到群集环境之外名为postgres
的其他系统。只需添加到上面@David的正确答案中,供搜索者使用:
SQLALCHEMY_数据库_URI的格式为:
schema://username:password@服务器:端口/数据库名称
我失败的原因是因为我认为我的服务器名是由Kubernetes Postgres部署文件定义的Postgres。然而,我有一个单独的“服务”文件,名为postgres集群ip服务。我第二次将其设置为我的服务器名时,连接就开始工作了。确保服务器不是直接指向服务器,而是位于Kubernetes前面的IP服务
示例:
postgres://username:password@postgres群集ip服务:5432/databasename
这肯定是正确的答案!我今天晚些时候再试。接下来,您能否解释一下.default.svc.cluster.local
,或者指向该长主机路由的文档?直觉上,我认为应该是postgres服务集群ip://postgres:postgres@postgres:5432/postgres
所以我只是想知道其他部分是从哪里来的?在Kubernetes文档中。该主机名应该在@
之后,在:5432
之前<代码>protocol://user:password@主机:端口/路径是通用URL语法。已确认!在下面添加了一些注释来详细说明,因为我实际上不需要“default.svc.cluster.local”。非常感谢你的帮助。