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

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

ভূমিকা

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

প্রযুক্তিগত সংক্ষিপ্ত বিবরণ

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

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

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

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

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

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

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

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

আপনি যা শিখবেন

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

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

পূর্বশর্ত

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

  1. ক্লাউড কনসোল থেকে, Activate Cloud Shell-এ ক্লিক করুন। 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

আপনার কন্টেইনার ইমেজগুলো রাখার জন্য একটি আর্টিফ্যাক্টরেজিস্ট্রি রিপো তৈরি করুন।

এই কোডল্যাবের জন্য আপনার কন্টেইনার ইমেজগুলো সংরক্ষণ করতে আপনি আর্টিফ্যাক্ট রেজিস্ট্রি-তে একটি রিপো তৈরি করতে পারেন।

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 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)') 

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

এখন আপনি আপনার আইডেন্টিটি টোকেন প্রদান করে পরিষেবাটি কল করতে পারবেন।

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 -এ গিয়ে, ধাপ ২-এ তৈরি করা প্রজেক্টটি নির্বাচন করে 'ডিলিট' (Delete) বিকল্পটি বেছে নিতে পারেন। প্রজেক্টটি মুছে ফেললে, আপনাকে আপনার ক্লাউড এসডিকে (Cloud SDK)-তে প্রজেক্ট পরিবর্তন করতে হবে। আপনি gcloud projects list চালিয়ে সমস্ত উপলব্ধ প্রজেক্টের তালিকা দেখতে পারেন।