در شب اول می‌خواهیم بفهمیم یک درخواست چگونه از 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