Dela via


Distribuera en Django-app i Azure Kubernetes Service med Azure Database for PostgreSQL

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 du använder för att snabbt 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.

Anmärkning

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 något Azure-konto skapar du ett kostnadsfritt 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 kommandot az login . För att avsluta autentiseringsprocessen, följ stegen som visas i din terminal.
  • Kör az version för att ta reda på 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 du distribuerar och hanterar Azure-resurser. Skapa en resursgrupp med namnet django-project med kommandot az-group-create på platsen eastus .

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

Anmärkning

Platsen för resursgruppen lagrar resursgruppens metadata. Det är också där dina resurser körs i Azure om du inte anger någon annan region när du skapar resurser.

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

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.

Anmärkning

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

Anslut till klustret

Hantera Kubernetes-kluster med kubectl, Kubernetes kommandoradsklient. Om du använder Azure Cloud Shell är kubectl redan installerat.

Anmärkning

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 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 har följande attribut:

  • En ny tom databas med namnet postgres skapas när servern först etableras. Den här snabbstarten använder postgres-databasen.
  • Automatiskt genererat servernamn, administratörsanvändarnamn, administratörslösenord, resursgruppsnamn (om du inte redan har angett det i lokal kontext) och samma plats som resursgruppen.
  • Genom att använda argumentet offentlig åtkomst skapar du en server med offentlig åtkomst för 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 läser databasvärd, 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 följande kodfragment. Den här Dockerfile konfigurerar Python 3.8 och installerar alla krav som anges i requirements.txt filen.

# 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 my-django-app katalogen i en terminal, med hjälp av cd kommandot. 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. Skapa en manifestfil med namnet djangoapp.yaml och kopiera i följande YAML-definition.

Viktigt!

Uppdatera env-avsnittet med dina SERVERNAME, YOUR-DATABASE-USERNAME, och YOUR-DATABASE-PASSWORD-värden för din flexibla serverinstans i din Azure Database for 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

Distribuera Django till AKS-kluster

Distribuera programmet med hjälp av kommandot kubectl apply . Ange namnet på YAML-manifestet:

kubectl apply -f djangoapp.yaml

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

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

En distribution med namnet django-app beskriver information om din distribution, till exempel vilka avbildningar som ska användas för appen, antalet poddar och poddkonfigurationen. Du skapar en tjänst med namnet python-svc 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 till 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.

Anmärkning

  • 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 måste du köra en databasmigrering eller samla in statiska filer. Du kan köra dessa Django Shell-kommandon med hjälp av $ kubectl exec <pod-name> -- [COMMAND]. Innan du kör kommandot måste du hitta poddnamnet med hjälp kubectl get podsav .

$ 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 du hittar poddnamnet kör du Django-databasmigreringar med kommandot $ kubectl exec <pod-name> -- [COMMAND]. /code/ är arbetskatalogen för projektet som definierats i Dockerfile avsnittet ovan.

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

Utdata ser ut så hä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
  . . . . . .

Om du stöter på problem kan du köra kubectl logs <pod-name> för att se vilket undantag programmet genererar. Om programmet fungerar visas utdata som dessa 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

Rensa onödiga resurser för att undvika Azure-avgifter. När du inte längre behöver klustret använder du 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

Anmärkning

När du tar bort klustret tas inte tjänstehuvudnamnet för Microsoft Entra, som AKS-klustret använder, 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änder en hanterad identitet hanterar plattformen identiteten och kräver inte borttagning.