در این مجموعه پستها قصد دارم دربارهی راهاندازی کوبرنتیز بنویسم. میدونم که خیلی بیش از دو روز از پست قبلی میگذره ولی امیدوارم آماده کردن این پست ارزششو داشته باشه. با خوندن این پست با روشهای مختلف راهاندازی کوبرنتیز آشنا میشی...بدیهتا!
یکی از موارد جالب درباره کوبرنتیز اینه که با وجود جدید بودنش، خیلی سریع و شدید توسعه پیدا کرده. یعنی اصلا خودشو هم نگاه نکنی، فقط برای نصبش، هر کی از راه رسیده یه راه حلی داده. یه چند مورد از روشهای متداول راهاندازی کوبرنتیز اینا هستن:
این روش برای کسایی که میخوان تازه کوبرنتیز را یاد بگیرند و دولوپرها خوبه. با این روش میتونی روی سیستم خودت (حتی اگه ویندوزه) یه نود تکی از کوبرنتیز با تمام ابزارهای لازم راه بندازی که کار master و worker را با هم میکنه. روی ویندوز کافیه پاورشل را با دسترسی ادمین باز کنی و بنویسی choco install minikube تا خودکار نرمافزارهای لازم نصب شن (شامل داکر و WSL هم میشه). اگه روی ویندوز نیستی یا میخوای فایل نصب را بگیری و چند بار نصب کنی، کافیه یه سر به سایتش بزنی. انقدر فرم این صفحه واضحه که نیازی به توضیح نمیبینم.
بعد از نصب هم کافیه اول داکر را راه بندازی (فقط روی داکر دسکتاپ کلیک کن) و با minkube start نودتو راه بندازی. برای متوقف کردنش هم از minikube stop استفاده کن. برای اینم که ببینی همه چیز اوکیه و چی نصب کردی بزن minikube kubectl --get nodes تا فهرست نودها (یدونه نود) بهت نمایش داده بشه.
اگه پلاگینی چیزی هم لازم داشتی میتونی مثل بلوک زیر راه بندازیش (مثلا ingress را باید خودت اضافه کنی چون برای کارای محلی زدن اینو و به ingress نیازی احساس نوگشته بید):
minikube addons list minikube addons enable ingress
در کل روش خوب و سر راستیه ولی دو تا مشکل داره:
این روش هم روی مک و ویندوز جواب میده و روی لینوکسهایی که snap داشته باشن (مثل اوبونتو). به سایتش که سر بزنی میتونی برای پلتفرمهای مختلف (پایین صفحه) روش نصب را ببینی. نصبش روی ویندوز خیلی جذابیتی نداشت، ولی روی لینوکس کافیه توی ترمینال دستورای زیرو بنویسی (بکوپیسی):
sudo snap install microk8s --classic sudo usermod -a -G microk8s $USER newgrp microk8s
بعد از نصب دستورای زیر را میتونی اجرا کنی (خود سایتش هم چند تا دستور بامزه گفته که نگاه کنی بد نیست):
این روش هم خوبه ... نه راستش این روش بر خلاف روش قبلی خیلی خوبه. یه چیزیه که میشه بهش گفت کلاستر و توی کار ازش استفاده کرد. ولی مشکلش اینه که از snap استفاده میکنه. مشکلای snap هم که اگه میدونی، میدونی.
اگه دو تا روش قبل خیلی برای به دلتون نچسبید، بهتون حق میدم. ولی این یکی چیز خوبیه. تو این روش یه فایل زیر (به قول بزرگان نیم-قاله-سه-چی) دانلود میکنی و بعد اجراش یه کلاستر مطابق با آخرین استانداردهای صنعتی و سنتی خواهید داشت مشتریان عزیز... . من چیزی نگم. همین تک پایینو بکوپیس تمومه (نود مستر):
curl -sfL https://get.k3s.io | sh -
برای اضافه کردن نود برده ذلیل هم اول برو /var/lib/rancher/k3s/server/node-token یه توکنه کپی کن. IP نود مستر را با ip a بگیر و دستور زیرو در سرور اجرا کن تا به صورت ابدی به بردگی ارباب بیرحمش دربیاد (سکوت):
curl -sfL https://get.k3s.io | K3S_URL=https://<controller IP>:6443 K3S_TOKEN=<token> sh -
شاید براتون سوال باشه که چرا این همه روش برای نصب کوبرنتیز هست (فقط سه تاشو گفتیم ولی این نوک چیزه...). در جواب باید گریست...چون روش اصلی نصب کوبرنتیز خیلی سخته. یعنی لیترالی سخته. و الان میخوایم ببینیم چیه. اول باید یه سرور جور کنید و پورتای زیرو در مستر بگشایید:
همچنین در تک تک نودهای کارگر پورتای زیرو باید باز کنی:
بعدش (یا قبلش) باید مطمئن بشی که IP مستر و ورکر (ارباب و کارگر) عوض نمیشه که راحت از فایل /etc/netplam/* میشه انجامش داد (اون ستاره برای اینه که یه فایل توی این پوشه هست و معمولا اسمش از سیستم به سیستم فرق میکنه، مثلا روی VM من 00-installer-config.yaml بود). خیلی نمیخوام درگیر این فایل بشم (خیلی ربطی نداره، gemini هم رایگانه)، ولی کلیتش اینه که یه IP استاتیک روی اینترفیس تعریف کردم و DNS هم گذشتم روی شکن (shecan.ir) تا بتونم بعدا ایمیجهای داکر را دانلود کنم. (انصافا ویرگول باید یه فکری به حال این کد بلاکها بکنه، نه رنگ دارن نه درست میشه توشون کپی پیست کرد، اگه اشتباه فاصلهگذاری داره، یه کاریش کنید)
network: ethernets: ens18: dhcp4: false addresses: - 10.10.1.15/24 routes: - to: default via: 10.10.1.1 on-link: true nameservers: addresses: - 185.51.200.2 - 178.22.122.10 version: 2
بعد هم با netplan apply تنظیمات شبکه را اعمال کنید (ممکنه لازم بشه دسترسی به فایل را محدود کنید به 600).
خان بعدی تعریف شبکه overlay هست که با دستور زیر در تعدادی ضربه انجامش میدیم:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # sysctl params required by setup, params persist across reboots cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF
بعد هم با sudo sysctl --system تغییرات را اعمال (قانون) میکنیم
در خان بعدی (نمیدونم از چندتا) باید swap را غیرفعال کنید (ظاهرا از یه نسخهای به بعد کوبرنتیز دیگه به این کار نیازی نیست ولی منابع موثق در این رابطه یافت نشد)
sudo swapoff -a (crontab -l 2>/dev/null; echo "@reboot /sbin/swapoff -a") | crontab - || true
اگه هنوز زندهاید، در خان بعدی (من که کیف میکنم) باید یه ران تایم (run time) نصب کنیم که کانتینرها را اجرا کنه. با دستور زیر این جنایت علیه بشریت را مرتکب میشم (واقعا اگه برای دستورای زیر توضیح لازمه نباید از این روش کوبرنتیز را نصب کنی، یا شاید بهتره اول بری لینوکس کار کنی؟):
sudo apt-get update -y sudo apt-get install -y software-properties-common curl apt-transport-https ca-certificates curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/deb/ /" | tee /etc/apt/sources.list.d/cri-o.list sudo apt-get update -y sudo apt-get install -y cri-o sudo systemctl daemon-reload sudo systemctl enable crio --now sudo systemctl start crio.service VERSION="v1.28.0" wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin rm -f crictl-$VERSION-linux-amd64.tar.gz
بعد باید روی تمام نودها دستور زیرو بزنی تا اجزای مشترک کوبرنتیز بین مستر و ورکر نصب بشن. قبلش فقط اینو اضافه کنم که برای دیدن آخرین نسخه کوبرنتیز کافیه بزنی apt-cache madison kubeadm | tac:
KUBERNETES_VERSION=1.29 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v$KUBERNETES_VERSION/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v$KUBERNETES_VERSION/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update -y sudo apt-get install -y kubelet kubeadm kubectl
چون کوبرنتیز موجود حساسیه، نباید بذاریم ورژنش آپدیت بشه (منطقشون منم نمیفهمه ولی همینه که هست؟). برای این کار کافیه بزنی sudo apt-mark hold kubelet kubeadm kubectl تا موقع آپدیت ورژن این چد ملعون بالا نره (آپدیت نشن نکبتیا).
بعد ... باید دستور زیرو بزنی تا به کوبلت حالی کنی IP سیستم چیه
sudo apt-get install -y jq local_ip="$(ip --json addr show eth0 | jq -r '.[0].addr_info[] | select(.family == "inet") | .local')" cat > /etc/default/kubelet << EOF KUBELET_EXTRA_ARGS=--node-ip=$local_ip EOF
تا اینجا تمام دستورا روی مستر و ورکر یکسان بود، از اینجا به بعد دیگه اینطور نیست. اول باید به سه سوال (به جز بودن یا نبودن) جواب بدی. قرار این کلاستر از بیرون قابل دسترس باشه یا داخلیه؟
اگه از بیرون قابل دسترسه: اول با (curl ifconfig.me && echo "") ببین IPت چیه (متاسفانه راستچین اینجا کار دست آدم میده، ولی کپی کنید درست میشه). بعد متغیرها محیطی زیرو تنظمیم کنی (توی ترمینا کپی پیست کن). بدیهتا باید IP ها را خودت با توجه به شبکت تنظیم کنی. دومی برای پادهاست و میتونی دستش نزنی.
IPADDR="10.10.1.15" NODENAME=$(hostname -s) POD_CIDR="192.168.0.0/16"
بعد دستور زیرو میزنی تا مستر اجرا شه
sudo kubeadm init --control-plane-endpoint=$IPADDR --apiserver-cert-extra-sans=$IPADDR --pod-network-cidr=$POD_CIDR --node-name $NODENAME --ignore-preflight-errors Swap
اگه هم که کلاستر داخلیه همون یه سه تا متغیر محیطی را تنظیم کن (این بار با هر IPای که میخوای توی شبکت باشه) و دستور زیرو میزنی
sudo kubeadm init --apiserver-advertise-address=$IPADDR --apiserver-cert-extra-sans=$IPADDR --pod-network-cidr=$POD_CIDR --node-name $NODENAME --ignore-preflight-errors Swap
دستورای بالا (هر کدوم که اجرا کردی) بهت یه دستور نمایش میدن که باید در ورکر وارد کنی تا به کلاستر (حلقه رعیتی) ملحق بشه. یه چیزی تو مایههای دستور زیره خروجی:
sudo kubeadm join 10.128.0.37:6443 --token j4eice.33vgvgyf5cxw4u8i --discovery-token-ca-cert-hash sha256:37f94469b58bcc8f26a4aa44441fb17196a585b37288f85e22475b00c36f1c61
دستورای زیرو هم ممکنه بعدش بخوای اجرا کنی برای دسترسی (خودش میگفت فکر کنم؟):
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
بعد از نصب میتونی دستورای زیرو بزنی تا اطلاعات کلاستر را ببینی و اشک بریزی:
برای دیدن نودها هم میتونی از kubectl get nodes اسنفاده کنی. اگه خواستی به کارگرهایی گه در کلاستر هستند هم اسم و القاب زشت بدی، دستور زیر هست:
kubectl label node my_node_label node-role.kubernetes.io/worker=worker
بعد از کارای بالا میتونی Calico هم برای بسری ماژولهای شبکه بهتر نصب کنی که من از خیرش میگذرم فعلا. این چیت شیت هم میذارم که ببینی چه دستورایی میشه روی کلاستر اجرا کرد. تا قسمت بعد!