স্থানীয়ভাবে কুবারনেটস চালানো মানে একটি ভারী ভার্চুয়াল মেশিন এবং দীর্ঘ অপেক্ষা। kind এবংk3d পাত্র হিসাবে ক্লাস্টারগুলি চালানোর মাধ্যমে এটি পরিবর্তন করা হয়েছে, যা সেকেন্ডে শুরু হয় এবং নিষ্ক্রিয় অবস্থায় প্রায় কিছুই খরচ হয় না। এই গাইড ইনগ্রেস, স্থানীয় ইমেজ লোডিং এবং একটি ডেভেলপমেন্ট লুপ সহ একটি কার্যকরী স্থানীয় ক্লাস্টার সেট আপ করে যা প্রতিটি পরিবর্তনের জন্য একটি রেজিস্ট্রিতে ঠেলে দেয় না।
📋 Table of Contents
- ধরনের বা k3d: কোনটি বেছে নিতে হবে
- পূর্বশর্ত
- বিকল্প A: ধরনের
- k3d পোর্ট ম্যাপিং পরিচালনা করে এবং পতাকা সহ প্রবেশ করে, তাই সেটআপ ছোট। k3s ডিফল্টরূপে ট্রাফিককে এর প্রবেশ নিয়ন্ত্রক হিসাবে অন্তর্ভুক্ত করে।
- স্থানীয় উন্নয়নের জন্য অপরিহার্য। ডিফল্ট
- আপনার ক্লাস্টার তার নিজস্ব ইমেজ স্টোরের সাথে তার নিজস্ব পাত্রে চলে। আপনি স্পষ্টভাবে লোড না করা পর্যন্ত আপনার হোস্টে নির্মিত একটি চিত্র এটিতে অদৃশ্য থাকে৷
- প্রতিটি পরিবর্তনের জন্য পুনঃনির্মাণ, লোডিং এবং পুনঃনিয়োগ করা টেকসই করার জন্য খুব ধীর। দুটি পন্থা এটি ঠিক করে।
- উভয় সরঞ্জামই একটি ডিফল্ট স্টোরেজ ক্লাস পাঠায়, তাই একটি PersistentVolumeClaim কনফিগারেশন ছাড়াই কাজ করে।
- প্রায় যেকোনো সমস্যার জন্য চালানো প্রথম কমান্ড। নীচের ইভেন্ট বিভাগটি স্পষ্টভাবে বলে যে চিত্রটি টানতে ব্যর্থ হয়েছে কিনা, নোডে সম্পদের অভাব ছিল বা একটি প্রোব ব্যর্থ হয়েছে।
- সাধারণ ভুল
- ছবি লোড করতে ভুলে গেছি।
- একটি উত্পাদনশীল স্থানীয় কুবারনেটস সেটআপের জন্য চারটি জিনিস সঠিক প্রয়োজন:
ধরনের বা k3d: কোনটি বেছে নিতে হবে
দুজনেই ডকারের ভিতরে কুবারনেটস চালায়। তারা কি চালায় এবং কিসের জন্য তারা অপ্টিমাইজ করে তার মধ্যে পার্থক্য রয়েছে।
| সদয় | k3d | |
|---|---|---|
| কুবারনেটস | উজানে, অপরিবর্তিত | k3s — হালকা ওজনের, কিছু উপাদান অদলবদল করা হয়েছে |
| শুরুর সময় | দ্রুত | দ্রুত |
| মেমরি ব্যবহার | উচ্চতর | নিম্ন |
| জন্য সেরা | বাস্তব আপস্ট্রিম আচরণের বিরুদ্ধে পরীক্ষা, CI | দ্রুত পুনরাবৃত্তি, সীমাবদ্ধ ল্যাপটপ |
চয়ন করুনসদয় আপনার যদি আপস্ট্রিম কুবারনেটস উৎপাদনের অনুরূপ আচরণের প্রয়োজন হয়, বিশেষ করে টেস্টিং অপারেটর বা ভর্তি নিয়ন্ত্রকদের জন্য। চয়ন করুনk3d আপনি যদি অ্যাপ্লিকেশন বিকাশের জন্য দ্রুততম, হালকা লুপ চান। উভয়ই চমৎকার; এই গাইড প্রতিটি কভার.
পূর্বশর্ত
# Docker must be running
docker version
# kubectl
brew install kubectl # macOS
# or: curl -LO "https://dl.k8s.io/release/$(curl -Ls https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# kind
brew install kind
# k3d
brew install k3d
বিকল্প A: ধরনের
একটি একক-নোড ক্লাস্টার একটি কমান্ড, কিন্তু একটি কনফিগারেশন ফাইল অবিলম্বে লেখার যোগ্য কারণ প্রবেশের জন্য পোর্ট ম্যাপিং প্রয়োজন যা ক্লাস্টারটি পুনরায় তৈরি না করে পরে যোগ করা যাবে না।
# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- role: worker
- role: worker
kind create cluster --name dev --config kind-config.yaml
# kubectl context is switched automatically
kubectl cluster-info --context kind-dev
kubectl get nodes
ক্লাস্টার নোডের মধ্যে 80 এবং 443 হোস্ট পোর্টগুলিকে ব্লক করুন, যা এটি তৈরি করেextraPortMappings আপনার প্রবেশ নিয়ন্ত্রকের কাছে পৌঁছান। এটিকে সামনে যুক্ত করুন — রেট্রোফিটিং মানে ক্লাস্টার মুছে ফেলা এবং পুনরায় তৈরি করা।http://localhostপ্রকারে প্রবেশ করুন
বিকল্প B: k3d
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s
k3d পোর্ট ম্যাপিং পরিচালনা করে এবং পতাকা সহ প্রবেশ করে, তাই সেটআপ ছোট। k3s ডিফল্টরূপে ট্রাফিককে এর প্রবেশ নিয়ন্ত্রক হিসাবে অন্তর্ভুক্ত করে।
Traefik-এর পরিবর্তে ingress-nginx ব্যবহার করতে, তৈরির সময় বান্ডিল করা অক্ষম করুন।
k3d cluster create dev \
--agents 2 \
--port "80:80@loadbalancer" \
--port "443:443@loadbalancer"
kubectl get nodes
একটি অ্যাপ্লিকেশন স্থাপন করা হচ্ছে
k3d cluster create dev \
--agents 2 \
--port "80:80@loadbalancer" \
--k3s-arg "--disable=traefik@server:0"
স্থানীয় উন্নয়নের জন্য অপরিহার্য। ডিফল্ট
# app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: my-app:dev
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
readinessProbe:
httpGet:
path: /healthz
port: 3000
initialDelaySeconds: 2
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 512Mi
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 3000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
spec:
ingressClassName: nginx
rules:
- host: app.localhost
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
imagePullPolicy: IfNotPresent কুবারনেটসকে টানার চেষ্টা করেAlways একটি রেজিস্ট্রি থেকে, যার অস্তিত্ব নেই, এবং পডটিmy-app:devএর সাথে ব্যর্থ হয়৷ স্থানীয় ছবি লোড হচ্ছে — যে ধাপটি সবাই মিস করেErrImagePull.
আপনার ক্লাস্টার তার নিজস্ব ইমেজ স্টোরের সাথে তার নিজস্ব পাত্রে চলে। আপনি স্পষ্টভাবে লোড না করা পর্যন্ত আপনার হোস্টে নির্মিত একটি চিত্র এটিতে অদৃশ্য থাকে৷
তারপর আবেদন করুন এবং পরীক্ষা করুন।
# Build normally
docker build -t my-app:dev .
# kind
kind load docker-image my-app:dev --name dev
# k3d
k3d image import my-app:dev -c dev
যদি শুঁটি বসে
kubectl apply -f app.yaml
kubectl get pods -w
curl -H "Host: app.localhost" http://localhost/
, আপনি প্রায় নিশ্চিতভাবেই লোডের ধাপটি এড়িয়ে গেছেন বা বামে গেছেনImagePullBackOff এর ডিফল্টে।imagePullPolicyএকটি দ্রুত অভ্যন্তরীণ লুপ
প্রতিটি পরিবর্তনের জন্য পুনঃনির্মাণ, লোডিং এবং পুনঃনিয়োগ করা টেকসই করার জন্য খুব ধীর। দুটি পন্থা এটি ঠিক করে।
কাত বা স্ক্যাফোল্ড
আপনার উত্স দেখুন, পুনর্নির্মাণ করুন, চিত্রটি লোড করুন এবং স্বয়ংক্রিয়ভাবে স্থাপনা আপডেট করুন।পোর্ট ফরওয়ার্ডিং
# Tiltfile
docker_build('my-app', '.')
k8s_yaml('app.yaml')
k8s_resource('web', port_forwards='3000:3000')
tilt up
যখন আপনাকে প্রবেশ না করেই একটি পরিষেবাতে পৌঁছাতে হবে তখনই যথেষ্ট।ক্রমাগত ভলিউম
kubectl port-forward svc/web 3000:80
# now http://localhost:3000
উভয় সরঞ্জামই একটি ডিফল্ট স্টোরেজ ক্লাস পাঠায়, তাই একটি PersistentVolumeClaim কনফিগারেশন ছাড়াই কাজ করে।
আপনার হোস্টে ডেটা রাখতে যাতে এটি ক্লাস্টার মুছে ফেলা থেকে বেঁচে থাকে, তৈরির সময় একটি হোস্ট ডিরেক্টরি মাউন্ট করুন।
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 1Gi
ডিবাগিং
# kind-config.yaml
nodes:
- role: control-plane
extraMounts:
- hostPath: /Users/me/k8s-data
containerPath: /data
প্রায় যেকোনো সমস্যার জন্য চালানো প্রথম কমান্ড। নীচের ইভেন্ট বিভাগটি স্পষ্টভাবে বলে যে চিত্রটি টানতে ব্যর্থ হয়েছে কিনা, নোডে সম্পদের অভাব ছিল বা একটি প্রোব ব্যর্থ হয়েছে।
# Why is a pod not starting? Events are at the bottom.
kubectl describe pod <pod-name>
# Logs, including from a crashed previous container
kubectl logs <pod-name>
kubectl logs <pod-name> --previous
# Shell into a running container
kubectl exec -it <pod-name> -- sh
# Debug a container with no shell using an ephemeral container
kubectl debug -it <pod-name> --image=busybox --target=web
# Cluster-wide recent events, newest last
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl describe podপরিষ্কার করা
সাধারণ ভুল
# kind
kind delete cluster --name dev
# k3d
k3d cluster delete dev
# k3d can also stop and restart without losing state
k3d cluster stop dev
k3d cluster start dev
ছবি লোড করতে ভুলে গেছি।
ক্লাস্টারটি আপনার হোস্টের ডকার চিত্রগুলি দেখতে পারে না। তাদের স্পষ্টভাবে লোড করুন.চলে যাচ্ছে
ডিফল্ট এimagePullPolicy সাথে একটি ট্যাগ ডিফল্ট হল:latest, যা শুধুমাত্র স্থানীয় ছবিগুলির জন্য ব্যর্থ হয়৷Alwaysতৈরির পরে পোর্ট ম্যাপিং যোগ করা হচ্ছে।
তারা ক্লাস্টার সৃষ্টি এ স্থির করা হয়. আপনি তৈরি করার আগে প্রবেশ পোর্টের পরিকল্পনা করুন।সম্পদ অনুরোধ বাদ দেওয়া.
তাদের ছাড়া সময়সূচী ক্ষমতা সম্পর্কে যুক্তি দিতে পারে না, এবং স্থানীয় ক্লাস্টারগুলি পড উচ্ছেদ না হওয়া পর্যন্ত ওভারকমিট করে।অনুমান স্থানীয় সমান উৎপাদন.
স্থানীয় ক্লাস্টারগুলিতে কোনও বাস্তব লোড ব্যালেন্সার নেই, কোনও ক্লাউড স্টোরেজ ক্লাস নেই এবং ডিফল্টরূপে কোনও নেটওয়ার্ক নীতি প্রয়োগ নেই৷ তাদের একটি উন্নয়ন হাতিয়ার হিসাবে বিবেচনা করুন, একটি উত্পাদন সিমুলেটর নয়।উপসংহার
একটি উত্পাদনশীল স্থানীয় কুবারনেটস সেটআপের জন্য চারটি জিনিস সঠিক প্রয়োজন:
প্রবেশের জন্য আপনার প্রয়োজন হবে এমন পোর্ট ম্যাপিং সহ ক্লাস্টার তৈরি করুন, ক্লাস্টারে স্পষ্টভাবে স্থানীয় ছবি লোড করুন, সেট করুন তাই Kubernetes একটি রেজিস্ট্রি তাড়া করে না, এবং Tilt বা Skaffold এর মাধ্যমে পুনর্নির্মাণ লুপ স্বয়ংক্রিয় করে।imagePullPolicy: IfNotPresent আপস্ট্রিম-অভিন্ন আচরণের প্রয়োজন হলে সদয় ব্যবহার করুন এবং যখন আপনি হালকা, দ্রুততম লুপ চান তখন k3d ব্যবহার করুন। উভয়ই আপনাকে সেকেন্ডের মধ্যে একটি ক্লাস্টার মুছে ফেলতে এবং পুনরায় তৈরি করতে দেয়, যা আসল সুবিধা — একটি ভাঙা স্থানীয় ক্লাস্টার ডিবাগ করার মতো সমস্যা হওয়া বন্ধ করে দেয়। আপস্ট্রিম-অভিন্ন আচরণের প্রয়োজন হলে সদয় ব্যবহার করুন এবং যখন আপনি হালকা, দ্রুততম লুপ চান তখন k3d ব্যবহার করুন। উভয়ই আপনাকে সেকেন্ডের মধ্যে একটি ক্লাস্টার মুছে ফেলতে এবং পুনরায় তৈরি করতে দেয়, যা আসল সুবিধা — একটি ভাঙা স্থানীয় ক্লাস্টার ডিবাগ করার মতো সমস্যা হওয়া বন্ধ করে দেয়।
🔗 Share this article
✍️ Leave a Comment