Aracılığıyla paylaş


Öğretici: PostgreSQL için Azure Veritabanı - Esnek Sunucu ile AKS'de Django uygulaması dağıtma

ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Veritabanı - Esnek Sunucu

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

AKS , kümeleri hızla dağıtmanıza ve yönetmenize olanak tanıyan 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.

Not

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

Önkoşullar

Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı 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 Azure CLI ile oturum açın . Kimlik doğrulama işlemini tamamlamak için terminalinizde görüntülenen adımları izleyin.
  • Yüklü sürümü ve bağımlı kitaplıkları 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.

Kaynak grubu oluşturma

Azure kaynak grubu, Azure kaynaklarının dağıtıldığı ve yönetildiği mantıksal bir gruptur. Şimdi eastus konumundaki az-group-create komutunu kullanarak django-project adlı bir kaynak grubu oluşturalım.

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

Not

Kaynak grubunun konumu, kaynak grubu meta verilerinin depolandığı yerdir. 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.

Not

AKS kümesi oluştururken AKS kaynaklarını depolamak için otomatik olarak ikinci bir kaynak grubu oluşturulur. 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 kullanırsınız. Azure Cloud Shell kullanıyorsanız zaten kubectl yüklüdür.

Not

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

kubectl istemcisini Kubernetes kümenize bağlanacak şekilde 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ırmaktadı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

PostgreSQL için Azure Veritabanı 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

Oluşturulan sunucu aşağıdaki özniteliklere sahiptir:

  • Sunucu ilk kez sağlandığında yeni bir boş veritabanı postgres oluşturulur. Bu hızlı başlangıçta bu veritabanını kullanacağız.
  • Otomatik oluşturulan sunucu adı, yönetici kullanıcı adı, yönetici parolası, kaynak grubu adı (yerel bağlamda belirtilmemişse) ve kaynak grubunuzla aynı konumda.
  • Genel erişim bağımsız değişkenini kullanmak, doğru kullanıcı adı ve parola ile herhangi bir istemciye genel erişime sahip bir sunucu oluşturmanıza olanak tanır.
  • 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

settings.py Django uygulamasının kubernetes uygulamasına atanan dış IP'yi kullandığından emin olmak için uygulamasını güncelleştirinALLOWED_HOSTS.

ALLOWED_HOSTS = ['*']

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

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. Python 3.8'i ayarlama ve requirements.txt dosyasında listelenen tüm gereksinimleri yükleme işlemindeki bu Dockerfile.

# 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 my-django-app olduğunuzdan cd 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 AKS kümesine ACR hesabı 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şturalım ve aşağıdaki YAML tanımında kopyalayalım.

Önemli

Aşağıdaki bölümü, PostgreSQL için Azure Veritabanı esnek sunucu örneğinizin , YOUR-DATABASE-USERNAMEYOUR-DATABASE-PASSWORD ile SERVERNAMEgüncelleştirinenv.

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

Dağıtım django-app , 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çıklamanıza olanak tanır. Uygulamayı bir dış IP üzerinden kullanıma açmak için bir hizmet python-svc oluşturulur.

Uygulamayı test etme

Uygulama çalıştırıldığında Kubernetes hizmeti, uygulamanın ön ucunu İnternet'te kullanıma sunar. 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-IP beklemede 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 kubectl izleme işlemini durdurmak için kullanınCTRL-C. 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.

Not

  • Ş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 veritabanı geçişi çalıştırmanız veya statik dosyaları toplamanız gerekir. kullanarak bu django kabuk komutlarını $ kubectl exec <pod-name> -- [COMMAND]çalıştırabilirsiniz. komutunu çalıştırmadan önce kullanarak pod adını kubectl get podsbulmanı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ı bulunduktan sonra komutuyla $ kubectl exec <pod-name> -- [COMMAND]django veritabanı geçişlerini çalıştırabilirsiniz. Not /code/ , yukarıda belirtilen Dockerfile projenin çalışma dizinidir.

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

Çıkış şöyle görünür:

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 tarafından hangi özel durumun oluştuğuna bakmak için komutunu çalıştırın kubectl logs <pod-name> . 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ı temizlemeniz gerekir. Kümeye artık ihtiyacınız yoksa az group delete komutunu kullanarak kaynak grubunu, kapsayıcı hizmetini ve ilgili tüm kaynakları kaldırın.

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

Not

Kümeyi sildiğinizde AKS kümesi tarafından kullanılan 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 kullandıysanız, kimlik platform tarafından yönetilir ve kaldırılması gerekmez.