পাঠ ৫৭ · ৫৭-এর মধ্যে · মডিউল ১৩
Home / Courses / Cloud Computing & DevOps / চূড়ান্ত প্রকল্প

চূড়ান্ত প্রকল্প — সম্পূর্ণ DevOps পাইপলাইন ডিজাইন সিমুলেশন

Capstone — a full DevOps pipeline design simulation
১৮ মিনিট পড়া উন্নত · Advanced ক্যাপস্টোন প্রজেক্ট Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • একটি নতুন প্রোডাক্টের জন্য কীভাবে প্রান্ত থেকে প্রান্ত একটি DevOps প্ল্যাটফর্ম ডিজাইন করতে হয়, কোর্সের বিভিন্ন মডিউলের কৌশল একত্র করে
  • কেন প্রতিটি সিদ্ধান্ত (কম্পিউট, IaC, CI/CD, K8s, মনিটরিং, DR, FinOps) একে অপরের সাথে সংযুক্ত, বিচ্ছিন্ন নয়
  • একাধিক আলাদা লেসনের সিমুলেটেড ফলাফল কীভাবে একটি একক, সমন্বিত প্ল্যাটফর্ম রিপোর্টে একত্র করা যায়
  • GitOps (M8) কীভাবে ডিজাস্টার রিকভারি (M13)-কে সহজ করে তোলে — একটি ক্রস-মডিউল সংযোগ

১ · প্রকল্পের প্রেক্ষাপট

একটি কাল্পনিক স্টার্টআপ একটি নতুন প্রোডাক্ট — একটি রিয়েল-টাইম কোলাবোরেশন টুল — লঞ্চ করতে যাচ্ছে। টিমের কাছে কোনো বিদ্যমান ইনফ্রাস্ট্রাকচার নেই, শুধু কোড। লক্ষ্য: এই পুরো কোর্সে শেখা প্রতিটি স্তম্ভ ব্যবহার করে একটি সম্পূর্ণ, প্রোডাকশন-রেডি প্ল্যাটফর্ম ডিজাইন করা — প্রতিটি সিদ্ধান্তে "কেন এটি বেছে নেওয়া হলো" এবং "কোন লেসনের কৌশল এখানে প্রয়োগ হচ্ছে" স্পষ্টভাবে ব্যাখ্যা করে।

২ · কম্পিউট/স্টোরেজ/নেটওয়ার্কিং ফাউন্ডেশন (M1-M4)

কম্পিউট: রিয়েল-টাইম কোলাবোরেশন ফিচার (দীর্ঘস্থায়ী WebSocket কানেকশন সহ) পোর্টেবিলিটি ও ধারাবাহিক পরিবেশের জন্য কন্টেইনারে চলবে, শুধু কাঁচা VM-এ নয় (L05 বনাম L22 — কন্টেইনার বেছে নেওয়া হলো কারণ এটি dev/staging/prod জুড়ে "works on my machine" সমস্যা দূর করে এবং M7-এর Kubernetes অর্কেস্ট্রেশনের সাথে সরাসরি সংযুক্ত)। ব্যাকগ্রাউন্ড, সাময়িক কাজ (যেমন ইমেইল নোটিফিকেশন পাঠানো) সার্ভারলেস FaaS-এ (L07) চলবে, কারণ এই কাজগুলো সাড়ম্বর নয়, ইভেন্ট-ট্রিগার্ড। স্টোরেজ: ব্যবহারকারীর আপলোড করা ফাইল অবজেক্ট স্টোরেজে (L09) যাবে, প্রাইমারি ডেটাবেস একটি ম্যানেজড সার্ভিস হিসেবে (L10) চলবে যাতে টিমকে নিজে প্যাচিং/ব্যাকআপ সামলাতে না হয়। নেটওয়ার্কিং: একটি VPC-তে (L13) পাবলিক সাবনেটে লোড ব্যালেন্সার, প্রাইভেট সাবনেটে ডেটাবেস ও অ্যাপ্লিকেশন সার্ভার রাখা হবে (least-privilege নেটওয়ার্কিং, L16)।

৩ · IaC-ম্যানেজড ইনফ্রাস্ট্রাকচার, মডিউল সহ (M5/L18-19)

পুরো VPC, কম্পিউট ক্লাস্টার ও ডেটাবেস Terraform দিয়ে ডিক্লারেটিভভাবে সংজ্ঞায়িত (L18) — কোনো ম্যানুয়াল কনসোল-ক্লিকিং নয়, প্রতিটি পরিবর্তন একটি রিভিউ করা প্ল্যানের মধ্য দিয়ে যায়। একটি পুনঃব্যবহারযোগ্য "স্ট্যান্ডার্ড ওয়েব সার্ভিস" মডিউল (L19) dev/staging/production — তিন এনভায়রনমেন্টেই একই সামঞ্জস্যপূর্ণ কাঠামো তৈরি করে, শুধু প্যারামিটার (ইনস্ট্যান্স সাইজ, রেপ্লিকা কাউন্ট) পাল্টে।

৪ · কন্টেইনারাইজড অ্যাপ + সিকিউরিটি-স্ক্যানিং সহ CI/CD (M6, M8)

প্রতিটি কমিট একটি CI পাইপলাইন ট্রিগার করে (L33) — লিন্ট → ইউনিট টেস্ট → multi-stage Dockerfile বিল্ড (L23, L25) → ইমেজ ভালনারেবিলিটি স্ক্যান (L26), ফেইল-ফাস্ট নিয়মে। এটি L53-এর কেস স্টাডিতে ব্যবহৃত ঠিক একই প্যাটার্ন, এখন একটি নতুন প্রোডাক্টের প্রথম দিন থেকেই প্রয়োগ করা হচ্ছে — মাইগ্রেশনের অপেক্ষা না করে।

৫ · Kubernetes ডিপ্লয়মেন্ট, Helm ও ক্যানারি রোলআউট (M7, M8/L37)

অ্যাপ্লিকেশন একটি Kubernetes Deployment/Service (L28-29) হিসেবে চলে, কনফিগারেশন/সিক্রেট ConfigMap/Secret দিয়ে ইনজেক্ট হয় (L30), এবং পুরো ম্যানিফেস্ট সেট একটি Helm চার্টে প্যাকেজ করা (L31) — L56-এর কেস স্টাডির সরাসরি প্রয়োগ। প্রতিটি রিলিজ একটি ক্যানারি স্ট্র্যাটেজিতে (L37) যায় — প্রথমে ৫% ট্রাফিক, স্বাস্থ্য নিশ্চিত হলে ধীরে ধীরে বৃদ্ধি — যাতে একটি লঞ্চ-দিনের বাগ পুরো ইউজারবেসকে একসাথে আঘাত না করে।

৬ · কেন্দ্রীয় মনিটরিং/লগিং/ট্রেসিং ও অ্যালার্টিং (M10)

মেট্রিক্স (L41) গোল্ডেন সিগনাল ট্র্যাক করে, সেন্ট্রালাইজড লগিং (L42) সব সার্ভিসের লগ একটি জায়গায় সার্চযোগ্য করে, ডিস্ট্রিবিউটেড ট্রেসিং (L43) একটি রিকোয়েস্টের পুরো ক্রস-সার্ভিস পথ দেখায়। অ্যালার্টিং (L44) শুধুমাত্র কনসিকিউটিভ থ্রেশহোল্ড ব্রিচে ট্রিগার হয় (নয়েজ কমাতে), এবং ক্যানারি রোলআউটের সময় এরর-রেট স্পাইক ধরা পড়লে স্বয়ংক্রিয় রোলব্যাক ট্রিগার করে — L54-এর কেস স্টাডির প্যাটার্নের সরাসরি পুনরাবৃত্তি।

৭ · ডকুমেন্টেড DR/মাল্টি-ক্লাউড পসচার (M12/L52, M13/L55)

লঞ্চের প্রথম দিন থেকেই টিম L52-এর পোর্টেবিলিটি নীতি মেনে চলে (কন্টেইনার, Kubernetes, Terraform — কোনো ভারী প্রোপাইটারি লক-ইন নয়) যাতে ভবিষ্যতে প্রয়োজনে মাল্টি-ক্লাউড DR (L55) সম্ভব থাকে। প্রাথমিকভাবে একটি অ্যাক্টিভ-প্যাসিভ/পাইলট-লাইট সেটআপ বেছে নেওয়া হয়েছে (স্টার্টআপ পর্যায়ে খরচ সংবেদনশীলতা বিবেচনায়), একটি নির্দিষ্ট RPO/RTO (L12) মেনে, এবং একটি ত্রৈমাসিক ফেইলওভার ড্রিল ক্যালেন্ডারে নির্ধারিত।

৮ · FinOps কস্ট-অ্যালোকেশন ও রাইট-সাইজিং রিভিউ ক্যাডেন্স (M12/L50-51)

প্রতিটি রিসোর্স টিম-ট্যাগসহ প্রভিশন করা হয় (L51), যাতে খরচ সঠিকভাবে বরাদ্দ করা যায় এবং কোনো "অনাথ" খরচ অদৃশ্য না থাকে। একটি মাসিক রাইট-সাইজিং রিভিউ (L50) প্রকৃত ব্যবহার বনাম প্রভিশন করা ক্যাপাসিটি তুলনা করে — লঞ্চের পরের মাসগুলোতে ট্রাফিক প্যাটার্ন স্থিতিশীল হওয়ার সাথে সাথে এই রিভিউ ক্যাডেন্স প্ল্যাটফর্মকে ক্রমাগত সঠিক আকারে রাখে, প্রথম দিনের অনুমান-ভিত্তিক প্রভিশনিংয়ের উপর চিরকাল নির্ভর না করে।

IaC (M5) Terraform + Modules CI/CD (M6, M8) Build, Scan, Canary Kubernetes (M7) Helm-managed মনিটরিং M10 FinOps M12
প্রতিটি স্তম্ভ কোর্সের একটি ভিন্ন মডিউল থেকে এসেছে, কিন্তু একসাথেই একটি সম্পূর্ণ প্ল্যাটফর্ম তৈরি করে।

৯ · কোড — চূড়ান্ত প্ল্যাটফর্ম সামারি রিপোর্ট

নিচের কোডটি এই কোর্সের চারটি ভিন্ন লেসনের প্যাটার্ন থেকে ছোট সিমুলেটেড ফলাফল টেনে নিয়ে একটি একক, সমন্বিত "প্ল্যাটফর্ম সামারি রিপোর্টে" একত্র করে — একটি CI রান (L33), একটি ক্যানারি স্প্লিট (L37), একটি টিম-ভিত্তিক কস্ট ব্রেকডাউন (L51), ও একটি রাইট-সাইজিং সুপারিশ (L50)।

Python
import random

platform_report = {}

# --- ১. CI পাইপলাইন ফলাফল (L33-এর প্যাটার্ন) ---
def run_ci_pipeline(stages):
    for name, passed in stages:
        if not passed:
            return False, name
    return True, None

ci_stages = [("lint", True), ("unit_test", True), ("build_image", True), ("scan_image", True)]
ci_passed, failed_stage = run_ci_pipeline(ci_stages)
platform_report["ci_pipeline"] = {
    "status": "PASS" if ci_passed else f"FAIL at {failed_stage}",
    "stages_run": len(ci_stages),
}

# --- ২. ক্যানারি ট্রাফিক-স্প্লিট ফলাফল (L37-এর প্যাটার্ন) ---
def route_traffic(canary_pct, rng):
    return "new_version" if rng.random() * 100 < canary_pct else "old_version"

rng = random.Random(7)
canary_pct = 5
routed = [route_traffic(canary_pct, rng) for _ in range(1000)]
new_version_pct = routed.count("new_version") / len(routed) * 100
platform_report["canary_rollout"] = {
    "configured_pct": canary_pct,
    "actual_pct": round(new_version_pct, 1),
}

# --- ৩. টিম-ভিত্তিক কস্ট ব্রেকডাউন (L51-এর প্যাটার্ন) ---
tagged_resources = [
    {"team": "platform",     "monthly_cost": 420},
    {"team": "collaboration","monthly_cost": 680},
    {"team": "collaboration","monthly_cost": 150},
    {"team": None,            "monthly_cost": 90},   # ট্যাগবিহীন — FinOps সমস্যা
]

def cost_by_team(resources):
    totals = {}
    untagged = 0
    for r in resources:
        if r["team"] is None:
            untagged += r["monthly_cost"]
        else:
            totals[r["team"]] = totals.get(r["team"], 0) + r["monthly_cost"]
    return totals, untagged

team_costs, untagged_cost = cost_by_team(tagged_resources)
platform_report["cost_by_team"] = team_costs
platform_report["untagged_cost_warning"] = untagged_cost

# --- ৪. রাইট-সাইজিং সুপারিশ (L50-এর প্যাটার্ন) ---
resources_to_check = {
    "web-tier":  {"provisioned_size": 100, "observed_peak_utilization_pct": 22},
    "db-tier":   {"provisioned_size": 100, "observed_peak_utilization_pct": 91},
}

def recommend_rightsizing(resources, target_pct=70):
    recs = {}
    for name, info in resources.items():
        peak = info["observed_peak_utilization_pct"]
        if peak < target_pct - 30:
            recs[name] = "downsize (উল্লেখযোগ্যভাবে ওভার-প্রভিশনড)"
        elif peak > 90:
            recs[name] = "upsize (ক্যাপাসিটি সীমার কাছাকাছি)"
        else:
            recs[name] = "ঠিক আছে"
    return recs

platform_report["rightsizing"] = recommend_rightsizing(resources_to_check)

# --- চূড়ান্ত সমন্বিত রিপোর্ট ---
print("=== প্ল্যাটফর্ম সামারি রিপোর্ট ===\n")
for section, data in platform_report.items():
    print(f"{section}:")
    print(f"  {data}\n")

    
লক্ষ্য করুন এই একটি কোড সেলে চারটি সম্পূর্ণ ভিন্ন লেসনের প্যাটার্ন — CI (L33), ক্যানারি (L37), কস্ট-অ্যালোকেশন (L51), রাইট-সাইজিং (L50) — একসাথে একটি একক রিপোর্টে মিশে গেছে। untagged_cost_warning-এ ৯০ দেখাচ্ছে একটি রিসোর্স এখনও কোনো টিমের সাথে ট্যাগড নয় (একটি বাস্তব FinOps সমস্যা), আর rightsizing দেখাচ্ছে "web-tier" ওভার-প্রভিশনড (২২% ব্যবহার) আর "db-tier" ক্যাপাসিটি সীমার কাছাকাছি (৯১%) — দুটোই অ্যাকশনেবল ফলো-আপ তৈরি করে।
মূল কথা · Key takeaway

একটি সম্পূর্ণ DevOps প্ল্যাটফর্ম কোনো একক বড়, জাদুকরী সিস্টেম নয় — এটি এই কোর্সের ১৩টি মডিউলে শেখা অনেকগুলো ছোট, স্বাধীনভাবে বোঝা কৌশলের একটি সুশৃঙ্খল, পরস্পর-সংযুক্ত সমাবেশ। প্রতিটি সিদ্ধান্ত (কম্পিউট চয়েস থেকে FinOps রিভিউ পর্যন্ত) অন্য সিদ্ধান্তগুলোকে প্রভাবিত করে এবং তাদের দ্বারা প্রভাবিত হয়।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন। এই প্রশ্নগুলো ইচ্ছাকৃতভাবে একাধিক মডিউল জুড়ে চিন্তা করতে বলে।

প্র ০১ GitOps (M8/L36) কীভাবে ডিজাস্টার রিকভারি (M13/L55)-কে সহজ করে তোলে — এখানে GitOps-এর ঠিক কোন বৈশিষ্ট্যটি সাহায্য করে?

যেহেতু GitOps-এ Git-ই ডিজায়ার্ড স্টেটের একমাত্র সোর্স অফ ট্রুথ, একটি সম্পূর্ণ নতুন প্রোভাইডারে (DR ফেইলওভারের সময়) পুরো এনভায়রনমেন্ট পুনর্নির্মাণ করা মানে শুধু GitOps রিকনসাইলারকে নতুন ক্লাস্টারের দিকে "পয়েন্ট" করা — কোনো ম্যানুয়ালি ডকুমেন্ট-না-করা কনফিগারেশন পুনর্গঠনের চেষ্টা করতে হয় না, যা মানুষের স্মৃতি বা অসম্পূর্ণ ডকুমেন্টেশনের উপর নির্ভরশীল এবং ভুল-প্রবণ হতো।

প্র ০২ কেন এই ক্যাপস্টোনের কস্ট-অ্যালোকেশন (M12) সিদ্ধান্ত এবং Kubernetes রেপ্লিকা-কাউন্ট (M7) সিদ্ধান্ত আসলে একে অপরের সাথে সংযুক্ত, দুটি আলাদা, স্বাধীন সিদ্ধান্ত নয়?

একটি সার্ভিসের রেপ্লিকা কাউন্ট সরাসরি তার মাসিক ইনফ্রাস্ট্রাকচার খরচ নির্ধারণ করে — বেশি রেপ্লিকা মানে বেশি খরচ, কম রেপ্লিকা মানে সম্ভাব্য পারফরম্যান্স ঝুঁকি। রাইট-সাইজিং রিভিউ (M12/L50) যখন একটি সার্ভিসকে "ওভার-প্রভিশনড" চিহ্নিত করে, সেই সুপারিশটি সরাসরি M7-এর Deployment/Helm ভ্যালুজ পরিবর্তন করে বাস্তবায়িত হয় — অর্থাৎ FinOps ও Kubernetes অপারেশন একটি একক ফিডব্যাক লুপের দুই প্রান্ত, বিচ্ছিন্ন সাইলো নয়।

প্র ০৩ এই প্ল্যাটফর্মের প্রথম দিন থেকেই পোর্টেবিলিটি (M12/L52) মেনে চলার সিদ্ধান্তটি M10-এর মনিটরিং সেটআপের উপর কী প্রভাব ফেলে?

যদি মনিটরিং/লগিং/অ্যালার্টিং স্ট্যাক নিজেও পোর্টেবল, ওপেন-স্ট্যান্ডার্ড টুলিং (যেমন কন্টেইনারে চলা, প্রোভাইডার-নিরপেক্ষ সলিউশন) ব্যবহার করে, তাহলে ভবিষ্যতে মাল্টি-ক্লাউড DR (M13/L55) বাস্তবায়ন করার সময় দ্বিতীয় প্রোভাইডারেও একই অবজারভেবিলিটি অভিজ্ঞতা পাওয়া যায়। কিন্তু মনিটরিং স্ট্যাক নিজেই যদি একটি প্রোভাইডারের গভীরভাবে প্রোপাইটারি সার্ভিস হয়, তাহলে DR ফেইলওভারের সময় সেকেন্ডারি প্রোভাইডারে "অন্ধভাবে" অপারেট করা লাগতে পারে — পোর্টেবিলিটি নীতি তাই শুধু অ্যাপ্লিকেশন লেয়ারে নয়, পুরো টুলচেইনে প্রযোজ্য হওয়া উচিত।

অনুশীলন

  1. পরীক্ষা করুন: উপরের কোডে resources_to_check-এ একটি তৃতীয় রিসোর্স "cache-tier": {"provisioned_size": 100, "observed_peak_utilization_pct": 55} যোগ করুন এবং recommend_rightsizing কী সুপারিশ দেয় দেখুন।

    ৫৫% ব্যবহার target_pct - 30 = 40-এর উপরে এবং ৯০%-এর অনেক নিচে, তাই ফাংশন "ঠিক আছে" রিপোর্ট করবে — দেখাচ্ছে রাইট-সাইজিং লজিক শুধু চরম কেস (খুব কম বা খুব বেশি ব্যবহার) চিহ্নিত করে, মাঝামাঝি, স্বাস্থ্যকর ব্যবহারের হারে কোনো অপ্রয়োজনীয় অ্যাকশন সুপারিশ করে না।

  2. চিন্তা করুন: এই ৫৭-পাঠের কোর্সে শেখা সবগুলো মডিউলের মধ্যে, কোন দুটি মডিউল আপনার মতে একে অপরের সাথে সবচেয়ে গভীরভাবে সংযুক্ত, এবং কেন?

    এই প্রশ্নের কোনো একক সঠিক উত্তর নেই — তবে একটি শক্তিশালী উদাহরণ M5 (IaC) ও M7 (Kubernetes): উভয়ই একই মূল দর্শনে ভিত্তি করে তৈরি — ডিক্লারেটিভভাবে ডিজায়ার্ড স্টেট বর্ণনা করা এবং একটি কন্ট্রোলার/ টুলকে প্রকৃত অবস্থা সেই দিকে ক্রমাগত রিকনসাইল করতে দেওয়া (L17, L20, L27 — একই ধারণা তিনটি ভিন্ন স্তরে পুনরাবৃত্ত হয়েছে)। এই ধরনের প্যাটার্ন চেনা এই কোর্সের সবচেয়ে গুরুত্বপূর্ণ শিক্ষার একটি।

আরও পড়ুন · আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
কেস স্টাডি: Kubernetes-এ একটি মাইক্রোসার্ভিস ডিপ্লয় করা