Dela via


Självstudie: Distribuera Django-appen på AKS med Azure Database for PostgreSQL – flexibel server

GÄLLER FÖR: Azure Database for PostgreSQL – flexibel server

I den här snabbstarten distribuerar du ett Django-program i AKS-kluster (Azure Kubernetes Service) med azure database for PostgreSQL – flexibel server med hjälp av Azure CLI.

AKS är en hanterad Kubernetes-tjänst som gör att du snabbt kan distribuera och hantera kluster. Azure Database for PostgreSQL – flexibel server är en fullständigt hanterad databastjänst som är utformad för att ge mer detaljerad kontroll och flexibilitet när det gäller databashanteringsfunktioner och konfigurationsinställningar.

Kommentar

Den här snabbstarten förutsätter en grundläggande förståelse av Kubernetes-begrepp, Django och PostgreSQL.

Förutsättningar

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

  • Starta Azure Cloud Shell i ett nytt webbläsarfönster. Du kan också installera Azure CLI på den lokala datorn. Om du använder en lokal installation loggar du in med Azure CLI med kommandot az login . Slutför autentiseringsprocessen genom att följa stegen som visas i terminalen.
  • Kör az version om du vill hitta versionen och de beroende bibliotek som är installerade. Om du vill uppgradera till den senaste versionen kör du az upgrade. Den här artikeln kräver den senaste versionen av Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad.

Skapa en resursgrupp

En Azure-resursgrupp är en logisk grupp där Azure-resurser distribueras och hanteras. Nu ska vi skapa en resursgrupp, django-project med kommandot az-group-createplatsen eastus .

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

Kommentar

Platsen för resursgruppen är platsen där resursgruppsmetadata lagras. Det är också där dina resurser körs i Azure om du inte anger någon annan region när resursen skapas.

Följande exempelutdata visar den resursgrupp som skapats:

{
  "id": "/subscriptions/<guid>/resourceGroups/django-project",
  "location": "eastus",
  "managedBy": null,
  
  "name": "django-project",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Skapa AKS-kluster

Använd kommandot az aks create för att skapa ett AKS-kluster. I följande exempel skapas ett kluster med namnet djangoappcluster med en nod. Det tar flera minuter att slutföra.

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

Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

Kommentar

När du skapar ett AKS-kluster skapas en andra resursgrupp automatiskt för att lagra AKS-resurserna. Se Varför skapas två resursgrupper med AKS?

Anslut till klustret

För att hantera Kubernetes-kluster använder du kubectl, Kubernetes kommandoradsklient. Om du använder Azure Cloud Shell är kubectl redan installerat.

Kommentar

Om du kör Azure CLI lokalt kör du kommandot az aks install-cli för att installera kubectl.

För att konfigurera kubectl till att ansluta till ditt Kubernetes-kluster använder du kommandot az aks get-credentials. Det här kommandot laddar ned autentiseringsuppgifter och konfigurerar Kubernetes CLI för att använda dem.

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

Du kan kontrollera anslutningen till klustret genom att köra kommandot kubectl get för att returnera en lista över klusternoderna.

kubectl get nodes

Följande exempelutdata visar den enskilda nod som skapades i föregående steg. Kontrollera att status för noden är Klar:

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

Skapa en flexibel Azure Database for PostgreSQL-serverinstans

Skapa en flexibel Azure Database for PostgreSQL-serverinstans med kommandot az postgreSQL flexible-server create . Följande kommando skapar en server med tjänstens standardvärden och värden från azure CLI:s lokala kontext:

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

Servern som skapades har följande attribut:

  • En ny tom databas postgres skapas när servern först etableras. I den här snabbstarten använder vi den här databasen.
  • Automatiskt genererat servernamn, administratörsanvändarnamn, administratörslösenord, resursgruppsnamn (om det inte redan har angetts i lokal kontext) och på samma plats som resursgruppen.
  • Med argumentet offentlig åtkomst kan du skapa en server med offentlig åtkomst till alla klienter med rätt användarnamn och lösenord.
  • Eftersom kommandot använder lokal kontext skapas servern i resursgruppen django-project och i regionen eastus.

Skapa din Django Docker-avbildning

Skapa ett nytt Django-program eller använd ditt befintliga Django-projekt. Kontrollera att koden finns i den här mappstrukturen.

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

Uppdatera ALLOWED_HOSTS i settings.py för att se till att Django-programmet använder den externa IP-adress som tilldelas kubernetes-appen.

ALLOWED_HOSTS = ['*']

Uppdatera DATABASES={ } avsnittet i settings.py filen. Kodfragmentet nedan läser databasvärden, användarnamnet och lösenordet från Kubernetes-manifestfilen.

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

Generera en requirements.txt fil

Skapa en requirements.txt fil för att visa en lista över beroenden för Django-programmet. Här är en exempelfil requirements.txt . Du kan använda pip freeze > requirements.txt för att generera en requirements.txt fil för ditt befintliga program.

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

Hur du skapar en Dockerfile

Skapa en ny fil med namnet Dockerfile och kopiera kodfragmentet nedan. Den här Dockerfile när du konfigurerar Python 3.8 och installerar alla krav som anges i requirements.txt fil.

# 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

Skapa avbildningen

Kontrollera att du är i katalogen my-django-app i en terminal med kommandot cd . Kör följande kommando för att skapa avbildningen av anslagstavlan:

docker build --tag myblog:latest .

Distribuera avbildningen till Docker Hub eller Azure Container Registry.

Viktigt!

Om du använder Azure Container Registry (ACR) kör az aks update du kommandot för att koppla ACR-kontot till AKS-klustret.

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

Skapa Kubernetes-manifestfil

En Kubernetes-manifestfil definierar ett önskat tillstånd för klustret, till exempel vilka containeravbildningar som ska köras. Nu ska vi skapa en manifestfil med namnet djangoapp.yaml och kopiera i följande YAML-definition.

Viktigt!

Uppdatera env avsnittet nedan med din SERVERNAME, YOUR-DATABASE-USERNAME, YOUR-DATABASE-PASSWORD för din flexibla Azure Database for PostgreSQL-serverinstans.

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

Distribuera Django till AKS-kluster

Distribuera programmet med kommandot kubectl apply och ange namnet på ditt YAML-manifest:

kubectl apply -f djangoapp.yaml

Följande exempelutdata visar de distributioner och tjänster som skapats:

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

Med en distribution django-app kan du beskriva information om distributionen, till exempel vilka avbildningar som ska användas för appen, antalet poddar och poddkonfigurationen. En tjänst python-svc skapas för att exponera programmet via en extern IP-adress.

Testa programmet

När programmet körs så exponerar en Kubernetes-tjänst programmets klientdel mot Internet. Den här processen kan ta ett par minuter att slutföra.

Du kan övervaka förloppet genom att använda kommandot kubectl get service med argumentet --watch.

kubectl get service python-svc --watch

Initialt visas EXTERNAL-IP för django-app-tjänsten som väntande.

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

När EXTERNAL-IP-adressen ändras från väntande till en faktisk offentlig IP-adress använder du CTRL-C för att stoppa kubectl-övervakningsprocessen. Följande exempelutdata visar en giltig offentlig IP-adress som har tilldelats tjänsten:

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

Öppna nu en webbläsare till den externa IP-adressen för din tjänst (http://<service-external-ip-address>) och visa Django-programmet.

Kommentar

  • Django-webbplatsen använder för närvarande inte HTTPS. Mer information om HTTPS och hur du konfigurerar programroutning för AKS finns i Hanterad NGINX-ingress med tillägget för programroutning.

Köra databasmigreringar

För alla django-program skulle du behöva köra databasmigrering eller samla in statiska filer. Du kan köra dessa django shell-kommandon med .$ kubectl exec <pod-name> -- [COMMAND] Innan du kör kommandot måste du hitta poddnamnet med hjälp av kubectl get pods.

$ kubectl get pods

Du ser utdata så här:

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

När poddnamnet har hittats kan du köra django-databasmigreringar med kommandot $ kubectl exec <pod-name> -- [COMMAND]. Obs! /code/ är arbetskatalogen för projektet som definieras ovan Dockerfile .

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

Utdata skulle se ut som

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

Om du stöter på problem kan du köra kubectl logs <pod-name> för att se vilket undantag som genereras av ditt program. Om programmet fungerar skulle du se utdata som detta när du kör 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.

Rensa resurserna

För att undvika Azure-avgifter bör du rensa onödiga resurser. När klustret inte längre behövs kan du använda kommandot az group delete för att ta bort resursgruppen, containertjänsten och alla relaterade resurser.

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

Kommentar

När du tar bort klustret tas inte microsoft Entra-tjänstens huvudnamn som används av AKS-klustret bort. Stegvisa instruktioner om hur du tar bort tjänstens huvudnamn finns i dokumentationen om viktiga överväganden och borttagning av AKS-tjänsten. Om du använde en hanterad identitet hanteras identiteten av plattformen och kräver inte borttagning.

Nästa steg