minikube K8s集群中Django应用无法连接Postgres数据库问题求助
问题排查&解决方案
1. 核心错误点梳理
- Postgres容器启动失败:官方Postgres镜像配置用户名的环境变量是
POSTGRES_USER,你的配置中写的是POSTGRES_USERNAME,导致Postgres启动时没有创建对应账号,甚至直接启动失败,这是连接超时的核心原因之一。 - 服务路由异常:你把Django和Postgres两个容器放在同一个Deployment的同一个Pod模板里,两个容器都带有
app: notejam-app标签,dbService的选择器匹配这个标签,会把5432端口的请求随机转发到对应Pod的8000端口(Django容器)和5432端口(Postgres容器),大概率请求会被转发到Django的8000端口,自然连接失败。 - Postgres数据目录挂载错误:官方Postgres镜像默认数据存储路径是
/var/lib/postgresql/data,你挂载到/notejam-db完全不生效,容器重启后所有数据会丢失。 - 配置不匹配:Django settings.py里数据库密码硬编码为
postgres,但你通过Secret存储数据库密码,两者如果不一致也会导致鉴权失败。 - 未执行数据库迁移:你Dockerfile启动命令直接运行runserver,没有提前执行
python manage.py migrate初始化数据库表结构,即使连接成功后续也会报错。
2. 修复步骤
步骤1:拆分Deployment
不建议把Django和Postgres放在同一个Deployment中,拆成两个独立的Deployment,分别打不同的标签:Postgres的Deployment标签用app: postgres,Django的Deployment标签用app: notejam-app。
如果临时测试不想拆分Deployment,也可以直接将Django配置里的数据库HOST改成127.0.0.1,同一个Pod内的容器共享网络栈,可以直接通过本地地址互访,不需要走Service。
步骤2:修正Postgres配置
- 把环境变量
POSTGRES_USERNAME改成POSTGRES_USER - 把Volume挂载路径改成
/var/lib/postgresql/data
步骤3:修正db Service配置
如果拆分了Deployment,把db Service的选择器改成匹配app: postgres,保证所有5432端口的请求都转发到Postgres容器。
步骤4:修正Django配置
- 把settings.py里的数据库用户名、密码改成从环境变量读取,和你配置的ConfigMap、Secret对应,避免硬编码不一致:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.getenv('POSTGRES_DB'), 'USER': os.getenv('POSTGRES_USER'), 'PASSWORD': os.getenv('POSTGRES_PASSWORD'), 'HOST': 'db', 'PORT': '5432', } }
- 调整启动命令,先执行迁移再启动服务,比如把Dockerfile的CMD改成:
CMD bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
步骤5:验证修复
部署后先执行kubectl get pods查看Postgres容器是否正常运行,进入Django容器执行nslookup db验证服务解析正常,再执行python manage.py shell测试数据库连接即可。
内容的提问来源于stack exchange,提问作者tkarahan
相关产品推荐
相关产品推荐

