Front-End-Proxys mit Nginx

Auf dieser Seite wird gezeigt, wie Sie Nginx als Frontend-Proxy für Ihren Anwendungscontainer verwenden. Das ist nützlich, wenn Sie Anfragen oder Antworten verarbeiten möchten. Sie können die GZIP-Komprimierung hinzufügen oder HTTP/2 in HTTP/1 übersetzen, wenn Ihre Anwendungscontainer nur HTTP/1 unterstützen und Sie aus Leistungsgründen HTTP/2 End-to-End verwenden müssen.

Im Beispiel auf dieser Seite wird ein Nginx-Container auf jeder Cloud Run-Instanz als Hauptbereitstellungscontainer ausgeführt. Er ist so konfiguriert, dass Anfragen an den Anwendungscontainer weitergeleitet werden, der als Sidecar-Container ausgeführt wird, wie in diesem Diagramm dargestellt:

Cloud Run mc hello nginx 1

Die effektivste Methode für Frontend-Proxy in Cloud Run ist die Bereitstellung des Nginx-Server-Proxy-Server-Containers und des Webanwendungs-Containers als einzelnen Cloud Run-Dienst:

Cloud Run mc hello nginx 2

Dieser einzelne Cloud Run-Dienst akzeptiert Anfragen und sendet sie an den Ingress-Container, der in diesem Fall der Proxyserver ist. Der Proxyserver sendet dann über das Netzwerk localhost Anfragen an die Webanwendung, sodass kein externes Netzwerk erforderlich ist.

Durch die Bereitstellung als einzelner Cloud Run-Dienst werden Latenzen, der Aufwand für die Dienstverwaltung und die Offenlegung in externen Netzwerken reduziert. Cloud Run interagiert nur direkt mit den Sidecar-Containern, um sie zu starten oder zu beenden, wenn der Dienst gestartet oder beendet wird.

Der Webanwendungscontainer und alle Sidecar-Container können in verschiedenen Programmiersprachen geschrieben werden. Ein Beispiel für PHP finden Sie unter nginx-Beispiel für PHP in GitHub.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistung unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Aktivieren Sie die Cloud Run API und die Secret Manager API.

    Für das Aktivieren von APIs erforderliche Rollen

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin), die die Berechtigung serviceusage.services.enable enthält. Informationen zum Zuweisen von Rollen.

    APIs aktivieren

  7. Installieren und initialisieren Sie die gcloud CLI.
  8. Aktualisieren Sie die Google Cloud CLI: gcloud components update
  9. Konfigurieren Sie die Google Cloud CLI: gcloud init
  10. Authentifizieren Sie sich mit der Google Cloud CLI: gcloud auth login

Für das Deployment erforderliche Berechtigungen

Sie benötigen EINES von Folgendem:

Konfigurationsübersicht

In dieser Anleitung werden vordefinierte Container-Images verwendet. Das einzige, was für einen Front-End-Proxy erforderlich ist, ist das Konfigurieren der Container und des Dienstes selbst.

Nginx-Ingress-Container konfigurieren

Das Container-Image ist nginx und in Docker Hub verfügbar. Sie können es weitgehend unverändert verwenden, mit der Ausnahme, dass es für die Ausführung als Proxydienst konfiguriert werden muss, sodass die Proxy-Anfragen an den Port gesendet werden, auf dem der Sidecar-Container localhost überwacht. Im Beispiel auf dieser Seite wird auch die GZIP-Komprimierung für Anfragen und Antworten aktiviert.

Konfiguration wird mithilfe einer bereitgestellten Textdatei um /etc/nginx/conf.d/nginx.conf bereitgestellt. Weil Sie Dateien im Container nicht direkt bearbeiten können, müssen Sie unter /etc/nginx/conf.d/ ein Volume bereitstellen, das die Konfigurationsdatei enthält. Eine Möglichkeit, eine Datei an einem bestimmten Speicherort in einem Container bereitzustellen, der in Cloud Run ausgeführt wird, besteht darin, den Dateiinhalt in einem Secret Manager-Secret zu speichern und dieses Secret an dem ausgewählten Speicherort bereitzustellen.

Kopieren Sie Folgendes in eine Datei mit dem Namen nginx.conf im aktuellen Verzeichnis Ihres lokalen Computers.


server {
    # Listen at port 8080
    listen 8080; 
    # Server at localhost
    server_name _;
    # Enables gzip compression to make our app faster
    gzip on;

    location / {
        # Passes initial requests to port 8080 to `hello` container at port 8888
        proxy_pass   http://127.0.0.1:8888;
    }
}

Führen Sie in der Konfiguration folgende Schritte aus:

  • Weisen Sie nginx an, denselben Cloud Run-Standardport 8080zu überwachen, der sich in localhost befindet.
  • Wenden Sie die GZIP-Komprimierung an, um die Leistung zu verbessern.
  • Weisen Sie proxy_pass an, alle Anfragen an diesen Ingress-Container an den Sidecar-Container der Webanwendung auf dem Port 8888 von „localhost“ zu senden.

Erstellen Sie ein Secret mit dem Inhalt der nginx.conf-Datei.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Secret Manager auf:

    Zu Secret Manager

  2. Klicken Sie auf Secret erstellen.

  3. Geben Sie im Formularfeld name nginx_config ein.

  4. Laden Sie die Datei nginx.conf unter multi-container/hello-nginx-sample/nginx.conf als Secret-Wert hoch.

  5. Behalten Sie die Standardeinstellungen bei (Google-owned and Google-managed encryption key, etc).

  6. Klicken Sie auf Secret erstellen.

  7. Gewähren Sie dem Compute-Dienstkonto des Projekts Zugriff auf dieses neue Secret. Rufen Sie dazu in der Google Cloud Console die Seite IAM auf:

    IAM aufrufen

  8. Suchen Sie das Hauptkonto des Dienstkontos mit dem Namen Compute Engine default service account und klicken Sie auf Hauptkonto bearbeiten.

  9. Klicken Sie auf Weitere Rolle hinzufügen und wählen Sie Secret Manager Secret Accessor aus.

  10. Klicken Sie auf Speichern.

gcloud

  1. Erstellen Sie in einem Terminal mit dem folgenden Befehl ein neues nginx_config-Secret in Secret Manager:

    gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'

  2. Gewähren Sie dem Compute-Dienstkonto des Projekts Zugang zu dem neuen Secret mit dem Befehl

    export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')
    gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com --role='roles/secretmanager.secretAccessor'

  3. Prüfen Sie mit dem Befehl gcloud secrets list, ob Ihr Secret erstellt wurde.

Informationen zum Sidecar-Beispiel-Image der Webanwendung

In dieser Anleitung wird das Beispiel-Container-Image unter us-docker.pkg.dev/cloudrun/container/hello verwendet. Sie müssen die Portnummer, die der Container überwacht, und localhost als Host angeben, wie unter Sidecar-Containerkonfiguration angeben beschrieben.

Multicontainer-Dienst konfigurieren

Sie können die Google Cloud Console oder die Cloud Run-YAML-Datei verwenden, um einen Cloud Run-Dienst mit mehr als einem Containern zu konfigurieren.

In der Dienstkonfiguration müssen Sie den Nginx-Proxyserver als Ingress-Container (Bereitstellend), den Port, der überwacht werden soll, ob es HTTP 1- oder HTTP 2-Anfragen annimmt und die Container-Startreihenfolge angeben. Der Ingress-Container (Proxyserver) hängt vom Sidecar der Webanwendung ab, sodass der Webanwendung-Sidecar zuerst gestartet werden muss.

Diese Konfigurationen werden in den nächsten Abschnitten beschrieben.

YAML-Metadaten hinzufügen

Console

Eine vollständige Anleitung für die Console finden Sie unter Dienst bereitstellen.

YAML

  1. Wenn Sie einen neuen Dienst erstellen, überspringen Sie diesen Schritt. Wenn Sie einen vorhandenen Dienst aktualisieren, laden Sie die zugehörige YAML-Konfiguration herunter:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Fügen Sie in service.yaml Folgendes hinzu:

    metadata:
      name: "MC_SERVICE_NAME"
      labels:
        cloud.googleapis.com/location: "REGION"
      annotations:
        # Required to use Cloud Run multi-containers (preview feature)
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/description: sample tutorial service
        # Externally available
        run.googleapis.com/ingress: all

Im Abschnitt wird die Überarbeitung des Dienstes beschrieben, einschließlich der Eigenschaften, die sich von Überarbeitung zu Überarbeitung unterscheiden können.

Startreihenfolge von Containern angeben

Console

Eine vollständige Anleitung für die Console finden Sie unter Dienst bereitstellen.

YAML

Hängen Sie in service.yaml Folgendes an:

spec:
  template:
    metadata:
      annotations:
        # Defines container startup order within multi-container service.
        # Below requires hello container to spin up before nginx container,
        # which depends on the hello container.
        # https://cloud.google.com/run/docs/configuring/containers#container-ordering
        run.googleapis.com/container-dependencies: "{nginx: [hello]}"

Beachten Sie die Annotation container-dependencies, die Cloud Run anweist, auf den Start des Containers „hello“ zu warten, bevor der nginx-Container gestartet wird. Andernfalls, wenn der nginx-Container zuerst gestartet wird, könnte der nginx-Container versuchen, eine Webanwendung an den Container der Web-Anwendung per Proxy weiterzuleiten, der nicht bereit ist. Dies würde Webfehlerantworten generieren.

Für jeden Container kann optional eine Name-Eigenschaft definiert werden, die verwendet werden kann, um in anderen Anweisungen darauf zu verweisen. Der Bereitstellungscontainer führt den Proxyserver mit dem Namen nginx aus. Dies ist der Container, an den Cloud Run eingehende Anfragen sendet. Sie müssen daher die Version von HTTP und den Containerport angeben, an den sie gesendet werden sollen.

Konfiguration des Bereitstellungscontainers angeben

Console

Eine vollständige Anleitung für die Console finden Sie unter Dienst bereitstellen.

YAML

Hängen Sie in der Datei service.yaml Folgendes an:

spec:
  containers:
    # A) Serving ingress container "nginx" listening at PORT 8080
    # Main entrypoint of multi-container service.
    # Source is stored in nginx_config secret in Secret Manager.
    # Any pings to this container will proxy over to hello container at PORT 8888.
    # https://cloud.google.com/run/docs/container-contract#port
    - image: nginx
      name: nginx
      ports:
        - name: http1
          containerPort: 8080
      resources:
        limits:
          cpu: 500m
          memory: 256Mi
      # Referencing declared volume below,
      # Declaring volume to mount in current ingress container's filesystem
      # https://cloud.google.com/run/docs/reference/rest/v2/Container#volumemount
      volumeMounts:
        - name: nginx-conf-secret
          readOnly: true
          mountPath: /etc/nginx/conf.d/
      startupProbe:
        timeoutSeconds: 240
        periodSeconds: 240
        failureThreshold: 1
        tcpSocket:
          port: 8080

Der nginx Server erfordert eine Konfigurationsdatei im Verzeichnis /etc/nginx/conf.d/. Stellen Sie dazu an diesem Speicherort ein Volume bereit, das die Datei enthält. Im Abschnitt volumeMount wird angegeben, dass dort ein Volume mit dem Namen configuration platziert werden soll. Das Volume selbst wird später in der Datei in einem eigenen Abschnitt definiert.

Sidecar-Containerkonfiguration angeben

Console

Eine vollständige Anleitung für die Console finden Sie unter Dienst bereitstellen.

YAML

Hängen Sie in service.yaml Folgendes an:

- image: us-docker.pkg.dev/cloudrun/container/hello
  name: hello
  env:
    - name: PORT
      value: "8888"
  resources:
    limits:
      cpu: 1000m
      memory: 512Mi
  startupProbe:
    timeoutSeconds: 240
    periodSeconds: 240
    failureThreshold: 1
    tcpSocket:
      port: 8888

Die hello-Anwendung benötigt ebenfalls Konfigurationsinformationen. Sie überwacht eingehende Anfragen auf dem Port, der in der Umgebungsvariablen PORT angegeben ist. Name und Wert werden im Abschnitt env angegeben.

Secret-Volume angeben

Console

Eine vollständige Anleitung für die Console finden Sie unter Dienst bereitstellen.

YAML

Hängen Sie in der Datei service.yaml Folgendes an:

volumes:
  - name: nginx-conf-secret
    secret:
      secretName: nginx_config
      items:
        - key: latest
          path: default.conf

Geben Sie das in der volumeMount-Sektion bereitgestellte Konfigurations-volume an. Sie enthält eine einzelne Datei namens nginx.conf, deren Inhalt als Wert des Secrets mit dem Namen nginx-conf-secret definiert ist.

Dienst bereitstellen

Console

  1. Rufen Sie in der Google Cloud Console die Seite Cloud Run auf:

    Zu Cloud Run

  2. Wählen Sie im Menü Dienste aus und klicken Sie auf Container bereitstellen, um das Formular Dienst erstellen aufzurufen.

    1. Wählen Sie Überarbeitung aus dem vorhandenen Container-Image bereitstellen aus und geben Sie nginx als Container-Image-URL ein.
    2. Geben Sie im Feld Name des Dienstes einen Namen für den Dienst ein, z. B. hello-mc.
    3. Wählen Sie aus der Liste Region einen Speicherort für die Bereitstellung aus, z. B. us-west1.
    4. Wählen Sie unter Authentifizierung die Option Öffentlichen Zugriff zulassen aus. Wenn Sie nicht berechtigt sind, diese Option auszuwählen (Cloud Run-Administratorrolle), wird der Dienst bereitgestellt und erfordert eine Authentifizierung.
  3. Klicken Sie auf Container, Netzwerk, Sicherheit , um das Konfigurationsformular zu maximieren.

    1. Klicken Sie auf den Tab Volumes.
    2. Klicken Sie auf Volume hinzufügen.
    3. Wählen Sie in der Liste Volume-Typ die Option Secret aus.
    4. Geben Sie im Feld Volume-Name nginx-conf-secret ein.
    5. Geben Sie im Feld Secret nginx_config ein.
    6. Geben Sie unter Angegebene Pfade für Secret-Versionen default.conf als Pfad und latest als Version an.
    7. Klicken Sie auf Erstellen , um das Secret-Volume zu erstellen.
  4. Klicken Sie auf den Tab Container , um das Formular Container bearbeiten aufzurufen.

    1. Klicken Sie auf Einstellungen und ändern Sie unter Ressourcen den Arbeitsspeicher auf 256 MiB und die CPU auf 1 CPU.
    2. Klicken Sie auf Volume-Bereitstellungen.
    3. Klicken Sie auf Volume bereitstellen.
    4. Wählen Sie in der Namensliste nginx-conf-secret aus.
    5. Geben Sie unter Bereitstellungspfad etc/nginx/conf.d ein.
    6. Klicken Sie auf Fertig , um die Konfiguration für den ersten Container abzuschließen.
  5. Klicken Sie auf Container hinzufügen , um den Sidecar-Container hinzuzufügen und das Formular Neuer Container aufzurufen.

    1. Wählen Sie die Standard-Container-Image-URL us-docker.pkg.dev/cloudrun/container/hello aus.
    2. Klicken Sie auf den Tab Einstellungen und ändern Sie dann unter Ressourcen den Speicher in 256 MiB und die CPU in 1 CPU.
    3. Klicken Sie auf Variablen und Secrets.
    4. Klicken Sie auf Variable hinzufügen.
    5. Geben Sie PORT als neuen Namen der Umgebungsvariablen und 8888 als Wert ein.
    6. Klicken Sie auf Fertig.
  6. Rufen Sie das Formular Container bearbeiten für den ersten Container (nginx) auf.

    1. Klicken Sie auf den Tab Einstellungen.
    2. Wählen Sie unter Startreihenfolge von Containern in der Liste Abhängig von die Option nginx aus. Das bedeutet, dass der Container nginx erst gestartet wird, nachdem der Container hello erfolgreich gestartet wurde.
    3. Klicken Sie auf Erstellen und warten Sie, bis Ihr Dienst bereitgestellt wurde.

YAML

So stellen Sie den Proxyserver-Container und den Webanwendungscontainer als einzelnen Dienst bereit:

gcloud run services replace service.yaml

Bereitgestellten Dienst prüfen

Um zu prüfen, ob erfolgreich bereitgestellt wurde: Kopieren Sie die generierte Cloud Run-URL und öffnen Sie sie in einem Browser oder verwenden Sie den folgenden Befehl, um eine authentifiziere Anfrage zu senden.

curl --header "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

Sie sollten mit einem nginx-Proxy begrüßt werden, der erfolgreich in den Hello-Sidecar-Container portiert wurde und den Antwortstatus 200 hat.

Möchten Sie es selbst testen?

So folgen Sie dieser Anleitung:

gcloud

  1. Klonen Sie in einem Terminal das Beispiel-App-Repository auf Ihren lokalen Computer:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples

  2. Wechseln Sie in das Verzeichnis, das den Cloud Run-Beispielcode enthält:

    cd cloud-run-samples/multi-container/hello-nginx-sample/

Nächste Schritte

Weitere Informationen zur Verwendung von Sidecars in einem Cloud Run-Dienst: