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. Другие СУБД сайт не поддерживает. Формат записи.