/k8s-test-django

Докеризированный сайт на Django для экспериментов с Kubernetes.

Primary LanguagePython

Django site

Докеризированный сайт на Django для экспериментов с Kubernetes.

Внутри конейнера Django запускается с помощью Nginx Unit, не путать с Nginx. Сервер Nginx Unit выполняет сразу две функции: как веб-сервер он раздаёт файлы статики и медиа, а в роли сервера-приложений он запускает Python и Django. Таким образом Nginx Unit заменяет собой связку из двух сервисов Nginx и Gunicorn/uWSGI. Подробнее про Nginx Unit.

Тестовая версия сайта

Пример тут

Как запустить dev-версию

Запустить minikube (на драйвере VirtualBox)

minikube start

Подключить аддон ingress для minikube

minikube addons enable ingress

Установить Helm

sudo snap install helm --classic

Установить PostgreSQL (не забудьте вставить ваш пароль от админ-пользователя БД в конце команды)

helm install test-db oci://registry-1.docker.io/bitnamicharts/postgresql --set auth.postgresPassword=<put-your-admin-password-here>

Сделать экспорт пароля от админ-пользователя БД в переменную окружения:

export POSTGRES_PASSWORD=$(kubectl get secret --namespace default test-db-postgresql -o jsonpath="{.data.postgres-password}" | base64 -d)

Создать pod с утилитой psql и выполнить в ней команду подключения к БД (после запуска команды дождитесь загрузки и появления postgres=# ):

kubectl run test-db-postgresql-client --rm --tty -i --restart='Never' --namespace default --image docker.io/bitnami/postgresql:15.3.0-debian-11-r7 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host test-db-postgresql -U postgres -d postgres -p 5432

Создать пользователя БД (и пароль) для подключения приложения:

CREATE ROLE <username> WITH LOGIN ENCRYPTED PASSWORD '<put-your-password-here>';

Создать базу для работы приложения, владельцем которой будет выбранный пользователь:

CREATE DATABASE <database-name> OWNER <username>;

В результате возможно сформировать DATABASE_URL следующего вида:

DATABASE_URL: postgres://<username>:<your-password>@test-db-postgresql:5432/<database-name>

Создать .env файл с двумя переменными окружения:

SECRET_KEY=put-your-secret-key-here
DATABASE_URL=postgres://...

Создать Secret c именем django-secrets используя файл .env в корневой директории проекта

kubectl create secret generic django-secrets --from-env-file=./.env

Перейти в директорию minikube

cd minikube/

Создать конфиг-файл django-config.yaml и в блоке data прописать переменные окружения ALLOWED_HOSTS и DEBUG

apiVersion: v1
kind: ConfigMap
metadata:
  name: django-config
  labels:
    app.kubernetes.io/name: django
    app.kubernetes.io/instance: django-test
    app.kubernetes.io/component: web
data:
  ALLOWED_HOSTS: "*"
  DEBUG: "True"

Перейти обратно в корневую директорию проекта

cd ..

Запустить манифесты для configmaps, deployment, ingress и cronjob

kubectl apply -f minikube/

Проверить работу всех компонентов:

kubectl get deployments.apps,pods,service,configmaps,ingress,cronjobs.batch

Для изменения настроек (после внесения изменений в ConfigMap)

kubectl apply -f minikube/ && kubectl rollout restart deployment django-deploy

Для запуска процесса миграций в БД

kubectl apply -f django-migrate-job.yaml

Для проверки прошедших миграций

kubectl logs <name of django-migrate-job pod>

Список подов можно вывести так

kubectl get pods

Создать супер-пользователя Django (выбрать можно любой из рабочих подов deploy)

kubectl exec -it <django-deploy-pod-name> -- python manage.py createsuperuser

Обновить файл /etc/hosts для маршрутизации запросов от star-burger.test

echo "$(minikube ip) star-burger.test" | sudo tee -a /etc/hosts

Как запустить prod-версию

Подключиться к кластеру (например через Lens)

Создать .env_prod файл с двумя переменными окружения:

SECRET_KEY=put-your-secret-key-here
DATABASE_URL=postgres://...

Для prod-версии: Создать Secret c именем django-secrets используя файл .env_prod в корневой директории проекта

kubectl create secret generic django-secrets --from-env-file=./.env_prod --namespace=<put-your-namespace-here>

Перейти в директорию kubernetes

cd kubernetes/

Создать конфиг-файл django-config.yaml и в блоке data прописать переменные окружения ALLOWED_HOSTS и DEBUG

apiVersion: v1
kind: ConfigMap
metadata:
  name: django-config
  namespace: <put-your-namespace-here>
  labels:
    app.kubernetes.io/name: django
    app.kubernetes.io/instance: django-test
    app.kubernetes.io/component: web
data:
  ALLOWED_HOSTS: "*"
  DEBUG: "False"

Перейти обратно в корневую директорию проекта

cd ..

Запустить манифесты для configmaps, deployment и cronjob (для prod-версии ingress не используется, вместо него запускается service через NodePort)

kubectl apply -f kubernetes/

Проверить работу всех компонентов:

kubectl get deployments.apps,pods,service,configmaps,cronjobs.batch

Для изменения настроек (после внесения изменений в ConfigMap)

kubectl apply -f kubernetes/ && kubectl rollout restart deployment django-deploy

Для запуска процесса миграций в БД

kubectl apply -f django-migrate-job-prod.yaml

Для проверки прошедших миграций

kubectl logs <name of django-migrate-job pod>

Список подов можно вывести так

kubectl get pods

Создать супер-пользователя Django (выбрать можно любой из рабочих подов deploy)

kubectl exec -it <django-deploy-pod-name> -- python manage.py createsuperuser

Переменные окружения

Образ с Django считывает настройки из переменных окружения в django-config.yaml и в secrets (внутри Kubernetes):

SECRET_KEY -- обязательная секретная настройка Django. Это соль для генерации хэшей. Значение может быть любым, важно лишь, чтобы оно никому не было известно. Документация Django.

DEBUG -- настройка Django для включения отладочного режима. Принимает значения True или False. Документация Django.

ALLOWED_HOSTS -- настройка Django со списком разрешённых адресов. Если запрос прилетит на другой адрес, то сайт ответит ошибкой 400. Можно перечислить несколько адресов через запятую, например 127.0.0.1,192.168.0.1,star-burger.test. Документация Django.

DATABASE_URL -- адрес для подключения к базе данных PostgreSQL. Другие СУБД сайт не поддерживает. Формат записи.