آموزش کوبرنتیز؛ شب سوم: 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 متصل کنید:
تا وقتی این فرمان اجراست، در Terminal دوم پاسخ HTTP را بررسی کنید:
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 سالم را حذف کنید:
چون این Pod هیچ Controllerای ندارد، دوباره ساخته نمیشود. Deployment و دیگر کنترلرها با Reconciliation این قابلیت را فراهم میکنند.
چکلیست پایان¶
- Pod را از روی YAML ساخته و بررسی کردهام.
- از logs، exec، describe و port-forward استفاده کردهام.
- خطای دریافت Image را تشخیص داده و رفع کردهام.
- دیدهام که Naked Pod پس از حذف دوباره ساخته نمیشود.