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

آموزش کوبرنتیز؛ شب اول: معماری کلاستر

در شب اول می‌خواهیم بفهمیم یک درخواست چگونه از kubectl عبور می‌کند و در نهایت به کانتینری در حال اجرا تبدیل می‌شود:

kubectl → API Server → etcd
                     → Scheduler → Node
                     → Controller Manager
                     → kubelet → containerd → container

اجزای اصلی

جزء مسئولیت
API Server اعتبارسنجی درخواست‌ها و ارائهٔ API کوبرنتیز
etcd نگه‌داری وضعیت مطلوب و وضعیت مشاهده‌شدهٔ کلاستر
Scheduler اختصاص Podهای زمان‌بندی‌نشده به Nodeها
Controller Manager نزدیک‌کردن پیوستهٔ وضعیت واقعی به وضعیت مطلوب
kubelet اطمینان از اجرای Podهای تخصیص‌یافته روی Node خود
Container Runtime دریافت Image و راه‌اندازی Containerها

کوبرنتیز یک سیستم «تطبیق وضعیت» یا Reconciliation است. شما وضعیت مطلوب را اعلام می‌کنید؛ کنترلرها دائماً آن را با وضعیت واقعی مقایسه می‌کنند و اختلاف را از بین می‌برند.

آزمایش: مشاهدهٔ Control Plane و Node

ابتدا وضعیت کلاستر، Nodeها، سلامت API و Podهای همهٔ Namespaceها را ببینید:

kubectl cluster-info
kubectl get nodes -o wide
kubectl get --raw='/readyz?verbose'
kubectl get pods -A -o wide
kubectl describe node playground-mj

اگر نام Node شما playground-mj نیست، نام درست را از خروجی دستور دوم بردارید.

یک Namespace جدا و Deployment دو‌نمونه‌ای بسازید:

kubectl create namespace course-night-1
kubectl create deployment architecture-demo \
  --namespace course-night-1 \
  --image=nginx:alpine \
  --replicas=2

kubectl get deployment,replicaset,pod \
  --namespace course-night-1 \
  --watch

با Ctrl+C مشاهدهٔ زنده را متوقف کنید. سپس زنجیرهٔ مالکیت را دنبال کنید:

kubectl get deployment architecture-demo \
  --namespace course-night-1 \
  -o yaml

kubectl get replicasets \
  --namespace course-night-1 \
  -o custom-columns='NAME:.metadata.name,OWNER:.metadata.ownerReferences[0].name,DESIRED:.spec.replicas'

kubectl get pods \
  --namespace course-night-1 \
  -o custom-columns='NAME:.metadata.name,NODE:.spec.nodeName,OWNER:.metadata.ownerReferences[0].name,STATUS:.status.phase'

در خروجی باید مسیر Deployment → ReplicaSet → Pod → Node را ببینید.

تمرین Reconciliation

نام یکی از Podها را پیدا و آن را حذف کنید:

kubectl get pods --namespace course-night-1
kubectl delete pod <pod-name> --namespace course-night-1
kubectl get pods --namespace course-night-1 --watch

کنترلر Deployment به‌دلیل تفاوت وضعیت واقعی با دو Replica مطلوب، Pod تازه‌ای می‌سازد. پس از مشاهدهٔ Pod جایگزین، با Ctrl+C خارج شوید.

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

  • نقش هر شش جزء جدول را می‌توانم توضیح دهم.
  • زنجیرهٔ Deployment تا Node را دنبال کرده‌ام.
  • یک Pod را حذف و ساخته‌شدن خودکار جایگزین را دیده‌ام.
  • نام Pod و Node مشاهده‌شده را ثبت کرده‌ام.

در پایان منابع تمرین را پاک کنید:

kubectl delete namespace course-night-1