Freigeben über


Bereitstellen einer Django-App auf Azure Kubernetes-Dienst mit Azure-Datenbank für PostgreSQL

In dieser Schnellstartanleitung stellen Sie eine Django-Anwendung im Azure Kubernetes Service (AKS)-Cluster mit Azure Database for PostgreSQL flexiblen Server mithilfe der Azure CLI bereit.

AKS ist ein verwalteter Kubernetes-Dienst, mit dem Sie Cluster schnell bereitstellen und verwalten können. Azure Database for PostgreSQL – Flexible Server ist ein vollständig verwalteter Datenbankdienst, der eine differenziertere Steuerung und mehr Flexibilität in Bezug auf Verwaltungsfunktionen und Konfigurationseinstellungen für Datenbanken bietet.

Hinweis

Für diese Schnellstartanleitung werden Grundkenntnisse von Kubernetes-Konzepten, Django und PostgreSQL vorausgesetzt.

Voraussetzungen

Wenn Sie nicht über ein Azure-Konto verfügen, erstellen Sie ein kostenloses Konto , bevor Sie beginnen.

  • Starten Sie Azure Cloud Shell in einem neuen Browserfenster. Sie können die Azure CLI auch auf Ihrem lokalen Computer installieren. Wenn Sie eine lokale Installation verwenden, melden Sie sich mit dem Az-Anmeldebefehl an. Um den Authentifizierungsprozess abzuschließen, führen Sie die schritte aus, die in Ihrem Terminal angezeigt werden.
  • Führen Sie az version aus, um die installierte Version und die abhängigen Bibliotheken zu ermitteln. Führen Sie az upgrade aus, um auf die neueste Version zu aktualisieren. Für diesen Artikel ist die aktuelle Azure CLI-Version erforderlich. Bei Verwendung von Azure Cloud Shell ist die aktuelle Version bereits installiert.

Erstellen einer Ressourcengruppe

Eine Azure-Ressourcengruppe ist eine logische Gruppe, in der Sie Azure-Ressourcen bereitstellen und verwalten. Erstellen Sie eine Ressourcengruppe namens django-project mithilfe des Befehls az-group-create im Standort eastus.

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

Hinweis

Der Speicherort für die Ressourcengruppe speichert die Ressourcengruppenmetadaten. Darüber hinaus werden dort Ihre Ressourcen in Azure ausgeführt, sofern Sie im Rahmen der Ressourcenerstellung keine andere Region angeben.

Die folgende Beispielausgabe zeigt, dass die Ressourcengruppe erfolgreich erstellt wurde:

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

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

Erstellen eines ACS-Clusters

Erstellen Sie mithilfe des Befehls az aks create einen AKS-Cluster. Im folgenden Beispiel wird ein Cluster mit dem Namen djangoappcluster mit einem Knoten erstellt. Die Erstellung des Clusters dauert einige Minuten.

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

Nach wenigen Minuten ist die Ausführung des Befehls abgeschlossen, und es werden Informationen zum Cluster im JSON-Format zurückgegeben.

Hinweis

Beim Erstellen eines AKS-Clusters erstellt der Befehl automatisch eine zweite Ressourcengruppe zum Speichern der AKS-Ressourcen. Weitere Informationen finden Sie unter Warum werden zwei Ressourcengruppen mit AKS erstellt?.

Herstellen einer Verbindung mit dem Cluster

Verwenden Sie zum Verwalten eines Kubernetes-Clusters den Kubernetes-Befehlszeilenclient kubectl. Bei Verwendung von Azure Cloud Shell ist kubectl bereits installiert.

Hinweis

Wenn Sie Azure CLI lokal ausführen, führen Sie den Az aks install-cli-Befehl aus, um es zu installieren kubectl.

Mit dem Befehl az aks get-credentials können Sie kubectl für die Verbindungsherstellung mit Ihrem Kubernetes-Cluster konfigurieren. Mit diesem Befehl werden die Anmeldeinformationen heruntergeladen, und die Kubernetes-Befehlszeilenschnittstelle wird für deren Verwendung konfiguriert.

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

Überprüfen Sie die Verbindung mit Ihrem Cluster mithilfe des Befehls kubectl get, um eine Liste der Clusterknoten zurückzugeben.

kubectl get nodes

In der folgenden Beispielausgabe wird der Knoten gezeigt, der in den vorherigen Schritten erstellt wurde. Vergewissern Sie sich, dass der Knoten den Status Bereit hat:

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

Erstellen einer flexiblen Serverinstanz

Erstellen Sie mithilfe des Befehls az postgreSQL flexible-server create eine Instanz von Azure Database for PostgreSQL – Flexible Server. Mit dem folgenden Befehl wird ein Server mit Dienststandards und -werten aus dem lokalen Kontext Ihrer Azure CLI erstellt:

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

Der Server verfügt über die folgenden Attribute:

  • Eine neue leere Datenbank mit dem Namen postgres wird erstellt, wenn der Server zum ersten Mal bereitgestellt wird. In dieser Schnellstartanleitung wird die postgres Datenbank verwendet.
  • Automatisch generierter Servername, Administratorbenutzername, Administratorkennwort, Ressourcengruppenname (wenn Sie ihn nicht bereits im lokalen Kontext angegeben haben) und denselben Speicherort wie Ihre Ressourcengruppe.
  • Mithilfe des Arguments für den öffentlichen Zugriff erstellen Sie einen Server mit öffentlichem Zugriff für jeden Client mit dem richtigen Benutzernamen und Kennwort.
  • Da der Befehl den lokalen Kontext verwendet, wird der Server in der Ressourcengruppe django-project und in der Region eastuserstellt.

Erstellen Ihres Django-Docker-Images

Erstellen Sie eine neue Django-Anwendung, oder verwenden Sie Ihr vorhandenes Django-Projekt. Stellen Sie sicher, dass sich der Code in dieser Ordnerstruktur befindet.

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

Aktualisieren Sie ALLOWED_HOSTS in settings.py, um sicherzustellen, dass die Django-Anwendung die externe IP verwendet, die der Kubernetes-Anwendung zugewiesen wird.

ALLOWED_HOSTS = ['*']

Aktualisieren Sie in der Datei DATABASES={ } den Abschnitt settings.py. Der Codeausschnitt liest den Datenbankhost, den Benutzernamen und das Kennwort aus der Kubernetes-Manifestdatei.

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'}
   }
}

Generieren der Datei „requirements.txt“

Erstellen Sie eine requirements.txt Datei zum Auflisten der Abhängigkeiten für die Django-Anwendung. Im Anschluss ist ein Beispiel für eine Datei vom Typ requirements.txt angegeben. Sie können pip freeze > requirements.txt verwenden, um die Datei „requirements.txt“ für Ihre vorhandene Anwendung zu generieren.

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

Dockerfile erstellen

Erstellen Sie eine neue Datei mit dem Namen Dockerfile , und kopieren Sie den folgenden Codeausschnitt. Diese Dockerfile richtet Python 3.8 ein und installiert alle in der requirements.txt Datei aufgeführten Anforderungen.

# 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

Erstellen Ihres Images

Stellen Sie sicher, dass Sie sich im my-django-app Verzeichnis in einem Terminal befinden, indem Sie den cd Befehl verwenden. Führen Sie den folgenden Befehl aus, um Ihr Bulletin Board-Image zu erstellen:

docker build --tag myblog:latest .

Stellen Sie Ihr Image in Docker Hub oder in Azure Container Registry bereit.

Von Bedeutung

Wenn Sie die Azure-Containerregistrierung (ACR) verwenden, führen Sie den az aks update Befehl aus, um das ACR-Konto an den AKS-Cluster anzufügen.

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

Erstellen einer Kubernetes-Manifestdatei

Eine Kubernetes-Manifestdatei definiert einen gewünschten Zustand (Desired State) für den Cluster – also beispielsweise, welche Containerimages ausgeführt werden sollen. Erstellen Sie eine Manifestdatei namens djangoapp.yaml und kopieren Sie sie in der folgenden YAML-Definition.

Von Bedeutung

Aktualisieren Sie den env Abschnitt mit Ihren SERVERNAME, YOUR-DATABASE-USERNAMEund YOUR-DATABASE-PASSWORD Werten für Ihre Azure-Datenbank für flexible Serverinstanz von 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

Bereitstellen von Django in einem AKS-Cluster

Stellen Sie die Anwendung mithilfe des Befehls "kubectl apply" bereit. Geben Sie den Namen Ihres YAML-Manifests an:

kubectl apply -f djangoapp.yaml

In der folgenden Beispielausgabe sind die erfolgreich erstellten Bereitstellungen und Dienste aufgeführt:

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

Eine Bereitstellung mit dem Namen django-app beschreibt Details Ihrer Bereitstellung, zum Beispiel welche Images für die App verwendet werden, die Anzahl der Pods und die Pod-Konfiguration. Sie erstellen einen Dienst mit dem Namen python-svc , um die Anwendung über eine externe IP verfügbar zu machen.

Testen der App

Wenn die Anwendung ausgeführt wird, macht ein Kubernetes-Dienst das Anwendungs-Front-End im Internet verfügbar. Dieser Vorgang kann einige Minuten dauern.

Verwenden Sie zum Überwachen des Fortschritts den Befehl kubectl get service mit dem Argument --watch.

kubectl get service python-svc --watch

Zu Beginn wird die EXTERNAL-IP für den django-app-Service als ausstehend angezeigt.

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

Sobald die externe IP-Adresse (EXTERNAL-IP) von pending (ausstehend) in eine tatsächliche öffentliche IP-Adresse geändert wurde, verwenden Sie CTRL-C, um die kubectl-Überwachung zu beenden. Die folgende Beispielausgabe zeigt eine gültige öffentliche IP-Adresse, die dem Dienst zugewiesen ist:

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

Öffnen Sie die externe IP-Adresse Ihres Diensts (http://<service-external-ip-address>) in einem Webbrowser, um die Django-Anwendung anzuzeigen.

Hinweis

Ausführen von Datenbankmigrationen

Für jede Django-Anwendung müssen Sie eine Datenbankmigration ausführen oder statische Dateien sammeln. Sie können diese Django-Shellbefehle mithilfe von $ kubectl exec <pod-name> -- [COMMAND] ausführen. Bevor Sie den Befehl ausführen, müssen Sie den Podnamen mithilfe von kubectl get pods ermitteln.

$ kubectl get pods

Eine Ausgabe wie die folgende sollte angezeigt werden:

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

Nachdem Sie den Podnamen gefunden haben, führen Sie Django-Datenbankmigrationen mit dem Befehl $ kubectl exec <pod-name> -- [COMMAND]aus. /code/ ist das Arbeitsverzeichnis für das im Dockerfile abschnitt oben definierte Projekt.

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

Die Ausgabe sieht wie folgt aus:

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

Wenn Probleme auftreten, führen Sie kubectl logs <pod-name> aus, um zu sehen, welche Ausnahme Ihre Anwendung auslöst. Wenn die Anwendung erfolgreich funktioniert, wird beim Ausführen eine Ausgabe wie diese angezeigt 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.

Bereinigen der Ressourcen

Um Azure-Gebühren zu vermeiden, bereinigen Sie nicht benötigte Ressourcen. Wenn Sie den Cluster nicht mehr benötigen, verwenden Sie den Befehl " az group delete ", um die Ressourcengruppe, den Containerdienst und alle zugehörigen Ressourcen zu entfernen.

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

Hinweis

Wenn Sie den Cluster löschen, wird der Microsoft Entra-Dienstprinzipal, den der AKS-Cluster verwendet, nicht entfernt. Schritte zum Entfernen des Dienstprinzipals finden Sie unter den Überlegungen zum AKS-Dienstprinzipal und dessen Löschung. Wenn Sie eine verwaltete Identität verwenden, verwaltet die Plattform die Identität und erfordert keine Entfernung.