আগের Tutorial-এ আমরা শিখেছি YAML কী, কীভাবে Key-Value Pairs, Lists, Dictionaries এবং Indentation কাজ করে।
আমরা আরও দেখেছি কীভাবে kubectl Command ব্যবহার করে Kubernetes Pod Create করতে হয়।
যেমন:
kubectl run nginx --image=nginx
কিন্তু Real Kubernetes Environment-এ সাধারণত প্রতিটি Resource Create করার জন্য আলাদা আলাদা Commands ব্যবহার করার পরিবর্তে YAML Definition Files ব্যবহার করা হয়।
YAML File-এর মাধ্যমে Kubernetes-কে বলে দেওয়া যায় আমরা কী ধরনের Resource Create করতে চাই এবং সেই Resource-এর Configuration কেমন হবে।
এই Tutorial-এ আমরা দেখব কীভাবে একটি Kubernetes Pod YAML Definition File লিখতে হয় এবং সেই File ব্যবহার করে Pod Create করতে হয়।
1. Kubernetes Objects Create করার দুটি উপায়
Kubernetes-এ Objects Create করার দুটি Common Approach রয়েছে।
Method 1: Imperative Command
সরাসরি kubectl Command ব্যবহার করে Object Create করা।
Example:
kubectl run nginx --image=nginx
এই Command Kubernetes-এ nginx নামে একটি Pod Create করে।
এটি Quick Testing এবং Learning-এর জন্য Useful।
Method 2: YAML Definition File
অন্য Approach হলো একটি YAML File লিখে Kubernetes Resource-এর Configuration Define করা।
Example:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
এরপর YAML File ব্যবহার করে Pod Create করা যায়।
Kubernetes-এ YAML Definition Files ব্যবহার করে বিভিন্ন Resources Define করা হয়।
যেমন:
- Pods
- ReplicaSets
- Deployments
- Services
YAML File-এর মাধ্যমে আমরা Kubernetes-কে জানাই কোন Object Create করতে হবে এবং তার Desired Configuration কী হবে।
2. Kubernetes YAML-এর Four Main Fields
Kubernetes Object Definition File-এ সাধারণত চারটি গুরুত্বপূর্ণ Root-Level Fields থাকে।
apiVersion:
kind:
metadata:
spec:
এগুলোকে Top-Level Properties অথবা Root-Level Fields বলা হয়।
বেশিরভাগ Kubernetes Workload Resources-এর YAML Manifest-এ এই Fields ব্যবহার করা হয়।
| Field | Meaning |
|---|---|
apiVersion | কোন Kubernetes API Version ব্যবহার করা হবে |
kind | কোন ধরনের Kubernetes Object Create করা হবে |
metadata | Object-এর Name, Labels এবং অন্যান্য Information |
spec | Object-এর Desired Configuration |
Basic Structure
Kubernetes YAML
|
├── apiVersion
|
├── kind
|
├── metadata
|
└── spec
এই চারটি Fields বুঝতে পারলে Kubernetes-এর অনেক YAML Files পড়া এবং লেখা সহজ হয়ে যায়।
Note: সব Kubernetes Resources-এর জন্য spec বাধ্যতামূলক নয়। তবে এই Tutorial-এর Pod Definition-এ চারটি Fields-ই ব্যবহার করব।
3. apiVersion — কোন Kubernetes API Version ব্যবহার করব?
apiVersion Kubernetes-কে বলে কোন API Version ব্যবহার করে Object Process করতে হবে।
একটি Basic Pod-এর জন্য:
apiVersion: v1
Different Kubernetes Resources-এর API Versions আলাদা হতে পারে।
| Kubernetes Object | Common API Version |
|---|---|
| Pod | v1 |
| Service | v1 |
| Deployment | apps/v1 |
| ReplicaSet | apps/v1 |
Example: Pod
apiVersion: v1
Example: Deployment
apiVersion: apps/v1
এখানে গুরুত্বপূর্ণ বিষয় হলো Object Type অনুযায়ী Correct API Version ব্যবহার করতে হবে।
এই Tutorial-এ আমরা Pod Create করছি।
তাই ব্যবহার করব:
apiVersion: v1
4. kind — কোন Kubernetes Object Create করব?
kind Field Kubernetes-কে বলে আমরা কোন ধরনের Object Create করতে চাই।
Pod Create করার জন্য:
kind: Pod
Deployment Create করতে:
kind: Deployment
ReplicaSet Create করতে:
kind: ReplicaSet
Service Create করতে:
kind: Service
Simple Example
apiVersion: v1
kind: Pod
এখানে আমরা Kubernetes-কে বলছি:
Kubernetes API-এর
v1Version ব্যবহার করে একটিPodObject Create করতে চাই।
মনে রাখবে
kind-এর Value অবশ্যই Kubernetes-এর Supported Resource Type-এর সঙ্গে Match করতে হবে।
Pod Definition লিখলে:
kind: Pod
ব্যবহার করতে হবে।
5. metadata — Kubernetes Object-এর Information
metadata Field-এর মধ্যে Kubernetes Object-এর Information Define করা হয়।
যেমন:
- Name
- Labels
- অন্যান্য Supported Metadata Properties
Example:
metadata:
name: myapp-pod
labels:
app: myapp
এখানে:
name হলো Pod-এর Name।
labels হলো Pod-এর সঙ্গে যুক্ত Key-Value Tags।
Structure
metadata
|
├── name: myapp-pod
|
└── labels
|
└── app: myapp
এখানে metadata হলো একটি Dictionary।
তার Child Properties হলো name এবং labels।
আবার labels নিজেও একটি Dictionary।
YAML Indentation
metadata:
name: myapp-pod
labels:
app: myapp
এখানে:
nameএবংlabelsএকই Indentation Level-এ রয়েছে।appহলোlabels-এর Child Property।
এই Parent-Child Relationship YAML Indentation দিয়ে বোঝানো হয়।
6. Kubernetes Labels কেন গুরুত্বপূর্ণ?
Kubernetes Labels ব্যবহার করে Objects Identify, Group এবং Select করা যায়।
Labels হলো Key-Value Pairs।
Example:
labels:
app: myapp
type: frontend
এখানে দুটি Labels রয়েছে।
app → myapp
type → frontend
ধরো, তোমার Kubernetes Cluster-এ অনেক Pods Running রয়েছে।
যেমন:
100 Frontend Pods
100 Backend Pods
50 Database Pods
এখন যদি Pods-এর Labels ঠিকভাবে Configure করা থাকে, তাহলে নির্দিষ্ট Category-এর Pods Identify এবং Filter করা সহজ হয়।
Example Labels
labels:
app: ecommerce
tier: frontend
environment: dev
এখানে:
| Label Key | Label Value |
|---|---|
| app | ecommerce |
| tier | frontend |
| environment | dev |
Labels ব্যবহার করে Kubernetes Objects Group করা যায়।
Important Difference
metadata-এর মধ্যে Arbitrary Field Names ব্যবহার করা যায় না।
Kubernetes যেসব Metadata Fields Support করে, সেগুলোই ব্যবহার করতে হবে।
যেমন:
metadata:
name: myapp-pod
labels:
app: myapp
কিন্তু labels-এর মধ্যে Kubernetes-এর Label Naming Rules অনুসরণ করে Custom Key-Value Pairs Define করা যায়।
7. spec — Pod-এর Desired Configuration
spec Field Kubernetes Object-এর Desired Configuration Define করে।
Pod-এর ক্ষেত্রে spec Kubernetes-কে বলে Pod-এর মধ্যে কোন Containers Run করতে হবে।
Example:
spec:
containers:
- name: nginx-container
image: nginx
এখানে:
specহলো একটি Dictionary।containersহলো একটি List।- List-এর প্রতিটি Item হলো একটি Dictionary।
nameহলো Container-এর Name।imageহলো Container Image।
Structure
spec
|
└── containers (List)
|
└── Container (Dictionary)
|
├── name: nginx-container
|
└── image: nginx
এই YAML Structure Kubernetes-কে বলে Pod-এর মধ্যে একটি Container Run করতে হবে।
Container-এর Name হবে nginx-container।
আর Container Image হবে nginx।
8. containers কেন List?
এখানে একটি গুরুত্বপূর্ণ প্রশ্ন আসে।
containers Field কেন List হিসেবে Define করা হয়?
কারণ একটি Kubernetes Pod-এর মধ্যে একাধিক Containers থাকতে পারে।
Example:
Pod
|
├── Main Application Container
|
└── Helper Container
তাই Kubernetes Pod Specification-এ containers একটি List।
Single Container Example
containers:
- name: nginx-container
image: nginx
এখানে Dash (-) List-এর একটি Item বোঝায়।
যদিও আমাদের Pod-এর মধ্যে একটি Container রয়েছে, তারপরও containers List হিসেবে Define করতে হয়।
Multi-Container Structure
containers:
- name: main-container
image: nginx
- name: helper-container
image: busybox
এখানে দুটি Container Definitions রয়েছে।
তবে এই Tutorial-এ আমরা Single-Container Pod নিয়ে কাজ করব।
9. Complete Kubernetes Pod YAML Example
এবার সব Fields একসঙ্গে ব্যবহার করে একটি Complete Pod Definition লিখি।
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: nginx-container
image: nginx
এই YAML File Kubernetes-কে কী বলছে?
Step 1: apiVersion: v1
Kubernetes API-এর v1 Version ব্যবহার করো।
Step 2: kind: Pod
একটি Pod Object Create করো।
Step 3: metadata.name: myapp-pod
Pod-এর Name হবে myapp-pod।
Step 4: metadata.labels.app: myapp
Pod-এর সঙ্গে app=myapp Label Attach করো।
Step 5: spec.containers
Pod-এর মধ্যে একটি Container Run করো।
Step 6: name: nginx-container
Container-এর Name হবে nginx-container।
Step 7: image: nginx
Container Run করার জন্য NGINX Image ব্যবহার করো।
Complete Structure
Kubernetes Pod
|
├── apiVersion: v1
|
├── kind: Pod
|
├── metadata
| |
| ├── name: myapp-pod
| |
| └── labels
| |
| └── app: myapp
|
└── spec
|
└── containers
|
└── nginx-container
|
└── image: nginx
10. YAML Indentation কেন গুরুত্বপূর্ণ?
YAML-এ Indentation Parent-Child Relationship Define করে।
তাই ভুল Indentation দিলে Kubernetes YAML File Correctly Parse করতে নাও পারে।
Correct Example
metadata:
name: myapp-pod
labels:
app: myapp
এখানে:
nameএবংlabelsহলোmetadata-এর Children।appহলোlabels-এর Child।
Incorrect Example
metadata:
name: myapp-pod
labels:
app: myapp
এটি Incorrect।
কারণ labels ভুলভাবে name-এর নিচে Nested করা হয়েছে।
কিন্তু name ইতিমধ্যে একটি Direct Value পেয়েছে।
name: myapp-pod
তাই তার নিচে Nested Dictionary রাখা যাবে না।
Correct Structure
metadata
|
├── name
|
└── labels
|
└── app
Important: YAML Indentation ভুল হলে Kubernetes Resource Definition Invalid হতে পারে অথবা Unexpected Structure তৈরি হতে পারে।
11. YAML File দিয়ে Pod Create করা
এবার আমরা একটি Pod YAML File Create করে Kubernetes-এ Apply করব।
Step 1: YAML File Create করা
Terminal-এ একটি File Create করো:
nano pod-definition.yaml
তারপর নিচের YAML Configuration লিখো:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: nginx-container
image: nginx
File Save করো।
File Name:
pod-definition.yaml
Step 2: Pod Create করা
kubectl create -f pod-definition.yaml
এই Command YAML File Read করে Kubernetes API Server-এ Resource Create করার Request পাঠায়।
Expected Output:
pod/myapp-pod created
এখন Kubernetes Pod Create করে Container Run করার চেষ্টা করবে।
12. kubectl create vs kubectl apply
Kubernetes YAML File ব্যবহার করার সময় সাধারণত দুটি Commands দেখতে পাওয়া যায়।
kubectl create
kubectl create -f pod-definition.yaml
এই Command YAML Definition অনুযায়ী একটি নতুন Kubernetes Object Create করে।
kubectl apply
kubectl apply -f pod-definition.yaml
এই Command Declarative Configuration অনুযায়ী Kubernetes Resource Create অথবা Update করার জন্য ব্যবহার করা হয়।
Difference
| Command | Purpose |
|---|---|
kubectl create -f | YAML থেকে নতুন Resource Create করা |
kubectl apply -f | Declarative Configuration Create বা Update করা |
এই Tutorial-এ আমরা ব্যবহার করব:
kubectl create -f pod-definition.yaml
কারণ এখানে আমাদের Main Goal হলো YAML File দিয়ে নতুন Pod Create করা।
13. Created Pod Check করা
Pod Create করার পর Check করো:
kubectl get pods
Expected Example:
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 30s
এখানে myapp-pod Pod Successfully Running রয়েছে।
Detailed Pod Information
kubectl describe pod myapp-pod
এই Command Pod সম্পর্কে বিস্তারিত Information দেখাবে।
যেমন:
- Pod Name
- Labels
- Node Assignment
- Container Image
- Container Status
- Events
Pod IP এবং Node দেখতে
kubectl get pods -o wide
এই Command Pod-এর Internal IP এবং Assigned Node Information দেখতে সাহায্য করে।
14. Imperative vs Declarative Style
এখন পর্যন্ত আমরা Kubernetes Pod Create করার দুটি Approach দেখেছি।
Imperative Approach
kubectl run nginx --image=nginx
এখানে আমরা সরাসরি Kubernetes-কে Command দিচ্ছি।
এই Approach Quick Testing-এর জন্য Useful।
Declarative Approach
একটি YAML File লিখছি:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: nginx-container
image: nginx
তারপর:
kubectl apply -f pod-definition.yaml
এখানে আমরা Desired Configuration File-এর মধ্যে Define করছি।
Kubernetes সেই Configuration অনুযায়ী Resource Create অথবা Update করার চেষ্টা করে।
Comparison
| Feature | Imperative | Declarative |
|---|---|---|
| Configuration | CLI Command | YAML File |
| Quick Testing | Very Useful | Possible |
| Reusability | Limited | High |
| Version Control | Commands আলাদাভাবে রাখতে হয় | YAML Git-এ রাখা যায় |
| Configuration Review | Less Convenient | Easy |
| Real Kubernetes Projects | Useful for Operations | Commonly Preferred |
Real Kubernetes Projects-এ Declarative YAML Configuration বেশি গুরুত্বপূর্ণ।
কারণ Configuration File Save, Review, Reuse এবং Version Control করা যায়।
15. Kubernetes YAML-এর Simple Mental Model
Kubernetes YAML File-কে একটি Order Form হিসেবে ভাবতে পারো।
ধরো, তুমি Kubernetes-কে একটি Pod Create করার Order দিচ্ছ।
তাহলে:
apiVersion = কোন API Version ব্যবহার হবে?
kind = কী ধরনের Object Create হবে?
metadata = Object-এর Name এবং Labels কী হবে?
spec = Object-এর Configuration কী হবে?
একটি Pod-এর ক্ষেত্রে:
kind: Pod
মানে:
আমি একটি Pod Create করতে চাই।
আর:
spec:
containers:
- name: nginx-container
image: nginx
মানে:
এই Pod-এর মধ্যে NGINX Image ব্যবহার করে একটি Container Run করতে চাই।
Complete Mental Model
Kubernetes YAML
|
+-----------+-----------+
| | |
▼ ▼ ▼
apiVersion kind metadata
|
▼
Name & Labels
|
▼
spec
|
▼
containers
|
▼
NGINX Image
|
▼
Running Pod
16. Important kubectl Commands
| Command | Purpose |
|---|---|
kubectl create -f pod-definition.yaml | YAML File থেকে Pod Create করা |
kubectl get pods | Pods List করা |
kubectl describe pod myapp-pod | Detailed Pod Information দেখা |
17. Complete Hands-On Demo — Pod with YAML
এই Tutorial-এর Commands একসঙ্গে:
Step 1: YAML File Create করা
File Name:
pod-definition.yaml
File Content:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: nginx-container
image: nginx
Step 2: Kubernetes Cluster Check করা
kubectl get nodes
Step 3: Pod Create করা
kubectl create -f pod-definition.yaml
Step 4: Pod Status Check করা
kubectl get pods
Step 5: Pod Details Check করা
kubectl describe pod myapp-pod
Step 6: Pod IP এবং Node Check করা
kubectl get pods -o wide
Step 7: Pod Delete করা
Testing শেষে Pod Remove করতে:
kubectl delete pod myapp-pod
এতে Pod Cluster থেকে Delete হবে।
YAML File Local Computer-এ থেকে যাবে।
18. Final Takeaway — Kubernetes Pods with YAML
এই Tutorial-এর সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো Kubernetes YAML Definition File-এর Structure বোঝা।
একটি Basic Pod YAML Definition-এ চারটি Main Fields ব্যবহার করা হয়।
apiVersion:
kind:
metadata:
spec:
এখানে:
apiVersion: Kubernetes API Version Define করে।
kind: কোন Kubernetes Resource Create করা হবে তা Define করে।
metadata: Resource-এর Name এবং Labels-এর মতো Information Store করে।
spec: Resource-এর Desired Configuration Define করে।
একটি Complete Pod Example:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: nginx-container
image: nginx
Pod Create করতে:
kubectl create -f pod-definition.yaml
Pod Check করতে:
kubectl get pods
Detailed Information দেখতে:
kubectl describe pod myapp-pod
Final Memory Rule
apiVersion → Kubernetes API Version
kind → Object Type
metadata → Name and Labels
spec → Desired Configuration
Final One-Line Summary:
Kubernetes Pod YAML File-এ apiVersion, kind, metadata এবং spec ব্যবহার করে Define করা হয় কোন Object Create করতে হবে, Object-এর Name ও Labels কী হবে এবং Pod-এর মধ্যে কোন Container Image Run করবে।
Official Documentation
- Kubernetes — Pods
- Kubernetes — Understanding Kubernetes Objects
- Kubernetes — Object Names and IDs
- Kubernetes — Labels and Selectors
- kubectl create
- kubectl apply
মনে রাখবে: Kubernetes YAML শেখার মূল উদ্দেশ্য শুধু Syntax মনে রাখা নয়। বরং YAML-এর মাধ্যমে Kubernetes Resources-এর Desired Configuration কীভাবে Define করা হয়, সেটি বোঝা। কারণ পরবর্তী Tutorials-এ ReplicaSets, Deployments এবং Services — সবকিছুতেই এই YAML Structure ব্যবহার করা হবে।
