Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом кратком руководстве описано, как развернуть приложение Django в кластере Службы Azure Kubernetes (AKS) с гибким сервером Базы данных Azure для PostgreSQL с помощью Azure CLI.
AKS — это управляемая служба Kubernetes, используемая для быстрого развертывания кластеров и управления ими. База данных Azure для PostgreSQL гибкий сервер — это полностью управляемая служба базы данных, предназначенная для обеспечения более детального контроля и гибкости функций управления базами данных и параметров конфигурации.
Замечание
В этом кратком руководстве предполагается базовое понимание концепций Kubernetes, Django и PostgreSQL.
Предпосылки
Если у вас нет аккаунта Azure, создайте бесплатную учетную запись перед началом.
- Запустите Azure Cloud Shell в новом окне браузера. Вы также можете установить 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 можно при помощи 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 с помощью команды az postgreSQL flexible-server create. Следующая команда позволяет создать сервер, используя параметры и значения по умолчанию для локального контекста Azure CLI:
az postgres flexible-server create --public-access all
Сервер имеет следующие атрибуты:
- При первоначальной настройке сервера создается новая пустая база данных
postgres. В этом кратком руководстве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 с вашими значениями SERVERNAME, YOUR-DATABASE-USERNAME и 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 и их конфигурацию. Вы создаете службу с именем python-svc, чтобы предоставить доступ к приложению через внешний IP-адрес.
Тестирование приложения
При запуске приложения Служба Kubernetes предоставляет внешний интерфейс приложения в Интернете. Процесс может занять несколько минут для завершения.
Чтобы отслеживать ход выполнения, используйте команду kubectl get service с аргументом --watch.
kubectl get service python-svc --watch
Изначально внешний IP-адрес для службы django-app отображается как в ожидании.
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, не удаляется. Инструкции по удалению доверенного лица службы см. в разделе Учётные записи службы AKS: соображения и удаление. Если вы используете управляемое удостоверение, платформа управляет удостоверением и не требует удаления.