我在配置我的 Dockerized Django + PostgreSQL DB 应用程序以在我使用 Google Cloud Platform 创建的 Kubernetes 集群上工作时遇到了很多问题。
当我将来自 Docker Hub 的 PostgreSQL 镜像和我的 Django Web 应用程序的镜像部署到 Kubernetes 集群时,如何从我的 settings.py 文件中指定 DATABASES.default.HOST?
下面是我希望我的应用程序如何工作。当我在本地运行应用程序时,我想使用 SQLITE DB,为此我在 settings.py 文件中进行了以下更改:
if(os.getenv('DB')==None):
print('Development - Using "SQLITE3" Database')
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR,'db.sqlite3'),
}
}
else:
print('Production - Using "POSTGRESQL" Database')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'agent_technologies_db',
'USER': 'stefan_radonjic',
'PASSWORD': 'cepajecar995',
'HOST': , #???
'PORT': , #???
}
}
主要思想是,当我将应用程序部署到 Kubernetes 集群时,在 Kubernetes Pod 对象内部,一个 Docker 容器(我的 Dockerized Django 应用程序)将运行。创建容器时,我还创建了环境变量 DB
并将其设置为 True。因此,当我部署应用程序时,我使用 PostgreSQL 数据库。
注意:如果有人对我应该如何将本地开发与生产开发分开有任何其他建议,请发表评论。
这是我的 Dockerfile 的样子:
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /agent-technologies
WORKDIR /agent-technologies
COPY . /agent-technologies
RUN pip install -r requirements.txt
EXPOSE 8000
这是我的 docker-compose 文件的样子:
version: '3'
services:
web:
build: .
command: python src/manage.py runserver --settings=agents.config.settings
volumes:
- .:/agent-technologies
ports:
- "8000:8000"
environment:
- DB=true
在本地运行应用程序时它工作得很好。但是当我尝试将它部署到 Kubernetes 集群时,运行我的应用程序容器的 Pod 对象在无限循环中崩溃,因为我不知道如何在生产环境中运行应用程序时指定 DATABASES.default.HOST。当然,docker-compose 文件中指定的命令 (command: python src/manage.py runserver --settings=agents.config.settings
) 可能会产生异常并使 Pod 在无限循环中崩溃.
注意:我已经为 Kubernetes 创建了所有必要的配置文件(部署定义/服务/ secret /卷文件)。这是我的 github 链接:https://github.com/StefanCepa/agent-technologies-bachelor
任何帮助将不胜感激!提前谢谢大家!
最佳答案
您必须创建一个 service (cluster ip) 用于您的 postgres pod 以使其“可访问”。创建服务时,您可以access它通过 <service name>.default:<port>
.但是,将 postgres(或任何数据库)作为一个简单的 pod 运行是危险的(一旦您或 k8s 重新创建 pod 或将其扩展,您就会丢失数据)。您可以使用 service或使用 statefulSets 正确安装它.
一旦你有了地址,你就可以把它放在env variable中并从您的 settings.py 访问它
编辑: 将其放入您的部署 yaml ( example ):
env:
- name: POSTGRES_HOST
value: "postgres-service.default"
- name: POSTGRES_PORT
value: "5432"
- name: DB
value: "DB"
在你的 settings.py 中
'USER': 'stefan_radonjic',
'PASSWORD': 'cepajecar995',
'HOST': os.getenv('POSTGRES_HOST'),
'PORT': os.getenv('POSTGRES_PORT'),
关于django - Kubernetes + Django/PostgreSQL - 当我将它部署到 Kubernetes 集群时如何指定我的 PostgreSQL 数据库的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50515478/