Kubernetes + Django / PostgreSQL - Как мне указать HOST моей базы данных PostgreSQL при ее развертывании в кластере Kubernetes - PullRequest
0 голосов
/ 24 мая 2018

У меня много проблем с настройкой приложения My Dockerized Django + PostgreSQL DB для работы в кластере Kubernetes, которое я создал с помощью облачной платформы Google.

Как мне указать DATABASES.default.HOST из моегоФайл settings.py при развертывании образа PostgreSQL из Docker Hub и образа моего веб-приложения Django в кластер Kubernetes?

Вот как я хочу, чтобы мое приложение работало.Когда я запускаю приложение локально, я хочу использовать базу данных SQLITE, для этого я внес следующие изменения в мой файл 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), вероятно, создает исключение и приводит к аварийному завершению работы модулей в бесконечном цикле.

ПРИМЕЧАНИЕ. Я уже создал все необходимые файлы конфигурации для Kubernetes (определения развертывания)/ Услуги / Секрет / Объемные файлы).Вот моя ссылка на github: https://github.com/StefanCepa/agent-technologies-bachelor

Любая помощь будет оценена!Спасибо всем заранее!

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Ниже приведены мои выводы:

  1. Количество экземпляров postgres зависело от постоянного тома.Я вижу код для постоянного требования объема, но не сам постоянный том.Поэтому мне пришлось сначала создать это.
apiVersion: v1
kind: PersistentVolume
metadata:
  labels:
    type: local
  name: task-pv-volume
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 1Gi
  hostPath:
    path: /tmp/data
  persistentVolumeReclaimPolicy: Retain
В agent-technologies-bachelor / agents / config / kubernetes / postgres / secrets-definition.yml существует тип пароля пароля.
data:
  user: c3RlZmFuX3JhZG9uamlj #stefan_radonjic
  passowrd: sdfsdfsd #cepajecar995

Из-за этого экземпляр postgres не смог запуститься.Я нашел это, посмотрев на события, выполнив команду kubectl description pods

В образе Docker не было команды для запуска приложения.В результате, если бы я запустил ваш образ докера в cepa995 / agents_web, он просто завершился бы и не запустил какое-либо приложение.Вот почему приложение django не было запущено.Чтобы это исправить, я изменил Dockerfile, добавив в конце инструкцию CMD.Я вижу, вы поместили это в docker-compose для создания образа, но эта команда должна быть внутри самого Dockerfile.Dockerfile теперь выглядит так:
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
0 голосов
/ 24 мая 2018

Вам нужно будет создать сервис (кластерный ip) для вашего модуля postgres, чтобы сделать его "доступным".Когда вы создаете сервис, вы можете получить доступ к через <service name>.default:<port>.Однако запуск postgres (или любого db) в качестве простого модуля опасен (вы потеряете данные, как только вы или k8s заново создадите модуль или увеличите его).Вы можете использовать service или установить его правильно, используя statefulSets .

Получив адрес, вы можете поместить его в env variable иПолучите доступ к нему из настроек..py

'USER': 'stefan_radonjic',
'PASSWORD': 'cepajecar995',
'HOST': os.getenv('POSTGRES_HOST'),
'PORT': os.getenv('POSTGRES_PORT'),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...