Aracılığıyla paylaş


PostgreSQL için Azure Veritabanı ile Azure Kubernetes Service'te Django uygulaması dağıtma

Bu hızlı başlangıçta, Azure CLI kullanarak PostgreSQL için Azure Veritabanı esnek sunucusuyla Azure Kubernetes Service (AKS) kümesinde bir Django uygulaması dağıtacaksınız.

AKS , kümeleri hızla dağıtmak ve yönetmek için kullandığınız yönetilen bir Kubernetes hizmetidir. PostgreSQL için Azure Veritabanı esnek sunucu, veritabanı yönetimi işlevleri ve yapılandırma ayarları üzerinde daha ayrıntılı denetim ve esneklik sağlamak için tasarlanmış, tam olarak yönetilen bir veritabanı hizmetidir.

Uyarı

Bu hızlı başlangıçta Kubernetes kavramları, Django ve PostgreSQL hakkında temel bilgiler yer alır.

Önkoşullar

Azure hesabınız yoksa, başlamadan önce ücretsiz hesap oluşturun.

  • Azure Cloud Shell'i yeni tarayıcı penceresinde başlatın. Azure CLI'yi yerel makinenize de yükleyebilirsiniz. Yerel yükleme kullanıyorsanız az login komutunu kullanarak oturum açın. Kimlik doğrulama işlemini tamamlamak için, terminalinizde görüntülenen adımları takip edin.
  • Yüklü olan sürümü ve bağımlı kütüphaneleri bulmak için az version komutunu çalıştırın. En son sürüme yükseltmek için az upgrade komutunu çalıştırın. Bu makale, Azure CLI'nin en son sürümünü gerektirir. Azure Cloud Shell kullanıyorsanız en son sürüm zaten yüklüdür.

Bir kaynak grubu oluşturun

Azure kaynak grubu, Azure kaynaklarını dağıtıp yönettiğiniz mantıksal bir grupdur. eastuskonumundaki az-group-create komutunu kullanarak django-project adlı bir kaynak grubu oluşturun.

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

Uyarı

Kaynak grubunun konumu, kaynak grubu meta verilerini depolar. Ayrıca kaynak oluşturma sırasında başka bir bölge belirtmezseniz kaynaklarınızın Azure'da çalıştığı yerdir.

Aşağıdaki örnek çıktı, başarıyla oluşturulan kaynak grubunu gösterir:

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

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

AKS kümesi oluşturma

AKS kümesi oluşturmak için az aks create komutunu kullanın. Aşağıdaki örnek, tek düğümlü djangoappcluster adlı bir küme oluşturur. Kümenin oluşturulması birkaç dakika sürer.

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

Birkaç dakika sonra komut tamamlanıp kümeyle ilgili JSON biçimli bilgileri döndürür.

Uyarı

AKS kümesi oluştururken, komutu AKS kaynaklarını depolamak için otomatik olarak ikinci bir kaynak grubu oluşturur. Daha fazla bilgi için bkz. AKS ile neden iki kaynak grubu oluşturulur?

Kümeye bağlanma

Kubernetes kümesini yönetmek için Kubernetes komut satırı istemcisi kubectl’i kullanın. Azure Cloud Shell kullanıyorsanız zaten kubectl yüklüdür.

Uyarı

Azure CLI'yi yerel olarak çalıştırıyorsanız, yüklemek için az aks install-cli komutunu çalıştırın.

Kubernetes kümenize bağlanmak üzere kubectl'yi yapılandırmak için az aks get-credentials komutunu kullanın. Bu komut, kimlik bilgilerini indirir ve Kubernetes CLI'yi bunları kullanacak şekilde yapılandırır.

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

Kümenize bağlantıyı doğrulamak için kubectl get komutunu kullanarak küme düğümleri listesini alın.

kubectl get nodes

Aşağıdaki örnekte önceki adımlarda oluşturulan tek düğüm gösterilmiştir. Düğümün durumunun Hazır olduğundan emin olun:

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

Esnek sunucu örneği oluşturma

az postgreSQL flexible-server create komutuyla PostgreSQL için Azure Veritabanı esnek sunucu örneği oluşturun. Aşağıdaki komut, Azure CLI'nızın yerel bağlamındaki hizmet varsayılanlarını ve değerlerini kullanarak bir sunucu oluşturur:

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

Sunucu aşağıdaki özniteliklere sahiptir:

  • Sunucu ilk kez sağlandığında adlı postgres yeni bir boş veritabanı oluşturulur. Bu hızlı başlangıç postgres veritabanını kullanır.
  • Otomatik oluşturulan sunucu adı, yönetici kullanıcı adı, yönetici parolası, kaynak grubu adı (yerel bağlamda belirtmediyseniz) ve kaynak grubunuzla aynı konum.
  • Genel erişim bağımsız değişkenini kullanarak, doğru kullanıcı adı ve parolaya sahip herhangi bir istemci için genel erişime sahip bir sunucu oluşturursunuz.
  • Komut yerel bağlam kullandığından, sunucuyu kaynak grubunda django-project ve bölgesinde eastusoluşturur.

Django docker görüntünüzü oluşturma

Yeni bir Django uygulaması oluşturun veya mevcut Django projenizi kullanın. Kodunuzun bu klasör yapısında olduğundan emin olun.

└───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 öğesini settings.py içinde güncelleyin, böylece Django uygulamasının Kubernetes uygulamasına atanan dış IP'yi kullandığından emin olun.

ALLOWED_HOSTS = ['*']

Dosyadaki DATABASES={ } Güncelleştirme settings.py bölümü. Kod parçacığı Kubernetes bildirim dosyasından veritabanı ana bilgisayarını, kullanıcı adını ve parolayı okur.

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 dosyası oluşturma

Django uygulamasının bağımlılıklarını listelemek için bir requirements.txt dosya oluşturun. İşte örnek requirements.txt bir dosya. Pip freeze > requirements.txt kullanarak mevcut uygulamanız için bir requirements.txt dosyası oluşturabilirsiniz.

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

Dockerfile oluşturma

adlı Dockerfile yeni bir dosya oluşturun ve aşağıdaki kod parçacığını kopyalayın. Bu Dockerfile, Python 3.8'i ayarlar ve dosyada requirements.txt listelenen tüm gereksinimleri yükler.

# 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

Görüntünüzü oluşturma

komutunu kullanarak terminaldeki dizinde olduğunuzdan my-django-appcd emin olun. Bülten panosu görüntünüzü oluşturmak için aşağıdaki komutu çalıştırın:

docker build --tag myblog:latest .

Görüntünüzü Docker hub'ına veya Azure Container registry'ye dağıtın.

Önemli

Azure container registry (ACR) kullanıyorsanız ACR hesabını AKS kümesine eklemek için komutunu çalıştırın az aks update .

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

Kubernetes bildirim dosyası oluşturma

Kubernetes bildirim dosyası, küme için hangi kapsayıcı görüntülerinin çalıştırılması gibi istenen bir durumu tanımlar. adlı djangoapp.yaml bir bildirim dosyası oluşturun ve aşağıdaki YAML tanımında kopyalayın.

Önemli

env bölümünü, PostgreSQL için Azure Veritabanı esnek sunucu örneğinizin SERVERNAME, YOUR-DATABASE-USERNAME ve YOUR-DATABASE-PASSWORD değerleriyle güncelleyin.

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

AKS kümesine Django dağıtma

kubectl apply komutunu kullanarak uygulamayı dağıtın. YAML bildiriminizin adını belirtin:

kubectl apply -f djangoapp.yaml

Aşağıdaki örnek çıktıda başarıyla oluşturulan Dağıtımlar ve Hizmetler gösterilmektedir:

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

adlı django-app bir dağıtım, uygulama için hangi görüntülerin kullanılacağı, pod sayısı ve pod yapılandırması gibi dağıtımınızın ayrıntılarını açıklar. Uygulamayı dış IP üzerinden kullanıma açmak için adlı python-svc bir hizmet oluşturursunuz.

Uygulamayı test et

Uygulama çalıştığında, bir Kubernetes hizmeti uygulamanın ön yüzünü internete açar. Bu işlemin tamamlanması birkaç dakika sürebilir.

İlerleme durumunu izlemek için kubectl get service komutunu --watch bağımsız değişkeniyle birlikte kullanın.

kubectl get service python-svc --watch

Başlangıçta django-app hizmeti için EXTERNAL-IPbeklemede olarak gösterilir.

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

EXTERNAL-IP adresi beklemeden gerçek bir genel IP adresine değiştiğinde, CTRL-C izleme işlemini durdurmak için kullanın kubectl. Aşağıdaki örnek çıktıda hizmete atanmış geçerli bir genel IP adresi gösterilmektedir:

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

Şimdi hizmetinizin (http://<service-external-ip-address>) dış IP adresine bir web tarayıcısı açın ve Django uygulamasını görüntüleyin.

Uyarı

  • Şu anda Django sitesi HTTPS kullanmıyor. HTTPS ve AKS için uygulama yönlendirmeyi yapılandırma hakkında daha fazla bilgi için bkz . Uygulama yönlendirme eklentisiyle Yönetilen NGINX girişi.

Veritabanı geçişlerini çalıştırma

Herhangi bir Django uygulaması için bir veritabanı geçişi çalıştırmanız veya statik dosyaları toplamanız gerekir. Bu Django kabuk komutlarını $ kubectl exec <pod-name> -- [COMMAND] kullanarak çalıştırabilirsiniz. Komutu çalıştırmadan önce kubectl get pods kullanarak pod adını bulmanız gerekir.

$ kubectl get pods

Şuna benzer bir çıkış görürsünüz:

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

Pod adını bulduğunuzda komutuyla $ kubectl exec <pod-name> -- [COMMAND]Django veritabanı geçişlerini çalıştırın. /code/ yukarıdaki bölümde tanımlanan Dockerfile projenin çalışma dizinidir.

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

Çıktı şuna benzer:

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

Sorunlarla karşılaşırsanız, uygulamanızın hangi hatayı fırlattığını görmek için kubectl logs <pod-name> komutunu çalıştırın. Uygulama başarıyla çalışıyorsa, çalıştırırken kubectl logsşuna benzer bir çıkış görürsünüz.

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.

Kaynakları temizleme

Azure ücretlerinden kaçınmak için gereksiz kaynakları temizleyin. Kümeye artık ihtiyacınız kalmadığında az group delete komutunu kullanarak kaynak grubunu, kapsayıcı hizmetini ve tüm ilgili kaynakları kaldırın.

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

Uyarı

Kümeyi sildiğinizde AKS kümesinin kullandığı Microsoft Entra hizmet sorumlusu kaldırılmaz. Hizmet sorumlusunu kaldırma adımları için bkz. AKS hizmet sorumlusuyla ilgili önemli noktalar ve silme. Yönetilen kimlik kullanıyorsanız, platform kimliği yönetir ve kaldırılmasını gerektirmez.