Samouczek: wdrażanie aplikacji Django w usłudze AKS przy użyciu usługi Azure Database for PostgreSQL — serwer elastyczny
DOTYCZY: Azure Database for PostgreSQL — serwer elastyczny
W tym przewodniku Szybki start wdrożysz aplikację Django w klastrze usługi Azure Kubernetes Service (AKS) przy użyciu elastycznego serwera usługi Azure Database for PostgreSQL przy użyciu interfejsu wiersza polecenia platformy Azure.
Usługa AKS to zarządzana usługa Kubernetes, która umożliwia szybkie wdrażanie klastrów i zarządzanie nimi. Serwer elastyczny usługi Azure Database for PostgreSQL to w pełni zarządzana usługa bazy danych, która zapewnia bardziej szczegółową kontrolę i elastyczność funkcji zarządzania bazami danych i ustawień konfiguracji.
Uwaga
W tym przewodniku Szybki start założono podstawową wiedzę na temat pojęć związanych z platformą Kubernetes, Django i PostgreSQL.
Wymagania wstępne
Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.
- Uruchom usługę Azure Cloud Shell w nowym oknie przeglądarki. Możesz też zainstalować interfejs wiersza polecenia platformy Azure na komputerze lokalnym. Jeśli używasz instalacji lokalnej, zaloguj się przy użyciu interfejsu wiersza polecenia platformy Azure przy użyciu polecenia az login . Aby ukończyć proces uwierzytelniania, wykonaj kroki wyświetlane w terminalu.
- Uruchom polecenie az version, aby znaleźć zainstalowane wersje i biblioteki zależne. Aby uaktualnić do najnowszej wersji, uruchom polecenie az upgrade. Ten artykuł wymaga najnowszej wersji interfejsu wiersza polecenia platformy Azure. Jeśli używasz usługi Azure Cloud Shell, najnowsza wersja jest już zainstalowana.
Tworzenie grupy zasobów
Grupa zasobów platformy Azure to logiczna grupa przeznaczona do wdrażania zasobów platformy Azure i zarządzania nimi. Utwórzmy grupę zasobów django-project przy użyciu polecenia az-group-create w lokalizacji eastus.
az group create --name django-project --location eastus
Uwaga
Lokalizacja grupy zasobów to miejsce przechowywania metadanych grupy zasobów. Jest to również miejsce, w którym zasoby są uruchamiane na platformie Azure, jeśli nie określisz innego regionu podczas tworzenia zasobów.
Następujące przykładowe dane wyjściowe przedstawiają pomyślnie utworzoną grupę zasobów:
{
"id": "/subscriptions/<guid>/resourceGroups/django-project",
"location": "eastus",
"managedBy": null,
"name": "django-project",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
Tworzenie klastra AKS
Utwórz klaster AKS za pomocą polecenia az aks create. Poniższy przykład tworzy klaster o nazwie djangoappcluster z jednym węzłem. Ukończenie tego procesu potrwa kilka minut.
az aks create --resource-group django-project --name djangoappcluster --node-count 1 --generate-ssh-keys
Po kilku minutach polecenie zostanie wykonane i zwróci informacje o klastrze w formacie JSON.
Uwaga
Podczas tworzenia klastra usługi AKS druga grupa zasobów jest tworzona automatycznie w celu przechowywania zasobów usługi AKS. Zobacz Dlaczego dwie grupy zasobów są tworzone za pomocą usługi AKS?
Łączenie z klastrem
Aby zarządzać klastrem Kubernetes, należy użyć klienta wiersza polecenia usługi Kubernetes — narzędzia kubectl. Jeśli korzystasz z usługi Azure Cloud Shell, narzędzie kubectl
jest już zainstalowane.
Uwaga
W przypadku lokalnego uruchamiania interfejsu wiersza polecenia platformy Azure uruchom polecenie az aks install-cli , aby zainstalować polecenie kubectl
.
Aby skonfigurować narzędzie kubectl
w celu nawiązania połączenia z klastrem Kubernetes, użyj polecenia az aks get-credentials. To polecenie powoduje pobranie poświadczeń i zastosowanie ich w konfiguracji interfejsu wiersza polecenia Kubernetes.
az aks get-credentials --resource-group django-project --name djangoappcluster
Aby sprawdzić połączenie z klastrem, użyj polecenia kubectl get, aby powrócić do listy węzłów klastra.
kubectl get nodes
Poniższe przykładowe dane wyjściowe zawierają jeden węzeł utworzony w poprzednich krokach. Upewnij się, że stan węzła to Gotowy:
NAME STATUS ROLES AGE VERSION
aks-nodepool1-31718369-0 Ready agent 6m44s v1.12.8
Tworzenie wystąpienia serwera elastycznego usługi Azure Database for PostgreSQL
Utwórz wystąpienie serwera elastycznego usługi Azure Database for PostgreSQL za pomocą polecenia az postgreSQL flexible-server create . Następujące polecenie tworzy serwer przy użyciu wartości domyślnych i wartości usługi z lokalnego kontekstu interfejsu wiersza polecenia platformy Azure:
az postgres flexible-server create --public-access all
Utworzony serwer ma następujące atrybuty:
- Nowa pusta baza danych
postgres
jest tworzona podczas pierwszej aprowizacji serwera. W tym przewodniku Szybki start użyjemy tej bazy danych. - Automatycznie wygenerowana nazwa serwera, nazwa użytkownika administratora, hasło administratora, nazwa grupy zasobów (jeśli nie została jeszcze określona w kontekście lokalnym) i w tej samej lokalizacji co grupa zasobów.
- Użycie argumentu dostępu publicznego umożliwia utworzenie serwera z publicznym dostępem do dowolnego klienta z poprawną nazwą użytkownika i hasłem.
- Ponieważ polecenie używa kontekstu lokalnego, tworzy serwer w grupie
django-project
zasobów i w regionieeastus
.
Kompilowanie obrazu platformy Docker Django
Utwórz nową aplikację Django lub użyj istniejącego projektu Django. Upewnij się, że kod znajduje się w tej strukturze folderów.
└───my-djangoapp
└───views.py
└───models.py
└───forms.py
├───templates
. . . . . . .
├───static
. . . . . . .
└───my-django-project
└───settings.py
└───urls.py
└───wsgi.py
. . . . . . .
└─── Dockerfile
└─── requirements.txt
└─── manage.py
Zaktualizuj ALLOWED_HOSTS
usługę , settings.py
aby upewnić się, że aplikacja Django używa zewnętrznego adresu IP, który zostanie przypisany do aplikacji kubernetes.
ALLOWED_HOSTS = ['*']
Zaktualizuj DATABASES={ }
sekcję settings.py
w pliku. Poniższy fragment kodu odczytuje hosta bazy danych, nazwę użytkownika i hasło z pliku manifestu platformy Kubernetes.
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'}
}
}
Generowanie pliku requirements.txt
Utwórz plik, requirements.txt
aby wyświetlić listę zależności dla aplikacji Django. Oto przykładowy requirements.txt
plik. Aby wygenerować plik requirements.txt dla istniejącej aplikacji, można użyć funkcji freeze > requirements.txt .
Django==2.2.17
postgres==3.0.0
psycopg2-binary==2.8.6
psycopg2-pool==1.1
pytz==2020.4
Tworzenie pliku Dockerfile
Utwórz nowy plik o nazwie Dockerfile
i skopiuj poniższy fragment kodu. Ten plik Dockerfile podczas konfigurowania środowiska Python 3.8 i instalowania wszystkich wymagań wymienionych w pliku requirements.txt.
# 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
Kompilowanie obrazu
Upewnij się, że jesteś w katalogu my-django-app
w terminalu cd
przy użyciu polecenia . Uruchom następujące polecenie, aby skompilować obraz tablicy biuletynu:
docker build --tag myblog:latest .
Wdróż obraz w usłudze Docker Hub lub Azure Container Registry.
Ważne
Jeśli używasz usługi Azure Container Registry (ACR), uruchom az aks update
polecenie , aby dołączyć konto usługi ACR z klastrem usługi AKS.
az aks update --name djangoappcluster --resource-group django-project --attach-acr <your-acr-name>
Tworzenie pliku manifestu platformy Kubernetes
Plik manifestu platformy Kubernetes definiuje żądany stan klastra, w tym informacje o obrazach kontenera do uruchomienia. Utwórzmy plik manifestu o nazwie djangoapp.yaml
i skopiujmy w poniższej definicji YAML.
Ważne
Zaktualizuj poniższą sekcję env
za pomocą polecenia SERVERNAME
, YOUR-DATABASE-USERNAME
YOUR-DATABASE-PASSWORD
z wystąpienia elastycznego serwera usługi 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
Wdrażanie rozwiązania Django w klastrze usługi AKS
Wdróż aplikację przy użyciu polecenia kubectl apply i podaj nazwę manifestu YAML:
kubectl apply -f djangoapp.yaml
Następujące przykładowe dane wyjściowe przedstawiają pomyślnie utworzone wdrożenia i usługi:
deployment "django-app" created
service "python-svc" created
Wdrożenie django-app
umożliwia opis szczegółów wdrożenia, takich jak obrazy do użycia w aplikacji, liczba zasobników i konfiguracja zasobnika. Usługa python-svc
jest tworzona w celu uwidocznienia aplikacji za pośrednictwem zewnętrznego adresu IP.
Testowanie aplikacji
Podczas uruchamiania aplikacji usługa Kubernetes uwidacznia fronton aplikacji w Internecie. Ten proces może potrwać kilka minut.
Aby monitorować postęp, użyj polecenia kubectl get-service z argumentem --watch
.
kubectl get service python-svc --watch
Początkowo adres EXTERNAL-IP dla usługi django-app service jest wyświetlany jako oczekujący.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
django-app LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
Gdy dla adresu EXTERNAL-IP wartość oczekujący zmieni się na rzeczywisty publiczny adres IP, naciśnij klawisze CTRL-C
, aby zatrzymać proces śledzenia narzędzia kubectl
. Następujące przykładowe dane wyjściowe przedstawiają prawidłowy publiczny adres IP przypisany do usługi:
django-app LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2m
Teraz otwórz przeglądarkę internetową pod zewnętrznym adresem IP usługi (http://<service-external-ip-address>
) i wyświetl aplikację Django.
Uwaga
- Obecnie witryna Django nie korzysta z protokołu HTTPS. Aby uzyskać więcej informacji na temat protokołu HTTPS i sposobu konfigurowania routingu aplikacji dla usługi AKS, zobacz Temat Managed NGINX ingress with the application routing add-on (Zarządzana ruch przychodzący NGINX z dodatkiem routingu aplikacji).
Uruchamianie migracji bazy danych
W przypadku dowolnej aplikacji django należy uruchomić migrację bazy danych lub zebrać pliki statyczne. Te polecenia powłoki django można uruchomić przy użyciu polecenia $ kubectl exec <pod-name> -- [COMMAND]
. Przed uruchomieniem polecenia należy znaleźć nazwę zasobnika przy użyciu polecenia kubectl get pods
.
$ kubectl get pods
Zobaczysz dane wyjściowe podobne do następujących:
NAME READY STATUS RESTARTS AGE
django-app-5d9cd6cd8-l6x4b 1/1 Running 0 2m
Po znalezieniu nazwy zasobnika można uruchomić migracje baz danych django za pomocą polecenia $ kubectl exec <pod-name> -- [COMMAND]
. Zwróć uwagę /code/
, że katalog roboczy projektu definiuje się powyżej Dockerfile
.
$ kubectl exec django-app-5d9cd6cd8-l6x4b -- python /code/manage.py migrate
Dane wyjściowe będą wyglądać następująco:
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
. . . . . .
Jeśli wystąpią problemy, uruchom polecenie kubectl logs <pod-name>
, aby zobaczyć, jaki wyjątek jest zgłaszany przez aplikację. Jeśli aplikacja działa pomyślnie, podczas uruchamiania polecenia zobaczysz dane wyjściowe podobne do tych 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.
Oczyszczanie zasobów
Aby uniknąć opłat za platformę Azure, należy wyczyścić niepotrzebne zasoby. Gdy klaster nie będzie już potrzebny, usuń grupę zasobów, usługę kontenera i wszystkie pokrewne zasoby za pomocą polecenia az group delete.
az group delete --name django-project --yes --no-wait
Uwaga
Po usunięciu klastra jednostka usługi Microsoft Entra używana przez klaster usługi AKS nie zostanie usunięta. Aby sprawdzić, jak usunąć jednostkę usługi, zobacz AKS service principal considerations and deletion (Uwagi dotyczące jednostki usługi AKS i jej usuwanie). Jeśli użyto tożsamości zarządzanej, tożsamość jest zarządzana przez platformę i nie wymaga usunięcia.
Następne kroki
- Dowiedz się, jak uzyskać dostęp do internetowego pulpitu nawigacyjnego platformy Kubernetes dla klastra usługi AKS
- Dowiedz się, jak włączyć ciągłe wdrażanie
- Dowiedz się, jak skalować klaster
- Dowiedz się, jak zarządzać wystąpieniem serwera elastycznego usługi Azure Database for PostgreSQL
- Dowiedz się, jak skonfigurować parametry serwera dla serwera bazy danych.