Kurz: Nasazení aplikace Django v AKS pomocí flexibilního serveru Azure Database for PostgreSQL

PLATÍ PRO: Flexibilní server Azure Database for PostgreSQL

V tomto rychlém startu nasadíte aplikaci Django do clusteru Azure Kubernetes Service (AKS) s flexibilním serverem Azure Database for PostgreSQL pomocí Azure CLI.

AKS je spravovaná služba Kubernetes, která umožňuje rychle nasazovat a spravovat clustery. Flexibilní server Azure Database for PostgreSQL je plně spravovaná databázová služba navržená tak, aby poskytovala podrobnější kontrolu a flexibilitu nad funkcemi správy databází a nastavením konfigurace.

Poznámka:

V tomto rychlém startu se předpokládá základní znalost konceptů Kubernetes, Django a PostgreSQL.

Požadavky

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet Azure před tím, než začnete.

  • Spusťte Azure Cloud Shell v novém okně prohlížeče. Azure CLI můžete nainstalovat i na místní počítač. Pokud používáte místní instalaci, přihlaste se pomocí Azure CLI pomocí příkazu az login . Pokud chcete dokončit proces ověřování, postupujte podle kroků zobrazených na terminálu.
  • Spuštěním příkazu az version zjistěte verzi a závislé knihovny, které jsou nainstalované. Pokud chcete upgradovat na nejnovější verzi, spusťte az upgrade. Tento článek vyžaduje nejnovější verzi Azure CLI. Pokud používáte Azure Cloud Shell, je už nainstalovaná nejnovější verze.

Vytvoření skupiny zdrojů

Skupina prostředků Azure je logická skupina, ve které se nasazují a spravují prostředky Azure. Pojďme vytvořit skupinu prostředků django-project pomocí příkazu az-group-create v umístění eastus.

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

Poznámka:

Umístění skupiny prostředků je místo, kde jsou uložena metadata skupiny prostředků. Pokud během vytváření prostředků nezadáte jinou oblast, je to také místo, kde se vaše prostředky spouštějí v Azure.

Následující příklad výstupu ukazuje, že skupina prostředků byla úspěšně vytvořena:

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

Vytvoření clusteru AKS

Pomocí příkazu az aks create vytvořte cluster AKS. Následující příklad vytvoří cluster s názvem djangoappcluster s jedním uzlem. Dokončení bude trvat několik minut.

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

Po několika minutách se příkaz dokončí a vrátí informace o clusteru ve formátu JSON.

Poznámka:

Při vytváření clusteru AKS se automaticky vytvoří druhá skupina prostředků pro uložení prostředků AKS. Přečtěte si, proč se v AKS vytvářejí dvě skupiny prostředků?

Připojení ke clusteru

Ke správě clusteru Kubernetes použijete klienta příkazového řádku Kubernetes kubectl. Pokud používáte Azure Cloud Shell, kubectl je už nainstalovaný.

Poznámka:

Pokud používáte Azure CLI místně, spusťte příkaz az aks install-cli a nainstalujte kubectl.

Pomocí příkazu az aks get-credentials nakonfigurujte klienta kubectl pro připojení k vašemu clusteru Kubernetes. Tento příkaz stáhne přihlašovací údaje a nakonfiguruje rozhraní příkazového řádku Kubernetes tak, aby je používalo.

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

Pokud chcete ověřit připojení ke clusteru, použijte příkaz kubectl get, který vrátí seznam uzlů clusteru.

kubectl get nodes

Následující příklad výstupu ukazuje jeden uzel vytvořený v předchozích krocích. Ujistěte se, že je stav uzlu připravený:

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

Vytvoření instance flexibilního serveru Azure Database for PostgreSQL

Vytvořte instanci flexibilního serveru Azure Database for PostgreSQL pomocí příkazu az postgreSQL flexible-server create . Následující příkaz vytvoří server s použitím výchozích hodnot služby a hodnot z místního kontextu Azure CLI:

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

Vytvořený server má následující atributy:

  • Při prvním zřízení serveru se vytvoří nová prázdná databáze postgres . V tomto rychlém startu používáme tuto databázi.
  • Automaticky vygenerovaný název serveru, uživatelské jméno správce, heslo správce, název skupiny prostředků (pokud ještě není zadaný v místním kontextu) a ve stejném umístění jako vaše skupina prostředků.
  • Pomocí argumentu veřejného přístupu můžete vytvořit server s veřejným přístupem k libovolnému klientovi se správným uživatelským jménem a heslem.
  • Vzhledem k tomu, že příkaz používá místní kontext, vytvoří server ve skupině django-project prostředků a v oblasti eastus.

Sestavení image Dockeru Django

Vytvořte novou aplikaci Django nebo použijte existující projekt Django. Ujistěte se, že je váš kód v této struktuře složek.

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

settings.py AktualizujteALLOWED_HOSTS, aby aplikace Django používala externí IP adresu, která se přiřadí k aplikaci Kubernetes.

ALLOWED_HOSTS = ['*']

Aktualizujte DATABASES={ } oddíl v settings.py souboru. Následující fragment kódu čte hostitele databáze, uživatelské jméno a heslo ze souboru manifestu 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'}
   }
}

Vygenerování souboru requirements.txt

Vytvořte soubor pro requirements.txt výpis závislostí pro aplikaci Django. Tady je ukázkový requirements.txt soubor. K vygenerování requirements.txt souboru requirements.txt pro vaši stávající aplikaci můžete použít pip freeze > requirements.txt .

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

Vytvoření souboru Dockerfile

Vytvořte nový soubor s názvem Dockerfile a zkopírujte následující fragment kódu. Tento soubor Dockerfile při nastavování Pythonu 3.8 a instalaci všech požadavků uvedených v souboru 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

Sestavení image

Pomocí příkazu se ujistěte, že jste v adresáři my-django-app v terminálu cd . Spuštěním následujícího příkazu sestavte image vývěsky:

docker build --tag myblog:latest .

Nasaďte image do centra Dockeru nebo do služby Azure Container Registry.

Důležité

Pokud používáte registr kontejneru Azure (ACR), spusťte az aks update příkaz pro připojení účtu ACR ke clusteru AKS.

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

Vytvoření souboru manifestu Kubernetes

Soubor manifestu Kubernetes definuje požadovaný stav clusteru, například jaké image kontejneru se mají spustit. Pojďme vytvořit soubor manifestu s názvem djangoapp.yaml a zkopírovat v následující definici YAML.

Důležité

Níže aktualizujte env část s vaší YOUR-DATABASE-USERNAMESERVERNAMEYOUR-DATABASE-PASSWORD instancí flexibilního serveru 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

Nasazení Django do clusteru AKS

Nasaďte aplikaci pomocí příkazu kubectl apply a zadejte název manifestu YAML:

kubectl apply -f djangoapp.yaml

Následující příklad výstupu ukazuje úspěšné vytvoření nasazení a služeb:

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

Nasazení django-app umožňuje popsat podrobnosti o nasazení, jako jsou image, které se mají použít pro aplikaci, počet podů a konfigurace podů. Vytvoří se služba python-svc , která aplikaci zveřejní prostřednictvím externí IP adresy.

Testování aplikace

Když se aplikace spustí, služba Kubernetes zveřejní front-end aplikace na internetu. Dokončení tohoto procesu může trvat několik minut.

Pomocí příkazu kubectl get service s argumentem --watch můžete sledovat průběh.

kubectl get service python-svc --watch

Zpočátku se externí IP adresa pro službu django-app service zobrazí jako čekající.

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

Když se externí IP adresa změní z čekání na skutečnou kubectl veřejnou IP adresu, použijte CTRL-C k zastavení procesu sledování. Následující příklad výstupu ukazuje platnou veřejnou IP adresu přiřazenou službě:

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

Teď otevřete webový prohlížeč na externí IP adresu vaší služby (http://<service-external-ip-address>) a zobrazte aplikaci Django.

Poznámka:

Spouštění migrací databází

Pro libovolnou aplikaci django byste museli spustit migraci databáze nebo shromáždit statické soubory. Tyto příkazy prostředí django můžete spustit pomocí $ kubectl exec <pod-name> -- [COMMAND]. Před spuštěním příkazu potřebujete najít název podu pomocí kubectl get pods.

$ kubectl get pods

Zobrazí se výstup podobný tomuto:

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

Po nalezení názvu podu můžete spustit migrace databáze django pomocí příkazu $ kubectl exec <pod-name> -- [COMMAND]. Všimněte si /code/ , že pracovní adresář projektu je definován výše Dockerfile .

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

Výstup by vypadal takto:

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

Pokud narazíte na problémy, spusťte spuštění kubectl logs <pod-name> , abyste zjistili, jakou výjimku vyvolá vaše aplikace. Pokud aplikace funguje úspěšně, při spuštění kubectl logsby se zobrazil výstup podobný tomuto.

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.

Vyčištění prostředků

Abyste se vyhnuli poplatkům za Azure, měli byste vyčistit nepotřebné prostředky. Pokud už cluster nepotřebujete, použijte k odebrání skupiny prostředků, služby kontejneru a všech souvisejících prostředků příkaz az group delete.

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

Poznámka:

Při odstranění clusteru se neodebere instanční objekt Microsoft Entra používaný clusterem AKS. Postup odebrání instančního objektu najdete v tématu věnovaném aspektům instančního objektu AKS a jeho odstranění. Pokud jste použili spravovanou identitu, identita se spravuje platformou a nevyžaduje odebrání.

Další kroky