در این قسمت می خواهیم resource هایی را بسازیم و آن ها را در کلاستر قرار دهیم. اولین resource ای که می سازیم pod است. به خاطر داشته باشید که pod ها کوچک ترین واحد موجود در کوبرنتیز اند و کانتینر هایی که برنامه ما را اجرا می کنند در آن ها قرار خواهند گرفت.
در این دوره می خواهیم یک برنامه ساده را در کوبرنتیز مستقر کنیم. برنامه ما شامل بخش های زیر است:
برای اجرای هر کدام از این بخش ها باید آن را داخل یک کانتینر قرار دهیم. باید برای هر کدام از این سرویس ها یک pod بسازیم. ابتدا با client شروع می کنیم. به خاطر داشته باشید که برای ایجاد resource ها دو راه دستوری و توضیحی وجود دارد. ما از راه توضیحی pod هایمان را می سازیم. به عبارت دیگر یک فایل yaml ای خواهیم نوشت که در آن ویژگی های pod مان را تعریف می کنیم.
بنابراین اولین کاری که باید انجام بدهیم ایجاد یک فایل yaml و باز کردن آن در یک ویرایشگر متن است. اگر با شیوه نگارش فایل های yaml آشنایی ندارید نگران نباشید. در طول دوره نمونه های زیادی از این فایل ها را مرور خواهیم کرد.
نام فایل مان را client-pod.yaml قرار می دهیم. سپس کد های زیر را در این فایل قرار می دهیم تا pod مورد نظرمان تعریف شود (کمی جلو تر خط به خط این فایل را توضیح می دهیم). توجه داشته باشید که در فایل های yaml فاصله گذاری و دندانه ها بسیار مهم اند.
apiVersion: v1
kind: Pod
metadata:
name:client-pod
labels:
app: client
spec:
containers:
- name: client
image: sokanacademy/k8s-course-client:1
اکنون که این فایل را داریم می توانیم pod مان را در کوبرنتیز قرار دهیم. این کار را با دستور زیر انجام می دهیم:
kubectl apply -f client-pod.yaml
پس از اجرای این دستور پیام ساخته شدن pod را می بینیم. پس از pull شدن کامل image، اگر دستور kubectl get all را اجرا کنیم می توانیم pod ساخته شده را ببینیم.
همانطور که می بینید وضعیت pod ما در حال اجرا (Running) است. اکنون کد هایی که در فایل client-pod.yaml نوشتیم را توضیح می دهیم.
ابتدا با برچسب kind شروع می کنیم. برچسب kind نشان می دهد ما چه نوع resource ای می خواهیم ایجاد کنیم. به خاطر داشته باشید که در کوبرنتیز، resource ها انواع مختلفی دارند. برخی از resource های کوبرنتیز را در لیست زیر می بینید:
- Pod
- Service
- Ingress
- Deployment
- ReplicaSet
- Secret
- ConfigMap
البته این لیست بخش کمی از انواع resource ها در کوبرنتیز است. شما می توانید در این لینک لیست کامل تری از انواع resource ها ببینید.
از آن جایی که ما می خواستیم یک pod ایجاد کنیم مقدار برچسب kind را Pod قرار دادیم. اگر می خواستیم یک deployment ایجاد کنیم باید مقدار kind را Deployment می گذاشتیم.
اما apiVersion چیست؟ من apiVersion را مانند پوشه ای می بینم که در آن برخی resource ها برای استفاده قرار داده شده اند.
همانطور که در تصویر بالا می بینید اگر از نسخه v1 استفاده کنیم، تنها به برخی از resource ها مانند pod و service و... دسترسی داریم اما به deployment دسترسی نداریم چون deployment در نسخه ی دیگری قرار دارد. بنابراین می توانیم نسخه ها را مانند پوشه هایی ببینیم که داخل آن ها resource های مختلف وجود دارد.
به خاطر داشتن مقدار صحیح برچسب apiVersion برای resource ای که می خواهیم استفاده کنیم، ممکن است کمی دشوار باشد. به همین دلیل پیشنهاد می کنم هر وقت می خواهید فایل yaml یک resource را بنویسید نمونه آن را در گوگل جست و جو کنید تا apiVersion مربوط به آن را پیدا کنید. همچنین می توانید به لینکی که بالاتر برای مشاهده لیست resource ها قرار داده شد مراجعه کنید.
اکنون به سراغ برچسب metadata می رویم. در metadata معمولا به resource مان یک اسم و نشانه می دهیم. در فایل client-pod.yaml ما به pod خود نام client-pod را دادیم.
metadata:
name: client-pod
این نام در خروجی دستور kubectl get all
قابل مشاهده است.
این نام می تواند هر چیزی که می خواهید باشد. اما بهتر است یک نام با معنی انتخاب کنیم. در برچسب metadata بعد از name، برچسب labels را داریم. می توانیم چندین label را به هر نوع resource بدهیم. اما چرا از labels استفاده می کنیم؟
ممکن است تعدادی resource بسازیم که نیاز داشته باشند با pod ما ارتباط برقرار کنند. resource های دیگر تنها از طریق label ها می توانند با pod ما ارتباط برقرار کنند. مقدار برچسب labels می تواند هر کلید و مقداری که می خواهیم باشد. همچنین می توانیم چندین کلید و مقدار در برچسب labels داشته باشیم. می توانیم label ها را مانند یک شناسه در نظر بگیریم.
اکنون نوبت به برچسب spec رسیده است. این برچسب شامل مشخصات pod ما می شود. این برچسب در تعریف بیشتر resource ها استفاده می شود. داخل برچسب spec ما لیستی از container هایی که می خواهیم درون pod مان قرار بگیرند را مشخص می کنیم. به خاطر داشته باشید که یک pod می تواند چندین کانتینر داشته باشد. به همین دلیل مقدار برچسب containers به صورت آرایه است.
containers:
- name: client
image: sokanacademy/k8s-course-client:1
- name: client2
image: sokanacademy/k8s-course-client:2
البته بیشتر وقت ها pod و کانتینر ها رابطه ی یک به یک دارند. به همین دلیل در نمونه ما هم تنها یک کانتینر تعریف شده است.
هنگام تعریف کانتینر به آن یک نام می دهیم که می تواند هر چیزی باشد. سپس برای کانتینر یک image مشخص می کنیم. در فایل client-pod.yaml، ما از image ای با نام sokanacademy/k8s-course-client:1 استفاده کردیم.
اکنون که با محتویات فایل client-pod.yaml آشنا شدیم و pod ما در حال اجرا است باید بتوانیم در آدرس localhost:3000 برنامه مان را مشاهده کنیم.
اما چرا برنامه ما بارگذاری نشد؟ دلیل بسیار خوبی برای این مشکل وجود دارد.
pod ما در کلاستر کوبرنتیز در حال اجرا است که نسبت به سیستم ما کاملا ایزوله است. به عبارت دیگر pod ما در کلاستر کوبرنتیز در حال اجرا است نه در سیستم ما! به همین خاطر نمی توانیم از طریق localhost:3000 به pod مان دسترسی داشته باشیم.
می توانیم از دستور <kubectl logs <resource name
استفاده کنیم تا لاگ های pod مان را ببینیم.
همانطور که می بینید pod ما به درستی اجرا شده است اما ما از سیستم خودمان به آن دسترسی نداریم. باید راهی برای دسترسی به pod مان ایجاد کنیم این کار را با resource ای به نام Service می توانیم انجام دهیم. در قسمت بعد با این resource آشنا خواهیم شد.
فایل های این قسمت را می توانید از اینجا دانلود کنید.