Руководство по развертыванию приложения Django в AKS с помощью База данных Azure для PostgreSQL — гибкий сервер
ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для PostgreSQL — гибкий сервер
В этом кратком руководстве описано, как развернуть приложение Django в кластере Служба Azure Kubernetes (AKS) с помощью гибкого сервера База данных Azure для PostgreSQL с помощью Azure CLI.
AKS — это управляемая служба Kubernetes, которая позволяет быстро развертывать кластеры и управлять ими. База данных Azure для PostgreSQL гибкий сервер — это полностью управляемая служба базы данных, предназначенная для обеспечения более детального контроля и гибкости функций управления базами данных и параметров конфигурации.
Примечание.
В этом кратком руководстве предполагается базовое понимание концепций Kubernetes, Django и PostgreSQL.
Необходимые компоненты
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
- Запустите Azure Cloud Shell в новом окне браузера. Вы также можете установить Azure CLI на локальном компьютере. Если вы используете локальную установку, выполните вход с помощью команды Azure CLI az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала.
- Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade. Для работы с этой статьей требуется последняя версия Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена.
Создание или изменение группы ресурсов
Группа ресурсов Azure — это логическая группа, в которой развертываются и управляются ресурсы Azure. Давайте создадим группу ресурсов django-project с помощью команды az-group-create в расположении eastus.
az group create --name django-project --location eastus
Примечание.
Расположением для группы ресурсов называется место хранения метаданных для этой группы ресурсов. Это также место, где ресурсы выполняются в Azure, если вы не указываете другой регион во время создания ресурса.
В следующем примере выходных данных показано, что группа ресурсов успешно создана:
{
"id": "/subscriptions/<guid>/resourceGroups/django-project",
"location": "eastus",
"managedBy": null,
"name": "django-project",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
Создание кластера AKS
Используйте команду az aks create, чтобы создать кластер AKS. В следующем примере создается кластер djangoappcluster с одним узлом. Создание кластера занимает несколько минут.
az aks create --resource-group django-project --name djangoappcluster --node-count 1 --generate-ssh-keys
Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.
Примечание.
При создании кластера AKS для хранения ресурсов AKS автоматически создается вторая группа ресурсов. См. раздел Почему с AKS создаются две группы ресурсов?
Подключение к кластеру
Управлять кластером Kubernetes можно c помощью kubectl, клиента командной строки Kubernetes. Если вы используете Azure Cloud Shell, kubectl
уже установлен.
Примечание.
При локальном запуске Azure CLI выполните команду az aks install-cli , чтобы установить kubectl
.
Чтобы настроить kubectl
на подключение к кластеру Kubernetes, выполните команду az aks get-credentials. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.
az aks get-credentials --resource-group django-project --name djangoappcluster
Чтобы проверить подключение к кластеру, используйте команду kubectl get для получения списка узлов кластера.
kubectl get nodes
В следующем примере показан единый узел, созданный на предыдущих шагах. Убедитесь, что узел находится в состоянии Ready (Готово):
NAME STATUS ROLES AGE VERSION
aks-nodepool1-31718369-0 Ready agent 6m44s v1.12.8
Создание гибкого экземпляра сервера База данных Azure для PostgreSQL
Создайте гибкий экземпляр сервера База данных Azure для PostgreSQL с помощью команды az postgreSQL flexible-server create. Следующая команда позволяет создать сервер, используя параметры и значения по умолчанию для локального контекста Azure CLI:
az postgres flexible-server create --public-access all
Сервер создается со следующими атрибутами:
- При первой подготовке сервера создается новая пустая база данных с именем
postgres
. Мы используем эту базу данных в этом кратком руководстве. - Автоматическое создание имени сервера, имени администратора, пароля администратора, имени группы ресурсов (если оно еще не указано в локальном контексте) и в том же расположении, что и группа ресурсов.
- С помощью аргумента общедоступного доступа можно создать сервер с общедоступным доступом к любому клиенту с правильным именем пользователя и паролем.
- Так как команда использует локальный контекст, он создает сервер в группе
django-project
ресурсов и в регионеeastus
.
Создание образа Docker для Django
Создайте приложение Django или используйте имеющийся проект Django. Убедитесь, что код находится в этой структуре папок.
└───my-djangoapp
└───views.py
└───models.py
└───forms.py
├───templates
. . . . . . .
├───static
. . . . . . .
└───my-django-project
└───settings.py
└───urls.py
└───wsgi.py
. . . . . . .
└─── Dockerfile
└─── requirements.txt
└─── manage.py
Обновите ALLOWED_HOSTS
в файле settings.py
, чтобы приложение Django использовало внешний IP-адрес, назначенный приложению Kubernetes.
ALLOWED_HOSTS = ['*']
Обновите раздел DATABASES={ }
в файле settings.py
. Приведенный ниже фрагмент кода считывает узел базы данных, имя пользователя и пароль из файла манифеста Kubernetes.
DATABASES={
'default':{
'ENGINE':'django.db.backends.postgresql_psycopg2',
'NAME':os.getenv('DATABASE_NAME'),
'USER':os.getenv('DATABASE_USER'),
'PASSWORD':os.getenv('DATABASE_PASSWORD'),
'HOST':os.getenv('DATABASE_HOST'),
'PORT':'5432',
'OPTIONS': {'sslmode': 'require'}
}
}
Создание файла requirements.txt
Создайте файл requirements.txt
, чтобы вывести список зависимостей для приложения Django. Ниже приведен пример requirements.txt
файла. Вы можете использовать requirements.txt пипса > для создания файла requirements.txt для существующего приложения.
Django==2.2.17
postgres==3.0.0
psycopg2-binary==2.8.6
psycopg2-pool==1.1
pytz==2020.4
Создание файла Dockerfile
Создайте файл с именем Dockerfile
и скопируйте в него приведенный ниже фрагмент кода. Этот файл Dockerfile предназначен для настройки Python 3.8 и установки всех требований, перечисленных в файле requirements.txt.
# Use the official Python image from the Docker Hub
FROM python:3.8.2
# Make a new directory to put our code in.
RUN mkdir /code
# Change the working directory.
WORKDIR /code
# Copy to code folder
COPY . /code/
# Install the requirements.
RUN pip install -r requirements.txt
# Run the application:
CMD python manage.py runserver 0.0.0.0:8000
Сборка образа
В терминале убедитесь, что вы находитесь в каталоге my-django-app
, выполнив команду cd
. Выполните следующую команду, чтобы создать образ для доски объявлений:
docker build --tag myblog:latest .
Разверните этот образ в Центре Docker или в Реестре контейнеров Azure.
Внимание
Если вы используете реестр контейнеров Azure (ACR), выполните az aks update
команду, чтобы присоединить учетную запись ACR к кластеру AKS.
az aks update --name djangoappcluster --resource-group django-project --attach-acr <your-acr-name>
Создание файла манифеста Kubernetes
Файл манифеста Kubernetes используется для определения требуемого состояния кластера, включая образы контейнеров, которые нужно запустить. Создайте файл манифеста djangoapp.yaml
и скопируйте в него приведенное ниже определение YAML.
Внимание
Обновите env
раздел ниже с YOUR-DATABASE-USERNAME
SERVERNAME
YOUR-DATABASE-PASSWORD
помощью вашего База данных Azure для PostgreSQL гибкого экземпляра сервера.
apiVersion: apps/v1
kind: Deployment
metadata:
name: django-app
spec:
replicas: 1
selector:
matchLabels:
app: django-app
template:
metadata:
labels:
app: django-app
spec:
containers:
- name: django-app
image: [DOCKER-HUB-USER-OR-ACR-ACCOUNT]/[YOUR-IMAGE-NAME]:[TAG]
ports:
- containerPort: 8000
env:
- name: DATABASE_HOST
value: "SERVERNAME.postgres.database.azure.com"
- name: DATABASE_USER
value: "YOUR-DATABASE-USERNAME"
- name: DATABASE_PASSWORD
value: "YOUR-DATABASE-PASSWORD"
- name: DATABASE_NAME
value: "postgres"
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- django-app
topologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: Service
metadata:
name: python-svc
spec:
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 8000
selector:
app: django-app
Развертывание Django в кластере AKS
Разверните приложение с помощью команды kubectl apply и укажите имя манифеста YAML:
kubectl apply -f djangoapp.yaml
В следующем примере выходных данных показано, что развертывания и службы успешно созданы.
deployment "django-app" created
service "python-svc" created
Развертывание позволяет описать сведения о развертывании django-app
, например о том, какие образы будут использоваться для приложения, количество модулей pod и конфигурации pod. Будет создана служба python-svc
, которая открывает доступ к приложению через внешний IP-адрес.
Тестирование приложения
При запуске приложения Служба Kubernetes предоставляет внешний интерфейс приложения в Интернете. Процесс создания может занять несколько минут.
Чтобы отслеживать ход выполнения, используйте команду kubectl get service с аргументом --watch
.
kubectl get service python-svc --watch
Изначально для параметра EXTERNAL-IP службы django-app отображается состояние pending.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
django-app LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
Когда значение EXTERNAL-IP изменится с состояния pending на фактический общедоступный IP-адрес, используйте команду CTRL-C
, чтобы остановить процесс отслеживания kubectl
. В следующем примере выходных данных показан общедоступный IP-адрес, присвоенный службе.
django-app LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2m
Теперь откройте веб-браузер для внешнего IP-адреса службы (http://<service-external-ip-address>
) и просмотрите приложение Django.
Примечание.
- В настоящее время сайт Django не использует ПРОТОКОЛ HTTPS. Дополнительные сведения о HTTPS и настройке маршрутизации приложений для AKS см. в разделе "Управляемый входящий трафик NGINX" с надстройкой маршрутизации приложений.
Выполнение миграций баз данных
Для любого приложения Django потребуется выполнить перенос базы данных или собрать статические файлы. Эти команды оболочки Django можно выполнить с помощью $ kubectl exec <pod-name> -- [COMMAND]
. Перед выполнением команды необходимо найти имя модуля pod с помощью kubectl get pods
.
$ kubectl get pods
Выходные данные отображаются следующим образом:
NAME READY STATUS RESTARTS AGE
django-app-5d9cd6cd8-l6x4b 1/1 Running 0 2m
После обнаружения имени pod можно выполнить миграцию базы данных django с помощью команды $ kubectl exec <pod-name> -- [COMMAND]
. Обратите внимание, что /code/
является рабочей папкой для проекта, определенной в файле Dockerfile
выше.
$ kubectl exec django-app-5d9cd6cd8-l6x4b -- python /code/manage.py migrate
Выходные данные будут выглядеть следующим образом.
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
. . . . . .
При возникновении проблем запустите, kubectl logs <pod-name>
чтобы узнать, какое исключение создается приложением. Если все успешно работает, при запуске kubectl logs
отобразится результат, подобный следующему.
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
December 08, 2020 - 23:24:14
Django version 2.2.17, using settings 'django_postgres_app.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
Очистка ресурсов
Чтобы избежать расходов за использование Azure, необходимо удалить ненужные ресурсы. Чтобы удалить ненужные кластер, группу ресурсов, службу контейнеров и все связанные с ней ресурсы, выполните команду az group delete.
az group delete --name django-project --yes --no-wait
Примечание.
При удалении кластера субъект-служба Microsoft Entra, используемая кластером AKS, не удаляется. Инструкции по удалению субъекта-службы см. в разделе с дополнительными замечаниями. Если вы использовали управляемое удостоверение, удостоверение управляется платформой и не требует удаления.
Поделитесь своими предложениями и ошибками с помощью команды База данных Azure для PostgreSQL продукта.
Связанный контент
- Доступ к ресурсам Kubernetes с помощью портал Azure для кластера AKS.
- Автоматизированные развертывания для Служба Azure Kubernetes.
- Масштабирование приложений в Служба Azure Kubernetes.
- Управление База данных Azure для PostgreSQL — гибкий сервер.
- Настройка параметров сервера в База данных Azure для PostgreSQL — гибкий сервер.