Tutorial: Implementación de una aplicación Django en AKS con Servidor flexible de Azure Database for PostgreSQL
SE APLICA A: Azure Database for PostgreSQL con servidor flexible
En este inicio rápido, implementará una aplicación Django en un clúster de Azure Kubernetes Service (AKS) con el servidor flexible de Azure Database for PostgreSQL mediante la CLI de Azure.
AKS es un servicio de Kubernetes administrado que permite implementar y administrar clústeres rápidamente. El servidor flexible de Azure Database for PostgreSQL es un servicio de base de datos totalmente administrado diseñado para proporcionar un control más pormenorizado y una mayor flexibilidad sobre las funciones de administración de bases de datos y las opciones de configuración.
Nota:
En este inicio rápido se presupone un conocimiento básico de los conceptos de Kubernetes, Django y PostgreSQL.
Requisitos previos
Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.
- Inicie Azure Cloud Shell en una nueva ventana del explorador. También puede instalar la CLI de Azure en la máquina local. Si utiliza una instalación local, inicie sesión con la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación.
- Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade. En este artículo se necesita la versión más reciente de la CLI de Azure. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.
Crear un grupo de recursos
Un grupo de recursos de Azure es un grupo lógico en el que se implementan y administran recursos de Azure. Vamos a crear un grupo de recursos, django-project, mediante el comando az-group-create en la ubicación eastus.
az group create --name django-project --location eastus
Nota
La ubicación del grupo de recursos es donde se almacenan los metadatos del grupo de recursos. Es también el lugar en el que se ejecutan los recursos en Azure si no se especifica otra región al crear los recursos.
En la siguiente salida de ejemplo se muestra que los recursos se crearon correctamente:
{
"id": "/subscriptions/<guid>/resourceGroups/django-project",
"location": "eastus",
"managedBy": null,
"name": "django-project",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
Creación de un clúster de AKS
Use el comando az aks create para crear un clúster de AKS. En el siguiente ejemplo, se crea un clúster llamado djangoappcluster con un nodo. Este proceso tardará varios minutos en completarse.
az aks create --resource-group django-project --name djangoappcluster --node-count 1 --generate-ssh-keys
Transcurridos unos minutos, el comando se completa y devuelve información en formato JSON sobre el clúster.
Nota
Al crear un clúster de AKS, se crea automáticamente un segundo grupo de recursos para almacenar los recursos de AKS. Consulte ¿Por qué se crean dos grupos de recursos con AKS?
Conectarse al clúster
Para administrar un clúster de Kubernetes, usará kubectl, el cliente de línea de comandos de Kubernetes. Si usa Azure Cloud Shell, kubectl
ya está instalado.
Nota:
Si ejecuta la CLI de Azure de manera local, ejecute el comando az aks install-cli para instalar kubectl
.
Para configurar kubectl
para conectarse a su clúster de Kubernetes, use el comando az aks get-credentials. Con este comando se descargan las credenciales y se configura la CLI de Kubernetes para usarlas.
az aks get-credentials --resource-group django-project --name djangoappcluster
Para comprobar la conexión al clúster, use el comando kubectl get para devolver una lista de los nodos del clúster.
kubectl get nodes
La salida del ejemplo siguiente muestra el nodo único creado en los pasos anteriores. Asegúrese de que el estado del nodo es Listo:
NAME STATUS ROLES AGE VERSION
aks-nodepool1-31718369-0 Ready agent 6m44s v1.12.8
Creación de una instancia de servidor flexible de Azure Database for PostgreSQL
Cree una instancia de servidor flexible de Azure Database for PostgreSQL con el comando az postgreSQL flexible-server create. El siguiente comando crea un servidor con los valores predeterminados de servicio y los valores del contexto local de la CLI de Azure:
az postgres flexible-server create --public-access all
El servidor creado tiene los siguientes atributos:
- Una nueva base de datos vacía,
postgres
se crea cuando se aprovisiona el servidor por primera vez. En este inicio rápido, se usará esta base de datos. - Nombre del servidor generado automáticamente, nombre de usuario administrador, contraseña de administrador, nombre del grupo de recursos (si aún no se ha especificado en el contexto local) y en la misma ubicación que el grupo de recursos.
- El uso del argumento public-access le permite crear un servidor con acceso público en cualquier cliente con el nombre de usuario y la contraseña correctos.
- Como el comando utiliza el contexto local, crea el servidor en el grupo de recursos
django-project
y en la regióneastus
.
Compilación de la imagen de Docker de Django
Cree una aplicación Django o use el proyecto Django existente. Asegúrese de que el código se encuentra en esta estructura de carpetas.
└───my-djangoapp
└───views.py
└───models.py
└───forms.py
├───templates
. . . . . . .
├───static
. . . . . . .
└───my-django-project
└───settings.py
└───urls.py
└───wsgi.py
. . . . . . .
└─── Dockerfile
└─── requirements.txt
└─── manage.py
Actualice ALLOWED_HOSTS
en settings.py
para asegurarse de que la aplicación Django usa la IP externa que se asigna a la aplicación kubernetes.
ALLOWED_HOSTS = ['*']
Actualice la sección DATABASES={ }
del archivo settings.py
. El siguiente fragmento de código lee el host de base de datos, el nombre de usuario y la contraseña del archivo de manifiesto de 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'}
}
}
Generación de un archivo requirements.txt
Cree un archivo requirements.txt
para enumerar las dependencias de la aplicación Django. Este es un archivo requirements.txt
de ejemplo. Puede usar pip freeze > requirements.txt para generar un archivo requirements.txt para la aplicación existente.
Django==2.2.17
postgres==3.0.0
psycopg2-binary==2.8.6
psycopg2-pool==1.1
pytz==2020.4
Creación de un archivo Dockerfile
Cree un archivo llamado Dockerfile
y copie el siguiente fragmento de código. Use este archivo Dockerfile al configurar Python 3.8 e instalar todos los requisitos enumerados en el archivo 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
Compilación de la imagen
Asegúrese de que se encuentra en el directorio my-django-app
en un terminal con el comando cd
. Ejecute el siguiente comando para compilar la imagen del tablón de anuncios:
docker build --tag myblog:latest .
Inserte la imagen en Docker hub o Azure Container Registry.
Importante
Si usa Azure Container Registry (ACR), ejecute el comando az aks update
para asociar la cuenta de ACR con el clúster de AKS.
az aks update --name djangoappcluster --resource-group django-project --attach-acr <your-acr-name>
Creación del archivo de manifiesto de Kubernetes
Un archivo de manifiesto de Kubernetes define un estado deseado del clúster, por ejemplo, qué imágenes de contenedor se van a ejecutar. Vamos a crear un archivo de manifiesto denominado djangoapp.yaml
y a copiarlo en la siguiente definición de YAML.
Importante
Actualice la sección env
siguiente con SERVERNAME
, YOUR-DATABASE-USERNAME
, YOUR-DATABASE-PASSWORD
de la instancia de servidor flexible de 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
Implementación de Django en un clúster de AKS
Implemente la aplicación mediante el comando kubectl apply y especifique el nombre del manifiesto de YAML:
kubectl apply -f djangoapp.yaml
En la salida de ejemplo siguiente se muestran las implementaciones y los servicios creados correctamente:
deployment "django-app" created
service "python-svc" created
Un valor django-app
de implementación permite describir los detalles de la implementación, como, por ejemplo, las imágenes que se van a usar para la aplicación, así como el número y la configuración de pods. Se crea un servicio python-svc
para exponer la aplicación a través de una IP externa.
Prueba de la aplicación
Cuando se ejecuta la aplicación, un servicio de Kubernetes expone el front-end de la aplicación a Internet. Este proceso puede tardar unos minutos en completarse.
Para supervisar el progreso, utilice el comando kubectl get service con el argumento --watch
.
kubectl get service python-svc --watch
En un primer momento, el parámetro EXTERNAL-IP del servicio de django-app se muestra como pendiente.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
django-app LoadBalancer 10.0.37.27 <pending> 80:30572/TCP 6s
Cuando la dirección EXTERNAL-IP cambie de pendiente a una dirección IP pública real, use CTRL-C
para detener el proceso de inspección de kubectl
. En la salida del ejemplo siguiente se muestra una dirección IP pública válida asignada al servicio:
django-app LoadBalancer 10.0.37.27 52.179.23.131 80:30572/TCP 2m
Ahora, abra un explorador web en la dirección IP externa del servicio (http://<service-external-ip-address>
) y vea la aplicación de Django.
Nota:
- Actualmente, el sitio de Django no utiliza HTTPS. Para más información sobre HTTPS y cómo configurar el enrutamiento de aplicaciones para AKS, consulte Entrada administrada de NGINX con el complemento de enrutamiento de aplicaciones.
Ejecución de migraciones de base de datos
En el caso de las aplicaciones Django, debería ejecutar la migración de base de datos o recopilar archivos estáticos. Para ejecutar estos comandos de la shell de Django se usa $ kubectl exec <pod-name> -- [COMMAND]
. Antes de ejecutar el comando debe buscar el nombre del pod mediante kubectl get pods
.
$ kubectl get pods
Verá una salida similar a la siguiente:
NAME READY STATUS RESTARTS AGE
django-app-5d9cd6cd8-l6x4b 1/1 Running 0 2m
Una vez que haya encontrado el nombre del pod, puede ejecutar las migraciones de base de datos de Django con el comando $ kubectl exec <pod-name> -- [COMMAND]
. Tenga en cuenta que /code/
es el directorio de trabajo del proyecto que se ha definido en Dockerfile
.
$ kubectl exec django-app-5d9cd6cd8-l6x4b -- python /code/manage.py migrate
La salida sería similar a esta:
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
. . . . . .
Si surgen problemas, ejecute kubectl logs <pod-name>
para ver qué excepción genera la aplicación. Si la aplicación funciona correctamente, verá una salida como la siguiente al ejecutar 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.
Limpiar los recursos
Para evitar los cargos de Azure, se recomienda limpiar los recursos que no sean necesarios. Cuando el clúster ya no se necesite, puede usar el comando az group delete para eliminar el grupo de recursos, el servicio de contenedor y todos los recursos relacionados.
az group delete --name django-project --yes --no-wait
Nota:
Cuando elimina el clúster, la entidad de servicio de Microsoft Entra que utiliza el clúster de AKS no se quita. Para conocer los pasos que hay que realizar para quitar la entidad de servicio, consulte Consideraciones principales y eliminación de AKS. Si usó una identidad administrada, esta estará administrada por la plataforma y no es necesario que la quite.
Pasos siguientes
- Aprenda a acceder al panel web de Kubernetes del clúster de AKS.
- Aprenda a habilitar la implementación continua
- Aprenda a escalar el clúster.
- Aprenda a configurar la instancia de servidor flexible de Azure Database for PostgreSQL.
- Aprenda a configurar parámetros de servidor en el servidor de bases de datos.