Руководство по развертыванию приложения Django в AKS с гибким сервером Базы данных Azure для PostgreSQL

Область применения: гибкий сервер Базы данных Azure для PostgreSQL

В рамках этого краткого руководства вы развернете приложение Django в кластере Azure Kubernetes Service (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

Создайте гибкий сервер с помощью команды az postgreSQL flexible-server create. Следующая команда создает сервер, используя параметры и значения по умолчанию для локального контекста Azure CLI:

az postgres flexible-server create --public-access all

Сервер создается со следующими атрибутами:

  • При первой подготовке сервера создается новая пустая база данных с именем postgres. В рамках этого краткого руководства мы будем использовать именно эту базу данных.
  • Автоматически созданное имя сервера, имя пользователя и пароль администратора, имя группы ресурсов (если оно не указано в локальном контексте) и расположение, которое выбрано для группы ресурсов.
  • Используя аргумент public-access, можно создать сервер, доступ к которому открыт любому клиенту с правильными именем пользователя и паролем.
  • Так как эта команда использует локальный контекст, сервер создается в группе ресурсов 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 для имеющегося приложения можно создать с использованием pip freeze > 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

[!INCLUDE [!INCLUDE [applies-to-postgresql-flexible-server](../includes/applies-to-postgresql-flexible-server.md)]
FROM python:3.8.2

# Make a new directory to put our code in.

[!INCLUDE [!INCLUDE [applies-to-postgresql-flexible-server](../includes/applies-to-postgresql-flexible-server.md)]
RUN mkdir /code

# Change the working directory.

[!INCLUDE [!INCLUDE [applies-to-postgresql-flexible-server](../includes/applies-to-postgresql-flexible-server.md)]
WORKDIR /code

# Copy to code folder

[!INCLUDE [!INCLUDE [applies-to-postgresql-flexible-server](../includes/applies-to-postgresql-flexible-server.md)]
COPY . /code/

# Install the requirements.

[!INCLUDE [!INCLUDE [applies-to-postgresql-flexible-server](../includes/applies-to-postgresql-flexible-server.md)]
RUN pip install -r requirements.txt

# Run the application:

[!INCLUDE [!INCLUDE [applies-to-postgresql-flexible-server](../includes/applies-to-postgresql-flexible-server.md)]
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 ниже, указав реальные значения SERVERNAME, YOUR-DATABASE-USERNAME и YOUR-DATABASE-PASSWORD для гибкого сервера postgres.
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-adress>) для просмотра приложения Django.

Примечание

  • Сейчас сайт Django не поддерживает HTTPS. Мы рекомендуем использовать параметр ENABLE TLS и собственные сертификаты.
  • Кроме того, вы можете включить для кластера маршрутизацию HTTP. Если маршрутизация HTTP включена, то она настраивает контроллер объекта ingress в кластере AKS. Когда приложения развернуты, решение также создает общедоступные DNS-имена для конечных точек приложений.

Выполнение миграций баз данных

Для любого приложения 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

Примечание

Когда вы удаляете кластер, субъект-служба Azure Active Directory, используемый в кластере AKS, не удаляется. Инструкции по удалению субъекта-службы см. в разделе с дополнительными замечаниями. Управляемые удостоверения администрируются платформой, и их не нужно удалять.

Дальнейшие действия