একটি মাত্র কন্টেইনার ডেপ্লয় করা সহজ। দশটি ম্যানেজ করা সামলানো যায়। কিন্তু যখন আপনি ডজন ডজন মেশিনে শত শত কন্টেইনার চালাচ্ছেন, তখন ম্যানুয়াল ম্যানেজমেন্ট কঠিন নয় বরং অসম্ভব হয়ে দাঁড়ায়। কোন কন্টেইনার কোথায় আছে তা আপনি হারিয়ে ফেলেন। একটি সার্ভার অচল হয়ে গেলে, কেউ এসে সেটি রিস্টার্ট না করা পর্যন্ত আপনার অ্যাপ্লিকেশনটি অদৃশ্য হয়ে থাকে। নতুন ইনস্ট্যান্স চালু করার আগেই ট্রাফিক স্পাইক আপনার সেটআপকে বিপর্যস্ত করে দেয়। ঠিক এখানেই Kubernetes এর ভূমিকা শুরু হয়। এটি কেবল অন্য কোনো DevOps টুল নয়। এটি একটি অর্কেস্ট্রেশন লেয়ার যা কন্টেইনার ম্যানেজমেন্টকে একটি স্ক্রিপ্টিং অনুশীলনের পরিবর্তে একটি কন্ট্রোল প্রবলেম হিসেবে বিবেচনা করে।
কেন স্ক্রিপ্টগুলো শেষ পর্যন্ত ব্যর্থ হয়
বেশিরভাগ টিম শেল স্ক্রিপ্ট বা বেসিক অটোমেশন দিয়ে শুরু করে। তারা ইমেজ পুল করা, কন্টেইনার স্টার্ট করা, লগ দেখা এবং ফেইলড প্রসেস রিস্টার্ট করার জন্য কমান্ড লেখে। এই পদ্ধতিটি একটি প্রুফ অফ কনসেপ্টের (proof of concept) জন্য কাজ করে। কিন্তু বাস্তব জগতের লোডের মুখে এটি ভেঙে পড়ে। মাইক্রোসার্ভিসগুলো বিভিন্ন হোস্টের মধ্যে একে অপরের সাথে কথা বলে, নির্দিষ্ট এনভায়রনমেন্ট ভেরিয়েবলের ওপর নির্ভর করে, কন্টেইনার রিস্টার্টের পরেও টিকে থাকে এমন পারসিস্টেন্ট স্টোরেজ প্রয়োজন হয় এবং ভার্সনগুলোর মধ্যে কনসিস্টেন্ট নেটওয়ার্কিং আশা করে। একটি ভার্চুয়াল মেশিন অদৃশ্য হয়ে গেলে একটি স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে ওয়ার্কলোড রিশেডিউল করতে পারে না। এটি ক্র্যাশ লুপে আটকে থাকা ইনস্ট্যান্সগুলোকে বাদ দিয়ে সুস্থ ইনস্ট্যান্সগুলোর মধ্যে নেটওয়ার্ক ট্রাফিক ডিস্ট্রিবিউট করতে পারে না। Kubernetes এই সমস্যাটি সমাধান করে ক্লাস্টারকে নিজেই সেই সিদ্ধান্তগুলো নেওয়ার জন্য দায়ী করে। আপনি যা চান তা বর্ণনা করবেন, এবং সিস্টেমটি ক্রমাগত সেই স্টেট (state) বজায় রাখে।
এটি আপনাকে তিনটি জিনিস দেয়
Kubernetes তিনটি মূল সক্ষমতা প্রদান করে যা ম্যানুয়াল ফায়ারফাইটিংয়ের পরিবর্তে স্বয়ংক্রিয় নির্ভরযোগ্যতা নিশ্চিত করে।
High availability মানে হলো আপনার ইনফ্রাস্ট্রাকচারের কিছু অংশ ব্যর্থ হলেও আপনার অ্যাপ্লিকেশনগুলো অনলাইনে থাকে। যদি একটি কন্টেইনার ক্র্যাশ করে, Kubernetes কয়েক সেকেন্ডের মধ্যে সেটি প্রতিস্থাপন করে। যদি একটি পুরো ওয়ার্কার নোড অচল হয়ে যায়, শিডিউলার সেই হার্টবিট মিস হওয়ার বিষয়টি লক্ষ্য করে এবং আক্রান্ত ওয়ার্কলোডগুলোকে ক্লাস্টারের অন্য সুস্থ মেশিনগুলোতে সরিয়ে নেয়। সিস্টেমটি আপনার সংজ্ঞায়িত করা কাঙ্ক্ষিত স্টেটের ওপর সার্বক্ষণিক নজর রাখে এবং মানুষের হস্তক্ষেপ ছাড়াই বিচ্যুতিগুলো সংশোধন করে।
Scalability মানে হলো আপনার ব্যবহারকারীর বৃদ্ধির সাথে সাথে আপনার অ্যাপ্লিকেশনও বৃদ্ধি পায়। মাত্র দুই ঘণ্টার ট্রাফিক পিক সামলানোর জন্য বিশটি সার্ভার প্রোভিশন করার পরিবর্তে, আপনি CPU ব্যবহার বা রিকোয়েস্ট ল্যাটেন্সির মতো গুরুত্বপূর্ণ মেট্রিক্সগুলো সংজ্ঞায়িত করতে পারেন এবং থ্রেশহোল্ড অতিক্রম করলে ক্লাস্টারকে আরও কন্টেইনার ইনস্ট্যান্স যোগ করতে দিতে পারেন। যখন চাহিদা কমে যায়, তখন রিপ্লিকা কাউন্ট আবার কমে যায়। আপনি যখন প্রয়োজন, তখনই কেবল যতটুকু প্রয়োজন তার জন্য খরচ করেন।
Disaster recovery মানে হলো ক্র্যাশের পরে আপনার ডেটা এবং কনফিগারেশন ফিরে পাওয়া। Kubernetes পুরো ক্লাস্টার স্টেট একটি ডিস্ট্রিবিউটেড কি-ভ্যালু স্টোরে (key-value store) সংরক্ষণ করে। যদি কোনো বিপর্যয়মূলক ব্যর্থতা ওয়ার্কার নোড বা এমনকি কন্ট্রোল প্লেনের অংশকেও মুছে ফেলে, তবে সেই সংরক্ষিত স্টেট সিস্টেমটিকে আপনার ওয়ার্কলোডগুলোকে ঠিক আগের মতো পুনর্গঠন করতে সাহায্য করে। আপনার ডেটা ফিরে আসে কারণ অর্কেস্ট্রেটর মনে রাখে যে এটি দেখতে কেমন হওয়া উচিত ছিল।
সেটআপ: মস্তিষ্ক এবং পেশি
একটি Kubernetes ক্লাস্টারে দুটি মৌলিক ভূমিকা রয়েছে যা ড্রাফটে মস্তিষ্ক এবং পেশি হিসেবে বর্ণনা করা হয়েছে, এবং এই উপমাটি বাস্তবে খুব কার্যকর।
Master Node হলো মস্তিষ্ক। এটি আপনার কাস্টমার-ফেসিং অ্যাপ্লিকেশনগুলো চালায় না। পরিবর্তে, এটি কন্ট্রোল প্লেন কম্পোনেন্টগুলোকে হোস্ট করে যা টাস্ক শিডিউল করে, ক্লাস্টার স্টেট ম্যানেজ করে এবং পরিবর্তনের বিপরীতে প্রতিক্রিয়া জানায়। যখন আপনি কোনো কমান্ড প্রদান করেন বা একটি কনফিগারেশন ফাইল জমা দেন, মাস্টার নোড সিদ্ধান্ত নেয় ওয়ার্কলোডটি কোথায় থাকবে, এটি সুস্থ কি না এবং এটি সুস্থ না থাকলে কী করতে হবে।
Worker Nodes হলো পেশি। প্রতিটি ওয়ার্কার একটি লাইটওয়েট এজেন্ট চালায় যা মাস্টারের সাথে যোগাযোগ করে এবং প্রকৃত পড (pods) চালানোর জন্য একটি কন্টেইনার রানটাইম ব্যবহার করে। এই নোডগুলোতেই আপনার অ্যাপ্লিকেশন কোড CPU এবং মেমরি ব্যবহার করে। আরও ওয়ার্কার নোড যোগ করলে আপনার ক্লাস্টারের সক্ষমতা বৃদ্ধি পায়। রিডানডেন্সির (redundancy) জন্য কনফিগার করা আরও মাস্টার নোড যোগ করলে আপনার কন্ট্রোল প্লেন একক হার্ডওয়্যার ব্যর্থতার বিরুদ্ধে আরও স্থিতিস্থাপক (resilient) হয়ে ওঠে।
Pods, Containers, and Services
Kubernetes নিয়ে কাজ করতে হলে আপনাকে তিনটি টার্ম বুঝতে হবে যা নির্ধারণ করে কীভাবে সফটওয়্যার প্যাকেজ করা হয় এবং কীভাবে তাতে পৌঁছানো যায়।
Containers হলো সেই প্যাকেজ যা আপনার অ্যাপ্লিকেশনকে এর ডিপেন্ডেন্সি, লাইব্রেরি এবং কনফিগারেশনের সাথে একত্রে যুক্ত করে। এগুলো সফটওয়্যারকে অন্তর্নিহিত হোস্ট থেকে আলাদা রাখে যাতে এটি ডেভেলপমেন্ট, স্টেজিং এবং প্রোডাকশনে একইভাবে চলতে পারে।
Pods হলো Kubernetes-এর সবচেয়ে ছোট ডিপ্লয়যোগ্য ইউনিট। একটি pod এক বা একাধিক কন্টেইনারকে আবৃত করে যা রিসোর্স শেয়ার করার প্রয়োজন হয়। তারা একই নেটওয়ার্ক নেমস্পেস শেয়ার করে এবং একই লোকাল স্টোরেজ ভলিউম অ্যাক্সেস করতে পারে। এটি গুরুত্বপূর্ণ: আপনি সরাসরি কোনো খালি কন্টেইনার ডিপ্লয় করেন না। আপনি একটি pod ডিপ্লয় করেন যা এটিকে ধারণ করে। Pods উদ্দেশ্যমূলকভাবে ক্ষণস্থায়ী (ephemeral)। পরিস্থিতি পরিবর্তনের সাথে সাথে এগুলো তৈরি হয়, ধ্বংস হয় এবং প্রতিস্থাপিত হয়। এদের জীবনকাল ডিজাইনের মাধ্যমেই ডায়নামিক।
Services বিদ্যমান কারণ pods অস্থায়ী বা ট্রানজিয়েন্ট। প্রতিবার যখন একটি pod রিস্টার্ট হয়, এটি সম্ভবত একটি নতুন ইন্টারনাল IP অ্যাড্রেস পায়। আপনার অ্যাপ্লিকেশনের অন্যান্য অংশ যদি সরাসরি সেই পরিবর্তনশীল অ্যাড্রেসগুলোর সাথে সংযোগ করার চেষ্টা করে, তবে সেগুলো ক্রমাগত ভেঙে পড়বে। একটি service আপনার pod-গুলোকে একটি নির্দিষ্ট IP অ্যাড্রেস এবং DNS নাম প্রদান করে। এটি একটি স্থিতিশীল প্রবেশদ্বার হিসেবে কাজ করে, যা এর সিলেক্টর (selector) অনুযায়ী সমস্ত সুস্থ (healthy) pod-গুলোর মধ্যে ইনকামিং রিকোয়েস্টগুলোকে লোড-ব্যালেন্স করে। এটি আপনার ক্লায়েন্টদের প্রতিটি কন্টেইনারের লাইফ সাইকেলের বিশৃঙ্খলা থেকে বিচ্ছিন্ন করে।
স্কেলে Kubernetes: Netflix-এর উদাহরণ
Netflix তাদের কন্টেন্ট ডেলিভারি নেটওয়ার্ক পরিচালনা করতে Kubernetes ব্যবহার করে। এই ইনফ্রাস্ট্রাকচারটি বিশ্বজুড়ে লক্ষ লক্ষ দর্শকের কাছে একই সাথে ভিডিও স্ট্রিম পৌঁছে দেয়। যখন কোনো জনপ্রিয় শো মুক্তি পায় এবং চাহিদা বাড়ে, তখন ক্লাস্টারটি সেই ক্যাশ নোডগুলোকে স্কেল আউট করে যা ব্যবহারকারীদের কাছাকাছি ভিডিও সেগমেন্টগুলো সংরক্ষণ করে। যদি কোনো রিজিওনাল নোড ব্যর্থ হয়, তবে ট্রাফিক স্বয়ংক্রিয়ভাবে রুট পরিবর্তন করে নেয়। এর ফলে কোনো ইঞ্জিনিয়ারকে ম্যানুয়ালি জরুরি কল দিতে না হলেও লক্ষ লক্ষ মানুষের জন্য মুভি চলা অব্যাহত থাকে। অর্কেস্ট্রেটর স্কেল এবং ব্যর্থতাগুলো সামলে নেয় যাতে পরিষেবাটি নিরবচ্ছিন্নভাবে চলতে থাকে।
শুরু করা: YAML, JSON, এবং API Server
Kubernetes-এর সাথে শুরু করার অর্থ হলো ইম্পারেটিভ (imperative) click-ops বাদ দেওয়া এবং ডিক্লারেটিভ (declarative) কনফিগারেশন গ্রহণ করা। আপনি YAML বা JSON ফাইলে যা চান তা লিখবেন। এই ম্যানিফেস্টগুলো কন্টেইনার ইমেজ থেকে শুরু করে রেপ্লিকার সংখ্যা, এক্সপোজড পোর্ট, এনভায়রনমেন্ট ভেরিয়েবল এবং স্টোরেজ মাউন্ট পর্যন্ত সবকিছু বর্ণনা করে। আপনার ফাইলটি প্রস্তুত হয়ে গেলে, আপনি এটি মাস্টার নোডের API server-এ পাঠান। কন্ট্রোল প্লেন সেই ডিক্লারেশনটি গ্রহণ করে, ক্লাস্টার স্টেট ডেটাবেসে সংরক্ষণ করে এবং তারপর আপনার বর্ণনা অনুযায়ী বাস্তবতাকে সাজানোর কাজ শুরু করে। আপনি Kubernetes-কে ঠিকভাবে বলে দেন না যে তার কাজ কীভাবে করতে হবে। আপনি তাকে বলেন শেষ ফলাফল কী হওয়া উচিত, এবং সে নিজেই ধাপগুলো বের করে নেয়।
আসল শিক্ষা
Kubernetes শেখার একটি নির্দিষ্ট ধাপ বা কার্ভ রয়েছে। শুরুতে এর পরিভাষাগুলো বেশ জটিল মনে হতে পারে। এখানে অনেকগুলো চলমান অংশ রয়েছে এবং একটি ডিস্ট্রিবিউটেড সিস্টেম ডিবাগ করা একটি সিঙ্গেল সার্ভার ডিবাগ করার চেয়ে সহজাতভাবেই কঠিন। কিন্তু এর প্রতিদান হলো অপারেশনাল প্রশান্তি। আপনি প্রতিটি মেশিনকে আলাদাভাবে দেখাশোনা করা বন্ধ করবেন। রাত ৩টার বিপর্যয়ের সময় আপনার স্টার্টআপ স্ক্রিপ্টগুলো কাজ করবে কি না—এমন প্রার্থনা করাও বন্ধ করবেন। আপনি ডিফল্টভাবে ব্যর্থতার কথা মাথায় রেখে ডিজাইন করা শুরু করবেন, ধরে নেবেন যে নোডগুলো অকেজো হতে পারে, এবং আপনার অ্যাপ্লিকেশনটিকে অক্ষত রাখতে অর্কেস্ট্রেটরের ওপর আস্থা রাখবেন। মানসিকতার সেই পরিবর্তন—কিছুই ভেঙে না যাওয়ার আশা করা থেকে শুরু করে সিস্টেমটি ভাঙা বা ব্যর্থতা সামলাতে সক্ষম তা জানা পর্যন্ত—এই পরিবর্তনটিই আপনার প্রচেষ্টাকে সার্থক করে তোলে।
উৎস: What Is Kubernetes? Kubernetes Explained in 15 Mins
ঐচ্ছিক লার্নিং কমিউনিটি: GyaanSetu AI on Telegram
