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

توی این بلاگ پست میریم به سراغ بررسی یه ابزار بسیار قدرتمند به اسم kubespray و یاد میگیریم که چجوری میتونیم باهاش یه کلاستر کوبرنتیز رو نصب کنیم. البته ابزار نمیشه بهش گفت. در حقیقت یه انسیبل خیلی بزرگ و کارا هست که میتونیم باهاش کوبرنتیز رو به با مدلهای مختلفی نصب و کانفیگ کنیم.
کیوباسپری در واقع یه کلاس درس تمام عیار برای انسیبل هست، این پروژه انسیبلی هست که به کمک اون میتونیم روی بسترهای مختلف کلاستر کوبرنتیز رو نصب کنیم و آپدیت و … که نیاز داریم رو به صورت automated انجام بدیم.
ابزار kubeadm دانش حوزهای درباره مدیریت چرخه حیات کلاستر کوبرنتیز را فراهم میکند؛ از جمله پیکربندیهای خودمیزبان (self-hosted layouts)، خدمات کشف پویا (dynamic discovery services) و موارد دیگر. اگر این ابزار در دنیای جدید «اپراتورها» قرار میگرفت، ممکن بود بهعنوان Kubernetes cluster operator نامگذاری شود.
از سوی دیگر، Kubespray وظایف عمومی مدیریت پیکربندی را از دنیای «اپراتورهای سیستمعامل» و Ansible انجام میدهد، علاوه بر اینکه بخشی از فرایند اولیه ایجاد کلاستر کوبرنتیز (بههمراه پلاگینهای شبکه) و راهاندازی control plane را بر عهده دارد.
ابزار Kubespray از نسخه v2.3 به بعد شروع به استفاده درونی از kubeadm برای ایجاد خوشه کرده است تا از دانش حوزهای مدیریت چرخه حیات آن بهره ببرد و وظایف عمومی پیکربندی سیستمعامل را از آن جدا کند.
پیشنیازها و نکات:
توی قدم اول باید پروژه رو با تگ مشخص اون ورژنی که میخوایم clone کنیم، دقت کنید که برنچ master رو نگیرید و حتما از ورژنهای استیبل استفاده کنید. اگر از برنچ master استفاده کنید استیبل نیست و آخرین نسخه هست که معمولا با خطاهای زیادی مواجهه میشید.

نیازمندی دیگری که داریم این هست که در حالت عادی سرورهامون باید دسترسی به اینترنت برای دریافت ایمیجهای داکر و باینریهای که نیاز داره رو داشته باشند مگر اینکه بخوایم از روشهای نصب برای محیطهای آفلاین استفاده کنیم. اگر بخواهیم این کار رو کنیم باید سرورهای ما دسترسی به ریپوهای آفلاین داشته باشه.
با توجه به مشکلاتی که تو دریافت پکیجها و ایمیجها تو ایران داریم توصیه میکنم یه 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 ست کنیم:
سی آر دی و اُپراتور (قسمت شانزدهم) توی این قسمت در مورد اینکه چطوری یه ریسورس کاستوم شده به کلاستر اضافه کنیم توضیح دادیم و مفهوم اُپراتور رو توی کوبر بررسی کردیم.
نصب کلاستر با kubeadm (قسمت هفدهم) توی این قسمت قدم به قدم نحوه نصب یک کلاستر کوبرنتیز رو با استفاده از ابزار kubeadm توضیح دادیم.
نصب کلاستر با kubespray (قسمت هجدهم) توی این قسمت نحوه نصب کلاستر با یه پروژه خیلی خوب به نام کیوب اسپری که یه انسیبل خفن برای ستاپ کلاستر رائه میده رو توضیح دادیم.
نصب کلاستر با rancher (قسمت نوزدهم) توی این قسمت توضیح دادیم که چطور با استفاده از ابزار RKE یک کلاستر کوبرنتیز راهاندازی کنیم.
								
															

