1. Обзор
Введение
В этой лабораторной работе вы узнаете, как развернуть службу Cloud Run , использующую несколько контейнеров . Вы создадите приложение node.js, которое будет использоваться в качестве входного контейнера Cloud Run, и дополнительное приложение node.js, которое будет использоваться в качестве вспомогательного приложения.
Технический обзор
При использовании нескольких контейнеров в экземпляре Cloud Run один контейнер используется в качестве основного для входа в Интернет. Один или несколько дополнительных контейнеров называются колясками.
Существует два способа взаимодействия нескольких контейнеров между собой:
- Контейнеры используют общий сетевой интерфейс localhost, поэтому все контейнеры могут прослушивать порт, например localhost:port.
- Вы также можете использовать тома в памяти и монтировать их в контейнеры для совместного использования файлов.
Варианты использования
Поскольку все контейнеры в экземпляре Cloud Run используют общий сетевой интерфейс localhost, вы можете использовать дополнительный интерфейс перед основным контейнером для прокси-запросов. Такие прокси могут обеспечить дополнительный уровень абстракции для более эффективного потока трафика к приложению между клиентом и серверами путем перехвата запросов и пересылки их в соответствующую конечную точку. В качестве примера можно использовать официальный образ Nginx с DockerHub (как показано здесь ).
Поскольку несколько контейнеров могут взаимодействовать, обмениваясь файлами через общие тома , вы добавляете в свой сервис различные дополнительные приложения. Например, вы можете настроить свою службу Cloud Run на использование пользовательских агентов, таких как OpenTelemetry, для экспорта журналов, метрик и трассировок ( пример OpenTelemetry ). Другой пример — использование дополнительного подключения к базе данных Cloud Spanner PostgreSQL ( пример Cloud Spanner Postgress ).
Примеры в этой кодовой лаборатории
В этой лаборатории кода вы сначала развернете службу Cloud Run, в которой ее входной контейнер взаимодействует с дополнительным устройством через порт локального хоста. Затем вы обновите входной контейнер и вспомогательную версию, чтобы предоставить общий доступ к файлу через монтирование тома.
Что вы узнаете
- Как создать контейнер, использующий сайдкар
- Как входной контейнер может взаимодействовать с сайдкаром с помощью localhost
- Как входящий контейнер и дополнительный контейнер могут совместно использовать файл через смонтированный том
2. Настройка и требования
Предварительные условия
- Вы вошли в облачную консоль.
- Ранее вы развернули службу Cloud Run. Например, вы можете выполнить развертывание веб-службы из краткого руководства по исходному коду, чтобы начать работу.
Активировать Cloud Shell
- В Cloud Console нажмите «Активировать Cloud Shell». .
Если вы запускаете Cloud Shell впервые, вы увидите промежуточный экран с описанием того, что это такое. Если вам был представлен промежуточный экран, нажмите «Продолжить» .
Подготовка и подключение к Cloud Shell займет всего несколько минут.
Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью браузера.
После подключения к Cloud Shell вы увидите, что вы прошли аутентификацию и что для проекта установлен идентификатор вашего проекта.
- Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:
gcloud auth list
Вывод команды
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project
Вывод команды
[core] project = <PROJECT_ID>
Если это не так, вы можете установить его с помощью этой команды:
gcloud config set project <PROJECT_ID>
Вывод команды
Updated property [core/project].
3. Создайте входное приложение
Установите переменные среды
В этой лаборатории кода вы создадите несколько переменных среды, чтобы улучшить читаемость команд gcloud
, используемых в этой лаборатории кода.
REGION=<YOUR-REGION> PROJECT_ID=<YOUR-PROJECT-ID> SERVICE_NAME=sidecar-codelab REPO_NAME=sidecar-codelab
Создайте репозиторий ArtifactRegistry для хранения образов контейнеров.
Вы можете создать репозиторий в реестре артефактов для хранения образов контейнеров для этой лаборатории кода.
gcloud artifacts repositories create $REPO_NAME --repository-format=docker \ --location=$REGION --description="sidecar codelab"
Затем создайте файл package.json
со следующим содержимым:
{ "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" } }
Теперь создайте файл ingress.js
со следующим содержимым:
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 для входного контейнера.
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" ]
И создайте файл ``.dockerignore` для входного контейнера.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Теперь вы можете создать образ для вашего входного контейнера, выполнив следующую команду:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
4. Создайте приложение с коляской.
В этом разделе вы создадите второе приложение node.js, которое будет использоваться в качестве дополнительного приложения в сервисе Cloud Run.
Перейдите в каталог коляски.
cd ../sidecar
Создайте файл package.json
со следующим содержимым:
{ "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" } }
Теперь создайте файл sidecar.js
со следующим содержимым:
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 для контейнера коляски.
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" ]
И создайте файл ``.dockerignore` для контейнера сопровождения.
# Exclude locally installed dependencies node_modules/ # Exclude "build-time" ignore files. .dockerignore .gcloudignore # Exclude git history and configuration. .gitignore
Теперь вы можете создать образ для вашего входного контейнера, выполнив следующую команду:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Развертывание службы Cloud Run
Вы развернете службу Cloud Run с помощью файла yaml.
Перейдите в родительский каталог.
cd ..
Создайте файл sidecar-codelab.yaml
со следующим содержимым:
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"
Затем разверните службу с помощью следующей команды. Вам необходимо использовать бета-версию gcloud, поскольку монтирование томов находится в общедоступной предварительной версии.
gcloud beta run services replace sidecar-codelab.yaml
После развертывания сохраните URL-адрес службы в переменной среды.
SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)')
5. Позвоните в службу Cloud Run.
Теперь вы можете позвонить в службу, предоставив свой идентификационный токен.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Ваши результаты должны выглядеть примерно так, как показано в примере ниже:
The sidecar says: Hello ingress container! I'm the sidecar.
6. Поделитесь файлом через монтирование тома
В этом разделе вы обновите контейнеры для совместного использования файла через монтирование тома. В этом примере входной контейнер будет записывать данные в файл на общем томе. Sidecar прочитает файл и вернет его содержимое обратно во входной контейнер.
Сначала вы обновите код входного контейнера. Перейдите во входной каталог.
cd ../ingress
а затем замените содержимое файла ingress.js
следующим:
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}`); });
И создайте новый образ для вашего входного контейнера, выполнив следующую команду:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest
Теперь перейдите в каталог коляски:
cd ../sidecar
И обновите sidecar.js
следующим содержимым:
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}`); });
И создайте новый образ для вашего контейнера с коляской, выполнив следующую команду:
gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest
Обновите файл sidecar-codelab.yaml
указав следующее, чтобы предоставить общий доступ к тому:
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
Разверните обновленный файл sidecar-codelab.yaml
gcloud beta run services replace sidecar-codelab.yaml
Теперь вы можете позвонить в службу, предоставив свой идентификационный токен.
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}
Ваши результаты должны выглядеть примерно так, как показано в примере ниже:
The sidecar says: the ingress container created this file.
7. Поздравляем!
Поздравляем с завершением работы над кодом!
Мы рекомендуем ознакомиться с документацией по Cloud Run , в частности по развертыванию мультиконтейнеров и использованию монтирования томов в памяти.
Что мы рассмотрели
- Как создать контейнер, использующий сайдкар
- Как входной контейнер может взаимодействовать с сайдкаром с помощью localhost
- Как входящий контейнер и дополнительный контейнер могут совместно использовать смонтированный том
8. Очистка
Чтобы избежать непреднамеренных расходов (например, если эта облачная функция случайно вызывается больше раз, чем выделено ежемесячное количество вызовов Cloud Run на уровне бесплатного пользования ), вы можете либо удалить службу Cloud Run, либо удалить проект, созданный на шаге 2.
Чтобы удалить облачную функцию, перейдите в облачную консоль облачных функций по адресу https://console.cloud.google.com/run/ и удалите службу sidecar-codelab
(или $SERVICE_NAME, если вы использовали другое имя).
Если вы решите удалить весь проект, вы можете перейти на https://console.cloud.google.com/cloud-resource-manager , выбрать проект, созданный на шаге 2, и нажать «Удалить». Если вы удалите проект, вам придется изменить проекты в Cloud SDK. Вы можете просмотреть список всех доступных проектов, запустив gcloud projects list
.