Bagikan melalui


Menyebarkan aplikasi Django di Azure Kubernetes Service dengan Azure Database for PostgreSQL

Dalam panduan memulai ini, Anda menyebarkan aplikasi Django pada kluster Azure Kubernetes Service (AKS) dengan menggunakan server fleksibel Azure Database for PostgreSQL dan Azure CLI.

AKS adalah layanan Kubernetes terkelola yang Anda gunakan untuk menyebarkan dan mengelola kluster dengan cepat. Server fleksibel Azure Database for PostgreSQL adalah layanan database terkelola penuh yang dirancang untuk memberikan kontrol dan fleksibilitas yang lebih terperinci atas fungsi manajemen database dan pengaturan konfigurasi.

Nota

Mulai cepat ini mengasumsikan pemahaman dasar tentang konsep Kubernetes, Django, dan PostgreSQL.

Prasyarat

Jika Anda tidak memiliki akun Azure, buat akun gratis sebelum memulai.

  • Meluncurkan Azure Cloud Shell di jendela browser baru. Anda juga dapat menginstal Azure CLI di komputer lokal Anda. Jika Anda menggunakan penginstalan lokal, masuk dengan menggunakan perintah az login . Untuk menyelesaikan proses autentikasi, ikuti langkah-langkah yang ditampilkan di terminal Anda.
  • Jalankan az version untuk menemukan versi dan pustaka dependen yang terinstal. Untuk meng-upgrade ke versi terbaru, jalankan az upgrade. Artikel ini memerlukan Azure CLI versi terbaru. Jika menggunakan Azure Cloud Shell, versi terbaru sudah terpasang.

Membuat grup sumber daya

Grup sumber daya Azure adalah grup logis tempat Anda menyebarkan dan mengelola sumber daya Azure. Buat grup sumber daya bernama django-project dengan menggunakan perintah az-group-create di lokasi eastus .

az group create --name django-project --location eastus

Nota

Lokasi untuk grup sumber daya menyimpan metadata grup sumber daya. Ini juga tempat sumber daya Anda berjalan di Azure jika Anda tidak menentukan wilayah lain selama pembuatan sumber daya.

Output contoh berikut menampilkan grup sumber daya yang berhasil dibuat:

{
  "id": "/subscriptions/<guid>/resourceGroups/django-project",
  "location": "eastus",
  "managedBy": null,

  "name": "django-project",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Membuat kluster AKS

Gunakan perintah az aks create untuk membuat kluster AKS. Contoh berikut membuat kluster bernama djangoappcluster dengan satu simpul. Pembuatan kluster membutuhkan waktu beberapa menit untuk diselesaikan.

az aks create --resource-group django-project --name djangoappcluster --node-count 1 --generate-ssh-keys

Setelah beberapa menit, perintah selesai dan kembalikan informasi berformat JSON tentang kluster.

Nota

Saat membuat kluster AKS, perintah secara otomatis membuat grup sumber daya kedua untuk menyimpan sumber daya AKS. Untuk informasi selengkapnya, lihat Mengapa dua grup sumber daya dibuat dengan AKS?

Menyambungkan ke kluster

Untuk mengelola kluster Kubernetes, gunakan kubectl, klien baris-perintah Kubernetes. Jika Anda menggunakan Azure Cloud Shell, kubectl sudah terpasang.

Nota

Jika Anda menjalankan Azure CLI secara lokal, jalankan perintah az aks install-cli untuk menginstal kubectl.

Untuk mengonfigurasi kubectl agar tersambung ke kluster Kubernetes, gunakan perintah az aks get-credentials. Perintah ini mengunduh kredensial dan mengonfigurasi CLI Kubernetes untuk menggunakannya.

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

Untuk memverifikasi sambungan ke kluster Anda, gunakan perintah kubectl get untuk mengembalikan daftar node kluster.

kubectl get nodes

Contoh output berikut menunjukkan satu simpul yang dibuat pada langkah sebelumnya. Pastikan bahwa status simpul Siap:

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

Membuat instans server yang fleksibel

Buat instans server fleksibel Azure Database for PostgreSQL dengan perintah az postgreSQL flexible-server create . Perintah berikut ini membuat server menggunakan default dan nilai layanan dari konteks lokal Azure CLI Anda:

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

Server memiliki atribut berikut:

  • Database kosong baru bernama postgres dibuat saat server pertama kali disediakan. Panduan cepat ini menggunakan basis data postgres.
  • Nama server yang dibuat secara otomatis, nama pengguna admin, kata sandi admin, nama grup sumber daya (jika Anda belum menentukannya dalam konteks lokal), dan lokasi yang sama dengan grup sumber daya Anda.
  • Dengan menggunakan argumen akses publik, Anda membuat server dengan akses publik untuk klien mana pun dengan nama pengguna dan kata sandi yang benar.
  • Karena perintah menggunakan konteks lokal, perintah membuat server di grup django-project sumber daya dan di wilayah eastus.

Membangun gambar docker Django Anda

Membuat aplikasi Django baru atau gunakan proyek Django Anda yang sudah ada. Memastikan kode Anda berada dalam struktur folder ini.

└───my-djangoapp
    └───views.py
    └───models.py
    └───forms.py
    ├───templates
          . . . . . . .
    ├───static
         . . . . . . .
└───my-django-project
    └───settings.py
    └───urls.py
    └───wsgi.py
        . . . . . . .
    └─── Dockerfile
    └─── requirements.txt
    └─── manage.py

Perbarui ALLOWED_HOSTS di settings.py untuk memastikan aplikasi Django menggunakan IP eksternal yang akan ditetapkan ke aplikasi Kubernetes.

ALLOWED_HOSTS = ['*']

Memperbarui bagian DATABASES={ } dalam file settings.py. Cuplikan kode membaca host database, nama pengguna, dan kata sandi dari file manifes 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'}
   }
}

Menghasilkan file persyaratan.txt

Buat file requirements.txt untuk mencantumkan dependensi aplikasi Django. Berikut adalah contoh requirements.txt file. Anda dapat menggunakan pip freeze > requirements.txt untuk menghasilkan file requirements.txt untuk aplikasi yang ada.

Django==2.2.17
postgres==3.0.0
psycopg2-binary==2.8.6
psycopg2-pool==1.1
pytz==2020.4

Membuat Dockerfile

Buat file baru bernama Dockerfile dan salin cuplikan kode berikut. Dockerfile ini menyiapkan Python 3.8 dan menginstal semua persyaratan yang tercantum dalam requirements.txt file.

# 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

Membuat citra

Pastikan Anda berada di my-django-app direktori di terminal dengan menggunakan cd perintah . Jalankan perintah berikut untuk membangun gambar papan buletin Anda:

docker build --tag myblog:latest .

Sebarkan gambar Anda ke hub Docker atau registri Azure Container.

Penting

Jika Anda menggunakan Azure container registry (ACR), jalankan az aks update perintah untuk melampirkan akun ACR ke kluster AKS.

az aks update --name djangoappcluster --resource-group django-project --attach-acr <your-acr-name>

Membuat file manifes Kubernetes

File manifes Kubernetes menentukan status yang diinginkan untuk kluster, seperti gambar kontainer apa yang akan dijalankan. Buat file manifes bernama djangoapp.yaml dan salin dalam definisi YAML berikut.

Penting

Perbarui bagian env dengan nilai SERVERNAME, YOUR-DATABASE-USERNAME, dan YOUR-DATABASE-PASSWORD untuk instans server fleksibel Azure Database for PostgreSQL Anda.

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

Sebarkan Django ke kluster AKS

Sebarkan aplikasi dengan menggunakan perintah kubectl apply . Tentukan nama manifes YAML Anda:

kubectl apply -f djangoapp.yaml

Output contoh berikut menampilkan Penyebaran dan Layanan yang berhasil dibuat:

deployment "django-app" created
service "python-svc" created

Penyebaran bernama django-app menjelaskan detail penyebaran Anda seperti gambar mana yang akan digunakan untuk aplikasi, jumlah pod, dan konfigurasi pod. Anda membuat layanan bernama python-svc untuk mengekspos aplikasi melalui IP eksternal.

Uji aplikasi

Ketika aplikasi berjalan, layanan Kubernetes mengekspos front end aplikasi ke internet. Diperlukan beberapa menit untuk menyelesaikan proses ini.

Untuk memantau kemajuan, gunakan perintah lkubectl get service dengan argumen --watch.

kubectl get service python-svc --watch

Awalnya EXTERNAL-IP untuk layanan django-app ditampilkan sebagai tertunda.

NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
django-app   LoadBalancer   10.0.37.27   <pending>     80:30572/TCP   6s

Ketika alamat EKSTERNAL-IP berubah dari tertunda ke alamat IP publik aktual, gunakan CTRL-C untuk menghentikan kubectl proses pemantauan. Keluaran contoh berikut menunjukkan alamat IP publik yang valid yang diberikan ke layanan.

django-app  LoadBalancer   10.0.37.27   52.179.23.131   80:30572/TCP   2m

Sekarang buka browser web ke alamat IP eksternal layanan Anda (http://<service-external-ip-address>) dan lihat aplikasi Django.

Nota

  • Saat ini situs Django tidak menggunakan HTTPS. Untuk informasi selengkapnya tentang HTTPS dan cara mengonfigurasi perutean aplikasi untuk AKS, lihat ingress NGINX terkelola dengan add-on perutean aplikasi.

Menjalankan migrasi database

Untuk aplikasi Django apa pun, Anda perlu menjalankan migrasi database atau mengumpulkan file statis. Anda dapat menjalankan perintah shell Django ini dengan menggunakan $ kubectl exec <pod-name> -- [COMMAND]. Sebelum menjalankan perintah, Anda perlu menemukan nama pod dengan menggunakan kubectl get pods.

$ kubectl get pods

Anda melihat output seperti ini:

NAME                             READY   STATUS          RESTARTS   AGE
django-app-5d9cd6cd8-l6x4b     1/1     Running              0       2m

Setelah Anda menemukan nama pod, jalankan migrasi database Django dengan perintah $ kubectl exec <pod-name> -- [COMMAND]. /code/ adalah direktori kerja untuk proyek yang ditentukan dalam bagian di Dockerfile atas.

$ kubectl exec django-app-5d9cd6cd8-l6x4b -- python /code/manage.py migrate

Outputnya terlihat seperti:

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
  . . . . . .

Jika Anda mengalami masalah, jalankan kubectl logs <pod-name> untuk melihat pengecualian apa yang dilemparkan aplikasi Anda. Jika aplikasi berhasil berfungsi, Anda akan melihat output seperti ini saat menjalankan 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.

Membersihkan sumber daya

Untuk menghindari biaya Azure, bersihkan sumber daya yang tidak perlu. Saat Anda tidak lagi memerlukan kluster, gunakan perintah az group delete untuk menghapus grup sumber daya, layanan kontainer, dan semua sumber daya terkait.

az group delete --name django-project --yes --no-wait

Nota

Saat Anda menghapus kluster, prinsipal layanan Microsoft Entra yang digunakan kluster AKS tidak dihapus. Untuk langkah tentang cara menghapus perwakilan layanan, lihat Pertimbangan dan penghapusan perwakilan layanan AKS. Jika Anda menggunakan identitas terkelola, platform mengelola identitas dan tidak memerlukan penghapusan.