Django mit Google Kubernetes Engine ausführen - Unsere Erfahrung

Das Ausführen einer Django Web-Applikation auf der Google Cloud Platform mit Hilfe von Google Kubernetes Engine (GKE) ist dank der verfügbaren Dokumentation sehr einfach. Gerne möchten wir unsere Erfahrung teilen und dabei auf Besonderheiten eingehen.

Die Dokumentation zum Ausführen von Django auf GKE ist sehr detailliert und beinhaltet auch die notwendigen Schritte zum Erstellen einer Datenbank und zur Bereitstellung der statischen  Inhalte. Der Einstieg ist dadurch einfach möglich, jedoch gibt es auch Google-spezifische Besonderheiten, auf die wir in diesem Beitrag näher eingehen wollen.

GCE Ingress oder NGINX Ingress?

In eimem Kubernetes-Cluster kann ein Ingress-Objekt erstellt werden, um externen Traffic zu den verschiedenen Microservices zu routen. Ein Ingress kann auch als Load-Balancer und zur SSL-Terminierung eingesetzt werden. Wenn Sie dem Google Tutorial folgen, dann werden Sie einen Google-spezifischen Ingress verwenden, nämlich den GCE Ingress.

Allerdings können Situationen auftreten, bei denen die Verwendung eines anderen Ingress Typ vorteilhaft ist. Ein Beispiel ist der NGINX Ingress, der Cloud agnostisch ist. Das heißt, dass ein Setup einfacher von einem Cloud-Provider zu einem anderen Anbieter migriert werden kann. Außerdem bietet der NGINX Ingress zusätzliche Funktionalität, wie z.B. Client-Authentifizierung mit Zertifikaten.

Falls der NGINX Ingress auf der Google Cloud verwendet werden soll, ist eine Installation über den Package-Manager helm möglich.

Konfiguration der Django Logging Funktionalität mit Stackdriver

Für das Monitoring der Django Anwendung auf Kubernetes ist es erforderlich, die Log-Einträge, die in verschiedenen Containern erzeugt werden, gesammelt darzustellen. Die Google Cloud bietet dafür einen Dienst an: Stackdriver. Stackdriver kann auch dafür verwendet werden, die Logs zu durchsuchen und auf einfachen Dashboards darzustellen. Stackdriver kann sehr gut in der standardmäßigen Django Logging Funktionalität integriert werden.

Ein typischer Eintrag in der settings.py Datei siehr beispielsweise wie folgt aus:

 

from google.cloud import logging as google_cloud_logging
log_client = google_cloud_logging.Client()
log_client.setup_logging()

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'stackdriver': {
            'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
            'client': log_client,
        }
    },
    'loggers': {
        '': {
            'handlers': ['stackdriver'],
            'level': 'INFO',
        }
    },
}

 

Je nach Anforderung kann auch eine Umgebungsvariable eingesetzt werden, um verschiedene Logging Handler zu verwenden. So kann beispielsweise bei der lokalen Entwicklung die Konsole zur Ausgabe der Logs verwendet werden. Falls dieselbe Applikation in der Cloud mit Kubernetes ausgeführt wird, kann über die Umgebungsvariable das Logging zu Stackdriver geleitet werden.