Bagikan melalui


Tutorial: Menyebarkan aplikasi Django di AKS dengan Azure Database for PostgreSQL - Flexible Server

BERLAKU UNTUK: Azure Database for PostgreSQL - Server Fleksibel

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

AKS adalah layanan Kubernetes terkelola yang memungkinkan Anda 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.

Catatan

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

Prasyarat

Jika Anda tidak memiliki Langganan Azure, buat Akun gratis Azure sebelum memulai.

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

Buat grup sumber daya

Grup sumber daya Azure adalah grup logis tempat sumber daya Azure disebarkan dan dikelola. Mari membuat grup sumber daya django-project menggunakan perintah az-group-create di lokasi eastus.

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

Catatan

Lokasi untuk grup sumber daya adalah tempat metadata grup sumber daya disimpan. 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.

Catatan

Saat membuat kluster AKS, grup sumber daya kedua secara otomatis dibuat untuk menyimpan sumber daya AKS. Lihat Mengapa dua grup sumber daya dibuat dengan AKS?

Menyambungkan ke kluster

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

Catatan

Jika 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 informasi masuk dan mengonfigurasi CLI Kube 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 fleksibel Azure Database for PostgreSQL

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 yang dibuat memiliki atribut di bawah ini:

  • Database kosong baru, postgres dibuat ketika server pertama kali disediakan. Kami menggunakan database ini dalam mulai cepat ini.
  • Nama server yang dibuat secara otomatis, nama pengguna admin, kata sandi admin, nama grup sumber daya (jika belum ditentukan dalam konteks lokal), dan di lokasi yang sama dengan grup sumber daya Anda.
  • Menggunakan argumen akses publik memungkinkan Anda membuat server dengan akses publik ke 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

Memperbarui ALLOWED_HOSTS di settings.py untuk memastikan bahwa aplikasi Django menggunakan IP eksternal yang ditetapkan ke aplikasi kubernetes.

ALLOWED_HOSTS = ['*']

Memperbarui bagian DATABASES={ } dalam file settings.py. Cuplikan kode di bawah ini 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

Membuat file requirements.txt untuk membuat daftar dependensi untuk 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

Membuat file baru bernama Dockerfile dan menyalin cuplikan kode di bawah ini. Dockerfile ini dalam menyiapkan Python 3.8 dan memasang semua persyaratan yang tercantum dalam file persyaratan.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

Membuat citra

Pastikan Anda berada di direktori my-django-app di terminal menggunakan perintah cd. 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 dengan 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. Mari membuat file manifest bernama djangoapp.yaml dan menyalin dalam definisi YAML berikut.

Penting

Perbarui env bagian di bawah ini dengan YOUR-DATABASE-USERNAMESERVERNAMEYOUR-DATABASE-PASSWORD 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 menggunakan perintah kubectl applydan 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 django-app memungkinkan Anda untuk menjelaskan detail penyebaran Anda seperti gambar mana yang akan digunakan untuk aplikasi, jumlah pod, dan konfigurasi pod. Layanan python-svc dibuat 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 IP-EKSTERNAL untuk layanan aplikasi-django 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 menghentikankubectl proses melihat. Output contoh berikut menunjukkan alamat IP publik yang valid yang ditetapkan 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.

Catatan

  • 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 harus menjalankan migrasi database atau mengumpulkan file statik. Anda dapat menjalankan perintah shell django ini menggunakan $ kubectl exec <pod-name> -- [COMMAND]. Sebelum menjalankan perintah, Anda perlu menemukan nama pod 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 nama pod ditemukan, Anda dapat menjalankan migrasi database django dengan perintah $ kubectl exec <pod-name> -- [COMMAND]. Catatan /code/ adalah direktori kerja untuk proyek yang didefinisikan Dockerfile di atas.

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

Output akan terlihat seperti ini

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 oleh aplikasi Anda. Jika aplikasi berhasil bekerja, 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, Anda harus membersihkan sumber daya yang tidak diperlukan. Ketika kluster tidak lagi diperlukan, gunakan perintah hapus grup az untuk menghapus grup sumber daya, layanan kontainer, dan semua sumber daya terkait.

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

Catatan

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