Поделиться через


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

В этом кратком руководстве описано, как развернуть приложение 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 необходимо выполнить миграцию базы данных или собрать статические файлы. Эти команды оболочки 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: соображения и удаление. Если вы используете управляемое удостоверение, платформа управляет удостоверением и не требует удаления.