Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Ejecuta Django en Google Kubernetes Engine

Las apps de Django que se ejecutan en Google Kubernetes Engine (GKE) escalan bien porque se ejecutan en la misma infraestructura que todos los productos de Google.

En este instructivo se da por hecho que tienes conocimientos de desarrollo web con Django. Si es la primera vez que desarrollas con Django, es recomendable que escribas tu primera app de Django antes de continuar. En este instructivo, los modelos de la app representan encuestas con preguntas, y podrás interactuar con los modelos mediante la Consola del administrador de Django.

Este instructivo requiere Python 2.7 o 3.4 o posterior. También necesitas tener Docker instalado.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir a la página del selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un proyecto.

  4. Habilita las API de Cloud SQL, and Compute Engine.

    Habilita las API

  5. Instala e inicializa el SDK de Cloud.

Descarga y ejecuta la app

Una vez que completes los requisitos, descarga y ejecuta la app de muestra de Django. En las siguientes secciones se te guiará a través de la configuración, ejecución e implementación de la app.

Cómo clonar la app de Django

El código de la app de muestra de Django está en el repositorio GoogleCloudPlatform/python-docs-samples en GitHub.

  1. Puedes descargar la muestra como un archivo ZIP y extraerlo o clonar el repositorio en tu máquina local:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

  2. Ve al directorio que contiene el código de muestra:

cd python-docs-samples/kubernetes_engine/django_tutorial

Configura tu entorno local

Cuando se implementa, tu aplicación usa el proxy de Cloud SQL integrado en el entorno de App Engine para comunicarse con tu instancia de Cloud SQL. Sin embargo, para probar tu aplicación de manera local, debes instalar y usar una copia local del proxy en tu entorno de desarrollo.

Más información sobre el proxy de Cloud SQL

Para realizar tareas de administrador básicas en la instancia de Cloud SQL, puedes usar el cliente PostgreSQL.

Cómo instalar el proxy de Cloud SQL

Descarga y, luego, instala el proxy de Cloud SQL. El proxy de Cloud SQL se conecta a tu instancia de Cloud SQL cuando se ejecuta de manera local.

Linux de 64 bits

  1. Descarga el proxy con el siguiente comando:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. Haz que el proxy sea ejecutable con el siguiente comando:
    chmod +x cloud_sql_proxy
    

Linux de 32 bits

  1. Descarga el proxy con el siguiente comando:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. Haz que el proxy sea ejecutable con el siguiente comando:
    chmod +x cloud_sql_proxy
    

macOS de 64 bits

  1. Descarga el proxy con el siguiente comando:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. Haz que el proxy sea ejecutable con el siguiente comando:
    chmod +x cloud_sql_proxy
    

macOS de 32 bits

  1. Descarga el proxy con el siguiente comando:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. Haz que el proxy sea ejecutable con el siguiente comando:
    chmod +x cloud_sql_proxy
    

Windows de 64 bits

Para descargar el proxy, haz clic con el botón derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe y selecciona Guardar vínculo como. Cambia el nombre del archivo por cloud_sql_proxy.exe.

Windows de 32 bits

Para descargar el proxy, haz clic derecho en https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe y selecciona Guardar vínculo como. Cambia el nombre del archivo por cloud_sql_proxy.exe.

Imagen del proxy de Docker

Para mayor comodidad, el equipo de Cloud SQL mantiene varias imágenes de contenedor que poseen el proxy de Cloud SQL para que lo usen nuestros clientes. Para obtener más información sobre estas imágenes, consulta el repositorio del proxy de Cloud SQL en GitHub. Puedes extraer la última imagen a tu máquina local usando Docker mediante el siguiente comando:
docker pull gcr.io/cloudsql-docker/gce-proxy:1.19.1

Otro SO

En el caso de otros sistemas operativos que no se incluyen aquí, puedes compilar el proxy a partir del código fuente.

Crea una instancia de Cloud SQL

  1. <a{: class="internal" l10n-attrs-original-order="href,track-type,track-name,track-metadata-position,track-metadata-end-goal,class,target" l10n-encrypted- href="lsL4NbV5FI0DRuRANJcTZKJysOQGKX761P3ItELRG1PjHEtGnUIGfDSUdzN6k/z" target="_blank" track-metadata-end-goal="createInstance" track-metadata-position="python" track-metadata-position="python" track-metadata-position="python" track-metadata-position="python" track-metadata-position="python" track-metadata-view="python" track-metadata-view="python" track. > Crear una instancia de Cloud SQL para PostgreSQL.

    Asigna a la instancia el nombre polls-instance o uno similar. Es posible que esto tarde algunos minutos. Cuando la instancia esté lista, aparecerá en la lista de instancias.

    </a{:>
  2. Usa el SDK de Cloud para ejecutar el comando siguiente en el que [YOUR_INSTANCE_NAME] representa el nombre de tu instancia de Cloud SQL:
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    En el resultado, toma nota del valor que se muestra para [CONNECTION_NAME].

    El valor [CONNECTION_NAME] tiene el formato [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME].

Inicializa tu instancia de Cloud SQL

  1. Inicia el proxy de Cloud SQL con el valor [CONNECTION_NAME] del paso anterior.

    Linux/macOS

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    Reemplaza [YOUR_INSTANCE_CONNECTION_NAME] por el valor [CONNECTION_NAME] que registraste en el paso anterior.

    En este paso, se establece una conexión entre tu computadora local y tu instancia de Cloud SQL a fin de realizar pruebas locales. Mantén el proxy de Cloud SQL en ejecución durante todo el tiempo que realices pruebas locales en tu aplicación.

  2. Crea un usuario y una base de datos de Cloud SQL de la manera siguiente:

    Cloud Console

    1. Crea una base de datos nueva mediante Cloud Console para tu instancia de Cloud SQLpolls-instance. Por ejemplo, puedes usar el nombre polls.
    2. Crea un usuario nuevo mediante Cloud Console para tu instancia de Cloud SQLpolls-instance.

    Cliente de Postgres

    1. En una pestaña separada de la línea de comandos, instala el cliente de Postgres.
      sudo apt-get install postgresql
    2. Usa el cliente Postgres o un programa similar para conectarte a tu instancia. Ingresa la contraseña raíz que configuraste cuando te la pidan.
      psql --host 127.0.0.1 --user postgres --password
    3. Crea las bases de datos, los usuarios y los permisos de acceso necesarios en tu base de datos de Cloud SQL mediante los comandos siguientes Reemplaza [POSTGRES_USER] y [POSTGRES_PASSWORD] por el nombre de usuario y la contraseña que deseas usar.
      CREATE DATABASE polls;
      CREATE USER [POSTGRES_USER] WITH PASSWORD '[POSTGRES_PASSWORD]';
      GRANT ALL PRIVILEGES ON DATABASE polls TO [POSTGRES_USER];
      GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [POSTGRES_USER];
      

Crea una cuenta de servicio

El proxy requiere una cuenta de servicio con privilegios de Editor para tu instancia de Cloud SQL. Para obtener más información sobre las cuentas de servicio, consulta la descripción general de la autenticación de Google Cloud.

  1. Ve a la página Cuentas de servicio de Google Cloud Console.

    Ve a la página Cuentas de servicio

  2. Selecciona el proyecto que contiene la instancia de Cloud SQL.
  3. Haz clic en Crear cuenta de servicio.
  4. En el cuadro de diálogo Crear cuenta de servicio, ingresa un nombre descriptivo para la cuenta de servicio.
  5. En Función, selecciona una de las siguientes funciones:
    • Cloud SQL > Cliente de Cloud SQL
    • Cloud SQL > Editor de Cloud SQL
    • Cloud SQL > Administrador de Cloud SQL
  6. Cambia el ID de la cuenta de servicio por un valor único y reconocible.
  7. Haz clic en Proporcionar una nueva clave privada y confirma que el tipo de clave sea JSON.
  8. Haz clic en Crear.

    El archivo de clave privada se descargará en tu equipo. Puedes moverlo a otra ubicación. Protege el archivo de clave.

Realizar las configuraciones de la base de datos

Usa los siguientes comandos a fin de configurar variables de entorno para acceder a la base de datos. Estas variables de entorno se usan para las pruebas locales.

Linux/macOS

export DATABASE_USER=<your-database-user>
export DATABASE_PASSWORD=<your-database-password>

Windows

set DATABASE_USER=<your-database-user>
set DATABASE_PASSWORD=<your-database-password>

Establece tu configuración de GKE

  1. Esta aplicación tiene una sola configuración de Kubernetes llamada polls. En polls.yaml, reemplaza <your-project-id> por el ID de tu proyecto de Google Cloud.

  2. Ejecuta el siguiente comando y anota el valor de connectionName:

    gcloud beta sql instances describe [YOUR_INSTANCE_NAME]
    
  3. En el archivo polls.yaml, reemplaza <your-cloudsql-connection-string> por el valor connectionName.

Ejecuta la app en tu computadora local

  1. Para ejecutar la app de Django en tu computadora local, configura un entorno de desarrollo de Python que incluya Python, pip y virtualenv.

  2. Crea un entorno aislado de Python e instala las dependencias. Si tu instalación de Python 3 tiene un nombre diferente, úsalo en el primer comando:

    virtualenv env
    source env/bin/activate
    pip install -r requirements.txt
    
  3. Ejecuta las migraciones de Django para configurar tus modelos:

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    
  4. Inicia un servidor web local:

    python manage.py runserver
    
  5. En tu navegador, ve a http://localhost:8000.

    Verás una página con el siguiente texto: "Hello, world. You're at the polls index". El servidor web de Django que se ejecuta en tu computadora proporciona las páginas de la aplicación de muestra.

  6. Presiona Control+C para detener el servidor web local.

Usa la Consola del administrador de Django

  1. Crea un superusuario. Debes especificar un nombre de usuario y una contraseña.

    python manage.py createsuperuser
    
  2. Ejecuta el programa principal:

    python manage.py runserver
    
  3. En tu navegador, ve a http://localhost:8000/admin.

  4. Accede al sitio del administrador con el nombre de usuario y la contraseña que usaste cuando ejecutaste createsuperuser.

Implementa la aplicación en GKE

Cuando la app se implementa en Google Cloud, usa el servidor Gunicorn. Como Gunicorn no procesa contenido estático, la app usa a Cloud Storage para ello.

Recopila y sube recursos estáticos

  1. Crea un depósito de Cloud Storage y haz que se pueda leer públicamente. Reemplaza [YOUR_GCS_BUCKET] por un nombre de depósito a elección. Por ejemplo, podrías usar el ID de tu proyecto como el nombre del depósito:

    gsutil mb gs://[YOUR_GCS_BUCKET]
    gsutil defacl set public-read gs://[YOUR_GCS_BUCKET]
    
  2. Recopila todo el contenido estático en una carpeta de manera local:

    python manage.py collectstatic
    
  3. Sube el contenido estático a Cloud Storage:

    gsutil -m rsync -r ./static gs://[YOUR_GCS_BUCKET]/static
    
  4. En mysite/settings.py, configura el valor de STATIC_URL como la siguiente URL y reemplaza [YOUR_GCS_BUCKET] por el nombre de tu depósito:

    http://storage.googleapis.com/[YOUR_GCS_BUCKET]/static/
    

Configura GKE

  1. Para inicializar GKE, ve a la página Clústeres.

    IR A LA PÁGINA CLÚSTERES

    Cuando utilizas GKE por primera vez en un proyecto, debes esperar a que desaparezca el mensaje "Kubernetes Engine is getting ready. This may take a minute or more".

  2. Crear un clúster de GKE:

    gcloud container clusters create polls \
      --scopes "https://www.googleapis.com/auth/userinfo.email","cloud-platform" \
      --num-nodes 4 --zone "us-central1-a"
    

    ¿Recibiste el error "Project [PROJECT_ID] is not fully initialized with the default service accounts."?

    Inicializa GKE

    Si recibiste un error, ve a Google Cloud Console para inicializar GKE en tu proyecto.

    IR A LA PÁGINA CLÚSTERES

    Espera que el mensaje "Kubernetes Engine is getting ready. This can take a minute or more" desaparezca.

  3. Después de crear el clúster, usa la herramienta de línea de comandos de kubectl, que está integrada en la herramienta de gcloud, para interactuar con tu clúster de GKE. Dado que gcloud y kubectl son herramientas independientes, asegúrate de que kubectl esté configurado para interactuar con el clúster correcto.

    gcloud container clusters get-credentials polls --zone "us-central1-a"
    

Configura Cloud SQL

  1. Necesitas varios secretos para habilitar la conexión de tu aplicación de GKE con tu instancia de Cloud SQL. Se requiere uno para el acceso a nivel de instancia (conexión), mientras que los otros dos se requieren para acceder a la base de datos. Para obtener más información sobre los dos niveles de control de acceso, consulta Control de acceso de instancias.

    1. Si deseas crear el secreto para el acceso a nivel de instancia, proporciona la ubicación ([PATH_TO_CREDENTIAL_FILE]) de la clave de la cuenta de servicio JSON que descargaste cuando creaste tu cuenta de servicio (consulta Crea un cuenta de servicio):

      kubectl create secret generic cloudsql-oauth-credentials --from-file=credentials.json=[PATH_TO_CREDENTIAL_FILE]
      
    2. Si quieres crear los secretos para el acceso a la base de datos, usa los métodos [DATABASE_USERNAME] y [PASSWORD] de SQL definidos en el paso 2 de Inicializa tu instancia de Cloud SQL:

      kubectl create secret generic cloudsql --from-literal=username=[DATABASE_USERNAME] --from-literal=password=[PASSWORD]
      
  2. Recupera la imagen pública de Docker para el proxy de Cloud SQL.

    docker pull b.gcr.io/cloudsql-docker/gce-proxy
    
  3. Compila una imagen de Docker y reemplaza <your-project-id> con tu ID del proyecto.

    docker build -t gcr.io/<your-project-id>/polls .
    
  4. Configura Docker para que use gcloud como auxiliar de credenciales y envía la imagen a Container Registry:

    gcloud auth configure-docker
    
  5. Envía la imagen de Docker. Reemplaza <your-project-id> con el ID del proyecto.

    docker push gcr.io/<your-project-id>/polls
    
  6. Crea el recurso de GKE:

    kubectl create -f polls.yaml
    

Implementar la app en GKE.

Después de crear los recursos, hay tres Pod de polls en el clúster. Verifica el estado de los pods:

    kubectl get pods

Espera unos minutos para que los estados del pod se muestren como Running. Si los pods no están listos o si ves reinicios, puedes revisar los registros de cada pod para averiguar el problema. [YOUR-POD-ID] es una parte del resultado que muestra el comando kubectl get pods anterior.

    kubectl logs [YOUR_POD_ID]

Visualiza la ejecución de la app en Google Cloud

Una vez que los pods estén listos, puedes obtener la dirección IP pública del balanceador de cargas:

kubectl get services polls

Ve a la dirección EXTERNAL-IP en tu navegador para ver la página de destino básica de Django y acceder a la Consola del administrador.

Comprende el código

La app de muestra de Django se creó usando las herramientas estándar de Django. Los comandos siguientes crean el proyecto y la app de encuestas:

django-admin startproject mysite
python manage.py startapp polls

settings.py contiene la configuración de tu base de datos de SQL:

DATABASES = {
    'default': {
        # If you are using Cloud SQL for MySQL rather than PostgreSQL, set
        # 'ENGINE': 'django.db.backends.mysql' instead of the following.
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'polls',
        'USER': os.getenv('DATABASE_USER'),
        'PASSWORD': os.getenv('DATABASE_PASSWORD'),
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

El archivo polls.yaml especifica dos recursos de Kubernetes. El primero es el Service, que define un nombre coherente y una dirección IP privada para la aplicación web de Django. El segundo es un balanceador de cargas HTTP con una dirección IP externa pública.

# The polls service provides a load-balancing proxy over the polls app
# pods. By specifying the type as a 'LoadBalancer', Container Engine will
# create an external HTTP load balancer.
# For more information about Services see:
#   https://cloud.google.com/container-engine/docs/services/
# For more information about external HTTP load balancing see:
#   https://cloud.google.com/container-engine/docs/load-balancer
apiVersion: v1
kind: Service
metadata:
  name: polls
  labels:
    app: polls
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: polls

El servicio proporciona un nombre de red y una dirección IP. Los pods de GKE ejecutan el código de la aplicación detrás el servicio. El archivo polls.yaml especifica una implementación que proporciona actualizaciones declarativas a los pods de GKE. El servicio dirige el tráfico a la implementación. Para ello, hace coincidir el selector del servicio con la etiqueta de implementación. En este caso, el selector polls coincide con la etiqueta polls.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: polls
  labels:
    app: polls
spec:
  replicas: 3
  selector:
    matchLabels:
      app: polls
  template:
    metadata:
      labels:
        app: polls
    spec:
      containers:
      - name: polls-app
        # Replace  with your project ID or use `make template`
        image: gcr.io/<your-project-id>/polls
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        env:
            - name: DATABASE_USER
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: username
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: password
        ports:
        - containerPort: 8080

      - image: gcr.io/cloudsql-docker/gce-proxy:1.16
        name: cloudsql-proxy
        command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                  "-instances=<your-cloudsql-connection-string>=tcp:5432",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        volumeMounts:
          - name: cloudsql-oauth-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: ssl-certs
            mountPath: /etc/ssl/certs
          - name: cloudsql
            mountPath: /cloudsql
      volumes:
        - name: cloudsql-oauth-credentials
          secret:
            secretName: cloudsql-oauth-credentials
        - name: ssl-certs
          hostPath:
            path: /etc/ssl/certs
        - name: cloudsql
          emptyDir: {}

Realice una limpieza

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos individuales

Si no quieres borrar el proyecto, borra los recursos individuales.

  1. Borra el clúster de Google Kubernetes Engine:

    gcloud container clusters delete polls
    
  2. Borra la imagen de Docker que enviaste a Container Registry:

    gcloud container images delete gcr.io/${PROJECT_ID}/polls
    
  3. Borra la instancia de Cloud SQL:

    gcloud sql instances delete $INSTANCE_NAME