আপনি যদি সফটওয়্যার ডেভেলপমেন্টের জগতে কাজ করেন, তাহলে নিশ্চয়ই Kubernetes-এর কথা শুনেছেন। কিন্তু এটি ঠিক কী, এবং কেন এটি কন্টেইনারাইজড অ্যাপ্লিকেশন পরিচালনার জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড হয়ে উঠেছে? এই গাইড আপনাকে মৌলিক থেকে মূল ধারণাগুলোতে নিয়ে যাবে, বোঝার জন্য ব্যবহারিক উদাহরণ এবং ডায়াগ্রাম সহ।
Kubernetes-এর আগে: একটু ইতিহাস
Kubernetes কেন এত বিপ্লবী তা বুঝতে, আসুন একটু পেছনে যাই।
- ঐতিহ্যবাহী ডিপ্লয়মেন্ট: প্রাথমিকভাবে, অ্যাপ্লিকেশনগুলো ফিজিক্যাল সার্ভারে চালানো হতো। এই পদ্ধতি ব্যয়বহুল, স্কেল করা কঠিন এবং রিসোর্স দ্বন্দ্বের প্রবণ ছিল।
- ভার্চুয়ালাইজড ডিপ্লয়মেন্ট: এরপর এলো ভার্চুয়াল মেশিন (VMs)। VMs একই হার্ডওয়্যারে একাধিক বিচ্ছিন্ন অ্যাপ্লিকেশন চালাতে সক্ষম করেছিল, রিসোর্স ব্যবহার এবং নিরাপত্তা উন্নত করেছিল। তবে, প্রতিটি VM একটি সম্পূর্ণ অপারেটিং সিস্টেম চালায়, যা অনেক রিসোর্স গ্রাস করে।
- কন্টেইনারাইজড ডিপ্লয়মেন্ট: কন্টেইনার (যেমন Docker) পরবর্তী বিবর্তন। এগুলো একই হোস্ট অপারেটিং সিস্টেম শেয়ার করে কিন্তু বিচ্ছিন্ন প্রসেস চালায়। এগুলো হালকা, দ্রুত শুরু হয় এবং পোর্টেবল।
কন্টেইনার পোর্টেবিলিটি সমস্যা সমাধান করেছিল কিন্তু আরেকটি তৈরি করেছিল: প্রোডাকশন পরিবেশে শত শত (বা হাজার হাজার) কন্টেইনার কীভাবে পরিচালনা করবেন? কীভাবে নিশ্চিত করবেন যে এগুলো সবসময় চলছে, একে অপরের সাথে যোগাযোগ করতে পারে এবং লোডের উপর ভিত্তি করে স্কেল করতে পারে?
এখানেই Kubernetes আসে।
Kubernetes কী?
Kubernetes (প্রায়ই K8s হিসেবে সংক্ষিপ্ত) কন্টেইনার অর্কেস্ট্রেশনের জন্য একটি ওপেন-সোর্স প্ল্যাটফর্ম। সহজ ভাষায়, এটি কন্টেইনারাইজড অ্যাপ্লিকেশনের ডিপ্লয়মেন্ট, স্কেলিং এবং ম্যানেজমেন্ট স্বয়ংক্রিয় করে। Google দ্বারা তৈরি এবং এখন Cloud Native Computing Foundation (CNCF) দ্বারা রক্ষণাবেক্ষণ করা হয়, Kubernetes স্কেলে মাইক্রোসার্ভিস নিয়ে কাজ করা যে কারো জন্য প্রধান টুল হয়ে উঠেছে।
একটি Kubernetes Cluster-এর আর্কিটেকচার
একটি Kubernetes পরিবেশকে cluster বলা হয়। একটি cluster মেশিনের একটি সেট নিয়ে গঠিত, যাদের nodes বলা হয়, যেগুলো আমাদের অ্যাপ্লিকেশন চালায়। আর্কিটেকচার দুটি প্রধান অংশে বিভক্ত: Control Plane এবং Worker Nodes।
Control Plane
Control Plane হলো cluster-এর "মস্তিষ্ক"। এটি বৈশ্বিক সিদ্ধান্ত নেয় (যেমন শিডিউলিং) এবং cluster ইভেন্ট সনাক্ত ও প্রতিক্রিয়া জানায়। এর প্রধান উপাদানগুলো হলো:
- API Server (
kube-apiserver): এটি cluster-এর গেটওয়ে। এটি Kubernetes API প্রকাশ করে, যা ব্যবহারকারীরা (kubectl-এর মাধ্যমে), cluster উপাদান এবং বাহ্যিক টুল যোগাযোগের জন্য ব্যবহার করে। - etcd: একটি সামঞ্জস্যপূর্ণ এবং অত্যন্ত উপলব্ধ কী-ভ্যালু ডাটাবেস। এটি সমস্ত cluster ডেটা সংরক্ষণ করে, সিস্টেমের কাঙ্ক্ষিত এবং বর্তমান অবস্থা উপস্থাপন করে।
- Scheduler (
kube-scheduler): নতুন তৈরি Pods-কে একটি উপলব্ধ Worker Node-এ বরাদ্দ করে, রিসোর্স প্রয়োজনীয়তা, নীতি এবং অন্যান্য সীমাবদ্ধতা বিবেচনায় নিয়ে। - Controller Manager (
kube-controller-manager): কন্ট্রোলার চালায়, যেগুলো কন্ট্রোল লুপ যা cluster-এর অবস্থা পর্যবেক্ষণ করে এবং কাঙ্ক্ষিত অবস্থায় আনতে কাজ করে। উদাহরণস্বরূপ,Node Controllernodes পরিচালনা করে, যখনReplication Controllerনিশ্চিত করে যে সঠিক সংখ্যক Pods চলছে।
Worker Node
Worker Nodes হলো সেই মেশিন (ফিজিক্যাল বা ভার্চুয়াল) যেখানে অ্যাপ্লিকেশনগুলো আসলে চলে। প্রতিটি node Control Plane দ্বারা পরিচালিত হয় এবং নিম্নলিখিত উপাদানগুলো ধারণ করে:
- Kubelet: একটি এজেন্ট যা প্রতিটি node-এ চলে। এটি নিশ্চিত করে যে Pods-এ বর্ণিত কন্টেইনারগুলো চলছে এবং সুস্থ আছে।
- Kube-proxy: একটি নেটওয়ার্ক প্রক্সি যা nodes-এ নেটওয়ার্ক নিয়ম পরিচালনা করে। এটি cluster-এর ভেতরে বা বাইরে থেকে Pods-এ নেটওয়ার্ক যোগাযোগ সম্ভব করে।
- Container Runtime: কন্টেইনার চালানোর জন্য দায়ী সফটওয়্যার। Docker সবচেয়ে পরিচিত, কিন্তু Kubernetes
containerdএবংCRI-O-এর মতো অন্যান্য runtimes-ও সমর্থন করে।
মৌলিক Kubernetes অবজেক্ট
Kubernetes-এ সবকিছু অবজেক্ট দ্বারা উপস্থাপিত হয়। এই অবজেক্টগুলো হলো "অভিপ্রায়ের রেকর্ড": একবার আপনি একটি অবজেক্ট তৈরি করলে, Kubernetes ক্রমাগত কাজ করে নিশ্চিত করতে যে এটি বিদ্যমান এবং কাঙ্ক্ষিত অবস্থার সাথে মিলে যায়।
এখানে সবচেয়ে গুরুত্বপূর্ণগুলো:
Pod
Pod হলো Kubernetes-এ ক্ষুদ্রতম এক্সিকিউশন ইউনিট। এটি এক বা একাধিক কন্টেইনার উপস্থাপন করে যা একই node-এ একসাথে চলে, নেটওয়ার্ক এবং স্টোরেজের মতো রিসোর্স শেয়ার করে।
সাধারণত, আপনি প্রতি Pod-এ শুধুমাত্র একটি কন্টেইনার চালান, কিন্তু উন্নত পরিস্থিতিতে (যেমন লগিং বা মনিটরিংয়ের জন্য "sidecar containers"), আপনি আরো থাকতে পারে।
আপনি প্রায় কখনোই সরাসরি Pods তৈরি করেন না। আপনি Deployments-এর মতো উচ্চ-স্তরের অ্যাবস্ট্রাকশন ব্যবহার করেন।
Deployment
একটি Deployment হলো সেই অবজেক্ট যা আপনি সবচেয়ে বেশি ব্যবহার করবেন। এটি অভিন্ন Pods-এর একটি গ্রুপের জন্য কাঙ্ক্ষিত অবস্থা বর্ণনা করে। Deployment কন্ট্রোলার দায়ী:
- একটি ReplicaSet তৈরি এবং পরিচালনা করা (আরেকটি অবজেক্ট যা নিশ্চিত করে যে একটি Pod-এর নির্দিষ্ট সংখ্যক রেপ্লিকা সবসময় চলছে)।
- Pods-এর সংখ্যা বাড়ানো বা কমানোর জন্য স্কেলিং।
- নিয়ন্ত্রিত উপায়ে অ্যাপ্লিকেশন আপডেট পরিচালনা করা (যেমন Rolling Update), ডাউনটাইম ছাড়াই।
এখানে একটি NGINX সার্ভারের 3টি রেপ্লিকা চালানো Deployment-এর জন্য একটি উদাহরণ YAML ফাইল:
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
Service
Kubernetes-এ Pods ক্ষণস্থায়ী: এগুলো যেকোনো সময় তৈরি এবং ধ্বংস হতে পারে। প্রতিটি Pod-এর নিজস্ব IP ঠিকানা আছে, কিন্তু এই IP স্থিতিশীল নয়। তাহলে, কীভাবে আমরা আমাদের অ্যাপ্লিকেশন নির্ভরযোগ্যভাবে প্রকাশ করব?
একটি Service দিয়ে। একটি Service হলো একটি অ্যাবস্ট্রাকশন যা Pods-এর একটি লজিক্যাল সেট এবং এগুলোতে অ্যাক্সেসের একটি নীতি সংজ্ঞায়িত করে। এটি Pods-এর একটি গ্রুপের জন্য একটি স্থিতিশীল অ্যাক্সেস পয়েন্ট (একটি ভার্চুয়াল IP ঠিকানা এবং একটি DNS নাম) প্রদান করে।
Service labels-এর উপর ভিত্তি করে একটি selector ব্যবহার করে সেই Pods খুঁজে বের করে যেখানে ট্র্যাফিক ফরওয়ার্ড করা উচিত।
আমাদের NGINX Deployment-এর জন্য একটি Service কীভাবে তৈরি করবেন:
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP # Default - exposes the service only within the cluster
বিভিন্ন ধরনের Services আছে:
ClusterIP: cluster-অভ্যন্তরীণ IP-তে service প্রকাশ করে (ডিফল্ট)।NodePort: প্রতিটি Worker Node-এ একটি স্ট্যাটিক পোর্টে service প্রকাশ করে।LoadBalancer: ক্লাউড প্রোভাইডারে (যেমন AWS, GCP) একটি বাহ্যিক লোড ব্যালেন্সার তৈরি করে এবং service-এ একটি পাবলিক IP বরাদ্দ করে।
Ingress
একটি LoadBalancer Service দারুণ, কিন্তু প্রতিটি service-এর জন্য একটি তৈরি করা ব্যয়বহুল হতে পারে। বাইরের জগতে একাধিক HTTP/HTTPS services প্রকাশ করতে, আপনি একটি Ingress ব্যবহার করেন।
একটি Ingress বাহ্যিক ট্র্যাফিকের জন্য একটি "বুদ্ধিমান রাউটার" হিসেবে কাজ করে। এটি host (যেমন api.mysite.com) বা path (যেমন mysite.com/api)-এর উপর ভিত্তি করে রাউটিং নিয়ম সংজ্ঞায়িত করতে দেয়।
এখানে একটি Ingress-এর উদাহরণ:
# example-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: mysite.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 - path: /ui pathType: Prefix backend: service: name: ui-service port: number: 3000
অন্যান্য দরকারী অবজেক্ট
- Namespace: একটি ফিজিক্যাল cluster-এর ভেতরে "ভার্চুয়াল cluster" তৈরি করতে দেয়। পরিবেশ (যেমন
development,staging,production) বা দল বিচ্ছিন্ন করার জন্য দরকারী। - ConfigMap এবং Secret: কন্টেইনার ইমেজ থেকে আলাদা করে কনফিগারেশন ডেটা এবং গোপনীয়তা (যেমন পাসওয়ার্ড বা API কী) পরিচালনা করতে।
- StatefulSet: Deployment-এর মতো, কিন্তু স্টেটফুল অ্যাপ্লিকেশনের (যেমন ডাটাবেস) জন্য নির্দিষ্ট যেগুলোর স্থিতিশীল নেটওয়ার্ক পরিচয় এবং স্থায়ী স্টোরেজ প্রয়োজন।
- PersistentVolume (PV) এবং PersistentVolumeClaim (PVC): cluster-এ স্থায়ী স্টোরেজ পরিচালনা করতে।
উপসংহার
Kubernetes একটি অবিশ্বাস্যভাবে শক্তিশালী টুল, কিন্তু এর শেখার বক্ররেখা খাড়া হতে পারে। এই গাইড শুধু উপরিভাগ স্পর্শ করেছে, কিন্তু আশা করি এটি আপনাকে মৌলিক ধারণাগুলোর একটি সুদৃঢ় বোঝাপড়া দিয়েছে।
এখন কী করবেন?
- স্থানীয়ভাবে পরীক্ষা করুন: আপনার কম্পিউটারে একটি Kubernetes cluster তৈরি করতে Minikube বা Kind ইনস্টল করুন।
kubectlব্যবহার করুন:kubectlকমান্ডের সাথে পরিচিত হন, cluster-এর সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার প্রধান টুল। এই নিবন্ধের NGINX Deployment এবং Service তৈরি করার চেষ্টা করুন।- অফিসিয়াল টিউটোরিয়াল অন্বেষণ করুন: Kubernetes ডকুমেন্টেশন উদাহরণ ভরা একটি চমৎকার রিসোর্স।
কন্টেইনার অর্কেস্ট্রেশন ক্লাউড-নেটিভ জগতে একটি মৌলিক দক্ষতা, এবং Kubernetes আয়ত্ত করা সম্ভাবনার এক জগত খুলে দেবে। উপভোগ করুন!