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

时间:2018-05-24 17:58:30

标签: django postgresql docker kubernetes

我在使用Google Cloud Platform创建的Kubernetes Cluster上配置My Dockerized Django + PostgreSQL数据库应用程序时遇到了很多问题。

当我将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 Cluster,在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)中指定的命令可能会产生异常并使Pods无限循环崩溃。

注意:我已经为Kubernetes(部署定义/服务/机密/卷文件)创建了所有必需的配置文件。这是我的github链接:https://github.com/StefanCepa/agent-technologies-bachelor

任何帮助将不胜感激!提前谢谢大家!

2 个答案:

答案 0 :(得分:2)

您必须为postgres pod创建一个service(群集IP)才能使其“可访问”。创建服务时,您可以<service name>.default:<port> access创建服务。但是,将postgres(或任何数据库)作为一个简单的pod运行是危险的(只要你或k8重新创建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'),

答案 1 :(得分:1)

以下是我的发现:

  1. postgres实例取决于持续的音量。我看到持久性volueme声明的代码,但不是持久性卷本身。所以我必须先创建它。
  2. apiVersion: v1
    kind: PersistentVolume
    metadata:
      labels:
        type: local
      name: task-pv-volume
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 1Gi
      hostPath:
        path: /tmp/data
      persistentVolumeReclaimPolicy: Retain
    
    1. agent-technologies-bachelor / agents / config / kubernetes / postgres / secrets-definition.yml term password中有一种类型。
    2. data:
        user: c3RlZmFuX3JhZG9uamlj #stefan_radonjic
        passowrd: sdfsdfsd #cepajecar995
      

      因此,postgres实例无法启动。我通过运行命令kubectl describe pods

      来查看事件
      1. Docker镜像没有执行应用程序的命令。因此,如果我在cepa995 / agents_web上运行您的docker镜像,它只会退出而不会运行任何应用程序。这就是django应用程序没有运行的原因。为了解决这个问题,我修改了Dockerfile以在最后添加CMD指令。我看到你把它放在docker-compose中构建图像,但是这个命令必须在Dockerfile本身内部。 Dockerfile现在看起来像这样:
      2. FROM python:3.6
        ENV PYTHONUNBUFFERED 1
        RUN mkdir /agent-technologies
        WORKDIR /agent-technologies
        COPY . /agent-technologies
        RUN pip install -r src/requirements.txt
        EXPOSE 8000
        CMD python src/manage.py runserver 0.0.0.0:8000 --settings=agents.config.settings