একটি সাইডকার দিয়ে একটি ক্লাউড রান পরিষেবা তৈরি করুন৷

1. সংক্ষিপ্ত বিবরণ

ভূমিকা

এই কোডল্যাবে, আপনি শিখবেন কিভাবে একাধিক কন্টেইনার ব্যবহার করে এমন একটি ক্লাউড রান পরিষেবা স্থাপন করতে হয়। আপনি একটি node.js অ্যাপ তৈরি করবেন যা ক্লাউড রান ইনগ্রেস কন্টেইনার হিসেবে ব্যবহৃত হবে এবং একটি অতিরিক্ত node.js অ্যাপ তৈরি করবেন যা সাইডকার হিসেবে ব্যবহৃত হবে।

প্রযুক্তিগত সারসংক্ষেপ

ক্লাউড রান ইনস্ট্যান্সের মধ্যে একাধিক কন্টেইনার ব্যবহার করার সময়, ওয়েব প্রবেশের জন্য একটি কন্টেইনার প্রধান কন্টেইনার হিসেবে ব্যবহৃত হয়। এক বা একাধিক অতিরিক্ত কন্টেইনারকে সাইডকার বলা হয়।

একাধিক কন্টেইনার একে অপরের সাথে যোগাযোগের দুটি উপায় রয়েছে:

  1. কন্টেইনারগুলি লোকালহোস্ট নেটওয়ার্ক ইন্টারফেস ভাগ করে, তাই সমস্ত কন্টেইনার একটি পোর্ট শুনতে পারে, যেমন localhost:port।
  2. আপনি ইন-মেমোরি ভলিউম ব্যবহার করতে পারেন এবং ফাইল শেয়ার করার জন্য কন্টেইনারে মাউন্ট করতে পারেন।

ব্যবহারের ক্ষেত্রে

যেহেতু ক্লাউড রান ইনস্ট্যান্সের মধ্যে থাকা সমস্ত কন্টেইনার লোকালহোস্ট নেটওয়ার্ক ইন্টারফেস শেয়ার করে, তাই আপনি প্রক্সি অনুরোধের জন্য আপনার প্রধান কন্টেইনারের সামনে একটি সাইডকার ব্যবহার করতে পারেন। এই ধরনের প্রক্সিগুলি ক্লায়েন্ট এবং সার্ভারের মধ্যে অ্যাপ্লিকেশনে ট্র্যাফিকের আরও দক্ষ প্রবাহের জন্য বিমূর্ততার একটি অতিরিক্ত স্তর প্রদান করতে পারে, অনুরোধগুলিকে আটকে রেখে এবং উপযুক্ত এন্ডপয়েন্টে ফরোয়ার্ড করে। উদাহরণস্বরূপ, আপনি DockerHub থেকে অফিসিয়াল Nginx চিত্রটি ব্যবহার করতে পারেন (যেমন এখানে দেখানো হয়েছে)।

যেহেতু একাধিক কন্টেইনার শেয়ার করা ভলিউমের মাধ্যমে ফাইল শেয়ার করে যোগাযোগ করতে পারে, তাই আপনি আপনার পরিষেবায় বিভিন্ন সাইডকার অ্যাপ্লিকেশন যুক্ত করতে পারেন। উদাহরণস্বরূপ, আপনি লগ, মেট্রিক্স এবং ট্রেস রপ্তানি করতে OpenTelemetry এর মতো কাস্টম এজেন্ট ব্যবহার করতে আপনার ক্লাউড রান পরিষেবা ব্যবহার করতে পারেন ( OpenTelemetry উদাহরণ )। আরেকটি উদাহরণ হল একটি ক্লাউড স্প্যানার পোস্টগ্রেএসকিউএল ডাটাবেসের সাথে একটি সাইডকার সংযোগ ব্যবহার করা ( Cloud Spanner Postgress উদাহরণ )।

এই কোডল্যাবের উদাহরণ

এই কোডল্যাবে, আপনি প্রথমে একটি ক্লাউড রান পরিষেবা স্থাপন করবেন যেখানে এর ইনগ্রেস কন্টেইনারটি একটি লোকালহোস্ট পোর্টের মাধ্যমে একটি সাইডকারের সাথে যোগাযোগ করবে। তারপর আপনি একটি ভলিউম মাউন্টের মাধ্যমে একটি ফাইল শেয়ার করার জন্য ইনগ্রেস কন্টেইনার এবং সাইডকার আপডেট করবেন।

তুমি কি শিখবে

  • সাইডকার ব্যবহার করে এমন একটি কন্টেইনার কীভাবে তৈরি করবেন
  • লোকালহোস্ট ব্যবহার করে একটি ইনগ্রেস কন্টেইনার কীভাবে একটি সাইডকারের সাথে যোগাযোগ করতে পারে
  • কিভাবে একটি ইনগ্রেস কন্টেইনার এবং একটি সাইডকার উভয়ই একটি মাউন্ট করা ভলিউমের মাধ্যমে একটি ফাইল ভাগ করতে পারে

2. সেটআপ এবং প্রয়োজনীয়তা

পূর্বশর্ত

ক্লাউড শেল সক্রিয় করুন

  1. ক্লাউড কনসোল থেকে, ক্লাউড শেল সক্রিয় করুন ক্লিক করুন d1264ca30785e435.png সম্পর্কে .

cb81e7c8e34bc8d.png সম্পর্কে

যদি আপনি প্রথমবারের মতো ক্লাউড শেল শুরু করেন, তাহলে আপনাকে একটি মধ্যবর্তী স্ক্রিন দেখানো হবে যা এটি কী তা বর্ণনা করবে। যদি আপনার কাছে একটি মধ্যবর্তী স্ক্রিন থাকে, তাহলে Continue এ ক্লিক করুন।

d95252b003979716.png সম্পর্কে

ক্লাউড শেলের সাথে সংযোগ স্থাপন এবং সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে।

7833d5e1c5d18f54.png সম্পর্কে

এই ভার্চুয়াল মেশিনটিতে প্রয়োজনীয় সকল ডেভেলপমেন্ট টুল রয়েছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি অফার করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার বেশিরভাগ কাজ, যদি সব না হয়, একটি ব্রাউজার দিয়ে করা যেতে পারে।

একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি দেখতে পাবেন যে আপনি প্রমাণিত এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে।

  1. আপনি প্রমাণিত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
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 কমান্ড আপনার প্রকল্প সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project

কমান্ড আউটপুট

[core]
project = <PROJECT_ID>

যদি তা না হয়, তাহলে আপনি এই কমান্ড দিয়ে এটি সেট করতে পারেন:

gcloud config set project <PROJECT_ID>

কমান্ড আউটপুট

Updated property [core/project].

৩. ইনগ্রেস অ্যাপ তৈরি করুন

পরিবেশগত ভেরিয়েবল সেট করুন

এই কোডল্যাবে, আপনি কয়েকটি পরিবেশ ভেরিয়েবল তৈরি করবেন যাতে এই কোডল্যাবে ব্যবহৃত 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}`);
});

ইনগ্রেস কন্টেইনারের জন্য একটি ডকারফাইল তৈরি করুন

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

৪. সাইডকার অ্যাপ তৈরি করুন

এই বিভাগে, আপনি একটি দ্বিতীয় node.js অ্যাপ তৈরি করবেন যা ক্লাউড রান পরিষেবায় সাইডকার হিসেবে ব্যবহৃত হবে।

সাইডকার ডিরেক্টরিতে যান।

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

সাইডকার কন্টেইনারের জন্য একটি ডকারফাইল তৈরি করুন

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

ক্লাউড রান পরিষেবা স্থাপন করুন

আপনি একটি 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)') 

৫. ক্লাউড রান পরিষেবাতে কল করুন

এখন আপনি আপনার পরিচয় টোকেন প্রদান করে আপনার পরিষেবাতে কল করতে পারেন।

curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}

আপনার ফলাফলগুলি নীচের উদাহরণ আউটপুটের মতো দেখতে হবে:

The sidecar says: Hello ingress container! I'm the 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.

৭. অভিনন্দন!

কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!

আমরা ক্লাউড রানের ডকুমেন্টেশন পর্যালোচনা করার পরামর্শ দিচ্ছি, বিশেষ করে মাল্টিকন্টেইনার স্থাপন এবং ইন-মেমরি ভলিউম মাউন্ট ব্যবহার করার জন্য।

আমরা যা কভার করেছি

  • সাইডকার ব্যবহার করে এমন একটি কন্টেইনার কীভাবে তৈরি করবেন
  • লোকালহোস্ট ব্যবহার করে একটি ইনগ্রেস কন্টেইনার কীভাবে একটি সাইডকারের সাথে যোগাযোগ করতে পারে
  • কিভাবে একটি প্রবেশকারী ধারক এবং একটি সাইডকার উভয়ই একটি মাউন্ট করা ভলিউম ভাগ করে নিতে পারে

৮. পরিষ্কার করা

অসাবধানতাবশত চার্জ এড়াতে, (উদাহরণস্বরূপ, যদি এই ক্লাউড ফাংশনটি আপনার মাসিক ক্লাউড রান ইনভোকমেন্ট বরাদ্দের চেয়ে বেশিবার অসাবধানতাবশত ব্যবহার করা হয়), আপনি হয় ক্লাউড রান পরিষেবাটি মুছে ফেলতে পারেন অথবা ধাপ ২-এ তৈরি করা প্রকল্পটি মুছে ফেলতে পারেন।

ক্লাউড ফাংশন মুছে ফেলার জন্য, https://console.cloud.google.com/run/ এ ক্লাউড ফাংশন ক্লাউড কনসোলে যান এবং sidecar-codelab পরিষেবাটি (অথবা যদি আপনি অন্য নাম ব্যবহার করে থাকেন তবে $SERVICE_NAME) মুছে ফেলুন।

যদি আপনি সম্পূর্ণ প্রকল্পটি মুছে ফেলতে চান, তাহলে আপনি https://console.cloud.google.com/cloud-resource-manager এ যেতে পারেন, ধাপ ২-এ তৈরি করা প্রকল্পটি নির্বাচন করুন এবং মুছে ফেলুন নির্বাচন করুন। যদি আপনি প্রকল্পটি মুছে ফেলেন, তাহলে আপনাকে আপনার ক্লাউড SDK-তে প্রকল্পগুলি পরিবর্তন করতে হবে। আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রকল্পের তালিকা দেখতে পারেন।