साइडकार के साथ Cloud Run सेवा बनाना

1. खास जानकारी

परिचय

इस कोडलैब में, आपको Cloud Run सेवा को डिप्लॉय करने का तरीका बताया जाएगा. यह सेवा, एक से ज़्यादा कंटेनर का इस्तेमाल करती है. आपको एक node.js ऐप्लिकेशन बनाना होगा. इसका इस्तेमाल Cloud Run के इनग्रेस कंटेनर के तौर पर किया जाएगा. साथ ही, एक और node.js ऐप्लिकेशन बनाना होगा. इसका इस्तेमाल साइडकार के तौर पर किया जाएगा.

तकनीकी जानकारी

Cloud Run इंस्टेंस में एक से ज़्यादा कंटेनर का इस्तेमाल करते समय, एक कंटेनर को वेब इनग्रेस के लिए मुख्य कंटेनर के तौर पर इस्तेमाल किया जाता है. एक या इससे ज़्यादा अतिरिक्त कंटेनर को साइडकार कहा जाता है.

एक से ज़्यादा कंटेनर, एक-दूसरे से दो तरीकों से कम्यूनिकेट कर सकते हैं:

  1. कंटेनर, लोकल होस्ट नेटवर्क इंटरफ़ेस शेयर करते हैं.इसलिए, सभी कंटेनर किसी पोर्ट को सुन सकते हैं. जैसे, localhost:port.
  2. फ़ाइलें शेयर करने के लिए, इन-मेमोरी वॉल्यूम का इस्तेमाल किया जा सकता है. साथ ही, उन्हें कंटेनर पर माउंट किया जा सकता है.

उपयोग के उदाहरण

Cloud Run इंस्टेंस में मौजूद सभी कंटेनर, लोकलहोस्ट नेटवर्क इंटरफ़ेस शेयर करते हैं. इसलिए, अनुरोधों को प्रॉक्सी करने के लिए, अपने मुख्य कंटेनर के सामने साइडकार का इस्तेमाल किया जा सकता है. इस तरह की प्रॉक्सी, क्लाइंट और सर्वर के बीच ऐप्लिकेशन पर ट्रैफ़िक को ज़्यादा असरदार तरीके से भेजने के लिए, अबस्ट्रैक्शन की एक अतिरिक्त लेयर उपलब्ध करा सकती हैं. इसके लिए, वे अनुरोधों को इंटरसेप्ट करती हैं और उन्हें सही एंडपॉइंट पर फ़ॉरवर्ड करती हैं. उदाहरण के लिए, DockerHub से Nginx की आधिकारिक इमेज का इस्तेमाल किया जा सकता है. इसे यहां दिखाया गया है.

एक से ज़्यादा कंटेनर, शेयर किए गए वॉल्यूम के ज़रिए फ़ाइलें शेयर करके एक-दूसरे से कम्यूनिकेट कर सकते हैं. इसलिए, अपनी सेवा में अलग-अलग साइडकार ऐप्लिकेशन जोड़े जा सकते हैं. उदाहरण के लिए, अपनी Cloud Run सेवा को OpenTelemetry जैसे कस्टम एजेंट का इस्तेमाल करने के लिए इंस्ट्रूमेंट किया जा सकता है, ताकि लॉग, मेट्रिक, और ट्रेस एक्सपोर्ट किए जा सकें (OpenTelemetry का उदाहरण). एक और उदाहरण, Cloud Spanner PostgreSQL डेटाबेस (Cloud Spanner Postgress का उदाहरण) से कनेक्ट करने के लिए, साइडकार का इस्तेमाल करना है.

इस कोडलैब में दिए गए उदाहरण

इस कोडलैब में, सबसे पहले Cloud Run सेवा को डिप्लॉय किया जाएगा. इसमें, इसका इनग्रेस कंटेनर, लोकल होस्ट पोर्ट के ज़रिए साइडकार से कम्यूनिकेट करता है. इसके बाद, वॉल्यूम माउंट के ज़रिए फ़ाइल शेयर करने के लिए, इनग्रेस कंटेनर और साइडकार को अपडेट करें.

आपको क्या सीखने को मिलेगा

  • साइडकार का इस्तेमाल करने वाला कंटेनर बनाने का तरीका
  • कोई इनग्रेस कंटेनर, लोकल होस्ट का इस्तेमाल करके साइडकार से कैसे कम्यूनिकेट कर सकता है
  • माउंट किए गए वॉल्यूम के ज़रिए, इनग्रेस कंटेनर और साइडकार, दोनों एक फ़ाइल को कैसे शेयर कर सकते हैं

2. सेटअप और ज़रूरी शर्तें

ज़रूरी शर्तें

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें d1264ca30785e435.png पर क्लिक करें.

cb81e7c8e34bc8d.png

अगर आपने Cloud Shell को पहली बार शुरू किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर आपको इंटरमीडिएट स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है, जो हमेशा बनी रहती है. साथ ही, यह Google Cloud में काम करता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम ब्राउज़र से किया जा सकता है.

Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि हो गई है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट कर दिया गया है.

  1. पुष्टि करें कि आपने 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`
  1. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
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 रेपो बनाएं

इस कोडलैब के लिए, Artifact Registry में एक रेपो बनाई जा सकती है. इसमें कंटेनर इमेज सेव की जा सकती हैं.

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}`);
});

इनग्रेस कंटेनर के लिए एक डॉकरफ़ाइल बनाएं

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 beta का इस्तेमाल करना होगा, क्योंकि वॉल्यूम माउंट करने की सुविधा, पब्लिक प्रीव्यू में है.

gcloud beta run services replace sidecar-codelab.yaml

डप्लॉय होने के बाद, सेवा के यूआरएल को एनवायरमेंट वैरिएबल में सेव करें.

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. वॉल्यूम माउंट के ज़रिए कोई फ़ाइल शेयर करना

इस सेक्शन में, आपको वॉल्यूम माउंट के ज़रिए फ़ाइल शेयर करने के लिए, कंटेनर अपडेट करने का तरीका बताया गया है. इस उदाहरण में, इनग्रेस कंटेनर, शेयर किए गए वॉल्यूम पर मौजूद किसी फ़ाइल में डेटा लिखेगा. साइडकार, फ़ाइल को पढ़ेगा और उसके कॉन्टेंट को वापस इनग्रेस कंटेनर में भेज देगा.

सबसे पहले, आपको इनग्रेस कंटेनर कोड अपडेट करना होगा. इनग्रेस डायरेक्ट्री पर जाएं.

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 से जुड़ा दस्तावेज़ पढ़ें. खास तौर पर, मल्टीकंटेनर डिप्लॉय करने और इन-मेमोरी वॉल्यूम माउंट इस्तेमाल करने के बारे में जानकारी पाएं.

हमने क्या-क्या बताया

  • साइडकार का इस्तेमाल करने वाला कंटेनर बनाने का तरीका
  • कोई इनग्रेस कंटेनर, लोकल होस्ट का इस्तेमाल करके साइडकार से कैसे कम्यूनिकेट कर सकता है
  • कोई इनग्रेस कंटेनर और साइडकार, दोनों माउंट किए गए वॉल्यूम को कैसे शेयर कर सकते हैं

8. व्यवस्थित करें

अनचाहे शुल्क से बचने के लिए, (उदाहरण के लिए, अगर इस Cloud फ़ंक्शन को फ़्री टियर में Cloud Run के लिए हर महीने तय किए गए कॉल की संख्या से ज़्यादा बार अनजाने में कॉल किया जाता है), तो Cloud Run सेवा को मिटा दें या दूसरे चरण में बनाए गए प्रोजेक्ट को मिटा दें.

Cloud फ़ंक्शन को मिटाने के लिए, Cloud Function Cloud Console पर जाएं. इसके लिए, https://console.cloud.google.com/run/ पर जाएं और sidecar-codelab सेवा (या अगर आपने किसी दूसरे नाम का इस्तेमाल किया है, तो $SERVICE_NAME) को मिटाएं.

अगर आपको पूरा प्रोजेक्ट मिटाना है, तो https://console.cloud.google.com/cloud-resource-manager पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.