آموزش نصب کلاسترینگ کوبرنت Kubernetes 1.10 با Kubeadm در اوبونتو ۱۶٫۰۴

Kubernetes Cluster Banner

آموزش نصب کلاسترینگ کوبرنت Kubernetes 1.10 با Kubeadm در اوبونتو ۱۶٫۰۴

How To Setup a Kubernetes 1.10 Cluster Using Kubeadm on Ubuntu 16.04

معرفی

کوبرنت Kubernetes یک سیستم مدیریت مخازن و به صورت متن باز و رایگان می باشد که توسط گوگل و بر اساس تجربیات اجرای مخازن در محصولات ایجاد شده است.

از Kubeadm برای نصب ، پیکربندی و خودکارسازی اجزای Kubernetes مانند API های سرور  ، Controller Manager و Kube DNS استفاده می شود. این برنامه کارهایی مثل ایجاد کاربر یا مدیریت مراحل نصب سیستم عامل و تنظیمات آن ها را انجام نمی دهد و برای این کار ها ممکن از ابزارهای مدیریت پیکربندی مانند Ansible یا SaltStack استفاده شود. از ابزار Kubeadm ایجاد کلاستر ها یا بازسازی آنها به سادگی و با کمترین خطا استفاده می شود.

اهداف

در این آموزش برای کلاسترینگ از سرور های زیر استفاده می کنیم :

  • یک سرور برای Master Node

این سرور مسئول مدیریت وضعیت کلاستر را دارد. در این سرور  Etcd اجرا می شود که اطلاعات کلاستر مربوط به تقسیم بار کاری بین سرور ها را ذخیره می کند.

  • دو سرور Worker Node

سرور هایی هستند که تقسیم بار بر روی آنها انجام می شود( مانند برنامه ها و سرویس های مخازن ها ). یک سرور worker وظیفه ای که به آن داده شده را تا زمانی که master زمان بندی کرده است انجام می دهد. با اضافه کردن سرور های worker می توان ظرفیت کلاستر را افزایش داد.

بعد از اتمام این آموزش شما یک کلاستر برای اجرای برنامه های مخازن دارید که منابع RAM و CPU مورد نیاز برای اجرای برنامه های شما را با سرور های متعدد تامین می کند. تقریبا تمامی برنامه ها یونیکس مانند برنامه های تحت وب ، پایگاه داده ، سرویس ها و ابزارهای دستورات خط فرمان تحت کلاستر قابل اجرا هستند. خود کلاستر نیز حدود ۵۰۰-۳۰۰ MB حافظه و ۱۰ درصد از CPU را مصرف می کند.

وقتی کلاستر راه اندازی شد ، یک وب سرور Nginx را نصب می کنیم تا از مطمئن شویم که همه چیز درست است.

پیش نیاز ها

  • کلید SSH که بر روی هر دو سرور محلی تنظیم شده است. اگر تا الان با کلید های SSH کار نکرده اید از این آموزش می توانید استفاده کنید.
  • سه سرور Ubuntu16.04 با حداقل یک گیگ رم که تنظیمات SSH با کلید روی آن انجام شده باشد.
  • برنامه Ansible بر روی سرورهای مجازی محلی نصب شده باشد. روش این کار در مرحله اول این آموزش نصب Ansible آورده شده است.
  • آشنایی با کتاب های آموزشی Ansible.
  • دانش راه اندازی یک مخزن با داکر Docker. مرحله پنجم از آموزش نصب داکر در اوبونتو را مرور کنید.

مرحله اول – تنظیم دایرکتوری فضای کار و فایل فهرست Ansible

در این مرحله یک دایرکتوری برای برای سرویس دهی فضای کاری ایجاد می کنیم. همچنین تنظیمات Ansible را به صورت محلی انجام می دهیم که بتوانیم از راه دور با سرور ها ارتباط برقرار کنیم و دستورات خط فرمان را اجرا کنیم. برای انجام این کار یک فایل با نام hosts که شامل فهرستی از اطلاعات از قبیل آدرس IP سرورها و گروهی که سرور ها به آن متعلق هستند ، ایجاد می کنیم.

یکی از این سه سرور ، سرور master شما هست که IP آن با master_ip نمایش داده می شود. آدرس IP دو سرور دیگر که به عنوان worker هستند ، به عنوان worker_1_ip و worker_2_ip نمایش داده می شوند.

یک دایرکتوری با نام ~/kube-cluster در مسیر home ایجاد کنید و وارد آن شوید :

این دایرکتوری ، فضای کاری شما در این آموزش خواهد بود و شامل playbook های Ansible خواهد بود و تمام دستورات خط فرمان را مربوط به این سرور را در این دایرکتوری وارد می کنید.

ایجاد یک فایل با نام kube-cluster/hosts/~ با ابزار nano یا ویرایشگر متن مورد نظرتان :

خطوط زیر را در این فایل وارد کنید و مقادیر مشخص شده را با مقادیر مناسب جایگزین کنید :

این فایل ، فایل اطلاعات دارایی ها یا همان سرور های شما خواهد بود و اطلاعاتی از قبیل آدرس IP ، کاربران از راه دور و گروهی از سرور ها می باشد که در اینجا شامل گروه های سرور های masters و workers می باشد و ممکن است چندین بار از این فایل استفاده کنید.

در گروه masters ، یک سرور وجود دارد که با نام master مشخص شده و آدرس IP و نام کاربر از راه دوری که Ansible باید دستورات خود را اجرا کند با کاربر root مشخص شده است.

به همین ترتیب ، در گروه workers ، دو سرور worker با آدرس های worker_1_ip و worker_2_ip و کاربر ansible_user مشخص شده اند.

در خط آخر نیز برای مدیریت عملیات ها از راه دور مشخص شده است که برنامه Ansible از مترجم Python 3 در سرور ها استفاده کند.

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

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

مرحله دوم – ایجاد کاربر در سرور های ریموت

در این قسمت بر روی سرور ها یک کاربر عادی بدون دسترسی ریشه non-root user ایجاد می کنیم ولی این کاربر ها باید عضو گروه sudo باشند تا بتوان بوسیله این کاربر ها از طریق اتصال SSH با سرور ارتباط برقرار کرد. این کار برای زمان هایی که می خواهید اطلاعات سیستم را با دستوراتی مانند top/htop مشاهده کنید و لیستی از منابع در حال اجرا را مشاهده کنید یا تغییراتی را در تنظیمات فایل هایی که مالک آن root است را تغییر دهید بسیار مفید است. هر چند که این کارها را به صورت مرتب در طول نگهداری کلاستر انجام خواهید داد ، و استفاده از یک کاربر عادی non-root ریسک عملیات هایی مانند ویرایش یا حذف فایل ها و عملیات هایی که ناخواسته انجام می شود را کاهش می دهد.

یک فایل با نام  kube-cluster/initial.yml/~ در فضای کاری ایجاد کنید :

در ادامه متن زیر را که play نامیده می شود، در فایل قرار دهید تا کاربر مورد نظر در تمام سرور ها ایجاد شود. یک play در Ansible مجموعه ای از مراحلی است که مشخصات سرور ها و گروه های مشخصی را تهیه می کند. Play زیر یک کاربر non-root ایجاد می کند :

توضیحات اینکه این play چکار می کند :

  • ایجاد یک کاربر non-root با نام ubuntu
  • تنظیم فایل sudoers برای اجازه اجرای دستورات sudo بدون درخواست رمز عبور برای کاربر ubuntu
  • اضافه کردن کلید عمومی ماشین محلی به لیست کلید های مجاز کاربر ریموت ubuntu. با این کار اجازه اتصال SSH به هر سروری داده می شود.

این فایل را ذخیره کرده و خارج شوید.

در ادامه این playbook را اجرا می کنیم :

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

تا اینجا تنظیمات مقدماتی انجام شده و می توانید به نصب پیش نیاز های کوبرنت بپردازید.

مرحله سوم – نصب پیش نیاز های kubernetes

در این قسمت شما باید پکیج های مورد نیاز سیستم عامل را برای پیش نیاز Kubernetes هستند بوسیله ابزار مدیریت بسته های Ubuntu نصب کنید. این پکیج ها به صورت زیر هستند :

  • Doker – یک مخزن زمان اجرا می باشد، که شامل اجزای مورد نیاز مخازن شما می باشد. همچنین از مخازن دیگر مانند rkt را پشتیبانی می کند.
  • kubeadm – یک ابزار خط فرمان برای نصب و پیکربندی اجزای مختلف کلاستر به صورت استاندارد می باشد.
  • kubelet – یک برنامه سیستمی و یک سرویس است که برای مدیریت گره ها Nodes و عملیات ها می باشد.
  • kubectl – یک ابزار خط فرمان برای ارسال دستورات به کلاستر ها از طریق API Server می باشد.

یک فایل با نام kube-cluster/kube-dependencies.yml/~ در مسیر فضای کاری ایجاد کنید :

سپس play زیر را برای نصب پکیج ها در سرور ها وارد کنید :

این play به صورت زیر کار می کند :

  • نصب داکر
  • نصب apt-transport-https ، اضافه کردن منابع HTTPS خارجی به لیست منابع APT
  • اضافه کردن apt-key برای تایید کلید منابع Kubernetes APT
  • نصب kubelet و kubeadm

دومین play فقط یک وظیفه را انجام می دهد و آن هم نصب kubectl بر روی سرور master می باشد.

بعد از اتمام کار فایل را ذخیره کرده و خارج شوید و Playbook را اجرا کنید :

بعد از اتمام اجرای این فایل خروجی مشابه زیر را مشاهده می کنید :

بعد از نصب داکر ، kubeadm و kubelet بر روی سرور ها ، برای اجرای kubectl چیز خاصی مورد نیاز نیست و فقط باید دستورات کلاستر را اجرا کنید. این مسئله خیلی مهم و حساس است ، که kubectl فقط بر روی سرور master نصب شده باشد و دستورات kubectl فقط از سرور master داده شود.به این نکته دقت کنید که kubectl بر روی هر ماشین مجازی که در کلاستر باشد می تواند نصب شود و دستورات کلاستر را اجرا کند.

خوب تا اینجا پیش نیاز ها نصب شده اند و در ادامه به سراغ نصب و تنظیم سرور master و راه اندازی اولیه کلاستر می رویم.

مرحله چهارم – تنظیم سرور Master

در این قسمت سرور master را تنظیم می کنیم. قبل از شروع تنظیمات و ایجاد playbook های جدید کمی درباره برخی اصطلاحات مانند Pods و Pods Networking Plugins صحبت می کنیم.

هر Pod آدرس IP برای خود دارد ، و هر هر pod در هر سرور باید بتواند از طریق آدرس IP آن pod در سرور دیگر به آن متصل شود. مخازنی که بر روی یک سرور هستند براحتی بوسیله رابط های محلی ارتباط برقرار می کنند. ارتباط بین pod ها پیچیده است و نیاز به یک شبکه جداگانه دارد که به صورت شفاف مسیر از یک pod به یک pod در یک سرور دیگر مشخص باشد.

این کار توسط پلاگین شبکه pod انجام می شود. در این آموزش از Flannel استفاده می کنیم که یک گزینه پایدار و مناسب است.

یک Ansible playbook با نام master.yml ایجاد کنید :

متن play زیر را برای نصب Flannel و مقدار دهی اولیه کلاستر وارد کنید :

توضیحاتی درباره این play :

  • اولین کاری که انجام می شود ، مقدار دهی اولیه کلاستر بوسیله kubeadm init است. تنظیم پارامتر –pod-network-cidr=10.244.0.0/16 ، که شبکه اختصاصی را برای pod مشخص می کند.
  • دومین کاری که انجام می شود، ایجاد دایرکتوری .kube در home/ubuntu/ است. در این دایرکتوری اطلاعات پیکربندی از قبیل فایل های کلید ادمین که برای اتصال کلاستر ها هستند و آدرس IP کلاستر ها نگهداری می شود.
  • سومین کاری که انجام می شود، کپی فایل etc/kubernetes/admin.conf/ که ubeadm init این فایل را با کاربر non-root در home ایجاد کرده است. این کار برای اجازه دسترسی kubectl به کلاستر های جدید ایجاد شده می باشد.
  • آخرین کار نیز اجرای kubectl apply برای نصب Flannel می باشد. مقدار [kubectl apply -f descriptor.[yml|json به kubectl اعلام می کند که یک شئ جدید که در فایل [descriptor.[yml|json توضیح داده شده است را ایجاد کند. فایل kube-flannel.yml شامل جزئیات شئ مورد نیاز برای تنظیم Flannel در کلاستر می باشد.

در انتها فایل را ذخیره کرده و خارج شوید.

فایل playbook را به صورت محلی اجرا کنید :

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

برای بررسی وضعیت سرور master از طریق ssh با دستور زیر به سرور متصل شوید :

پس از وارد شدن به سرور دستور زیر را اجرا کنید :

باید خروجی مشابه زیر را مشاهده کنید :

در سرور master تمامی تنظیمات و مقداردهی های اولیه انجام شده و وضعیت سرور در حالت ready و آماده برای شروع اتصال به سرور های worker و ارسال وظایف به API Server می باشد. اکنون می توانید سرور های worker را اضافه کنید.

مرحله پنجم – تنظیمات سرور های Worker

برای اضافه کردن گره worker یک دستور را باید اجرا کنید که شامل جزئیات مورد نیاز کلاستر از قبیل آدرس IP و پورت API سرور master می باشد و یک توکن امنیتی می باشد. فقط سروری که توکن را قبول می کند می تواند به کلاستر متصل شود.

به مسیر فضای کاری بروید و یک playbook به نام workers.yml ایجاد کنید :

متن زیر را در فایل قرار دهید :

توضیحات این playbook :

  • در ابتدا دستور اتصال اجرا می شود که باید در سرور worker وارد شود و قالب دستور به این صورت است : kubeadm join –token <token> <master-ip>:<master-port> –discovery-token-ca-cert-hash sha256:<hash>. این دستور با قرار دادن مقادیر token و hash تکمیل می شود.
  • قسمت دوم فقط دستور اتصال به گره ها یا سرور های worker را اجرا می کند که پس از تکمیل شدن این دستور هر دو سرور ، قسمتی از کلاستر خواهند بود.

فایل را ذخیره کرده و خارج شوید.

فایل playbook را اجرا کنید :

خروجی این اجرا مشابه زیر است :

با اضافه شدن سرور های worker کلاستر شما به صورت کامل تنظیم شده و آماده بهره برداری است و worker ها آماده اجرای بارهای کاری ارسالی هستند. قبل از زمان بندی برنامه ، اجازه دهید تا بررسی کنیم که کلاستر همانطور که می خواهیم کار می کند یا خیر.

مرحله ششم – بررسی کلاستر

ممکن است به دلیل از دسترسی خارج شدن یک سرور worker یا خرابی ارتباط بین سرور های master و worker ، راه اندازی کلاستر با مشکل مواجه شود. در این قسمت بررسی می کنیم که کلاستر و سرور ها به درستی کار کنند.

در ابتدا وضعیت گره ها یا سرور های متصل به سرور master را در سرور master را بررسی می کنیم. در ابتدا به سرور master متصل می شویم :

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

خروجی باید مشابه زیر باشد :

اگر وضعیت STATUS سرور ها در حالت ready بود ، به این معنی است که این قسمت از سرور به درستی کار می کند و آماده انجام کارها می باشند.

و اگر هر وضعیت STATUS هر سروری در حالت NotReady باشد به این معنی است که تنظیمات آن سرور هنوز تمام نشده است. حدود ۵ تا ۱۰ دقیقه قبل از اجرای مجدد دستور kubectl get node صبر کنید ، سپس مجددا خروجی را بررسی کنید. اگر هنوز وضعیت سرور ها NotReady بود ، باید دستورات مراحل قبل را مجددا بررسی و اجرا کنید.

پس از اطمینان از صحت عملکرد کلاستر ، برنامه Nginx را به عنوان یک نمونه زمان بندی می کنیم.

مرحله هفتم – اجرای یک برنامه در کلاستر

اکنون می توانید هر برنامه ای که نیاز به مخزن دارد را اجرا کنید. برای نمونه برنامه Nginx را بر روی کلاستر اجرا می کنیم. از دستوراتی که در ادامه آورده می شوند می توانید برای اجرای هر برنامه دیگری استفاده کنید.

همچنان در سرور master دستور زیر را برای ایجاد یک deployment از  nginx وارد کنید :

deployment یک نو از شئ Kubernetes می باشد که وجود همیشگی تعدادی pod در حال اجرا را در یک قالب تعریف شده تضمین می کند ، حتی اگر در زمان اجرای کلاستر pod از دسترس خارج شود. قبل از deployment یک pod با یک کانتینر از داکر موجود در Ngingx Docker Image ایجاد می شود.

سپس برای ایجاد یک سرویس با نام nginx برای در اختیار عموم قرار دادن این برنامه ، دستور زیر را وارد کنید. این کار از طریق NodePort انجام می شود ، به این صورت که یک پورت دلخواه را برای اتصال به یک pod در یک سرور دیگر باز می کند :

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

دستور زیر را اجرا کنید :

خروجی این دستور مانند زیر است :

همانطور که در خروجی مشاهده می کنید Nginx بر روی پورت ۸۰ کار می کند. Kubernetes یک پورت تصادفی بالاتر از ۳۰۰۰۰ که مطمئن است به سرویس دیگری تعلق نگرفته است را به این برنامه می دهد.

برای بررسی صحت عملکرد آدرس http://worker_1_ip:nginx_port یا http://worker_2_ip:nginx_port را در مرورگر سرور محلی خود وارد کنید. باید بتوانید صفحه Nginx را مشاهده کنید.

برای حذف برنامه Nginx ابتدا سرویس Nginx را از سرور master حذف کنید :

دستور زیر را وارد کنید تا از حذف شدن برنامه مطمئن شوید :

خروجی باید مشابه زیر باشد :

سپس deployment را حذف کنید :

پایان

در این آموزش شما توانستید یک کلاستر مخازن Kubernetes در Ubuntu 16.04 بوسیله Kubeadm راه اندازی کنید ، و در مراحل بعدی باید بتوانید برنامه ها و سرویس ها بیشتری را در کلاستر deploy کنید. در ادامه چند لینک برای راهنمایی و آموزش بیشتر شما قرار داده ایم :

  • Dockerizing applications – لیستی از مثال هایی برای آموزش استفاده از مخازن داکر.
  • Pod Overview – توضیحات بیشتر درباره pod ها و ارتباط آن ها با اجزا دیگر Kubernetes. این pod ها در همه جای Kubernetes هستند و فهم بهتر آن ها به شما کمک زیادی می کند.
  • Deployments Overview – مرور بر مفهوم deployment است. خیلی مهم است که بدانید deployments ها چطور مانند کارها را کنترل می کنند.
  • Services Overview – سرویس های دیگری را که توسط اجزا Kubernetes استفاده می شوند را بررسی می کند. درک انواع سرویس ها و گزینه هایی که برای اجرای هر دو برنامه های stateless و statefull هستند ، ضروری است.

مفاهیم مهم دیگر  Volumes, Ingresses و  Secrets .هستند که برای deploy برنامه ها در Kubernetes بسیار مفید هستند. Kubernetes ، امکانات و ویژگی های زیادی دارد که در مستندات رسمی Kubernetes بهترین منبع برای مطالعه می باشد.

Leave a Reply