ویرگول
ورودثبت نام
فرهاد صادقی
فرهاد صادقیمهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
فرهاد صادقی
فرهاد صادقی
خواندن ۶ دقیقه·۱ ماه پیش

آموزش Kubernetes - قسمت ششم (Kube API و Pod)

Kubernetes API و Pod

1. Kubernetes API

وقتی ما دستور kubectl را اجرا می کنیم، در واقع آن دستور تبدیل به فراخوانی REST API می شود و به kube API Server ارسال می شود.

پارامترهای ورودی تبدیل به json شده و به kube API Server ارسال می شوند و نتیجه نیز بصورت json برگردانده می شود.

Resource: هر چیزی که کوبرنتیز مدیریت می کند، یک Resource است مانند Node و Pod و Service

API Group: دسته ای از API ها که یک حیطه کاری را انجام می دهند جزو یک API Group هستند.

API Versioning:

1.Alpha (Example: V1Alpha1)

نسخه ای است که هنوز به طور کامل تست نشده است و ممکن است دارای Bug باشد. ممکن است این نسخه در آینده کلا حذف شود. در محیط product به هیچ وجه نباید از نسخه های alpha استفاده شود.

2.Beta (Example: V1Beta1)

نسخه ای است که تست اولیه شده است. در آینده حذف نخواهد شد. مانند نسخه آلفا از نسخه بتا نیز نباید در محیط product استفاده شود.

3.Stable (Example: V1)

نسخه پایدار است که بصورت کامل تست شده و Bug های آن برطرف شده است.

1.1 فراخوانی Kube API

فرمت فراخوانی:

GET /api/GROUP/VERSION/RESOURCETYPE

*توجه: اگر GROUP وارد نشود، مقدار پیش فرض آن یعنی core در نظر گرفته می شود.

برای فراخوانی مستقیم API های kubernetes، ابتدا باید یک پروکسی بالا بیاوریم. با دستور زیر یک پروکسی کوبرنتیز ایجاد می شود:

kubectl proxy --port=8080

حالا می توانیم از طریق پروکسی ایجاد شده، APIهای کوبر را فراخوانی کنیم:

# گرفتن لیست پادها curl http://127.0.0.1:8080/api/v1/pods # گرفتن لیست پادها و ذخیره خروجی در فایل curl http://127.0.0.1:8080/api/v1/pods > pods.json

# get pods in kube-system namespace by kubectl command kubectl get po -n kube-system # get pods in kube-system namespace by kube API curl http://127.0.0.1:8080/api/v1/namespaces/kube-system/pods

1.2 گرفتن لیست همه Resource های کوبرنتیز به همراه Namespace آنها

kubectl api-resources | more

[root@MASTER-01 ~]# kubectl api-resources | more NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 true Binding componentstatuses cs v1 false ComponentStatus configmaps cm v1 true ConfigMap endpoints ep v1 true Endpoints events ev v1 true Event limitranges limits v1 true LimitRange namespaces ns v1 false Namespace nodes no v1 false Node persistentvolumeclaims pvc v1 true PersistentVolumeClaim persistentvolumes pv v1 false PersistentVolume pods po v1 true Pod podtemplates v1 true PodTemplate ...

1.3 نصب bash-completion

برای اینکه نیاز نباشد ما دستورات kubernetes را حفظ بکنیم و به راحتی از دستورات استفاده کنیم، باید bash-completion را نصب کنیم.

yum -y install bash-completion kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null sudo chmod a+r /etc/bash_completion.d/kubectl

حالا هنگام نوشتن دستورات kubectl، هر کجا که نیاز داشته باشیم می توانیم با زدن tab پیشنهادات موجود در ادامه دستور را مشاهده کنیم.

* ابزارهایی مانند Rancher ، Lenz و غیره از Kube API برای ارتباط با کوبر استفاده می کنند.*


2. Pod

کوچکترین واحد قابل Deploy روی کلاستر kubernetes پاد می باشد.

پاد مجموعه ای از یک یا چند Container هست که storage و network مشترکی دارند و Namespace آنها یکی است.

یعنی هر پاد و همه کانتینرهای داخل آن یک IP دارند. همچنین اگر ما پوشه ای را داخل پاد یا داخل یکی از کانتینرهای آن بسازیم، همه کانتینرهای داخل پاد به آن پوشه دسترسی خواهند داشت.

2.1 Pod Manifest

Manifest هر پاد در فایل yaml نوشته می شود و چهار بخش دارد:

apiVersion:

kind:

metadata:

spec:

apiVersion و kind مربوط به پاد را با دستور زیر می توانیم بدست آوریم:

kubectl api-resources | grep pods

[root@MASTER-01 ~]# kubectl api-resources | grep pods pods po v1 true Pod

اطلاعاتی که در هر بخش نوشته می شوند به شرح زیر هستند:

apiVersion: [نسخه پاد] kind: Pod metadata: name: [نام پاد] namespace: [نام namespace] spec: containers: //مشخصات کانتینرهای پاد - name: [نام کانتینر] image: [image کانتینر] imagePullPolicy: [ifNotPresent/Always/Never]

مثال:

apiVersion: v1 kind: Pod metadata: name: webserver namespace: default spec: containers: - name: nginx image: nginx:latest imagePullPolicy: ifNotPresent

بعد از تهیه فایل manifest پاد، آن را در کلاستر کوبرنتیز apply می کنیم.

kubectl apply -f pod.yaml

2.2 POD Phases (Lifecycle)

CrashLoopBackup:

وقتی یک پاد در وضعیت Pending است، کوبر دائما تلاش می کند که آن را به وضعیت Running ببرد. اگر بعد از تعدادی تلاش، کوبر نتواند پاد را اجرایی کند مثلا اگر نتواند image آن را دانلود کند، وضعیت پاد را به CrashLoopBackup تغییر می دهد. در وضعیت CrashLoopBackup کوبر همچنان از تلاش برای اجرای پاد دست نمی کشد ولی بازه های زمانی تلاش مجدد خود را طولانی تر می کند.

Container Phases (Lifecycle):

1.Running

2.Waiting

3.Terminated

وضعیت پاد تابعی است از وضعیت کانتینر.

Pod Canditions:

  • PodReadyToStartContainers (True/False)

  • Initialized (True/False)

  • Ready (True/False)

  • ContainersReady (True/False)

  • PodScheduled (True/False)

2.3 مدیریت POD

وقتی دستور kubectl apply را اجرا می کنیم، کانتینر و پاد روی نود worker بالا می آید. یعنی فایلهای image و کانتینر روی Pod دانلود می شود و نیازی به دانلود آنها روی نودهای master نیست.

حذف پاد:

Kubectl delete -f pod.yaml --force Kubectl delete po webserver --force

 

اجرای دستور bash داخل پادی با نام webserver:

Kubectl exec -it webserver -- bash حالا داخل پاد هستیم ls -l

* قاعدتا ما نباید نیازی به این کار داشته باشیم؛ مگر در حالتهای خاص برای troubleshooting.

اگر روی یک پاد چند کانتینر وجود داشته باشد موقع اجرای کامند exec باید مشخص کنیم که منظورمان کدام کانتینر است. در غیر این صورت کوبرنتیز خودش یکی از کانتینرها را به عنوان پیش فرض انتخاب کرده و داخل آن می شود.

Kubectl exec -it -n time-namespace time-pod -c nginx-container -- bash

 

مشاهده 200 خط آخر لاگی که برنامه نویس روی کنسول write کرده است:

Kubectl logs --tail 200 -f webserver

ابزارهایی وجود دارند که کنسول برنامه را خوانده و در ابزارهای ذخیره لاگ، ذخیره می کند. بنابراین فقط کافی است که برنامه نویس لاگهای خود را با یک فرمت استاندارد مثلا json در کنسول write کند.

دریافت اطلاعات پاد:

Kubectl get po redis

Export فایل yaml از پاد:

Kubectl get po redis -o yaml > redis.yaml

فایل yaml خروجی، شامل برخی اطلاعات اضافی هست که مختص همین پادی است که در حال اجراست. برای ایجاد یک پاد دیگر از روی این فایل yaml، باید اطلاعات اضافی حذف شوند.

2.4 InitContainer

کانتینری است که قبل از کانتینر اصلی بالا می آید و بعد از اینکه terminate شد، کانتینر اصلی بالا می آید. در حالتهایی که بخواهیم قبل از اجرای کانتینر اصلی یک کانتینر اجرا شود و دیتاهای اولیه را برای کانتینر اصلی فراهم کند، از initContainer استفاده می کنیم.

یک پاد می تواند چند initContainer و چند کانتینر اصلی داشته باشد.

نحوه تعریف initContainer در فایل manifestمانند کانتینر اصلی است.

apiVersion: v1 kind: Pod metadata: name: webserver spec: containers: - name: nginx image: nginx:1.14.2 imagePullPolicy: IfNotPresent initContainers: - name: init-service1 image: busybox:1.28 command: [ “sleep”, “10”] - name: init-service2 image: busybox:1.28 command: [ “sleep”, “10”]

 اگر خطایی در اجرای initContainer رخ دهد، کانتینر اصلی اجرا نمی شود.

2.5 Multicontainer

فرق initContainer و multiContainer در این است که initContainer ها ابتدا اجرا می شوند و بعد از اتمام کار آنها، کانتینرهای اصلی اجرا می شوند ولی در یک پاد multiContainer همه کانتنرها باهم اجرا می شوند.

کاربرد multiContainer در دو حالت زیر می باشد:

1. Sidecar

در sidecar، کانتینرها موازی با هم اجرا می شوند. از این حالت عمدتا برای لاگ گیری و مانیتورینگ استفاده می شود.

مثال: ما یک اپلیکیشن داشته باشیم که کار خود را انجام دهد و لاگ ها را در کنسول بنویسد. همزمان یک اپلیکیشن دیگر هم نیاز داشته باشیم که لاگ ها را بخواند و به یک لاگ سرور مانند Fluend ارسال کند. یعنی ما نمیخواهیم اپلیکیشن اصلی درگیر نحوه ارسال و ذخیره لاگ شود.

2. Ambassador

از این حالت عمدتا برای proxy و کنترل ترافیک استفاده می کنند.

مثال: ما یک اپلیکیشن داریم که میخواهیم قبل از اینکه درخواستها به آن برسند، درخواستها از یک پروکسی مانند envoy رد شوند و از این طریق قوانین و محدودیتهایی را برای مسیریابی و دسترسی اعمال نماییم.

 

منابع:

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

کوبرنتیزپاد
۲
۰
فرهاد صادقی
فرهاد صادقی
مهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
شاید از این پست‌ها خوشتان بیاید