پرش به محتویات

آموزش کوبرنتیز؛ شب سوم: Podها

امشب یک Pod را اجرا و عیب‌یابی می‌کنیم، چرخهٔ حیاتش را می‌شناسیم و می‌بینیم چرا یک Pod بدون Controller برای سرویس‌های بلندمدت قابل‌اعتماد نیست.

ساخت Pod به روش Declarative

فایل pod.yaml را بسازید:

apiVersion: v1
kind: Pod
metadata:
  name: web
  namespace: course-night-3
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: nginx:alpine
      ports:
        - name: http
          containerPort: 80

سپس آن را اعمال کنید:

kubectl create namespace course-night-3
kubectl apply -f pod.yaml
kubectl get pod web --namespace course-night-3 --watch

پس از Ready شدن Pod، با Ctrl+C مشاهده را متوقف کنید.

مشاهده و استفاده از Pod

kubectl describe pod web --namespace course-night-3
kubectl logs web --namespace course-night-3
kubectl exec --namespace course-night-3 web -- nginx -v
kubectl exec --namespace course-night-3 web -- cat /etc/os-release
kubectl get pod web --namespace course-night-3 -o wide

پورت محلی ۸۰۸۰ را به پورت ۸۰ Pod متصل کنید:

kubectl port-forward --namespace course-night-3 pod/web 8080:80

تا وقتی این فرمان اجراست، در Terminal دوم پاسخ HTTP را بررسی کنید:

curl -I http://127.0.0.1:8080

Image و وضعیت Container

kubectl get pod web --namespace course-night-3 \
  -o jsonpath='{.spec.containers[0].image}{"\n"}'

kubectl get pod web --namespace course-night-3 \
  -o jsonpath='{range .status.containerStatuses[*]}{.name}{" ready="}{.ready}{" restarts="}{.restartCount}{"\n"}{end}'

سه مفهوم را از هم جدا کنید:

  • Phase خلاصه‌ای سطح‌بالا از وضعیت Pod مانند Pending یا Running است.
  • State هر Container یکی از Waiting، Running یا Terminated است.
  • عبارتی مثل CrashLoopBackOff معمولاً دلیل قابل‌فهمی است که kubectl نمایش می‌دهد، نه Phase خود Pod.

تمرین خرابی Image

فایل broken-pod.yaml را با یک Tag نامعتبر بسازید:

apiVersion: v1
kind: Pod
metadata:
  name: broken
  namespace: course-night-3
spec:
  containers:
    - name: nginx
      image: nginx:this-tag-does-not-exist

آن را اعمال و عیب‌یابی کنید:

kubectl apply -f broken-pod.yaml
kubectl get pod broken --namespace course-night-3
kubectl describe pod broken --namespace course-night-3
kubectl get events --namespace course-night-3 \
  --sort-by=.metadata.creationTimestamp

در فایل خراب، Image را به nginx:alpine تغییر دهید، دوباره apply کنید و Ready شدن Pod را ببینید.

چرا Naked Pod یک سرویس نیست؟

Pod سالم را حذف کنید:

kubectl delete pod web --namespace course-night-3
kubectl get pods --namespace course-night-3

چون این Pod هیچ Controllerای ندارد، دوباره ساخته نمی‌شود. Deployment و دیگر کنترلرها با Reconciliation این قابلیت را فراهم می‌کنند.

چک‌لیست پایان

  • Pod را از روی YAML ساخته و بررسی کرده‌ام.
  • از logs، exec، describe و port-forward استفاده کرده‌ام.
  • خطای دریافت Image را تشخیص داده و رفع کرده‌ام.
  • دیده‌ام که Naked Pod پس از حذف دوباره ساخته نمی‌شود.
kubectl delete namespace course-night-3