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

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

परिचय

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

तकनीकी खास जानकारी

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

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

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

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

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

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

इस कोडलैब के उदाहरण

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

आपको इनके बारे में जानकारी मिलेगी

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

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

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

Cloud Shell चालू करें

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

cb81e7c8e34bc8d.png

अगर आपने Cloud Shell का इस्तेमाल पहली बार किया है, तो आपको बीच में आने वाली स्क्रीन दिखेगी. इसमें यह बताया जाएगा कि यह क्या है. अगर आपको बीच के लेवल पर मिलने वाली स्क्रीन दिखती है, तो जारी रखें पर क्लिक करें.

d95252b003979716.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

7833d5e1c5d18f54.png

इस वर्चुअल मशीन में डेवलपमेंट के सभी ज़रूरी टूल मौजूद हैं. इसमें लगातार पांच जीबी की होम डायरेक्ट्री मिलती है और यह 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. 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 का डेटा स्टोर करने की जगह बनाएं

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

इन्ग्रेस डेटा ट्रैफ़िक कंटेनर के लिए 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 सेवा को डिप्लॉय करने के लिए, 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

लागू होने के बाद, सेवा यूआरएल को किसी एनवायरमेंट वैरिएबल में सेव करें.

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 सेवा को मिटाया जा सकता है या दूसरे चरण में बनाए गए प्रोजेक्ट को मिटाया जा सकता है.

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

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