نوید شیرمحمدی
نوید شیرمحمدی
خواندن ۸ دقیقه·۷ ماه پیش

کوبرنتیز: 02-راه‌اندازی

در این مجموعه پست‌ها قصد دارم درباره‌ی راه‌اندازی کوبرنتیز بنویسم. میدونم که خیلی بیش از دو روز از پست قبلی میگذره ولی امیدوارم آماده کردن این پست ارزششو داشته باشه. با خوندن این پست با روش‌های مختلف راه‌اندازی کوبرنتیز آشنا میشی...بدیهتا!

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

  • مینی کیوب (Minikube): برای یادگیری و دولوپرا خوبه
  • میکرو کوبرنتیز (Mikrok8s): شرکت پشت اوبونتو پشتشه (پشت پشت = جلو؟)
  • کی تری اس (K3s): نمیدونم مخفف چیه ولی خیلی خوفه (میرسیم بهش)
  • کوبیدم :) (Kubeadm): خود توسعه دهنده‌های کوبرنتیز این روشو معرفی کردن و سخته

روش اول: Minikube

این روش برای کسایی که میخوان تازه کوبرنتیز را یاد بگیرند و دولوپرها خوبه. با این روش میتونی روی سیستم خودت (حتی اگه ویندوزه) یه نود تکی از کوبرنتیز با تمام ابزارهای لازم راه بندازی که کار master و worker را با هم میکنه. روی ویندوز کافیه پاورشل را با دسترسی ادمین باز کنی و بنویسی choco install minikube تا خودکار نرم‌افزارهای لازم نصب شن (شامل داکر و WSL هم میشه). اگه روی ویندوز نیستی یا میخوای فایل نصب را بگیری و چند بار نصب کنی، کافیه یه سر به سایتش بزنی. انقدر فرم این صفحه واضحه که نیازی به توضیح نمی‌بینم.

بعد از نصب هم کافیه اول داکر را راه بندازی (فقط روی داکر دسکتاپ کلیک کن) و با minkube start نودتو راه بندازی. برای متوقف کردنش هم از minikube stop استفاده کن. برای اینم که ببینی همه چیز اوکیه و چی نصب کردی بزن minikube kubectl --get nodes تا فهرست نودها (یدونه نود) بهت نمایش داده بشه.

اگه پلاگینی چیزی هم لازم داشتی میتونی مثل بلوک زیر راه بندازیش (مثلا ingress را باید خودت اضافه کنی چون برای کارای محلی زدن اینو و به ingress نیازی احساس نوگشته بید):

minikube addons list minikube addons enable ingress

در کل روش خوب و سر راستیه ولی دو تا مشکل داره:

  • فقط یه نود داری و اونم روی سیستم خودته
  • همه دستوراتی که انلاین برای کوبرنتیز میبینی را باید با minikube بزنی

روش دوم: Mikrok8s

این روش هم روی مک و ویندوز جواب میده و روی لینوکس‌هایی که snap داشته باشن (مثل اوبونتو). به سایتش که سر بزنی میتونی برای پلتفرم‌های مختلف (پایین صفحه) روش نصب را ببینی. نصبش روی ویندوز خیلی جذابیتی نداشت، ولی روی لینوکس کافیه توی ترمینال دستورای زیرو بنویسی (بکوپیسی):

sudo snap install microk8s --classic sudo usermod -a -G microk8s $USER newgrp microk8s

بعد از نصب دستورای زیر را میتونی اجرا کنی (خود سایتش هم چند تا دستور بامزه گفته که نگاه کنی بد نیست):

  • دیدن نودها: microk8s kubectl get nodes
  • بررسی اوضاع احوال کوبرنتیز: microk8s status
  • اضافه کردن داشبور: microk8s enable dashboard
  • اضافه کردن نود کارگر (یه دستور و تیکت میده که باید در نور کارگر بدبخت یکپیسی): microk8s add-node

این روش هم خوبه ... نه راستش این روش بر خلاف روش قبلی خیلی خوبه. یه چیزیه که میشه بهش گفت کلاستر و توی کار ازش استفاده کرد. ولی مشکلش اینه که از snap استفاده میکنه. مشکلای snap هم که اگه میدونی، میدونی.

روش سوم: K3s

اگه دو تا روش قبل خیلی برای به دلتون نچسبید، بهتون حق میدم. ولی این یکی چیز خوبیه. تو این روش یه فایل زیر (به قول بزرگان نیم-قاله-سه-چی) دانلود میکنی و بعد اجراش یه کلاستر مطابق با آخرین استانداردهای صنعتی و سنتی خواهید داشت مشتریان عزیز... . من چیزی نگم. همین تک پایینو بکوپیس تمومه (نود مستر):

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 -

روش چهارم: Kubeamd

شاید براتون سوال باشه که چرا این همه روش برای نصب کوبرنتیز هست (فقط سه تاشو گفتیم ولی این نوک چیزه...). در جواب باید گریست...چون روش اصلی نصب کوبرنتیز خیلی سخته. یعنی لیترالی سخته. و الان میخوایم ببینیم چیه. اول باید یه سرور جور کنید و پورتای زیرو در مستر بگشایید:

  • پورت‌های 64430-64439 برای API کوبرنتیز
  • پورت‌های 2379-2380 برای etcd (دیتابیس کوبرنتیز برای اینکه ثبت کنه اوضاع چطوره)
  • پورت 10250: API کوبلت (Kubelet)
  • پورت 10251: برای scheduler کوبرنتیز (میگه چه موقع، چه کارایی انجام شه)
  • پورت 10252: برای kube-controller-manager (نمیدونم چیه ولی مهمه)

همچنین در تک تک نودهای کارگر پورتای زیرو باید باز کنی:

  • پورت‌های 10250: برای API
  • پورت‌های 30000 تا 32767: وقتی پاد میاد بالا و یرویس تعریف میکنی، پورت‌ها از این بازه انتخاب میشن.

بعدش (یا قبلش) باید مطمئن بشی که 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 &quot@reboot /sbin/swapoff -a&quot) | 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 &quotdeb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/deb/ /&quot | 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=&quotv1.28.0&quot 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 &quotdeb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v$KUBERNETES_VERSION/deb/ /&quot | 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=&quot$(ip --json addr show eth0 | jq -r '.[0].addr_info[] | select(.family == &quotinet&quot) | .local')&quot cat > /etc/default/kubelet << EOF KUBELET_EXTRA_ARGS=--node-ip=$local_ip EOF

تا اینجا تمام دستورا روی مستر و ورکر یکسان بود، از اینجا به بعد دیگه اینطور نیست. اول باید به سه سوال (به جز بودن یا نبودن) جواب بدی. قرار این کلاستر از بیرون قابل دسترس باشه یا داخلیه؟

اگه از بیرون قابل دسترسه: اول با (curl ifconfig.me && echo "") ببین IPت چیه (متاسفانه راست‌چین اینجا کار دست آدم میده، ولی کپی کنید درست میشه). بعد متغیرها محیطی زیرو تنظمیم کنی (توی ترمینا کپی پیست کن). بدیهتا باید IP ها را خودت با توجه به شبکت تنظیم کنی. دومی برای پادهاست و میتونی دستش نزنی.

IPADDR=&quot10.10.1.15&quot NODENAME=$(hostname -s) POD_CIDR=&quot192.168.0.0/16&quot

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

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 po -n kube-system
  • kubectl get --raw='/readyz?verbose
  • kubectl cluster-info

برای دیدن نودها هم میتونی از kubectl get nodes اسنفاده کنی. اگه خواستی به کارگرهایی گه در کلاستر هستند هم اسم و القاب زشت بدی، دستور زیر هست:

kubectl label node my_node_label node-role.kubernetes.io/worker=worker

بعد از کارای بالا میتونی Calico هم برای بسری ماژولهای شبکه بهتر نصب کنی که من از خیرش میگذرم فعلا. این چیت شیت هم میذارم که ببینی چه دستورایی میشه روی کلاستر اجرا کرد. تا قسمت بعد!

کوبرنتیزدواپسkubernetesk8sلینوکس
شاید از این پست‌ها خوشتان بیاید