django - Kubernetes + Django/PostgreSQL - 当我将它部署到 Kubernetes 集群时如何指定我的 PostgreSQL 数据库的主机

标签 django postgresql docker kubernetes

我在配置我的 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/

相关文章:

django - 更新期间如何在 Django REST Framework 序列化程序中获取 changed_fields?

python - 将 PDF 文件从 Django 网站发送到 LogicalDOC

php - 向 Apache 和 PHP 公开环境变量

mysql - 在 docker 中连接到 mysql 失败

sql - PostgresQL - 日期工作很奇怪

scala - SBT 项目未使用 docker-compose 安装到 Docker 容器

python - 项目外的 Django 设置

python - Django 左连接?

sql - 让 PostgreSQL 更容错一点?

sql - 如何从多个表中删除数据?