spinny:~/writing $ vim introduction-to-kubernetes.md
1~2আপনি যদি সফটওয়্যার ডেভেলপমেন্টের জগতে কাজ করেন, তাহলে নিশ্চয়ই Kubernetes-এর কথা শুনেছেন। কিন্তু এটি ঠিক কী, এবং কেন এটি কন্টেইনারাইজড অ্যাপ্লিকেশন পরিচালনার জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড হয়ে উঠেছে? এই গাইড আপনাকে মৌলিক থেকে মূল ধারণাগুলোতে নিয়ে যাবে, বোঝার জন্য ব্যবহারিক উদাহরণ এবং ডায়াগ্রাম সহ।3~4## Kubernetes-এর আগে: একটু ইতিহাস5~6Kubernetes কেন এত বিপ্লবী তা বুঝতে, আসুন একটু পেছনে যাই।7~81. **ঐতিহ্যবাহী ডিপ্লয়মেন্ট**: প্রাথমিকভাবে, অ্যাপ্লিকেশনগুলো ফিজিক্যাল সার্ভারে চালানো হতো। এই পদ্ধতি ব্যয়বহুল, স্কেল করা কঠিন এবং রিসোর্স দ্বন্দ্বের প্রবণ ছিল।92. **ভার্চুয়ালাইজড ডিপ্লয়মেন্ট**: এরপর এলো ভার্চুয়াল মেশিন (VMs)। VMs একই হার্ডওয়্যারে একাধিক বিচ্ছিন্ন অ্যাপ্লিকেশন চালাতে সক্ষম করেছিল, রিসোর্স ব্যবহার এবং নিরাপত্তা উন্নত করেছিল। তবে, প্রতিটি VM একটি সম্পূর্ণ অপারেটিং সিস্টেম চালায়, যা অনেক রিসোর্স গ্রাস করে।103. **কন্টেইনারাইজড ডিপ্লয়মেন্ট**: কন্টেইনার (যেমন Docker) পরবর্তী বিবর্তন। এগুলো একই হোস্ট অপারেটিং সিস্টেম শেয়ার করে কিন্তু বিচ্ছিন্ন প্রসেস চালায়। এগুলো হালকা, দ্রুত শুরু হয় এবং পোর্টেবল।11~12কন্টেইনার পোর্টেবিলিটি সমস্যা সমাধান করেছিল কিন্তু আরেকটি তৈরি করেছিল: প্রোডাকশন পরিবেশে শত শত (বা হাজার হাজার) কন্টেইনার কীভাবে পরিচালনা করবেন? কীভাবে নিশ্চিত করবেন যে এগুলো সবসময় চলছে, একে অপরের সাথে যোগাযোগ করতে পারে এবং লোডের উপর ভিত্তি করে স্কেল করতে পারে?13~14এখানেই **Kubernetes** আসে।15~16## Kubernetes কী?17~18Kubernetes (প্রায়ই **K8s** হিসেবে সংক্ষিপ্ত) কন্টেইনার অর্কেস্ট্রেশনের জন্য একটি ওপেন-সোর্স প্ল্যাটফর্ম। সহজ ভাষায়, এটি কন্টেইনারাইজড অ্যাপ্লিকেশনের ডিপ্লয়মেন্ট, স্কেলিং এবং ম্যানেজমেন্ট স্বয়ংক্রিয় করে। Google দ্বারা তৈরি এবং এখন Cloud Native Computing Foundation (CNCF) দ্বারা রক্ষণাবেক্ষণ করা হয়, Kubernetes স্কেলে মাইক্রোসার্ভিস নিয়ে কাজ করা যে কারো জন্য প্রধান টুল হয়ে উঠেছে।19~20## একটি Kubernetes Cluster-এর আর্কিটেকচার21~22একটি Kubernetes পরিবেশকে **cluster** বলা হয়। একটি cluster মেশিনের একটি সেট নিয়ে গঠিত, যাদের **nodes** বলা হয়, যেগুলো আমাদের অ্যাপ্লিকেশন চালায়। আর্কিটেকচার দুটি প্রধান অংশে বিভক্ত: Control Plane এবং Worker Nodes।23~24```mermaid25graph TD26 subgraph "Control Plane (Master)"27 A["API Server"]28 B["etcd"]29 C["Scheduler"]30 D["Controller Manager"]31 end32~33 subgraph "Worker Node 1"34 E["Kubelet"] --- F["Container Runtime"]35 G["Kube-proxy"]36 F --- H["Pod"]37 F --- I["Pod"]38 end39~40 subgraph "Worker Node 2"41 J["Kubelet"] --- K["Container Runtime"]42 L["Kube-proxy"]43 K --- M["Pod"]44 end45~46 A -- "Communicates with" --> E47 A -- "Communicates with" --> J48 User -- "kubectl" --> A49 C -- "Assigns Pods to Nodes" --> E50 D -- "Maintains state" --> A51 A -- "Saves/Reads state" --> B52```53~54### Control Plane55~56Control Plane হলো cluster-এর "মস্তিষ্ক"। এটি বৈশ্বিক সিদ্ধান্ত নেয় (যেমন শিডিউলিং) এবং cluster ইভেন্ট সনাক্ত ও প্রতিক্রিয়া জানায়। এর প্রধান উপাদানগুলো হলো:57~58- **API Server (`kube-apiserver`)**: এটি cluster-এর গেটওয়ে। এটি Kubernetes API প্রকাশ করে, যা ব্যবহারকারীরা (`kubectl`-এর মাধ্যমে), cluster উপাদান এবং বাহ্যিক টুল যোগাযোগের জন্য ব্যবহার করে।59- **etcd**: একটি সামঞ্জস্যপূর্ণ এবং অত্যন্ত উপলব্ধ কী-ভ্যালু ডাটাবেস। এটি সমস্ত cluster ডেটা সংরক্ষণ করে, সিস্টেমের কাঙ্ক্ষিত এবং বর্তমান অবস্থা উপস্থাপন করে।60- **Scheduler (`kube-scheduler`)**: নতুন তৈরি Pods-কে একটি উপলব্ধ Worker Node-এ বরাদ্দ করে, রিসোর্স প্রয়োজনীয়তা, নীতি এবং অন্যান্য সীমাবদ্ধতা বিবেচনায় নিয়ে।61- **Controller Manager (`kube-controller-manager`)**: কন্ট্রোলার চালায়, যেগুলো কন্ট্রোল লুপ যা cluster-এর অবস্থা পর্যবেক্ষণ করে এবং কাঙ্ক্ষিত অবস্থায় আনতে কাজ করে। উদাহরণস্বরূপ, `Node Controller` nodes পরিচালনা করে, যখন `Replication Controller` নিশ্চিত করে যে সঠিক সংখ্যক Pods চলছে।62~63### Worker Node64~65Worker Nodes হলো সেই মেশিন (ফিজিক্যাল বা ভার্চুয়াল) যেখানে অ্যাপ্লিকেশনগুলো আসলে চলে। প্রতিটি node Control Plane দ্বারা পরিচালিত হয় এবং নিম্নলিখিত উপাদানগুলো ধারণ করে:66~67- **Kubelet**: একটি এজেন্ট যা প্রতিটি node-এ চলে। এটি নিশ্চিত করে যে Pods-এ বর্ণিত কন্টেইনারগুলো চলছে এবং সুস্থ আছে।68- **Kube-proxy**: একটি নেটওয়ার্ক প্রক্সি যা nodes-এ নেটওয়ার্ক নিয়ম পরিচালনা করে। এটি cluster-এর ভেতরে বা বাইরে থেকে Pods-এ নেটওয়ার্ক যোগাযোগ সম্ভব করে।69- **Container Runtime**: কন্টেইনার চালানোর জন্য দায়ী সফটওয়্যার। Docker সবচেয়ে পরিচিত, কিন্তু Kubernetes `containerd` এবং `CRI-O`-এর মতো অন্যান্য runtimes-ও সমর্থন করে।70~71## মৌলিক Kubernetes অবজেক্ট72~73Kubernetes-এ সবকিছু **অবজেক্ট** দ্বারা উপস্থাপিত হয়। এই অবজেক্টগুলো হলো "অভিপ্রায়ের রেকর্ড": একবার আপনি একটি অবজেক্ট তৈরি করলে, Kubernetes ক্রমাগত কাজ করে নিশ্চিত করতে যে এটি বিদ্যমান এবং কাঙ্ক্ষিত অবস্থার সাথে মিলে যায়।74~75এখানে সবচেয়ে গুরুত্বপূর্ণগুলো:76~77### Pod78~79**Pod** হলো Kubernetes-এ ক্ষুদ্রতম এক্সিকিউশন ইউনিট। এটি এক বা একাধিক কন্টেইনার উপস্থাপন করে যা একই node-এ একসাথে চলে, নেটওয়ার্ক এবং স্টোরেজের মতো রিসোর্স শেয়ার করে।80~81সাধারণত, আপনি প্রতি Pod-এ শুধুমাত্র একটি কন্টেইনার চালান, কিন্তু উন্নত পরিস্থিতিতে (যেমন লগিং বা মনিটরিংয়ের জন্য "sidecar containers"), আপনি আরো থাকতে পারে।82~83আপনি প্রায় কখনোই সরাসরি Pods তৈরি করেন না। আপনি Deployments-এর মতো উচ্চ-স্তরের অ্যাবস্ট্রাকশন ব্যবহার করেন।84~85### Deployment86~87একটি **Deployment** হলো সেই অবজেক্ট যা আপনি সবচেয়ে বেশি ব্যবহার করবেন। এটি অভিন্ন Pods-এর একটি গ্রুপের জন্য কাঙ্ক্ষিত অবস্থা বর্ণনা করে। Deployment কন্ট্রোলার দায়ী:88~89- একটি **ReplicaSet** তৈরি এবং পরিচালনা করা (আরেকটি অবজেক্ট যা নিশ্চিত করে যে একটি Pod-এর নির্দিষ্ট সংখ্যক রেপ্লিকা সবসময় চলছে)।90- Pods-এর সংখ্যা বাড়ানো বা কমানোর জন্য **স্কেলিং**।91- নিয়ন্ত্রিত উপায়ে অ্যাপ্লিকেশন **আপডেট** পরিচালনা করা (যেমন *Rolling Update*), ডাউনটাইম ছাড়াই।92~93এখানে একটি NGINX সার্ভারের 3টি রেপ্লিকা চালানো Deployment-এর জন্য একটি উদাহরণ YAML ফাইল:94~95```yaml96# nginx-deployment.yaml97apiVersion: apps/v198kind: Deployment99metadata:100 name: nginx-deployment101spec:102 replicas: 3103 selector:104 matchLabels:105 app: nginx106 template:107 metadata:108 labels:109 app: nginx110 spec:111 containers:112 - name: nginx113 image: nginx:1.14.2114 ports:115 - containerPort: 80116```117~118### Service119~120Kubernetes-এ Pods ক্ষণস্থায়ী: এগুলো যেকোনো সময় তৈরি এবং ধ্বংস হতে পারে। প্রতিটি Pod-এর নিজস্ব IP ঠিকানা আছে, কিন্তু এই IP স্থিতিশীল নয়। তাহলে, কীভাবে আমরা আমাদের অ্যাপ্লিকেশন নির্ভরযোগ্যভাবে প্রকাশ করব?121~122একটি **Service** দিয়ে। একটি Service হলো একটি অ্যাবস্ট্রাকশন যা Pods-এর একটি লজিক্যাল সেট এবং এগুলোতে অ্যাক্সেসের একটি নীতি সংজ্ঞায়িত করে। এটি Pods-এর একটি গ্রুপের জন্য একটি **স্থিতিশীল অ্যাক্সেস পয়েন্ট** (একটি ভার্চুয়াল IP ঠিকানা এবং একটি DNS নাম) প্রদান করে।123~124```mermaid125graph TD126 subgraph "Service (nginx-service)"127 A["ClusterIP: 10.96.0.10"]128 end129~130 subgraph "Pods"131 B("Pod 1 - IP: 192.168.1.2")132 C("Pod 2 - IP: 192.168.1.3")133 D("Pod 3 - IP: 192.168.1.4")134 end135~136 A -- "Selector: app=nginx" --> B137 A -- "Selector: app=nginx" --> C138 A -- "Selector: app=nginx" --> D139~140 Client -- "Request to nginx-service" --> A141```142~143Service `labels`-এর উপর ভিত্তি করে একটি `selector` ব্যবহার করে সেই Pods খুঁজে বের করে যেখানে ট্র্যাফিক ফরওয়ার্ড করা উচিত।144~145আমাদের NGINX Deployment-এর জন্য একটি Service কীভাবে তৈরি করবেন:146~147```yaml148# nginx-service.yaml149apiVersion: v1150kind: Service151metadata:152 name: nginx-service153spec:154 selector:155 app: nginx156 ports:157 - protocol: TCP158 port: 80159 targetPort: 80160 type: ClusterIP # Default - exposes the service only within the cluster161```162~163বিভিন্ন ধরনের Services আছে:164- `ClusterIP`: cluster-অভ্যন্তরীণ IP-তে service প্রকাশ করে (ডিফল্ট)।165- `NodePort`: প্রতিটি Worker Node-এ একটি স্ট্যাটিক পোর্টে service প্রকাশ করে।166- `LoadBalancer`: ক্লাউড প্রোভাইডারে (যেমন AWS, GCP) একটি বাহ্যিক লোড ব্যালেন্সার তৈরি করে এবং service-এ একটি পাবলিক IP বরাদ্দ করে।167~168### Ingress169~170একটি `LoadBalancer` Service দারুণ, কিন্তু প্রতিটি service-এর জন্য একটি তৈরি করা ব্যয়বহুল হতে পারে। বাইরের জগতে একাধিক HTTP/HTTPS services প্রকাশ করতে, আপনি একটি **Ingress** ব্যবহার করেন।171~172একটি Ingress বাহ্যিক ট্র্যাফিকের জন্য একটি "বুদ্ধিমান রাউটার" হিসেবে কাজ করে। এটি host (যেমন `api.mysite.com`) বা path (যেমন `mysite.com/api`)-এর উপর ভিত্তি করে রাউটিং নিয়ম সংজ্ঞায়িত করতে দেয়।173~174```mermaid175graph LR176 User -- "mysite.com/api" --> Ingress177 User -- "mysite.com/ui" --> Ingress178~179 subgraph "Cluster"180 Ingress -- "/api" --> ServiceA("api-service")181 Ingress -- "/ui" --> ServiceB("ui-service")182~183 ServiceA --> PodA1("API Pod 1")184 ServiceA --> PodA2("API Pod 2")185~186 ServiceB --> PodB1("UI Pod 1")187 ServiceB --> PodB2("UI Pod 2")188 end189```190~191এখানে একটি Ingress-এর উদাহরণ:192```yaml193# example-ingress.yaml194apiVersion: networking.k8s.io/v1195kind: Ingress196metadata:197 name: example-ingress198spec:199 rules:200 - host: mysite.com201 http:202 paths:203 - path: /api204 pathType: Prefix205 backend:206 service:207 name: api-service208 port:209 number: 8080210 - path: /ui211 pathType: Prefix212 backend:213 service:214 name: ui-service215 port:216 number: 3000217```218~219### অন্যান্য দরকারী অবজেক্ট220~221- **Namespace**: একটি ফিজিক্যাল cluster-এর ভেতরে "ভার্চুয়াল cluster" তৈরি করতে দেয়। পরিবেশ (যেমন `development`, `staging`, `production`) বা দল বিচ্ছিন্ন করার জন্য দরকারী।222- **ConfigMap এবং Secret**: কন্টেইনার ইমেজ থেকে আলাদা করে কনফিগারেশন ডেটা এবং গোপনীয়তা (যেমন পাসওয়ার্ড বা API কী) পরিচালনা করতে।223- **StatefulSet**: Deployment-এর মতো, কিন্তু স্টেটফুল অ্যাপ্লিকেশনের (যেমন ডাটাবেস) জন্য নির্দিষ্ট যেগুলোর স্থিতিশীল নেটওয়ার্ক পরিচয় এবং স্থায়ী স্টোরেজ প্রয়োজন।224- **PersistentVolume (PV) এবং PersistentVolumeClaim (PVC)**: cluster-এ স্থায়ী স্টোরেজ পরিচালনা করতে।225~226## উপসংহার227~228Kubernetes একটি অবিশ্বাস্যভাবে শক্তিশালী টুল, কিন্তু এর শেখার বক্ররেখা খাড়া হতে পারে। এই গাইড শুধু উপরিভাগ স্পর্শ করেছে, কিন্তু আশা করি এটি আপনাকে মৌলিক ধারণাগুলোর একটি সুদৃঢ় বোঝাপড়া দিয়েছে।229~230**এখন কী করবেন?**231- **স্থানীয়ভাবে পরীক্ষা করুন**: আপনার কম্পিউটারে একটি Kubernetes cluster তৈরি করতে [Minikube](https://minikube.sigs.k8s.io/docs/start/) বা [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/) ইনস্টল করুন।232- **`kubectl` ব্যবহার করুন**: `kubectl` কমান্ডের সাথে পরিচিত হন, cluster-এর সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার প্রধান টুল। এই নিবন্ধের NGINX Deployment এবং Service তৈরি করার চেষ্টা করুন।233- **অফিসিয়াল টিউটোরিয়াল অন্বেষণ করুন**: [Kubernetes ডকুমেন্টেশন](https://kubernetes.io/docs/tutorials/) উদাহরণ ভরা একটি চমৎকার রিসোর্স।234~235কন্টেইনার অর্কেস্ট্রেশন ক্লাউড-নেটিভ জগতে একটি মৌলিক দক্ষতা, এবং Kubernetes আয়ত্ত করা সম্ভাবনার এক জগত খুলে দেবে। উপভোগ করুন!236~
NORMAL · introduction-to-kubernetes.md [readonly]236 lines · :q to close