Kubernetes Concepts
Cluster
مجموعه ای ماشین ها - مجازی یا واقعی - می گویند . که شامل یک نود اصلی - مستر - می باشد و یک یا چند ورکر دارد
nodes
به هر ماشین تو کلاستر کردن یه نود می گن و نود اصلی مستر هست و به وسیله ی Kubelet شناسایی می شن و با مستر ارتباط می گیرن
هر ماشین رو یه نود میگن ، که اصولن یک نود مستر و چندین ورکر داریم
هر نود نسبت به ریسورسی که داره تو خودش pod داره ، بین ۱۰ تا ۱۰۰
دو نوع نود داریم - مستر - ورکر
pod
resource group هست
گروهی از کانتینر ها ، شبکه و ستوریج مشترک و یک پاد ، آی پی واحد دارند
در واقع کوچک ترین واحد دپلوی . یک اینستنس که میتوان یک یا چند کانتینر را شامل شود که ریسورس بین آنها مشترک است
-
داخل یه وروکر نود میشه چندین پاد بسازیم
-
درون هر پاد میشه چندین کانتینر بیاریم بالا
-
هر پاد آی پی خودش رو داره ، و درونش هر کانتینر پورت خودش رو داره
-
bestpractice اینه که هر پاد ، یه کانتینر توش باشه و اینجوری اصل srp هم برقراره و مفهوم
میکروسرویس رو هم پیاده میکنه ، ولی گاهی میشه بیش از یه کانتینر در پاد ایجاد کرد ، مثلن زمانی که ابزار مانیتور یا لاگ یا پروکسی رو ست میکنیم ، همچنین گاهی کانتینر هایی برای اینیت باید بزاریم ، مانند زمانی که می خوایم مایگریشن بزنیم
مانند docker file که میشه یه ایمیج ساخت ، با استفاده از defination file هم میشه یه پاد ساخت و بهش گفت که درونش یک یا چند کانتینر از چه ایمیج هایی ساخته شود
kind
مشخص میکنیم که نوع آن پاد هست یا سرویس
بعد از ایجاد فایل دفینیشن ، با دستور زیر ، اون پاد را میسازیم
kubectl apply -f file.yml
یا
kubectl create -f file.yml
همچنین برای دیدن توضیحات بیشتر پاد و لاگ های اون event, از دستور زیر استفاده میکنیم
kubectl describe pod nginx1
برای مشاهده پاد جدید ساخته شده دستور زیر
get pod -n ns1l1
Namespace
یک کلاستر مجازی است ، در حقیقت برای تقسیم بندی منابع بر روی یک کلاستر ، می توان از این مفهوم استفاده کرد
با استفاده از این میتوان ریسورس رو گروه بندی یا ایزوله کرد ، بعد از ساخت یه کلاستر به صورت پیشفرض ۳ نیم اسپیس ساخته میشن : دیفالت ، پابلیک و سیستم نیم اسپیس
kubectl get namespaces
برای پروژه های معمولی نیازی به تعریف نیم اسپیس های زیاد نداریم ، همون دیفالت کافیه ، همچنین تو هر نیم اسپیس ، باید اسم پاد ها یونیک باشه
برای گرفتن تمام نیم اسپیس ها
kubectl get all
فکر میکنم ابتدایی ترین دستورات در ctl با نیم اسپیس ها باشه در دستور بالا بدون گفتن ns یا pod پیشفرض نیم اسپیس میده
همچنین برای ساخت pod در درون ns ها ، از دستور زیر استفاده میشه
kubectl get svc -n <name>
همچنین برای ایجاد یک پاد در درون یک نیم اسپیس
kubectl run nginx --image=nginx -n ns1
kubeconfig
روی نود مستر قرار داره و برای مدیریت نود ها هست و موارد زیر توش هست و اطلاعات رو توش میریزیم
همچنین آدرس اون توی مستر نود :
.kube/config
kubectl
یک اینترفیس است برای ارتباط با کلاستر
kubelet
دستورات از نود مستر باید به نود ورکر برسند ، این kubelet هست که درستور از مستر میگیره و در نود خودشاجرا میکنه ، در حقیقت یه agent هست
etcd
یک متغییر گلوبال برای پیکر بندی هست و و اطلاعات همه ی نود ها را دارد . پایگاه داده هست
kube api server
هم ای پی آی ها رودی و خروجی رو مدیریت می کنه ، هم مانند سویچ رو نتورک ، اگه سرویس های دیگه بخوان با هم صحبت کنن ، مثل اسکجولر یا کنترلر از طریق این api server با هم صحبت می کنن ، توجه سود میشه کاستوم کرد که سرویس ها
هم مستقیم امکان پذیره
kube scheduler
وظیفش اینکه تشخیص بده اگه یه پاد رو کدوم نود بیاد بالا با اطلاعاتی که داره
kube conroller manager
هلت چک پاد ها رو میگیره و هر موقع یه پاد کرش کرد یا ترکید ، سریع می فهمه و به اسکجولر ، از طریق api server میگه
objects
به مجموع deployments, replica sets, services, pods از یک واحد در کلاستر میگن
-
- ReplicaSet
می توان تعداد تکرار پاد ها را با استفاده از لیبل مدیریت کرد
-
- Deployment
استقرار یک پاد یا رپلیکا را مدیریت می کند
گروهی از Pods را مدیریت میکند و اطمینان میدهد که آنها در حالت دلخواه و مقیاس خودکار اجرا میشوند.
- minikube
یه نسخه ی سبک برای پیاده سازی روی یه ماشین ، بعد از استارت کردن مینی کیوب، به صورت پیشفرض یه پاد ایجاد میشه
kubectl command
این دستور یک دولوپمنت می سازد
kubectl run nginx --image=nginx
node port
یکی از سرویس های خوب برای تست که شبیه به load balancer در محیط تست عمل میکند
رپلیکا ست - ReplicaSet
با استفاده از این می توان تعداد پاد ها رو مشخص کرد ، حتی اگه کرش کنن یا پاک شن ، این ابزار به تعداد نگاه می کنه و تعداد پاد ایجاد می کنه
برای ایجاد رپلیکا از development pod برای اسکیل آپ کردن
kubectl get rs
services (network)
یک ریسورس است و در مبحث شبکه کمک میکند به این صورت:
وقتی ما پاد میسازیم یک ip داخلی بهش تخصیص داده میشه اما با کرش و … هر بار یه پاد دیگه بیاد بالا ip تغییر میکنه ، برای حل این مشکل ما از ریسورس سرویس استفاده مکنیم ، سرویس مستقل از طول عمر ریسورس پاد ها یا دیپلویمنت هاست
به این صورت که هر سرویس یک نام مشخص یا ip
مشخص داره ، و می تونه ارتباط بگیره با یک یا چندین پاد ، دیگه در این صورت نیاز نیست مستقیم به پاد درخواست بزنیم چون یا ip پاد موقت است یا دوست داریم درخواست ها بین چند پاد پخش بشن
نود ها از طریق کارت شبکه فیزیکی خود با مستر ارتباط دارن ، و همه این ها توی یک range هستند، مستر ( احتمال زیاد ) وظیفه ی ip routing رو هم انجام میده یعنی یه تیبل تو خودش داره که میگه اگر هدف یه پاد با آی پی 10.21.10.6 هست پس next hub آی پی فیزیکی نود 18.54.96.64 هست
توجه کنید بعد از کانفیگ کیوب ، اگر ifconfig بزنیم و کارت شبکه هامون رو ببینیم احتمالا 10.42.0.1 اضافه شده باشه و میتونیم توی اون ماشین دسترسی داشته باشیم به این شبکه
نکته باحال : اگه مثلا nodeport بسازیم در حقیقت درونش cluster ip هم داریم یا اگه load balancer بسازیم ، قبلی ها رو توش داریم
انواع تایپ های سرویس
- cluster ip خیلی ساده ، تعریف عادیه سرویس رو داره
به این صورت که یه سرویس با تایپ کلاستر آی پی انتخاب میکنیم ، یه نام نتورک براش انتخاب میکنیم و اون دسته پاد ها با تگ و لیبل بهش میدیم ، از این به بعد اگه لیست end point های رو بگیریم ، میبینیم ip داخلی پاد هابه این نیم مپ شده
توجه شود این شبکه برای در خواست های داخلی است ، مثلن می خواییم چند تا سرویس که فقط درخواست های سرویس های داخلی رو انجام میدن ، ببینن ، اگه در خواست تو بخش نتورک به جای ip اسم این سرویس رو بدیم ، شبکه ریسالو میکنه و به یکی از پاد های شبکه میرسه ، اما بیرون از کلاستر ، در دسترس نیست
- node port
مانند clusterip هست با این ویژگی که یه پورت بهمون می ده و با اون و ip external node میشه از خارج از کلاستر ، دسترسی به اون میشه پیدا کرد
هر سرویس nodeport , یه پورت بهمون میده ، و این پورت درخواست رو تبدیل میکنه به نام شبکه
توجه کنید اسم nodeport ربطی به نود نداره و بهتره اسمش clusterPort میبود
- load balancer
تفاوت این با نودپورت در اینه که اون یه پورت میده ، اما در این تایپ ، یه اکسترنال ip میده ، اما بیشتر در محیط های cloud مانند aws و … استفاده میشه ، اگر ما از این تایپ استفاده کنیم ezternal ip در وضعیت pending میمونه ، و باید از ابزار های third party استفاده کنیم تا بتونیم از این تایپ در لوکال استفاده کنیم
- external name
تا این جا هر چی گفتیم ، مواردی بوده که در خواست به سمت پاد یا کلاستر میومده ، با استفاده از این تایپ ، برای هر دامین یا آدرس بیرونی ، یه اسم در نظر میگیریم ،توجه شود بدون این تایپ هم
میشه به بیرون درخواست داد حالا این چه مزییتی میده ،اینکه دیگه با آدرس دقیق کار نداریم ، اگر آدرس موقت باشه هم میشه آدرس رو بروز کرد ، ولی نامی که در نظر گرفتیم ثابته و هزینه تغییر کمه
اگر از یه پاد چند رپلیکا اوردیم بالا و خواستیم با سرویس اونا رو با یک ip به دست بیاریم میشه دستور زیر رو استفاده کرد
میشه end point ها رو دید
kubectl get ep
daemon set
گاهی ما نیاز داریم که روی هر نود ، یک سرویس بیاریم بالا ، توجه شود که تعداد رو مانند رپلیکا
مشخص نمی کنیم ، بلکه میگیم روی هر نود یکی بیاد بالا در این حال از دایمون ست استفاده میکنیم مثال:
یکی از سرویس های promateus که اطلاعات رو از نود جمع میکنه ، node exporter هست. با استفاده از این kind می تونیم این سرویس رو بالا بیاریم
دیپلوینمت
با استفاده از این می تونیم نسخه ی برنامه ها رو مدیریت کنیم و upgrade - down grade انجام بدیم
نحوه ی کارش اینجوریه بالا سر رپلیکا میشینه و می بینه اگه نسخه ای که بهش دستور دادن با رپلیکا ها یکی نبود ، اونا رو پاک می کنه
از ایمیج هایی که داریم ، کانتینر در پاد میسازه
هر بار دیپلوی منت جدید بدیم توی لیست و تاریخچه ی رپلیکا ست ها ، یک نسخه افزوده میشه
kubectl get rs
با دستور بالا می بینیم که سطر اضافه میشه
جالبه که توی دستور پایین اطلاعات خاصی نیست :
kubectl get deploy
state full setp
این تضمین و میده هر استوریج برای اینستنس خاص است
وقتی از این ریسورس استفاده میکنیم ، به ازای هر اینستنس اعداد اینیتجر در انتهای نامش میزاره و به ترتیب اون ها رو میسازه و کامل مشخصه که رندوم نیست
توی این حالت میشه استوریج ها رو پرو ویژن کرد
volumes
- persistant volume
استوریج هایی که خودمون پرو ویژن کردیم رو این جامی تونیم ببینیم
kubectl get pv
- persistanct volume claim
شبیه به جدول ریلیشنی در دیتابیس هست و میگه که هر اینسنتس sfs به کدوم pv ارتباط داره
نکات
- اگرخواستیم دیتابیس رو رپلیکا کنیم ، توجه شود حتما اسلیو ها باید پایین بیان و در نهایت مستر چون اگر برعکس باشه ، اسایو ها به محض این که ببینن مستر نیست الکشن میکنن و یکی میشه مستر
و به همین ترتیب ادامه دار میشه
- در شاردینگ دیپلویمنت به صورت دیفالت ممیفهمه که هر استوریج یا ولیوم برای کدوم شاردینگ هست ، به عبارت دیگه اگه بخواهیم چند تا اینستنس بیاریم بالا و شارد کنیم ، باید مشخص کنیم هر استوریج مال کدوم اینستنس هست زمان بالا اومدن
hpa _ horizental pods autoscale
یه ریسورس هست و هدفش اینه با توجه به حجم درخواست ها ، تعداد پاد ها رو تنظیم کنه ، از یه سری متریک میتونه استفاده کنه و معروف ترینس متریک cpu هست
commands
commons
و چند دستور کاربردی برای کار با محیطی که devops در اختیار قرار میده
پاد ها رو میشه دید
kubectl get pods
مشاهده لاگ
ابتدا نیازه لیست پاد ها رو دریافت کنیم
kubectl logs -f pod/mostafa-backend-tenancy-digitalsignature-76d465f8bd-2s8lz
دیپلویمنت ها رو میشه دید
kubectl get deployments.apps
پایین اوردن یه سرویس در محیط
kubectl scale deployment mostafa-backend-tenancy-upg --replicas=0
کلاستر تستی رو میسازه
minikube start --driver=docker
نود ها رو میشه دید
kubectl get nodes
سرویس ها رو میشه دید
kubectl get services
سرویس ها رو با مینیکیوب میشه دید
minikube service nginx
حذف پاد
توجه شود که این دستور در صورتی پاد رو پاک می کنه که رپلیکا ست دوباره این پاد رو نسازه
kubectl delete pod test
اگر دیدیم بعد از پاک کردن دوباره ایجاد شد ، باید بریم رپلیکا ست رو استاپ کنیم
کانفیگ
cat ~/.kube/config
توی این فایل ۳ بخش اصلی داره
-
اولیش اطلاعات کلاستره مثل آدرس سرور و ورژن و پروایدرش (مثل مینی کیوب یا k3s )
-
یوزر و اطلاعاتی که هر یوزر داره
-
کانتکس که ارتباط بین کلاستر ویوزر هست و این که هر یوزر به کدوم کلاستر ها دسترسی داره یا هر کلاستر چه نیم اسپیس هایی داره
tips
- اگه با یوزر root بخواهیم بریم دستورات رو اجرا کنیم احتمالن پیدا نکنه زیرا رو نمی ره از کانفیگ یوزر بخونه
گرفتن ایمیج
kubectl get svc nginx
اکسپوز کردن پورت پاد
kubectl expose deployment nginx --type=NodePort --port=80 --name=nginx
روش مشاهده پاد مرحله به مرحله
- پیدا کردن IP برای تست و درخواست
minikube ip
- روش اگزپوز کردن یک پاد و پورتش
kubectl expose pod pod-test --type=NodePort --port=8080
- بعد این باید سرویس رو کال کرد تا ببینیم به چه پورتی مپ شده
kubectl get svc
- پاد ها رو میشه دید
curl http://192.168.49.2:32593
متداول ترین راه ها برای دیباگ و یافت خطا
- Check Pod Status:
kubectl get pods - Describe Pod:
kubectl describe pod <pod-name> to check for events and errors. - Logs:
kubectl logs <pod-name> for application logs. - Exec into Pod:
kubectl exec -it <pod-name> -- /bin/bash to explore the container’s environment. - YAML Validation:
Ensure the Pod specification file is correct.
چگونه ریسورس رو مدیریت می کنیم
apiVersion: v1
kind: Pod
metadata:
name: resource-limits-pod
spec:
containers:
- name: nginx
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"tips
-
باید کدی میزنیم ، کلود نیتیو باشه cloud native مثال یعنی این که کد عادی شاید حالیش نشه که دیتابیس ها چند کلاستر میشن ، شاید جای نام نتورک ، آی پی بگیرن و شاید کد یا سرویس آمادگی این که چند تا پاد بیاد بالا رو نداشته باشن ، ما باید جوری کد بزنیم که سرویسامون کلود نیتیو باشن
-
اگه ۳ تا نود داشته باشیم و بخوایم یه پاد رو با ۳ رپلیکاست بالا بیاریم ، به صورت دیفالت روی هر نود یه پاد میاد بالا ، ولی اگه از anti affinity rule استفاده کنیم احتمالا تضمین نکنه که پخش کنه ، همچنین اگه یه نود ریسورسش محدود باشه اون رو حذف میکنه
-
همیشه در نظر داشته باشیم که اگر یه node داشته باشیم و چندین پاد مشابه ، بهتر از این است که در یک نود ، یه پاد باشه ، در نگاه اول شاید بگیم
وقتی resource ثابت هست چرا چندین پاد روی یه نود بیاریم بالا ، دلیلش موارد زیر هست
-
ریسورس ها برای کار موازی ایزوله هستند
-
اگر بنا به درخواست ، یک پاد کرش کرد ، پاد های دیگه بالا هستند
-
اینجوری خودمون رو ملزم میکنیم که حداقل چند پاد داریم در نتیجه معماری io خیلی تمییزه و آمادگی scale up رو داریم
اما معایبش دقیقا برعکس موارد بالا هست
-
چون چندین پاد داریم ، overhead داریم و کوبرنتیس ، شبکه و لود بالانسر نیاز داره برای این
-
نیاز به کانفیگ های پیچیده تر برا دقیق تر برای لیمیت گذاری هستیم
-
نیاز به معماری های پیچیده برای جلو گیری از خطرات data resource share , data consistancy و manage session هست ،
terms
- ckAd
مدرکی که کوبرنتیز به عنوان دولوپر میده
- workload
طریقه ی دیپلوی( اجرای) پاد ها
- cri
پلتفورمی هست که کوبر بسترشو فراهم کرده تا شرکت بتونن ابزاری برای مدیریت بسازن مانند docker , containerd
- cni
مانند بالایی هست ، یه اینترفیس که بستر فراهم میکنه ابزار ها برای نتورک کار کنن
- sef
شبیه به minio است ولی جانع تر ، علاوه بر ابجکت ، چیزای دیگه هاذخیره میکنن
- ترافورم
با این می تونیم سرور ها رو مدیریت کنیم، مثلکانفیگ کردن سیستم عامل
- انسیبل
بعد از پیاده سازی با ترافورم ، میشه پکیج ها و کانفیگ های پکیج ها رو با این نصب کرد
- kubeAdm _ spraiy
حالا با استفاده از این ابزار روی ماشین ها ، کوبر مستر و کوبر اسلیو میاره بالا