نصب کلاستر با kubespray (قسمت هجدهم)

توی این قسمت میریم سراغ اینکه بررسی کنیم چطوری می‌تونیم یه کلاستر کوبرنتیز رو با استفاده از kubespray ستاپ کنیم و بیاریم بالا. روشی که می‌تونیم باهاش کلاستر پروداکش رو ستاپ و نگهداری کنیم.

خب یه مروری کنیم پست‌های قبلی رو:

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

Kubespray
Kubespray

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

کیوب‌اسپری در واقع یه کلاس درس تمام عیار برای انسیبل هست، این پروژه انسیبلی هست که به کمک اون میتونیم روی بسترهای مختلف کلاستر کوبرنتیز رو نصب کنیم و آپدیت و … که نیاز داریم رو به صورت automated انجام بدیم.

ابزار kubeadm دانش حوزه‌ای درباره مدیریت چرخه حیات کلاستر کوبرنتیز را فراهم می‌کند؛ از جمله پیکربندی‌های خودمیزبان (self-hosted layouts)، خدمات کشف پویا (dynamic discovery services) و موارد دیگر. اگر این ابزار در دنیای جدید «اپراتورها» قرار می‌گرفت، ممکن بود به‌عنوان Kubernetes cluster operator نام‌گذاری شود.

از سوی دیگر، Kubespray وظایف عمومی مدیریت پیکربندی را از دنیای «اپراتورهای سیستم‌عامل» و Ansible انجام می‌دهد، علاوه بر اینکه بخشی از فرایند اولیه ایجاد کلاستر کوبرنتیز (به‌همراه پلاگین‌های شبکه) و راه‌اندازی control plane را بر عهده دارد.

ابزار Kubespray از نسخه v2.3 به بعد شروع به استفاده درونی از kubeadm برای ایجاد خوشه کرده است تا از دانش حوزه‌ای مدیریت چرخه حیات آن بهره ببرد و وظایف عمومی پیکربندی سیستم‌عامل را از آن جدا کند.

پیش‌نیازها و نکات:

توی قدم اول باید پروژه رو با تگ مشخص اون ورژنی که میخوایم clone کنیم، دقت کنید که برنچ master رو نگیرید و حتما از ورژن‌های استیبل استفاده کنید. اگر از برنچ master استفاده کنید استیبل نیست و آخرین نسخه هست که معمولا با خطاهای زیادی مواجهه می‌شید.

kubespray Release
kubespray Release

برای مثال از قسمت Tags گزینه v2.27.0 را انتخاب می‌کنیم و در این برنچ فایلی با نام requirements.txt وجود دارد به شکل زیر:

requirements
requirements

در این فایل ورژن انسیبلی که نیاز داریم نوشته شده که در اینجا مثلا ۹.۱۳.۰ هست، همچنین ورژن سایر پکیج‌هایی که نیاز دارید در 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: &quotvip.kubespray.mecan.ir&quot
loadbalancer_apiserver:
  address: 192.168.200.10
  port: 6443
				
			

همچنین برای لودبالانسر داخلی می‌تونیم از این کانفیگ استفاده کنیم:

				
					## Internal loadbalancers for apiservers
loadbalancer_apiserver_localhost: true
# valid options are &quotnginx&quot or &quothaproxy&quot
loadbalancer_apiserver_type: nginx
				
			

اگه میخواید که http_proxy ست کنید برای آپدیت پکیج‌ها و گرفتن ایمیج‌ها میتونید موارد زیر رو اضافه کنید:

				
					http_proxy: &quotPROXY_ADDRESS:PROXY_PORT&quot
https_proxy: &quotPROXY_ADDRESS:PROXY_PORT&quot
# https_proxy_cert_file: &quot&quot
				
			

به مسیر roles/kubespray-defaults/defaults/main.yml هم مراجعه کنید قبل از اینکه تغییری رو در no_proxy ایجاد کنید. حتما لازمه که کانفیگ درستی برای NO_PROXY تنظیم کنید که درخواست‌هایی که نیاز نیست از روی پروکسی عبور نکنه.

				
					# no_proxy: &quot10.233.0.0/18,10.233.64.0/18&quot
				
			

همچنین گزینه زیر رو هم 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: &quot/etc/sysctl.d/99-sysctl.conf&quot
				
			

کانفیگ وریبل‌های مرتبط با containerd:

توی قدم بعدی بایستی که تغییراتی رو در وریبل‌های مسیر group_vars/all/containerd.yml ایجاد کنیم و رجیستری های میرور خودمون رو برای container runtime که داریم استفاده می‌کنیم یعنی containerd ست کنیم:

دیدگاه‌ خود را بنویسید

مقاله های داکرمی

Kubernetes

نصب کلاستر با kubespray (قسمت هجدهم)

توی این قسمت میریم سراغ اینکه بررسی کنیم چطوری می‌تونیم یه کلاستر کوبرنتیز رو با استفاده از kubespray ستاپ کنیم و بیاریم بالا. روشی که می‌تونیم باهاش کلاستر پروداکش رو ستاپ و نگهداری کنیم. خب یه مروری کنیم پست‌های قبلی

توضیحات بیشتر »
Kubernetes

نصب کلاستر با kubeadm (قسمت هفدهم)

توی این قسمت میریم به سراغ اینکه بررسی کنیم چطوری می‌تونیم یه کلاستر کوبرنتیز رو با استفاده از kubeadm ستاپ کنیم و بیاریم بالا. خب یه مروری کنیم پست‌های قبلی رو: دواپس چیه و چرا لازمه؟ اینجا در مورد دواپس و

توضیحات بیشتر »
Kubernetes

سی آر دی و اُپراتور (قسمت شانزدهم)

توی این قسمت میریم به سراغ اینکه بررسی کنیم چطوری می‌تونیم ریسورس‌های خودمون رو به صورت کاستوم شده توی کوبرنتیز تعریف کنیم و بعدش هم در مورد اُپراتورها توی کوبرنتیز توضیح می‌دیم. خب یه مروری کنیم پست‌های قبلی رو: دواپس

توضیحات بیشتر »
پیمایش به بالا