توی این قسمت میریم سراغ اینکه بررسی کنیم چطوری میتونیم یه کلاستر کوبرنتیز رو با استفاده از kubespray ستاپ کنیم و بیاریم بالا. روشی که میتونیم باهاش کلاستر پروداکش رو ستاپ و نگهداری کنیم.
خب یه مروری کنیم پستهای قبلی رو:
- دواپس چیه و چرا لازمه؟ اینجا در مورد دواپس و ضرورت استفاده از آن صحبت کردم.
- مسیر شغلی دواپس اینجا در مورد مسیر شغلی دواپس و موارد پیرامون آن صحبت کردم.
- چطور اپلیکیشن مناسب کلاد آماده کنیم؟ و اینجا توضیح دادم که چطور میتونیم یه اپلیکیشن مناسب کلاد توسعه بدیم.
- چه عمقی از لینوکس برای دواپس لازمه؟ و اینجا توضیح دادم که کدوم موارد لینوکس برای دواپس الزامی هست که اول سراغ اون موارد بریم.
- خودکارش کن، مشکلاتت حل میشه 🙂 در اینجا در مورد اتومیشن و اینکه انسیبل چیه و چه کمکی به ما میکنه صحبت کردم.
- در مسیر دواپس اینبار اجزای اصلی انسیبل تو این پست اجزای انسیبل رو معرفی کردم و آنها را شرح دادم.
- در مسیر دواپس به داکر رسیدم. (قسمت اول) تو این پست داکر رو شروع کردیم و اونو معرفی کردیم.
- در مسیر دواپس اینبار: پشت داکر چه خبره؟ (قسمت دوم) توی این پست در مورد تکنولوژی هایی که داکر ازشون استفاده میکنه توضیح دادیم.
- در مسیر دواپس اینبار: والیوم و نتورک داکر (قسمت سوم) توی این پست در مورد شبکه توی داکر و اینکه چطوری دیتای کانتینر رو میتونیم نگه داریم توضیح دادیم.
- در مسیر دواپس اینبار: داکر فایل ( قسمت چهارم ) توی این پست در مورد اینکه چطور با استفاده از داکر اپلیکیشن مون رو بیلد کنیم و ایمیج بسازیم توضیح دادیم.
- در مسیر دواپس اینبار: کامپوز فایل و داکر کامپوز (قسمت پنجم) توی این پست در مورد اینکه چطور روند دیپلوی کردن سرویسهامون و کانفیگ اونها رو به صورت کد داشته باشیم توضیح دادیم.
- در مسیر دواپس: اینبار داکر سوآرم (قسمت ششم) توی این پست در مورد داکر سوآرم و اینکه چطوری به کمک داکر چنتا سرور رو کلاستر کنیم، توضیح دادیم.
- در مسیر دواپس اینبار: دور و بری های داکر (قسمت هفتم) توی این پست در مورد ابزارهای جانبی که بهمون توی کار با داکر کمک میکنن توضیح دادیم.
- در مسیر دواپس: جمع بندی داکر (قسمت هشتم) توی این پست در مورد امنیت داکر توضیح دادیم و در آخر هم یه سری از بست پرکتیسها و تجربیات خودم رو گفتم.
- تست نوشتن و شروع مسیر CI/CD (قسمت اول) توی این پست انواع تست رو بررسی کردیم و با ابزارهای CI/CD آشنا شدیم و یه مقایسه بین گیتلب و جنکینز داشتیم.
- در مسیر CI/CD گیت رو بررسی میکنیم (قسمت دوم) توی این پست قبل ورود به گیتلب نیاز بود که گیت و ورژن کنترل سیستم ها رو یه بررسی کنیم.
- در مسیر CI/CD شناخت گیتلب (قسمت سوم) توی این پست اجزای گیتلب رو بررسی کردیم و با کامپوننتهای مختلفی که داره بیشتر آشنا شدیم.
- در مسیر CI/CD پایپلاین و رانر گیتلب (قسمت چهارم) توی این پست پایپلاین و رانر گیتلب رو بررسی کردیم.
- در مسیر CI/CD وریبل، گیتآپس و جمعبندی (قسمت پنجم) توی این پست وریبلهای گیتلب رو بررسی کردیم و یه معرفی کوتاه از گیتآپس و آتودواپس کردیم و در انتها یه مقدار تجربههای خودم رو در گیتلب باهاتون به اشتراک گذاشتم.
- مسیر Observability (قسمت اول) توی این پست معرفی observability رو داشتیم و مقایسه اش با مانیتورینگ و یه توضیح مختصر هم در مورد اپنتلهمتری دادیم.
- در مسیر Observability، الک (قسمت دوم) توی این پست استک قدرتمند ELK رو بررسی کردیم.
- در مسیر Observability، جمع بندی استک الک (قسمت سوم) توی این پست بقیه کامپوننتهای استک الک رو بررسی کردیم و fluentd و fluentbit رو مقایسه کردیم و نهایتا یه معرفی هم روی opensearch داشتیم.
- در مسیر Observability، استک پرومتئوس (قسمت چهارم) توی این پست یه معرفی اولیه داشتیم روی استک پرومتئوس.
- در مسیر Observability، استک پرومتئوس (قسمت پنجم) توی این پست یه مقدار کامپوننت های استک پرومتئوس رو بیشتر بررسی کردیم.
- در مسیر Observability، استک ویکتوریا (قسمت ششم) توی این پست استک ویکتوریا رو معرفی کردیم و سعی کردیم با پرومتئوس مقایسهاش کنیم.
- در مسیر Observability، میمیر (قسمت هفتم) توی این پست در مورد ابزار میمیر از ابزارهای گرافانا توضیح دادیم و کاربردش رو بررسی کردیم.
- در مسیر Observability، لوکی (قسمت هشتم) توی این پست در مورد ابزار گرافانا برای مدیریت لاگ یعنی لوکی توضیح دادیم و آخرشم یه معرفی کوتاه رو graylog داشتیم.
- در مسیر Observability، تمپو (قسمت نهم) توی این پست در مورد تریسینگ توضیح دادیم و گرافانا تمپو رو بررسی کردیم و یه معرفی کوتاه روی Jaeger داشتیم
- در مسیر Observability، گرافانا (قسمت دهم) توی این پست در مورد گرافانا و HA کردنش و همچنین یه سری از ابزارهاش مثل alloy , incident, on-call توضیح دادیم.
- آغاز مسیر کوبر (قسمت اول) تو این قدم به معرفی ابزارهای ارکستریشن پرداختیم و مدارک کوبرنتیز رو بررسی کردیم.
- کوبر سینگل ( قسمت دوم ) توی این قدم در مورد kubectl , kubeconfig توضیح دادیم و تعدادی ابزار رو معرفی کردیم که به کمک اونها میتونیم یک کوبرنتیز دمهدستی واسه تستهامون داشته باشیم.
- کامپوننتهای کوبر ( قسمت سوم ) توی این پست کامپوننتهای مختلف کوبرنتیز رو بررسی کردیم و اجزای نودهای مستر و ورکر رو دونه دونه بررسی کردیم و توضیح دادیم.
- پادها و مدیریت اونها در کوبرنتیز (قسمت چهارم) توی این پست در مورد پاد توی کوبرنتیز توضیح دادیم و موارد مربوط به اون رو بررسی کردیم.
- ورکلودهای کوبر و مدیریت منابع کوبر (قسمت پنجم) توی این پست در مورد namespaceها توی کوبر توضیح دادیم و انواع ورکلود کوبر رو بررسی کردیم.
- اگه لازم شد کوبر خودش گنده میشه! ( قسمت ششم ) توی این پست در مورد سه نوع ورکلود مرتبط با scaling به صورت خودکار در کوبرنتیز توضیح دادیم.
- نتورک کوبر (قسمت هفتم) توی این قسمت انواع سرویس توی کوبرنتیز رو بررسی کردیم و در مورد مفاهیم اینگرس و نتورک پالیسی توضیح دادیم.
- استورج کوبرنتیز (قسمت هشتم) توی این قسمت در مورد انواع استورج توی کوبرنتیز توضیح دادیم و مفاهیم PV و PVC و Storage Class رو بررسی کردیم.
- پراب، ریکوئست و لیمیت (قسمت نهم) توی این قسمت موارد مربوط به محدود کردن منابع کانتینر توی کوبرنتیز رو بررسی کردیم و در مورد انواع probe ها توی کوبرنتیز توضیح دادیم.
- پاد تو نود (قسمت دهم) توی این قسمت درمورد فرآیند انتقال پاد به نود مناسب مفاهیم پیشرفتهتری مثل affinity و anti-affinity و taint و toleration رو بررسی کردیم.
- اولویت پاد و امنیت (قسمت یازدهم) توی این قسمت در مورد تعیین اولویت برای پادها و جنبههای مختلف امنیت در کوبرنتیز توضیح دادیم.
- کنترل دسترسی به کوبر (قسمت دوازدهم) توی این قسمت در مورد مراحل دسترسی به api کوبرنتیز صحبت کردیم و بعدش مفاهیمی مثل سرویس اکانت رو توضیح دادیم.
- دیزاین کلاستر (قسمت سیزدهم) توی این قسمت در مورد طراحی و دیزاین یک کلاستر و روشهای مختلفی که داره توضیح دادیم و همچنین تفاوت روشهای مختلف تقسیم منابع در کلاسترها را بررسی کردیم.
- مالتی تننسی در کوبر (قسمت چهاردهم) توی این قسمت چالشهای مربوط به داشتن چند مستاجر بر روی کلاستر کوبرنتیز توضیح دادیم.
- هلم (قسمت پانزدهم) توی این قسمت پکیج منیجر معروف کوبرنتیز یعنی Helm رو بررسی کردیم و در موردش ویژگیها و کاربردهاش توضیح دادیم.
- سی آر دی و اُپراتور (قسمت شانزدهم) توی این قسمت در مورد اینکه چطوری یه ریسورس کاستوم شده به کلاستر اضافه کنیم توضیح دادیم و مفهوم اُپراتور رو توی کوبر بررسی کردیم.
- نصب کلاستر با kubeadm (قسمت هفدهم) توی این قسمت قدم به قدم نحوه نصب یک کلاستر کوبرنتیز رو با استفاده از ابزار kubeadm توضیح دادیم.
توصیه میکنم که حتما این پستها رو هم مطالعه کنید. بریم که ادامه بدیم.
توی این بلاگ پست میریم به سراغ بررسی یه ابزار بسیار قدرتمند به اسم kubespray و یاد میگیریم که چجوری میتونیم باهاش یه کلاستر کوبرنتیز رو نصب کنیم. البته ابزار نمیشه بهش گفت. در حقیقت یه انسیبل خیلی بزرگ و کارا هست که میتونیم باهاش کوبرنتیز رو به با مدلهای مختلفی نصب و کانفیگ کنیم.
کیوباسپری در واقع یه کلاس درس تمام عیار برای انسیبل هست، این پروژه انسیبلی هست که به کمک اون میتونیم روی بسترهای مختلف کلاستر کوبرنتیز رو نصب کنیم و آپدیت و … که نیاز داریم رو به صورت automated انجام بدیم.
ابزار kubeadm دانش حوزهای درباره مدیریت چرخه حیات کلاستر کوبرنتیز را فراهم میکند؛ از جمله پیکربندیهای خودمیزبان (self-hosted layouts)، خدمات کشف پویا (dynamic discovery services) و موارد دیگر. اگر این ابزار در دنیای جدید «اپراتورها» قرار میگرفت، ممکن بود بهعنوان Kubernetes cluster operator نامگذاری شود.
از سوی دیگر، Kubespray وظایف عمومی مدیریت پیکربندی را از دنیای «اپراتورهای سیستمعامل» و Ansible انجام میدهد، علاوه بر اینکه بخشی از فرایند اولیه ایجاد کلاستر کوبرنتیز (بههمراه پلاگینهای شبکه) و راهاندازی control plane را بر عهده دارد.
ابزار Kubespray از نسخه v2.3 به بعد شروع به استفاده درونی از kubeadm برای ایجاد خوشه کرده است تا از دانش حوزهای مدیریت چرخه حیات آن بهره ببرد و وظایف عمومی پیکربندی سیستمعامل را از آن جدا کند.
پیشنیازها و نکات:
توی قدم اول باید پروژه رو با تگ مشخص اون ورژنی که میخوایم clone کنیم، دقت کنید که برنچ master رو نگیرید و حتما از ورژنهای استیبل استفاده کنید. اگر از برنچ master استفاده کنید استیبل نیست و آخرین نسخه هست که معمولا با خطاهای زیادی مواجهه میشید.
برای مثال از قسمت Tags گزینه v2.27.0 را انتخاب میکنیم و در این برنچ فایلی با نام requirements.txt وجود دارد به شکل زیر:
در این فایل ورژن انسیبلی که نیاز داریم نوشته شده که در اینجا مثلا ۹.۱۳.۰ هست، همچنین ورژن سایر پکیجهایی که نیاز دارید در venv مربوطه نصب کنیم نوشته شده. این طوری تمام اون نیازمندی که برای نصب و کانفیگ توسط kubespray داریم رو همون نسخه که نیاز داره رو نصب میکنیم. حتما توصیه میکنم که از virtual env استفاده کنیم که اگر نسخهی دیگهای داریم اونها رو خراب نکنه.
نیازمندی دیگری که داریم این هست که در حالت عادی سرورهامون باید دسترسی به اینترنت برای دریافت ایمیجهای داکر و باینریهای که نیاز داره رو داشته باشند مگر اینکه بخوایم از روشهای نصب برای محیطهای آفلاین استفاده کنیم. اگر بخواهیم این کار رو کنیم باید سرورهای ما دسترسی به ریپوهای آفلاین داشته باشه.
با توجه به مشکلاتی که تو دریافت پکیجها و ایمیجها تو ایران داریم توصیه میکنم یه Nexus بالای دست کلاستر کوبرنتیز خودمون داشته باشیم تا همهی پکیجها و ایمیجهایی که لازم داره رو از اون بگیره.
نیازمندی بعدی این هست که سرورهامون رو کانفیگ کنیم که IPv4 forwarding بر روی اونها به صورت مجاز باشد، همچنین اگه از IPv6 برای سرویسها و پادهاتون استفاده میکنید اون هم باید allowed کنید.
نکته مهم دیگه اینکه این پروژه انسیبل فایروال شما رو مدیریت نمیکنه و خودتون بایستی که تنظیماتی که لازم دارید رو انجام بدید که در این مورد توی پست قبلی یه روشی پیشنهادی رو توضیح دادیم.
دقت کنید که اگر انسیبل رو با کاربری غیر از root ران میکنید بایستی دسترسیهای لازم رو بهش بدید و فلگ become رو ست کنید حتما و کامندتون رو با b- بزنید.
حداقل برای نود مستر 1500MB و برای ورکر 1024MB رم نیاز هست که معمولا اگر برای پروداکشن بخوایم استفاده کنیم اعداد خیلی بیشتر از اینهاست و بسته به اپلیکیشن و نیازمندی که داریم متفاوت هست.
پس کیوباسپری رو کلون میکنیم 🙂
git clone -b release-2.27 https://github.com/kubernetes-sigs/kubespray.git
بهتره که یه environment پایتونی ایجاد کنیم و مواردیکه توی requirements.txt هست رو توی اون نصب کنیم:
VENVDIR=kubespray-venv
KUBESPRAYDIR=kubespray
apt install python3.10-venv
python3 -m venv $VENVDIR
source $VENVDIR/bin/activate
cd $KUBESPRAYDIR
# Install requirements package
pip install -U -r requirements.txt
یه کپی از فایل سمپلی که توی inventory پروژه هست میگیریم تا تغییراتی که لازم داریم رو توش انجام بدیم:
# Copy inventory/sample as inventory/MeCan
cp -rfp inventory/sample inventory/MeCan
توی این فایل سرورها به سه تا گروه زیر تقسیم میشن:
- گروه kube_node: لیست همه نودهای کلاستر توی این قسمت قرار میگیره.
- گروه kube_control_plane: این قسمت لیست سرورهایی هست که کامپوننتهای نودهای مستر یا control plane روی اونها بالا میاد یعنی api-server و scheduler و controller manager.
- گروه etcd: توی این قسمت هم لیست نودهایی که روی اونها etcd بالا میاد رو میذاریم که برای پروداکشن حداقل باید سه تا باشن.
# This inventory describe a HA typology with stacked etcd (== same nodes as control plane)
# and 3 worker nodes
# See https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html
# for tips on building your # inventory
# Configure 'ip' variable to bind kubernetes services on a different ip than the default iface
# We should set etcd_member_name for etcd cluster. The node that are not etcd members do not need to set the value,
# or can set the empty string value.
node1 ansible_host=192.168.200.11
node2 ansible_host=192.168.200.12
node3 ansible_host=192.168.200.13
node4 ansible_host=192.168.200.14
node5 ansible_host=192.168.200.15
node6 ansible_host=192.168.200.16
[kube_control_plane]
node1
node2
node3
[etcd:children]
kube_control_plane
[kube_node]
node1
node2
node3
node4
node5
node6
بعد از اینکه inventory رو درست کردیم حالا میرسه زمان استفاده از playbookهای پروژه، اینجا میتونید یه لیستی از تگ های انسیبلی که این پروژه داره ببینید.
برای مثال کامند زیر فقط تسک های مربوط به DNS configuration رو انجام میده و بقیه موارد رو اسکیپ میکنه:
ansible-playbook -i inventory/MeCan/hosts.ini cluster.yml --tags preinstall,facts --skip-tags=download,bootstrap-os
یا مثلا با استفاده از کامند زیر میتونید DNS resolver ip رو از روی نودهای کلاستر و مسیر etc/resolv.conf/ پاک کنید:
ansible-playbook -i inventory/MeCan/hosts.ini -e dns_mode='none' cluster.yml --tags resolvconf
شناخت انسیبل کیوباسپری مهمه، مخصوصا اینکه بدونید تگی که دارید استفاده میکنید یا skipش میکنید چه کاری رو انجام میده. دستور زیر ایمیجهای مورد نظر رو به صورت locally آماده میکنه، بدون اینکه نصب یا آپگریدی رو انجام بده:
ansible-playbook -i inventory/MeCan/hosts.ini cluster.yml \
-e download_run_once=true -e download_localhost=true \
--tags download --skip-tags upload,upgrade
کانفیگ group_vars/all/all.yml :
توی قدم بعدی باید یه سری وریبلهارو تنظیم کنیم که توی فایل group_vars/all/all.yml
هستن.
برای کانفیگ لودبالانسری که برای api-server ها گذاشتیم به شکل زیر عمل میکنیم:
## External LB example config
apiserver_loadbalancer_domain_name: "vip.kubespray.mecan.ir"
loadbalancer_apiserver:
address: 192.168.200.10
port: 6443
همچنین برای لودبالانسر داخلی میتونیم از این کانفیگ استفاده کنیم:
## Internal loadbalancers for apiservers
loadbalancer_apiserver_localhost: true
# valid options are "nginx" or "haproxy"
loadbalancer_apiserver_type: nginx
اگه میخواید که http_proxy ست کنید برای آپدیت پکیجها و گرفتن ایمیجها میتونید موارد زیر رو اضافه کنید:
http_proxy: "PROXY_ADDRESS:PROXY_PORT"
https_proxy: "PROXY_ADDRESS:PROXY_PORT"
# https_proxy_cert_file: ""
به مسیر roles/kubespray-defaults/defaults/main.yml هم مراجعه کنید قبل از اینکه تغییری رو در no_proxy ایجاد کنید. حتما لازمه که کانفیگ درستی برای NO_PROXY تنظیم کنید که درخواستهایی که نیاز نیست از روی پروکسی عبور نکنه.
# no_proxy: "10.233.0.0/18,10.233.64.0/18"
همچنین گزینه زیر رو هم true کنید تا cache رو به درستی انجام بده و همینطور گزینه های بعدی برای دیپلوی کردن container engine و مسیر فایل sysctl:
download_container: true
# Set false if you want to deploy container engine manually.
deploy_container_engine: true
sysctl_file_path: "/etc/sysctl.d/99-sysctl.conf"
کانفیگ وریبلهای مرتبط با containerd:
توی قدم بعدی بایستی که تغییراتی رو در وریبلهای مسیر group_vars/all/containerd.yml
ایجاد کنیم و رجیستری های میرور خودمون رو برای container runtime که داریم استفاده میکنیم یعنی containerd ست کنیم: