هدف امشب این است که بدون وابستگی به داشبورد گرافیکی، کلاستر را با اطمینان بررسی کنیم. مهم‌ترین عادت عملیاتی این است که پیش از هر تغییر، Context و Namespace مقصد را کنترل کنیم.

ایمنی Context و Namespace#

kubectl config current-context
kubectl config get-contexts
kubectl config view --minify
kubectl get namespaces

Namespace این درس را بسازید:

kubectl create namespace course-night-2

می‌توانید Namespace را فقط برای یک فرمان تعیین کنید:

kubectl get pods --namespace course-night-2

یا Namespace پیش‌فرض Context فعلی را تغییر دهید:

kubectl config set-context --current --namespace=course-night-2
kubectl config view --minify --output 'jsonpath={..namespace}{"\n"}'

این تنظیم در پایان درس دوباره به default برگردانده می‌شود.

کشف منابع API#

به‌جای حفظ‌کردن منابع و فیلدها، از خود API کمک بگیرید:

kubectl api-resources
kubectl api-resources --namespaced=true
kubectl api-resources --namespaced=false
kubectl api-versions
kubectl explain deployment
kubectl explain deployment.spec
kubectl explain deployment.spec.strategy

دو فرمان دوم و سوم نشان می‌دهند هر منبع درون Namespace قرار می‌گیرد یا در سطح کل کلاستر تعریف می‌شود. kubectl explain نیز مستندات Schema را مستقیماً از API در اختیارتان می‌گذارد.

قالب‌های خروجی#

یک منبع واحد را می‌توان با قالب‌های گوناگون مشاهده کرد:

kubectl get nodes
kubectl get nodes -o wide
kubectl get nodes -o name
kubectl get nodes -o yaml
kubectl get nodes -o json

برای گزارش‌های دقیق‌تر، ستون‌های سفارشی و JSONPath کاربردی‌اند:

kubectl get nodes \
  -o custom-columns='NAME:.metadata.name,READY:.status.conditions[-1].status,KUBELET:.status.nodeInfo.kubeletVersion'

kubectl get pods -A \
  -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,NODE:.spec.nodeName,PHASE:.status.phase'

kubectl get nodes \
  -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.nodeInfo.containerRuntimeVersion}{"\n"}{end}'

فیلترکردن و بررسی سلامت#

با Label Selector و Field Selector دامنهٔ خروجی را محدود کنید:

kubectl get pods -A --show-labels
kubectl get pods -A --field-selector=status.phase=Running
kubectl get pods -A -l app=nginx

رویدادها و Endpointهای خام سلامت API را نیز بررسی کنید:

kubectl get events -A --sort-by=.metadata.creationTimestamp
kubectl get --raw='/version'
kubectl get --raw='/readyz'

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

  • پیش از تغییر کلاستر، Context و Namespace را بررسی کرده‌ام.
  • می‌توانم Namespaced یا Cluster-scoped بودن یک منبع را پیدا کنم.
  • یک فیلد ناآشنا را با kubectl explain بررسی کرده‌ام.
  • خروجی YAML، ستون سفارشی و JSONPath ساخته‌ام.
  • آبجکت‌ها را بر اساس Label و Field فیلتر کرده‌ام.

در پایان Context و محیط تمرین را به حالت قبل برگردانید:

kubectl config set-context --current --namespace=default
kubectl delete namespace course-night-2