آموزش نصب و راه اندازی کلاسترینگ Kubernetes با Kubeadm در لینوکس Ubuntu 16.04

Kubernetes Cluster Banner

آموزش نصب و راه اندازی کلاسترینگ کوبرنیتیس Kubernetes 1.10 با Kubeadm در لینوکس Ubuntu 16.04

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

مقدمه

کوبرنیتیس Kubernetes یک سیستم مدیریت مخازن است که به صورت متن باز و رایگان می باشد. این پروژه توسط گوگل و بر اساس تجربیات اجرای مخازن در محصولات ایجاد شده است. در این آموزش به نحوه نصب ، راه اندازی و تنظیمات کلاسترینگ Kubernetes بر روی لینوکس Ubuntu می پردازیم. این آموزش یک آموزش حرفه ای است و برای نصب Kubernetes از Kubeadm و برای تنظیمات سرور های موجود در کلاستر از Ansible استفاده می کنیم.

مشاهده خلاصه آموزش و دستورات این آموزش

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

دانلود فایل PDF این آموزش

اهداف

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

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

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

  • دو سرور برای Worker Node ها

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

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

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

پیش نیاز ها

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

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

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

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

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

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

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

خطوط زیر را در این فایل وارد کنید و مقادیر گفته شده را با مقادیر مناسب جایگزین کنید. منظور مقادیر master_ip و worker_1_ip و worker_2_ip می باشد :

اطلاعات این فایل ، دارایی ها یا همان اطلاعات سرور ها خواهند بود که شامل اطلاعاتی از قبیل آدرس IP ، نام کاربری کاربرانی که از راه دور به صورت Remote متصل می شوند و نام گروه های سرور ها می باشد ، که در اینجا شامل گروه سرور های 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/~ در فضای کاری Workspace ایجاد کنید :

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

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

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

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

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

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

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

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

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

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

نصب این بسته ها به صورت دستی و یکی یکی بر روی همه سرورهای کلاستر زمانبر است و به همین دلیل از Ansible برای این کار استفاده می کنیم و برای این کار باید یک Playbook دیگر تنظیم کنیم.

یک فایل با نام 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 ها مطلب مفهوم Pod در kubernetes چیست و چطور کار می کند را مطالعه کنید.

هر 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 را به صورت محلی Local اجرا کنید :

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

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

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

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

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

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

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

به مسیر فضای کاری Workspace بروید و یک 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 را به عنوان یک نمونه زمان بندی یا Schedule می کنیم.

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

اکنون می توانید هر برنامه ای که نیاز به مخزن دارد را اجرا کنید. برای نمونه برنامه 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