Руководство по развертыванию приложения 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 -n djangoappcluster -g django-project --attach-acr <your-acr-name>

Создание файла манифеста Kubernetes

Файл манифеста Kubernetes используется для определения требуемого состояния кластера, включая образы контейнеров, которые нужно запустить. Создайте файл манифеста djangoapp.yaml и скопируйте в него приведенное ниже определение YAML.

Внимание

Обновите env раздел ниже с YOUR-DATABASE-USERNAMESERVERNAMEYOUR-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 потребуется выполнить перенос базы данных или собрать статические файлы. Эти команды оболочки 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, не удаляется. Инструкции по удалению субъекта-службы см. в разделе с дополнительными замечаниями. Если вы использовали управляемое удостоверение, удостоверение управляется платформой и не требует удаления.

Следующие шаги