البرنامج التعليمي: نشر Django التطبيق على AKS مع قاعدة بيانات Azure لـ PostgreSQL - Flexible Server

يطبق على: قاعدة بيانات Azure لـ PostgreSQL - الخادم المرن

في هذا التشغيل السريع، يمكنك نشر تطبيق Django على نظام مجموعة Azure Kubernetes Service (AKS) مع قاعدة بيانات Azure لخادم PostgreSQL المرن باستخدام Azure CLI.

خدمة Azur Kubernetes AKSهي خدمة مُدارة توفر لك سرعة نشر نظام المجموعات وإدارتها. قاعدة بيانات Azure لخادم PostgreSQL المرن هي خدمة قاعدة بيانات مدارة بالكامل مصممة لتوفير مزيد من التحكم الدقيق والمرونة على وظائف إدارة قاعدة البيانات وإعدادات التكوين.

إشعار

يمنحك هذا التشغيل السريع فهمًا أساسيًا لمفاهيم Kubernetes وDjango وPostgreSQL.

المتطلبات الأساسية

إذا لم يكن لديك اشتراك في Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.

  • قم بتشغيل Azure Cloud Shell في نافذة مستعرض جديدة. يمكنك أيضاً تثبيت Azure CLI على جهازك الشخصي. في حال كنت تستخدم تثبيتًا محليًا، فقم بتسجيل الدخول باستخدام Azure CLI باستخدام أمر تسجيل الدخول من az . لإنهاء عملية المصادقة، اتبع الخطوات المعروضة في جهازك.
  • يُرجى تشغيل إصدار az للوصول إلى الإصدار والمكتبات التابعة التي تم تثبيتها. للتحديث لآخر إصدار، يُرجى تشغيل تحديث az. تتطلب هذه المقالة أحدث إصدار من Azure CLI. إذا كنت تستخدم Azure Cloud Shell، فإن أحدث إصدار مثبت بالفعل.

إنشاء مجموعة موارد

مجموعة الموارد عبارة عن حاوية منطقية يتم فيها توزيع موارد 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، استخدم سطر أوامر العميل Kubernetes، kubectl. kubectl والذي سيكون مثبتًا بالفعل في حال كنت تستخدم Azure Cloud Shell.

إشعار

إذا كنت تقوم بتشغيل Azure CLI محليا، فقم بتشغيل الأمر az aks install-cli لتثبيت kubectl.

لتكوين kubectl للاتصال بنظام مجموعتك في Kubernetes، يمكن استخدام الأمر az aks get-credentials. هذا الأمر يقوم بتحميل بيانات الاعتماد وضبط Kubernetes CLI لاستخدامها.

az aks get-credentials --resource-group django-project --name djangoappcluster

للتحقق من الاتصال بالمجموعة الخاصة بك، استخدم الأمر kubectl get لإرجاع قائمة العُقد العنقودية.

kubectl get nodes

يوضح إخراج المثال التالي العقدة المفردة التي تم إنشاؤها في الخطوات السابقة. تأكد من أن حالة العقدة جاهزة:

NAME                       STATUS   ROLES   AGE     VERSION
aks-nodepool1-31718369-0   Ready    agent   6m44s   v1.12.8

إنشاء مثيل خادم مرن لقاعدة بيانات Azure ل PostgreSQL

إنشاء مثيل خادم مرن ل Azure Database for PostgreSQL باستخدام الأمر az postgreSQL flexible-server create . الأمر التالي بإنشاء ملقم باستخدام افتراضيات الخدمة والقيم من السياق المحلي لـ Azure CLI الخاص بك:

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

يحتوي الملقم الذي تم إنشاؤه على السمات التالية:

  • يتم إنشاء قاعدة بيانات فارغة جديدة postgresعند توفير الخادم لأول مرة. في هذا التشغيل السريع، نستخدم قاعدة البيانات هذه.
  • اسم الخادم الذي تم إنشاؤه تلقائيا واسم مستخدم المسؤول وكلمة مرور المسؤول واسم مجموعة الموارد (إذا لم يكن محددا بالفعل في السياق المحلي) وفي نفس موقع مجموعة الموارد الخاصة بك.
  • يسمح لك استخدام وسيطة الوصول العام بإنشاء خادم مع وصول عام إلى أي عميل باسم مستخدم وكلمة مرور صحيحين.
  • نظرا لأن الأمر يستخدم السياق المحلي فإنه ينشئ الخادم في مجموعة django-project الموارد وفي المنطقة eastus.

أنشأ صورة Django docker الخاصة بك

أنشأ تطبيقDjango application جديد أو استخدم مشروع 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 لإنشاء ملف 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 hub أوAzure Container registry.

هام

في حال كنت تستخدم سجل حاوية 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 Database for 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 بوصف تفاصيل التوزيع الخاص بك مثل الصور التي يجب استخدامها للتطبيق، وعدد القرون وتكوين الجراب. يتم إنشاء خدمةpython-svc لعرض التطبيق من خلال عنوان IP خارجي.

اختبر التطبيق

عند تشغيل التطبيق، تعرض خدمة Kubernetes واجهة التطبيق الأمامية للإنترنت. قد تستغرق هذه العملية بضع دقائق حتى تكتمل.

لمراقبة التقدم، استخدم أمر kubectl get service مع --watch الوسيطة.

kubectl get service python-svc --watch

في البداية، يتم عرض EXTERNAL-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 من معلق إلى عنوان 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 shell باستخدام$ 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 وحذفها. إذا استخدمت هوية مدارة، تتم إدارة الهوية بواسطة النظام الأساسي ولا تتطلب الإزالة.

الخطوات التالية