Tutorial: Implantar o aplicativo Django no AKS com o Banco de Dados do Azure para PostgreSQL – Servidor Flexível

APLICA-SE A: Banco de Dados do Azure para PostgreSQL – Servidor Flexível

Neste início rápido, você implanta um aplicativo Django no cluster do AKS (Serviço de Kubernetes do Azure) com o servidor flexível do Banco de Dados do Azure para PostgreSQL usando a CLI do Azure.

O AKS é um serviço de Kubernetes gerenciado que permite a implantação e o gerenciamento de clusters rapidamente. O servidor flexível do Banco de Dados do Azure para PostgreSQL é um serviço de banco de dados totalmente gerenciado, projetado para proporcionar um controle mais granular e flexibilidade nas funções de gerenciamento de banco de dados e definições de configuração.

Observação

Este guia de início rápido pressupõe uma compreensão básica dos conceitos do Kubernetes, do Django e do PostgreSQL.

Pré-requisitos

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

  • Inicie o Azure Cloud Shell em uma nova janela do navegador. Você também pode instalar a CLI do Azure no computador local. Se estiver usando uma instalação local, entre pela CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal.
  • Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade. Este artigo exige a versão mais recente da CLI do Azure. Se você está usando o Azure Cloud Shell, a última versão já está instalada.

Criar um grupo de recursos

Um grupo de recursos do Azure é um grupo lógico no qual os recursos do Azure são implantados e gerenciados. Vamos criar um grupo de recursos, django-project, usando o comando az-group-create no local eastus.

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

Observação

A localização do grupo de recursos é onde os metadados do grupo de recursos são armazenados. Também é onde seus recursos são executados no Azure, caso você não especifique outra região durante a criação de recursos.

A seguinte saída de exemplo mostra o grupo de recursos criado com êxito:

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

Criar cluster AKS

Use o comando az aks create para criar um cluster do AKS. O exemplo a seguir cria um cluster chamado djangoappcluster com um nó. Isso levará vários minutos.

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

Após alguns minutos, o comando será concluído e retornará informações no formato JSON sobre o cluster.

Observação

Durante a criação de um cluster do AKS, um segundo grupo de recursos é criado automaticamente para armazenar os recursos do AKS. Confira Por que são criados dois grupos de recursos com o AKS?

Conectar-se ao cluster

Para gerenciar um cluster do Kubernetes, use kubectl, o cliente de linha de comando do Kubernetes. Se você usar o Azure Cloud Shell, o kubectl já estará instalado.

Observação

Ao utilizar a CLI do Azure localmente, execute o comando az aks install-cli para instalar kubectl.

Para configurar o kubectl para se conectar ao cluster do Kubernetes, use o comando az aks get-credentials. Este comando baixa as credenciais e configura a CLI do Kubernetes para usá-las.

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

Para verificar a conexão com o cluster, use o comando kubectl get para retornar uma lista dos nós de cluster.

kubectl get nodes

A saída de exemplo a seguir mostra o único nó criado nas etapas anteriores. Verifique se o status do nó é Pronto:

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

Criar uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL

Crie uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL com o comando az postgreSQL flexible-server create O seguinte comando criará um servidor usando valores e padrões de serviço do contexto local da CLI do Azure:

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

O servidor criado terá os atributos abaixo:

  • Um banco de dados vazio, postgres, é criado quando o servidor é provisionado pela primeira vez. Neste início rápido, usaremos este banco de dados.
  • Nome do servidor gerado automaticamente, nome de usuário administrador, senha do administrador, nome do grupo de recursos (caso ainda não tenha sido especificado no contexto local) e na mesma localização do grupo de recursos.
  • O uso do argumento de acesso público permite criar um servidor com acesso público a qualquer cliente com o nome de usuário e a senha corretos.
  • Como o comando está usando o contexto local, ele criará o servidor no grupo de recursos django-project e na região eastus.

Criar sua imagem do Docker do Django

Crie um aplicativo Django ou use seu projeto Django existente. Verifique se o código está nesta estrutura de pastas.

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

Atualize ALLOWED_HOSTS no settings.py para verificar se o aplicativo Django usa o IP externo que é atribuído ao aplicativo Kubernetes.

ALLOWED_HOSTS = ['*']

Atualize a seção DATABASES={ } no arquivo settings.py. O snippet de código abaixo está lendo o host de banco de dados, o nome de usuário e a senha do arquivo de manifesto do 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'}
   }
}

Gerar um arquivo requirements.txt

Crie um arquivo requirements.txt para listar as dependências para o aplicativo Django. Veja um arquivo requirements.txt de exemplo. Você pode usar pip freeze > requirements.txt para gerar um arquivo requirements.txt para seu aplicativo existente.

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

Criar um Dockerfile

Crie um arquivo chamado Dockerfile e copie o snippet de código abaixo. Esse Dockerfile na configuração do Python 3.8 e da instalação de todos os requisitos listados no arquivo 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

Crie sua imagem

Verifique se você está no diretório my-django-app em um terminal usando o comando cd. Execute o seguinte comando para criar sua imagem de painel de anúncios:

docker build --tag myblog:latest .

Implante sua imagem no Docker Hub ou no Registro de Contêiner do Azure.

Importante

Se você estiver usando o ACR (Registro de Contêiner do Azure), execute o comando az aks update para anexar a conta do ACR ao cluster do AKS.

az aks update -n djangoappcluster -g django-project --attach-acr <your-acr-name>

Criar o arquivo de manifesto do Kubernetes

Um arquivo de manifesto do Kubernetes define um estado desejado para o cluster, como as imagens de contêiner a serem executadas. Vamos criar um arquivo de manifesto chamado djangoapp.yaml e copiar na definição YAML a seguir.

Importante

Atualize a seção env abaixo com seu SERVERNAME, YOUR-DATABASE-USERNAME, YOUR-DATABASE-PASSWORD da instância de servidor flexível do Banco de Dados do Azure para 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

Implantar Django no cluster AKS

Implante o aplicativo usando o comando kubectl apply e especifique o nome do manifesto YAML:

kubectl apply -f djangoapp.yaml

A seguinte saída de exemplo mostra as Implantações e os Serviços criados com êxito:

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

Uma implantação django-app permite que você descreva detalhes de sua implantação, como quais imagens usam para o aplicativo, o número de pods e a configuração de pod. Um serviço python-svc é criado para expor o aplicativo por meio de um IP externo.

Testar o aplicativo

Quando o aplicativo é executado, um serviço de Kubernetes expõe o front-end do aplicativo à Internet. A conclusão desse processo pode levar alguns minutos.

Para monitorar o andamento, use o comando kubectl get service com o argumento --watch.

kubectl get service python-svc --watch

Inicialmente, o EXTERNAL-IP para o serviço django-app de exemplo é mostrado como pendente.

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

Quando o endereço EXTERNAL-IP for alterado de pendente para um endereço IP público real, use CTRL-C para interromper o processo de inspeção do kubectl. A seguinte saída de exemplo mostra um endereço IP público válido atribuído ao serviço:

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

Agora abra um navegador da Web para o endereço IP externo do seu serviço (http://<service-external-ip-address>) e exiba o aplicativo Django.

Observação

Executar migrações de banco de dados

Para qualquer aplicativo Django, você precisaria executar uma migração de banco de dados ou coletar arquivos estáticos. Você pode executar esses comandos do shell Django usando $ kubectl exec <pod-name> -- [COMMAND]. Antes de executar o comando, você precisa encontrar o nome do pod usando kubectl get pods.

$ kubectl get pods

Você verá uma saída como esta:

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

Depois que o nome do pod for encontrado, você poderá executar migrações de banco de dados Django com o comando $ kubectl exec <pod-name> -- [COMMAND]. Observe que /code/ é o diretório de trabalho para o projeto definir no Dockerfile acima.

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

A saída teria uma aparência como

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

Se você encontrar problemas, execute kubectl logs <pod-name> para ver qual exceção é gerada pelo seu aplicativo. Se o aplicativo estiver funcionando com êxito, você verá uma saída como esta ao executar 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.

Limpar os recursos

Para evitar cobranças do Azure, limpe recursos desnecessários. Quando o cluster não for mais necessário, use o comando az group delete para remover o grupo de recursos, o serviço de contêiner e todos os recursos relacionados.

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

Observação

Quando você excluir o cluster, a entidade de serviço do Microsoft Entra usada pelo cluster do AKS não será removida. Para obter as etapas para remover a entidade de serviço, confira Considerações sobre a entidade de serviço do AKS e sua exclusão. Se você tiver usado uma identidade gerenciada, ela será gerenciada pela plataforma e não exigirá remoção.

Próximas etapas