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

1. ওভারভিউ

ভূমিকা

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

প্রযুক্তিগত ওভারভিউ

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

একাধিক পাত্রে একে অপরের মধ্যে যোগাযোগ করার দুটি উপায় রয়েছে:

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

কেস ব্যবহার করুন

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

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

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

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

আপনি কি শিখবেন

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

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

পূর্বশর্ত

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

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

cb81e7c8e34bc8d.png

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

d95252b003979716.png

ক্লাউড শেলের সাথে সংযোগ করতে এবং সংযোগ করতে এটির মাত্র কয়েক মুহূর্ত লাগবে৷

7833d5e1c5d18f54.png

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

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

  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].

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

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

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 অ্যাপ তৈরি করবেন যা ক্লাউড রান পরিষেবাতে সাইডকার হিসাবে ব্যবহার করা হবে।

সাইডকার ডিরেক্টরিতে নেভিগেট করুন।

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

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

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

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. অভিনন্দন!

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

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

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

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

8. পরিষ্কার করুন

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

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

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