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-create på platsen 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 regioneneastus
.
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
- Lär dig hur du kommer åt Kubernetes-webbinstrumentpanelen för ditt AKS-kluster
- Lär dig hur du aktiverar kontinuerlig distribution
- Lär dig hur du skalar klustret
- Lär dig hur du hanterar din flexibla Azure Database for PostgreSQL-serverinstans
- Lär dig hur du konfigurerar serverparametrar för databasservern.