1. Übersicht
Einführung
In diesem Codelab erfahren Sie, wie Sie einen Cloud Run-Dienst bereitstellen, der mehrere Container verwendet. Sie erstellen eine node.js-Anwendung, die als Cloud Run-Container für eingehenden Traffic verwendet wird, und eine zusätzliche node.js-Anwendung, die als Sidecar verwendet wird.
Technische Übersicht
Wenn Sie mehrere Container in einer Cloud Run-Instanz verwenden, wird ein Container als Hauptcontainer für eingehenden Webtraffic verwendet. Ein oder mehrere zusätzliche Container werden als Sidecars bezeichnet.
Mehrere Container können auf zwei Arten miteinander kommunizieren:
- Die Container teilen sich die localhost-Netzwerkschnittstelle, sodass alle Container einen Port überwachen können, z.B. localhost:port.
- Sie können auch In-Memory-Volumes verwenden und in den Containern bereitstellen, um Dateien freizugeben.
Anwendungsfälle
Da alle Container in der Cloud Run-Instanz die localhost-Netzwerkschnittstelle gemeinsam nutzen, können Sie vor Ihrem Hauptcontainer einen Sidecar-Proxy verwenden, um Anfragen weiterzuleiten. Solche Proxys können eine zusätzliche Abstraktionsebene für einen effizienteren Trafficfluss zwischen Client und Servern zur Anwendung bereitstellen, indem sie Anfragen abfangen und an den entsprechenden Endpunkt weiterleiten. Als Beispiel können Sie das offizielle Nginx-Image von DockerHub verwenden (siehe hier).
Da mehrere Container durch die Freigabe von Dateien über freigegebene Volumes kommunizieren können, fügen Sie Ihrem Dienst verschiedene Sidecar-Anwendungen hinzu. Sie können beispielsweise Ihren Cloud Run-Dienst so instrumentieren, dass benutzerdefinierte Agents wie OpenTelemetry verwendet werden, um Logs, Messwerte und Traces zu exportieren (OpenTelemetry-Beispiel). Ein weiteres Beispiel ist die Verwendung einer Sidecar-Verbindung zu einer PostgreSQL-Datenbank in Cloud Spanner (Postgress-Beispiel für Cloud Spanner).
Beispiele in diesem Codelab
In diesem Codelab stellen Sie zuerst einen Cloud Run-Dienst bereit, bei dem der Ingress-Container über einen localhost-Port mit einer Sidecar-Datei kommuniziert. Anschließend aktualisieren Sie den Ingress-Container und die Sidecar-Datei, um eine Datei über eine Volume-Bereitstellung freizugeben.
Aufgaben in diesem Lab
- Container erstellen, der eine Sidecar-Datei verwendet
- So kann ein Container für eingehenden Traffic über localhost mit einer Sidecar-Datei kommunizieren
- Wie ein Ingress-Container und ein Sidecar eine Datei über ein bereitgestelltes Volume gemeinsam nutzen können
2. Einrichtung und Anforderungen
Voraussetzungen
- Sie sind in der Cloud Console angemeldet.
- Sie haben zuvor einen Cloud Run-Dienst bereitgestellt. Weitere Informationen finden Sie beispielsweise in der Kurzanleitung: Webdienst aus dem Quellcode bereitstellen.
Cloud Shell aktivieren
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren .
Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.
Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.
Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können mit einem Browser erledigt werden.
Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-ID eingestellt ist.
- Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project
Befehlsausgabe
[core] project = <PROJECT_ID>
Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:
gcloud config set project <PROJECT_ID>
Befehlsausgabe
Updated property [core/project].
3. Ingress-Anwendung erstellen
Umgebungsvariablen festlegen
In diesem Codelab erstellen Sie einige Umgebungsvariablen, um die Lesbarkeit der gcloud
-Befehle in diesem Codelab zu verbessern.
REGION=<YOUR-REGION> PROJECT_ID=<YOUR-PROJECT-ID> SERVICE_NAME=sidecar-codelab REPO_NAME=sidecar-codelab
ArtifactRegistry-Repository für die Container-Images erstellen
Sie können in Artifact Registry ein Repository erstellen, um Ihre Container-Images für dieses Codelab zu speichern.
gcloud artifacts repositories create $REPO_NAME --repository-format=docker \ --location=$REGION --description="sidecar codelab"
Erstellen Sie dann eine package.json
-Datei mit folgendem Inhalt:
{ "name": "sidecar-codelab", "version": "1.0.0", "private": true, "description": "demonstrates how to use sidecars in cloud run", "main": "index.js", "author": "Google LLC", "license": "Apache-2.0", "scripts": { "start": "node ingress.js" }, "dependencies": { "axios": "^1.6.2", "express": "^4.18.2" } }
Erstellen Sie nun eine Datei mit dem Namen ingress.js
und folgendem Inhalt:
const express = require('express'); const app = express(); const axios = require("axios"); app.get('/', async (req, res) => { let response = await axios.get("http://localhost:5000"); res.send("The sidecar says: " + response.data); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`Ingress container listening on port ${port}`); });
Dockerfile für Ingress-Container erstellen
FROM node:20.10.0-slim WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --production # Copy local code to the container image. COPY . . # Run the web service on container startup. ENV PORT=8080 CMD [ "npm", "start" ]
Und erstellen Sie eine „.dockerignore“-Datei für den Container für eingehenden Traffic.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Jetzt können Sie das Image für Ihren Ingress-Container erstellen, indem Sie den folgenden Befehl ausführen:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
4. Sidecar-Anwendung erstellen
In diesem Abschnitt erstellen Sie eine zweite node.js-Anwendung, die als Sidecar im Cloud Run-Dienst verwendet wird.
Rufen Sie das Sidecar-Verzeichnis auf.
cd ../sidecar
Erstellen Sie eine package.json
-Datei mit folgendem Inhalt:
{ "name": "sidecar-codelab", "version": "1.0.0", "private": true, "description": "demonstrates how to use sidecars in cloud run", "main": "index.js", "author": "Google LLC", "license": "Apache-2.0", "scripts": { "start": "node sidecar.js" }, "dependencies": { "axios": "^1.6.2", "express": "^4.18.2" } }
Erstellen Sie nun eine Datei mit dem Namen sidecar.js
und folgendem Inhalt:
const express = require('express'); const app = express(); app.get('/', async (req, res) => { res.send("Hello ingress container! I'm the sidecar."); }); const port = parseInt(process.env.PORT || 5000); app.listen(port, () => { console.log(`Sidecar container listening on port ${port}`); });
Dockerfile für den Sidecar-Container erstellen
FROM node:20.10.0-slim WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --production # Copy local code to the container image. COPY . . # Run the web service on container startup. ENV PORT=5000 CMD [ "npm", "start" ]
Erstellen Sie außerdem eine.dockerignore-Datei für den Sidecar-Container.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Jetzt können Sie das Image für Ihren Ingress-Container erstellen, indem Sie den folgenden Befehl ausführen:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Cloud Run-Dienst bereitstellen
Sie stellen den Cloud Run-Dienst mithilfe einer YAML-Datei bereit.
Wechseln Sie zum übergeordneten Verzeichnis.
cd ..
Erstellen Sie eine Datei mit dem Namen sidecar-codelab.yaml
und mit folgendem Inhalt:
apiVersion: serving.knative.dev/v1 kind: Service metadata: annotations: name: sidecar-codelab labels: cloud.googleapis.com/location: "<YOUR_REGION>" spec: template: spec: containers: - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest" ports: - containerPort: 8080 - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest" env: - name: PORT value: "5000"
Stellen Sie dann den Dienst mit dem folgenden Befehl bereit. Sie müssen gcloud beta verwenden, da sich Volume-Bereitstellungen in der öffentlichen Vorschau befinden.
gcloud beta run services replace sidecar-codelab.yaml
Speichern Sie nach der Bereitstellung die Dienst-URL in einer Umgebungsvariablen.
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)')
5. Cloud Run-Dienst aufrufen
Jetzt können Sie Ihren Dienst aufrufen, indem Sie Ihr Identitätstoken angeben.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Die Ergebnisse sollten in etwa so aussehen:
The sidecar says: Hello ingress container! I'm the sidecar.
6. Datei über eine Volume-Bereitstellung freigeben
In diesem Abschnitt aktualisieren Sie die Container, um eine Datei über eine Volume-Bereitstellung freizugeben. In diesem Beispiel schreibt der Container für eingehenden Traffic in eine Datei auf einem freigegebenen Volume. Die Sidecar-Datei liest die Datei und gibt ihren Inhalt an den Ingress-Container zurück.
Zuerst aktualisieren Sie den Containercode für eingehenden Traffic. Rufen Sie das Verzeichnis für eingehenden Traffic auf.
cd ../ingress
und ersetzen Sie dann den Inhalt der Datei ingress.js
durch Folgendes:
const express = require('express'); const app = express(); const fs = require('fs'); const axios = require("axios"); const filename = "test.txt" let path = "/my-volume-mount"; app.use(path, express.static(path)); try { fs.writeFileSync(`${path}/${filename}`, "The ingress container created this file."); } catch (err) { console.error(err); } app.get('/', async (req, res) => { let response = await axios.get("http://localhost:5000"); res.send("The sidecar says: " + response.data); }); const port = parseInt(process.env.PORT) || 8080; app.listen(port, () => { console.log(`Ingress container listening on port ${port}`); });
Und erstellen Sie das neue Image für den Ingress-Container, indem Sie den folgenden Befehl ausführen:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
Wechseln Sie jetzt zum Sidecar-Verzeichnis:
cd ../sidecar
Und aktualisieren Sie sidecar.js
mit folgendem Inhalt:
const express = require('express'); const app = express(); const fs = require('fs'); const filename = "test.txt" let path = "/my-volume-mount"; app.use(path, express.static(path)); async function readFile() { try { return await fs.readFileSync(`${path}/${filename}`, { encoding: 'utf8' }); } catch (err) { console.log(err); } } app.get('/', async (req, res) => { let contents = await readFile(); res.send(contents); }); const port = parseInt(process.env.PORT || 5000); app.listen(port, () => { console.log(`Sidecar container listening on port ${port}`); });
Erstellen Sie nun das neue Image für Ihren Sidecar-Container, indem Sie den folgenden Befehl ausführen:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Geben Sie in sidecar-codelab.yaml
Folgendes ein, um ein Volume freizugeben:
apiVersion: serving.knative.dev/v1 kind: Service metadata: annotations: name: sidecar-codelab labels: cloud.googleapis.com/location: "<YOUR_REGION>" spec: template: spec: containers: - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest" ports: - containerPort: 8080 volumeMounts: - mountPath: /my-volume-mount name: in-memory-1 - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest" env: - name: PORT value: "5000" volumeMounts: - mountPath: /my-volume-mount name: in-memory-1 volumes: - emptyDir: medium: Memory name: in-memory-1
Aktualisierte Datei sidecar-codelab.yaml
bereitstellen
gcloud beta run services replace sidecar-codelab.yaml
Jetzt können Sie Ihren Dienst aufrufen, indem Sie Ihr Identitätstoken angeben.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Die Ergebnisse sollten in etwa so aussehen:
The sidecar says: the ingress container created this file.
7. Glückwunsch!
Herzlichen Glückwunsch zum Abschluss des Codelabs!
Wir empfehlen, die Dokumentation zu Cloud Run zu lesen, insbesondere zur Bereitstellung von Multicontainern und zur Verwendung von Volume-Bereitstellungen im Arbeitsspeicher.
Behandelte Themen
- Container erstellen, der eine Sidecar-Datei verwendet
- So kann ein Container für eingehenden Traffic über localhost mit einer Sidecar-Datei kommunizieren
- So können ein Ingress-Container und ein Sidecar ein bereitgestelltes Volume gemeinsam nutzen
8. Bereinigen
Um versehentliche Gebühren zu vermeiden, z. B. wenn diese Cloud Functions-Funktion versehentlich häufiger aufgerufen wird als Ihre monatliche Zuweisung von Cloud Run-Aufrufen in der kostenlosen Stufe, können Sie entweder den Cloud Run-Dienst oder das in Schritt 2 erstellte Projekt löschen.
Rufen Sie zum Löschen der Cloud Functions-Funktion die Cloud Console unter https://console.cloud.google.com/run/ auf und löschen Sie den sidecar-codelab
-Dienst (oder $SERVICE_NAME, falls Sie einen anderen Namen verwendet haben).
Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit dem Befehl gcloud projects list
aufrufen.