🌐 Detecting your location…

2026 में कुबेरनेट्स को स्थानीय रूप से काइंड और के3डी के साथ कैसे सेट करें: संपूर्ण गाइड

⏱️3 min read  ·  526 words

कुबेरनेट्स को स्थानीय रूप से चलाने का मतलब एक भारी वर्चुअल मशीन और लंबा इंतजार होता है। kind औरk3d क्लस्टर को कंटेनर के रूप में चलाकर इसे बदल दिया गया, जो सेकंड में शुरू होता है और निष्क्रिय होने पर लगभग कुछ भी खर्च नहीं होता है। यह मार्गदर्शिका प्रवेश, स्थानीय छवि लोडिंग और एक विकास लूप के साथ एक कार्यशील स्थानीय क्लस्टर स्थापित करती है जिसमें प्रत्येक परिवर्तन पर रजिस्ट्री को धक्का देना शामिल नहीं होता है।

📋 Table of Contents

  1. प्रकार या k3d: किसे चुनें
  2. विकल्प ए: प्रकार
  3. सिंगल-नोड क्लस्टर एक कमांड है, लेकिन एक कॉन्फ़िगरेशन फ़ाइल तुरंत लिखने लायक है क्योंकि इनग्रेस के लिए पोर्ट मैपिंग की आवश्यकता होती है जिसे क्लस्टर को दोबारा बनाए बिना बाद में नहीं जोड़ा जा सकता है।
  4. ट्रैफ़िक के बजाय इनग्रेस-एनजीएनएक्स का उपयोग करने के लिए, निर्माण के समय बंडल किए गए को अक्षम करें।
  5. कुबेरनेट्स को खींचने की कोशिश करता है
  6. फिर आवेदन करें और जांचें।
  7. झुकाव या मचान
  8. अपने होस्ट पर डेटा रखने के लिए ताकि यह क्लस्टर विलोपन से बच जाए, निर्माण के समय एक होस्ट निर्देशिका माउंट करें।
  9. सफ़ाई करना
  10. छवि लोड करना भूल गया.
  11. क्लस्टर आपके होस्ट की डॉकर छवियां नहीं देख सकता। उन्हें स्पष्ट रूप से लोड करें.
  12. पोर्ट मैपिंग के साथ क्लस्टर बनाएं जिसकी आपको प्रवेश के लिए आवश्यकता होगी, स्थानीय छवियों को क्लस्टर में स्पष्ट रूप से लोड करें, सेट करें

प्रकार या k3d: किसे चुनें

दोनों डॉकर के अंदर कुबेरनेट्स चलाते हैं। वे जो चलाते हैं और जिसके लिए अनुकूलन करते हैं उसमें भिन्नता होती है।

दयालु k3d
कुबेरनेट्स अपस्ट्रीम, असंशोधित k3s – हल्का वजन, कुछ घटकों की अदला-बदली
प्रारंभ समय तेज़ तेज़
मेमोरी उपयोग उच्चतर निचला
के लिए सर्वोत्तम वास्तविक अपस्ट्रीम व्यवहार के विरुद्ध परीक्षण, सीआई तेज़ पुनरावृत्ति, बाधित लैपटॉप चुनें

दयालु यदि आपको उत्पादन अपस्ट्रीम कुबेरनेट्स के समान व्यवहार की आवश्यकता है, विशेष रूप से परीक्षण ऑपरेटरों या प्रवेश नियंत्रकों के लिए। चुनें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

सिंगल-नोड क्लस्टर एक कमांड है, लेकिन एक कॉन्फ़िगरेशन फ़ाइल तुरंत लिखने लायक है क्योंकि इनग्रेस के लिए पोर्ट मैपिंग की आवश्यकता होती है जिसे क्लस्टर को दोबारा बनाए बिना बाद में नहीं जोड़ा जा सकता है।

होस्ट पोर्ट 80 और 443 को क्लस्टर नोड में ब्लॉक करें, जो

# 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

बनाता है अपने प्रवेश नियंत्रक तक पहुंचें. इसे आगे जोड़ें – रेट्रोफिटिंग का अर्थ है क्लस्टर को हटाना और पुनः बनाना।extraPortMappingsतरह पर प्रवेशhttp://localhostविकल्प बी: k3d

k3d पोर्ट मैपिंग और फ़्लैग के साथ प्रवेश को संभालता है, इसलिए सेटअप छोटा है। k3s में डिफ़ॉल्ट रूप से ट्रैफ़िक को इसके प्रवेश नियंत्रक के रूप में शामिल किया गया है।

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 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

लगातार वॉल्यूमदोनों उपकरण एक डिफ़ॉल्ट स्टोरेज क्लास शिप करते हैं, इसलिए PersistentVolumeClaim बिना कॉन्फ़िगरेशन के काम करता है।

kubectl port-forward svc/web 3000:80
# now http://localhost:3000

अपने होस्ट पर डेटा रखने के लिए ताकि यह क्लस्टर विलोपन से बच जाए, निर्माण के समय एक होस्ट निर्देशिका माउंट करें।

डिबगिंग

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 वे क्लस्टर निर्माण पर तय किए गए हैं। बंदरगाह बनाने से पहले प्रवेश की योजना बनाएं।

संसाधन अनुरोध छोड़ना. उनके बिना शेड्यूलर क्षमता के बारे में तर्क नहीं कर सकता है, और जब तक पॉड्स को बाहर नहीं निकाला जाता है तब तक स्थानीय क्लस्टर ओवरकमिट करते हैं।

यह मानते हुए कि स्थानीय उत्पादन के बराबर है। स्थानीय क्लस्टर में कोई वास्तविक लोड बैलेंसर नहीं है, कोई क्लाउड स्टोरेज क्लास नहीं है, और डिफ़ॉल्ट रूप से कोई नेटवर्क नीति प्रवर्तन नहीं है। उन्हें एक विकास उपकरण के रूप में मानें, उत्पादन सिम्युलेटर के रूप में नहीं।

निष्कर्षएक उत्पादक स्थानीय कुबेरनेट्स सेटअप के लिए चार चीजों की आवश्यकता होती है:

पोर्ट मैपिंग के साथ क्लस्टर बनाएं जिसकी आपको प्रवेश के लिए आवश्यकता होगी, स्थानीय छवियों को क्लस्टर में स्पष्ट रूप से लोड करें, सेट करें

इसलिए कुबेरनेट्स रजिस्ट्री का पीछा नहीं करता है, और टिल्ट या स्केफोल्ड के साथ पुनर्निर्माण लूप को स्वचालित करता है। जब आपको अपस्ट्रीम-समान व्यवहार की आवश्यकता हो तो टाइप का उपयोग करें और जब आप सबसे हल्का, सबसे तेज़ लूप चाहते हैं तो k3d का उपयोग करें। दोनों आपको सेकंडों में एक क्लस्टर को हटाने और फिर से बनाने की सुविधा देते हैं, जो वास्तविक लाभ है – एक टूटा हुआ स्थानीय क्लस्टर डिबगिंग के लायक समस्या बनना बंद कर देता है।imagePullPolicy: IfNotPresent जब आपको अपस्ट्रीम-समान व्यवहार की आवश्यकता हो तो टाइप का उपयोग करें और जब आप सबसे हल्का, सबसे तेज़ लूप चाहते हैं तो k3d का उपयोग करें। दोनों आपको सेकंडों में एक क्लस्टर को हटाने और फिर से बनाने की सुविधा देते हैं, जो वास्तविक लाभ है – एक टूटा हुआ स्थानीय क्लस्टर डिबगिंग के लायक समस्या बनना बंद कर देता है। जब आपको अपस्ट्रीम-समान व्यवहार की आवश्यकता हो तो टाइप का उपयोग करें और जब आप सबसे हल्का, सबसे तेज़ लूप चाहते हैं तो k3d का उपयोग करें। दोनों आपको सेकंडों में एक क्लस्टर को हटाने और फिर से बनाने की सुविधा देते हैं, जो वास्तविक लाभ है – एक टूटा हुआ स्थानीय क्लस्टर डिबगिंग के लायक समस्या बनना बंद कर देता है।

MD Rafikul Islam

Written by

MD Rafikul Islam is a software developer and the editor of TechPulse. He writes about developer tooling, hardware, and the practical decisions that come up in day-to-day engineering work — which laptop to buy, which framework to commit to, why a build broke at 2am. He tests the tools he writes about and says plainly when something is not worth the money. Corrections and corrections requests are welcome at rony.yf25@gmail.com.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা