به سوی کوبرنتیز و فراتر از آن: آشنایی با سرویس‌ها


تو قسمت قبلی دیدیم چجوری میشه یه برنامه رو اجرا کرد و داخل پاد قرار داد. اما این فقط کافی نیست چون ما باید اون رو به دنیای بیرون هم مرتبط کنیم. سرویس یک مفهوم جالب در کوبرنتیز هست که کمک میکنه پادهامون رو در اختیار بقیه پادها توی کلاستر بذاریم یا حتی اونا رو به دنیای بیرون وصل کنیم.

تو این نوشته انواع سرویس‌ها رو توی کوبرنتیز یاد می‌گیریم. در قسمت بعد هم ان شاء الله کار عملی می‌کنیم. این نوشته به درد کسایی میخوره که میخوان کار با کوبرنتیز رو به شکل حرفه‌ای شروع کنن. برای برنامه‌نویس‌ها هم خوبه که با این موجود دوست داشتنی آشنا بشن.

تو این مطلب فرض بر این هست که شما آشنایی ابتدایی با کوبرنتیز و ساختار اون دارید. هم‌چنین با پاد باید سر و کله زده باشید. طبیعتا داکر، مفاهیم کانتینرها و لینوکس هم باید بدونید.

تو کوبرنتیز هر پاد یک ip یکتا داره. وقتی دو تا پاد بخوان به هم دیگه برسن میتونن از اون استفاده کنن. اما پادها موجودات پایداری نیستن و ممکنه از بین برن و یکی دیگه ایجاد بشه به جاشون. در نتیجه ip هم تغییر میکنه و بقیه پادها باید با ip جدید بهش برسن. این خودش کار رو برای برنامه نویس سخت میکنه؛ چون از کجا میخواد بدونه اون یکی پاد الان ipش چیه؟ برای حل مشکل اومدن گفتن از سرویس استفاده کنیم. سرویس خودش ip داره و ثابته و میدونه پادی که بهش وصل شده چه آدرسی داره. پس هر وقت اون پاد از بین بره و دوباره بالا بیاد سرویس پیداش میکنه و ما میتونیم دوباره به سرویس با همون ip ثابت وصل شیم و اون دست ما رو میذاره تو دست اون پاد. تو این شکل این توضیحات رو میبینید (هم ویژگی توزین بار و هم ثابت بودن ip) :


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

یه سری جزئیات دیگه هم هست راجع به سرویس که ایشالا خواستیم عمیق‌تر بحث کنیم راجع بهش میگیم.

حالا بریم تعریف یه سرویس رو ببینیم:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

دوباره همون چهار بخش اصلی. apiVersion رو ... گذاشتم. نوعش هم که Service هست. دقت کنید حرف اول بزرگه. در متادیتا اسمش رو انتخاب کردم. هر چی میتونه باشه ولی خوبه با معنی باشه. بعدش هم رسیدیم به spec. تو اینجا نوع سرویس با type معلوم میشه. راجع به این تو همین نوشته صحبت می‌کنیم. بخش مهم بعدی انتخاب label هست. سرویس‌ها پادها رو با برچسب‌هاشون پیدا میکنن. من اینجا label پاد مطلب قبلی رو گذاشتم تا هر کس با این سرویس ارتباط برقرار کرد بفرسته به اون پاد. این کار زمانی خوبیش معلوم میشه که چن تا پاد یکسان دارم و میخوام بین اون‌ها load balancing یا توزین بار انجام بدن. وقتی به سرویس درخواست بدم نگاه میکنه چه پادهایی اون label رو دارن و یکیشون رو رندم انتخاب میکنه.

قبل از اینکه انواع سرویس رو بگم یه چیزی رو داخل پرانتز بگم. سرویس در اصل وجود خارجی نداره و فقط یه جور بازی با آدرسه که ما با یه ip ثابت به پادها برسیم. پیاده‌سازی سرویس هم با iptables در لینوکس انجام شده. دیگه بیشتر از این ادامه نمیدم فقط خواستم بگم سرویس وجود خارجی نداره مثل پاد.

خب تو منیفست بالا دیدید که نوعش رو گذاشتم NodePort. این نوع سرویس کمک میکنه از دنیای بیرون بتونیم به پاد برسیم. در اصل یه پورت روی تمام ماشین‌هایی که تو کلاستر هستن رو میده به این سرویس و اگه ما به اون پورت درخواست بدیم میره به پاد. میتونیم این پورت رو خودمون با nodePort تعیین کنیم یا نذاریمش و خود کوبرنتیز تعیین کنه. حالا به کدوم پورت پاد میره؟ این رو targetPort مشخص میکنه؛ مثلا اگه من nginx دارم باید 80 بذارمش. port هم پورت سرویس هست. سرویس خودش یه ip داره که موقع ایجاد تعیین میشه و پورتش اینجا معلوم میشه. نوع دیگه ClusterIP هست که فقط تو کلاستر در دسترسه. تو این نوع دیگه nodePort نداریم چون به دنیای بیرون نمیخوایم دسترسی بدیم. بقیه‌‌اش مثل قبلیه. بر عکس NodePort که nodePort و آدرس ماشین برامون مهم بود تو ClusterIP برامون ip مهمه. این ip همون ip ثابتی هست که در موردش صحبت کردیم. یه نوع دیگه هم هست که اسمش LoadBalancer هست. این نوع میره وصل میشه به یه لود بالانسر واقعی تو کلاستر و کاری میکنه درخواست‌ها رو بفرسته برای ماشین‌هایی که پاد توشون هست. این کار لازمه‌اش اینه که واقعا یه لود بالانسر داشته باشید.

یه جمع بندی بکنیم. یاد گرفتیم سرویس یه ip ثابت داره که میشه از تو کلاستر بهش رسید. به این میگیم سرویس ClusterIP. همچنین با سرویس NodePort میشه به دنیای بیرون دسترسی داد. با LoadBalancer هم میشه کلاستر رو با یه لود بالانسر واقعی هماهنگ کرد. یه چیز مهم دیگه در مورد سرویس اینه که وقتی چند تا پاد پشت سرش باشن بین اون‌ها توزین بار انجام میده. در آخر هم یه سرویس پاد(ها)ش رو با label اونا میشناسه و نه ipشون.

مطلب طولانی‌ای بود. امیدوارم براتون مفید باشه. ان شاء الله دفعه بعد به شکل عملی با سرویس سر و کله میزنیم. اگه نظر یا سوالی دارید این پایین بفرمایید.

قسمت قبلی