NodePort،LoadBalancer و Ingress از هر کدام چه زمانی می توانیم استفاده کنیم؟

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

ClusterIP

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

در زیر مثالی ساده برای سرویس ClusterIP داریم:

apiVersion: v1
kind: Service
metadata:  
  name: mhmd-internal-service
spec:
  selector:    
    app: mhmd-app
  type: ClusterIP
  ports:  
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

خب حالا که ما نمی تونیم از روی اینترنت یا بیرون از کلاستر به ClusterIP دسترسی داشته باشیم اصلا چرا در موردش حرف می زنیم؟! طبیعیه که هر دردی دوایی داره :دی از بیرون با Kubernetes Proxy می تونیم با کلاستر آی پی مثل شکل زیر ارتباط داشته باشیم.

با دستور زیر می تونیم سرویس پراکسی کوبرنتیز رو استارت کنیم:

kubectl proxy --port=8080

بعد از اجرای کامند بالا برای دیدن سرویسی که در حالت نود پورت آپ شده می تونیم به شکل زیر اقدام کنیم:

http://localhost:8080/api/v1/proxy/namespaces/<NAMESPACE>/services/<SERVICE-NAME>:<PORT-NAME>/

با توجه به ساختار بالا برای دسترسی به سرویسی که در ابتدای پست ایجاد کردیم باید مقادیر رو به شکل زیر جاگذاری کنیم:

http://localhost:8080/api/v1/proxy/namespaces/default/services/mhmd-internal-service:http/

خب حالا چه زمانی می تونیم از این نوع سرویس استفاده کنیم؟

چند سناریو برای استفاده از این نوع سرویس وجود داره که یکیش می تونه دیباگ کردن سرویس از روی لپ تاپ یا کامپیوتر شخصیمون باشه مثلا بخواهیم swagger مربوط به API رو بررسی بکنیم یا هر دلیل دیگه ای، یه سناریوی دیگه هم اینکه مثلا یک داشبورد یا پنلی مثل هنگ فایر یا هر چیز دیگه ای داشته باشیم و بخواهیم از این طریق به صورتی ایمن دسترسی داشته باشیم.

یکم که فکر کنیم میبینیم طبیعی هست که این نوع سرویس برای استفاده های خاص منظوره هست به دلیل اینکه از روی یک سیستم که دارای kubectl نصب شده هست و کاربر authenticated شده در حال اجراست و برای استفاده در پروداکشن یا expose کردن سرویس روی بستر عمومی نیست و اصلا پیشنهاد نمیشه.

NodePort

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

شمای کلی نود پورت

ساختار yml سرویس نود پورت مشابه زیر هست:

apiVersion: v1
kind: Service
metadata:  
  name: my-nodeport-service
spec:
  selector:    
    app: my-app
  type: NodePort
  ports:  
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30036
    protocol: TCP

اساسا دو تفاوت عمده بین سرویس نود پورت و کلاستر آی پی وجود داره که یکی مولفه type سرویس نود پورت هست و دیگری مولفه اضافی nodePort هست که به جز پورت مربوط به سرویس و targetPort  تعریف می شه. باید در نظر گرفت که اگه این مولفه تعریف نشه خود کوبرنتیز مسولیت انتخاب رندوم این پورت رو به عهده میگیره.

چه زمانی می تونیم از سرویس نود پورت استفاده کنیم؟

معایب زیادی رو برای این تایپ از سرویس می تونیم بشماریم مثلا:

  • به ازای هر پورت فقط یک سرویس داریم
  • فقط از پورت رنج 30000–32767 می تونیم استفاده کنیم
  • اگر آی پی نود عوض بشه ممکنه مشکلاتی رو ایجاد کنه

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

LoadBalancer

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

چه زمانی می تونیم از این نوع سرویس استفاده کنیم؟

اگر بخواهیم به طور مستقیم سرویس رو نمایش بدیم، این روش به صورت پیش فرض در دسترسمون هست. تمام ترافیک در پورتی که مشخص می کنید به سرویس ارسال میشه. هیچ فیلترینگ، مسیریابی یا هر چیز دیگه ای وجود نداره. این یعنی که شما می تونید تقریبا هر نوع ترافیکی به آن ارسال کنید، مانند HTTP، TCP، UDP، Websockets، gRPC یا هر چیز دیگه ای.

یکم که بیشتر فکر کنیم میبینیم این روش خیلی پر هزینه هست و اگه بخوایم به عنوان مثال ده تا سرویس روی بستر بیرونی expose کنیم به ده تا آی پی لود بالانسر احتیاج داریم که اگه روی کلود گوگل یا آمازون بخواهیم این کار رو کنیم احتمالا دیگه پولی واسه مون نمی مونه :دی

Ingress

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

شما می تونید بسیاری از چیزهای مختلف رو با یک ورودی اینگرس انجام بدین و انواع مختلفی از کنترلر های Ingress وجود دارد که دارای قابلیت های متفاوت هستند.

کنترلر پیش فرض انواع سیستم های کلودی، چه کوبرنتیزی که در محیط دیتاسنتر خودتون نصب می کنید، چه گوگل یا آمازون امکان HTTP/S load balancing رو در اختیارمون قرار میده .

این به شما امکان میده که بتونید به صورت مسیر یا ساب دامین مسیر دهی کنید به سمت سرویس های backend یا اینکه مثلا هر در خواستی که اومد به سمت foo.yourdomain.com به داخل کلاستر به سرویس foo اشاره کنه. یا هر درخواستی که به سمت ypurdomain.com/bar اومد به سمت سرویس bar روانه بشه.

نمونه yml مربوط به ingress به شکل زیر هست.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  backend:
    serviceName: other
    servicePort: 8080
  rules:
  - host: foo.mydomain.com
    http:
      paths:
      - backend:
          serviceName: foo
          servicePort: 8080
  - host: mydomain.com
    http:
      paths:
      - path: /bar/*
        backend:
          serviceName: bar
          servicePort: 8080

چه زمانی می تونیم از ingress استفاده کنیم؟

Ingress یکی از قدرتمند ترین و بهترین روش های expose سرویس هست و گاها خیلی پیچیده میشه. انواع مختلفی برای ingress controller داریم که مهم ترین آنها Google Cloud Load Balancer, Nginx, Contour, Istio و موارد دیگه هستند. یکی از مزایای ingress می تونه پلاگین cert-manager باشه که کار اتوماتیک renewal گواهینامه های ssl رو می تونه انجام بده. اینگرس از این جهت می تونه مفید باشه که شما با یه آی پی تحت عنوان لود بالانسر می تونید هر تعدادی که سرویس داشتید و لازم داشتید رو اکسپوز کنید ( بدون هزینه اضافه )

امید وارم که این مطلب مفید بوده باشه :)

موفق باشید.