ویرگول
ورودثبت نام
احمد رفیعی
احمد رفیعیمشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
احمد رفیعی
احمد رفیعی
خواندن ۱۹ دقیقه·۱۰ ماه پیش

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

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

Kubernetes installation with kubeadm
Kubernetes installation with kubeadm

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

  • دواپس چیه و چرا لازمه؟  اینجا در مورد دواپس و ضرورت استفاده از آن صحبت کردم.

  • چطور اپلیکیشن مناسب کلاد آماده کنیم؟ و اینجا توضیح دادم که چطور می‌تونیم یه اپلیکیشن مناسب کلاد توسعه بدیم.

  • چه عمقی از لینوکس برای دواپس لازمه؟ و اینجا توضیح دادم که کدوم موارد لینوکس برای دواپس الزامی هست که اول سراغ اون موارد بریم.

  • خودکارش کن,مشکلاتت حل میشه در اینجا در مورد اتومیشن و اینکه انسیبل چیه و چه کمکی به ما می‌کنه صحبت کردم.

  • در مسیر دواپس اینبار اجزای اصلی انسیبل تو این پست اجزای انسیبل رو معرفی کردم و آنها را شرح دادم.

  • در مسیر دواپس به داکر رسیدیم (قسمت اول) تو این پست داکر رو شروع کردیم و اونو معرفی کردیم.

  • در مسیر دواپس اینبار: پشت داکر چه خبره؟ (قسمت دوم) توی این پست در مورد تکنولوژی هایی که داکر ازشون استفاده میکنه توضیح دادیم.

  • تست نوشتن و شروع مسیر CI/CD (قسمت اول) توی این پست انواع تست رو بررسی کردیم و با ابزارهای CI/CD آشنا شدیم و یه مقایسه بین گیت‌لب و جنکینز داشتیم.

  • در مسیر CI/CD گیت رو بررسی می‌کنیم (قسمت دوم) توی این پست قبل ورود به گیت‌لب نیاز بود که گیت و ورژن کنترل سیستم ها رو یه بررسی کنیم.

  • در مسیر ‌CI/CD شناخت گیت‌لب (قسمت سوم) توی این پست اجزای گیت‌لب رو بررسی کردیم و با کامپوننت‌های مختلفی که داره بیشتر آشنا شدیم.

  • در مسیر ‌CI/CD پایپ‌لاین و رانر گیت‌لب (قسمت چهارم) توی این پست پایپ‌لاین و رانر گیت‌لب رو بررسی کردیم.

  • در مسیر CI/CD وریبل، گیت‌آپس و جمع‌بندی (قسمت پنجم) توی این پست وریبل‌های گیت‌لب رو بررسی کردیم و یه معرفی کوتاه از گیت‌آپس و آتودواپس کردیم و در انتها یه مقدار تجربه‌های خودم رو در گیت‌لب باهاتون به اشتراک گذاشتم.

  • در مسیر 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 (قسمت هجدهم) توی این قسمت نحوه نصب کلاستر با یه پروژه خیلی خوب به نام کیوب اسپری که یه انسیبل خفن برای ستاپ کلاستر رائه میده رو توضیح دادیم.

  • نصب کلاستر با rancher (قسمت نوزدهم) توی این قسمت توضیح دادیم که چطور با استفاده از ابزار RKE یک کلاستر کوبرنتیز راه‌اندازی کنیم.


در این بلاگ پست، راهنمای گام‌به‌گام راه‌اندازی یک کلاستر Kubernetes با استفاده از Kubeadm را ارائه داده‌ام.

kubeadm
kubeadm

ابزار Kubeadm ابزاری فوق‌العاده برای راه‌اندازی سریع یک کلاستر Kubernetes است. این ابزار، تمام کارهای سنگین مربوط به تنظیم مؤلفه‌های کلاستر Kubernetes را انجام می‌دهد و همچنین از بهترین شیوه‌های پیکربندی کلاستر پیروی می‌کند. به صورت اختصار kubernetes admin هست که کمک می‌کنه تا به راحتی کلاستر ستاپ کنیم. فقط تو ستاپ کمک نمی‌کنه بلکه در ادامه‌ی نگهداری کلاستر هم بهمون کمک می‌کنه. مثلا اگر بخواهیم نود اضافه کنیم یا به روز رسانی انجام بدیم کنار دستمون هست تا بتونیم به راحتی هر کاری که لازم است رو باهاش انجام بدیم.

ابزار Kubeadm چیست؟

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

این ابزار توسط کامیونیتی رسمی Kubernetes توسعه و نگهداری می‌شود. ابزارهای دیگری مانند Minikube و Kind نیز هستند که به‌صورت ساده‌تر و با نیازمندی سخت‌افزاری کمتر، کلاستر Kubernetes راه‌اندازی می‌کنند که توی این بلاگ پست در موردشون توضیح دادیم و اینجا هم می‌تونید بیشتر در موردشون بخونید ولی این ابزارها بیشتر برای تست اپلیکیشن‌ها روی Kubernetes مفید هستند و همواره تو استیج و آرمایشگاه‌ها از آنها استفاده می‌شود. اما kubeadm به ما این امکان رو می‌دهد که کلاستر در سطح پروداکشن ستاپ و نگهداری کنیم.

اما اگر قصد دارید با مؤلفه‌های کلاستر عمیق‌تر آشنا شوید یا ابزارهایی که مرتبط با مدیریت کلاستر هستند را آزمایش کنید، Kubeadm بهترین انتخاب خواهد بود و میتونید برای ستاپ کردن یه کلاستر production ready ازش استفاده کنید.

بررسی پیش‌نیازهای راه‌اندازی

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

۲. نود مستر باید حداقل ۲ vCPU و ۲ گیگابایت رم داشته باشد. نود ورکر می‌تونه کمتر از این هم داشته باشه ولی بهتره که همین مقدار باشه.

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

نصب یه سری tools اولیه روی نودها

خوبه که قبل از هر هرکاری سرورهامون رو آپدیت کنیم و hardening (مجموعه‌ کارهایی که امنیت سرور رو افزایش می‌دهد) و tuning (مجموعه‌ کارهایی که کارایی سرور را افزایش می‌دهد) اونها رو انجام بدیم، که معمولا این کار رو با انسیبل انجام میدن. بعدش یه سری ابزار اولیه رو به شکل زیر نصب می‌کنیم:

apt install -y wget git vim bash-completion curl htop net-tools dnsutils \ atop sudo software-properties-common telnet axel jq iotop \ ca-certificates curl gnupg lsb-release apt-transport-https gpg

توی مرحله بعدی باید کانتینر ران‌تایم موردنظرمون رو نصب کنیم. لازمه که اینجا یادآوری کنم داکر کانتینر ران‌تایم نیست و خود داکر از کانتینر‌دی برای کانتینر ران‌تایم داره استفاده می‌کنه. در ادامه دستورات مربوط به نصب و کانفیگ Containerd رو براتون میذارم:

ابتدا GPG key رسمی داکر را به شکل زیر به کلیدهای apt اضافه می‌کنیم.

sudo mkdir -p /etc/apt/keyrings && sudo chmod -R 0755 /etc/apt/keyrings
curl -fsSL "https://download.docker.com/linux/debian/gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

اگه توی ایران هستید و این دستور کرل اذیت میکنه باید از یه طریق مطمئن اون کلید رو با روش‌هایی که هر ایرانی بلده، بردارید و توی اون مسیر قرار بدید یا یه جایی که بشه ازش گرفت برای خودتون بذارید صرفا برای مثال به این شکل میشه فرآیند بعدش:

curl -fsSL "https://store.dockerme.ir/Software/docker.gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg

بعدشم مخزن داکر رو به لیست مخزن‌های apt اضافه کنید.

chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bullseye stable" > /etc/apt/sources.list.d/docker.list # Check docker repository cat /etc/apt/sources.list.d/docker.list

اگه ایرانی هستی و میخوای از ریپوزیتوری‌هایی استفاده کنی که تحریم نباشه این مدلی میزنی برای مثال کامند این قسمت رو به جای روش بالا:

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://repo.mecan.ir/repository/debian-docker bookworm stable" > /etc/apt/sources.list.d/docker.list
# Check docker repository cat /etc/apt/sources.list.d/docker.list

نهایتا containrerd رو نصب می‌کنیم و سرویسش رو استارت می‌کنیم.

sudo apt update # Install containerd service sudo apt install containerd.io # Start and enable Containerd service sudo systemctl enable containerd sudo systemctl restart containerd sudo systemctl status containerd

بعدش کانفیگش رو انجام می‌دیم و درایور Cgroup رو عوض می‌کنیم.

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# Change Cgroup driver sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# Check Cgroup driver sudo cat /etc/containerd/config.toml | grep SystemdCgroupsudo apt-get update
# Restart Containerd service sudo systemctl restart containerd sudo systemctl status containerd

مجدد اگه ایرانی هستی و نیاز داری برای containerd رجیستری میرور ست کنی اینجوریه👇🏼

توی همون فایل config.toml که داره بعد از اینکه پترن پلاگین هارو دیدی مثل این:

[plugins."io.containerd.grpc.v1.cri".registry.mirrors]

زیرش موارد زیر رو اضافه می‌کنید برای مخزن های مختلف:

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://hub.mecan.ir"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"] endpoint = ["https://k8s.mecan.ir"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"] endpoint = ["https://quay.mecan.ir"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."mirror.gcr.io"] endpoint = ["https://gcr.mecan.ir"]

اگر هم نیاز دارید که http proxy ست کنید براش میتونید اینجوری انجامش بدید:

# Check and create directory path DIR_PATH=/etc/systemd/system/containerd.service.d [ -d "${DIR_PATH}" ] || sudo mkdir "${DIR_PATH}"
# Create config file cat <<EOF >${DIR_PATH}/http-proxy.conf [Service] Environment="HTTP_PROXY=http://HTTP_PROSY_DOMAIN:PORT" Environment="HTTPS_PROXY=http://HTTP_PROSY_DOMAIN:PORT" Environment="NO_PROXY=localhost,127.0.0.1,10.233.0.0/18,10.233.64.0/18,.mecan.ir" EOF
# Check config file cat ${DIR_PATH}/http-proxy.conf

بعد از همه اینها هم یه ریلود و یه ری استارت لازمه تا چنج‌ کانفیگ‌هاتون اعمال شه و بریم مرحله بعدی:

sudo systemctl daemon-reload sudo systemctl restart containerd sudo systemctl status containerd

نصب و کانفیگ ابزارهای کوبرنتیز و پیش‌نیازهاشون روی تمام سرورها

ازونجایی که kube-proxy برای کار کردن به پکت فیلترینگ نیاز داره و تو این مستند ما مودش رو iptables قرار می‌دیم، این متغیرهای کرنلی زیر رو هم بایستی ست کنید:

cat >>/etc/sysctl.d/kubernetes.conf<<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
# apply new sysctl config sysctl --system >/dev/null 2>&1

بعدش برای فعال کردن این فیچرهای ترافیک bridge ماژول br-netfilter رو لود می‌کنیم:

modprobe br_netfilter

برای اینکه کوبرنتیز بتونه بهتر فیچرهای memory management که داره رو اجرایی کنه swap رو برمیداریم:

# Disable swap in fstab file sed -i '/swap/d' /etc/fstab
# off swap swapoff -a

در قدم بعدی میریم سراغ اضافه کردن مخزن‌ها و نهایتا نصب ابزارهای کوبرنتیز:

ابتدا نصب چنتا ابزار لینوکسی که نیازمون میشه:

sudo apt-get update # apt-transport-https may be a dummy package; if so, you can skip that package sudo apt-get install -y apt-transport-https ca-certificates curl gpg

اضافه کردن کلید مخزن‌ها به apt:

# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below. # sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# OR Download from Store.DockerMe.ir curl -fsSL https://repo.mecan.ir/repository/apt-kube/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# Check gpg key sudo ls -alh /etc/apt/keyrings/kubernetes-apt-keyring.gpg

اضافه کردن مخزن کوبرنتیز به لیست مخازن apt:

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# Check kubernetes repo cat /etc/apt/sources.list.d/kubernetes.list
# Update your repository apt-get update -y

مجدد اگه ایرانی هستی و نیاز داری که مخزن میرور ست کنی میشه یه چیزی شبیه این:

# for kubernetes 1.30 echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://repo.mecan.ir/repository/apt-kube/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# Update your repository cat /etc/apt/sources.list.d/kubernetes.list
# Update your repository apt-get update

چک نهایی و نصب kubelet و kubectl و kubeadm :

# check package version: apt-cache policy kubelet kubectl kubeadm
# install kubernetes tools: sudo apt-get install -y kubelet kubeadm kubectl
# check install versions: kubelet --version kubeadm version kubectl version

نکته مهم اینجا این هست که پکیج‌هایی که نصب می‌کنید رو hold کنید تا بعدا ناخواسته ورژن اونها رو عوض نکنید، مگر اینکه در حال آپدیت نود باشید و خودتون بدونید که دارید چیکار می‌کنید. اگر اونها رو hold نکنید و ریپوی جدید کوبرنتیز رو داشته باشید با هر آپدیت سیستم‌عامل نسخه‌ی جدید‌ترش نصب می‌شه که اگر حواستون نباشه اذیتتون می‌کنه.

sudo apt-mark hold kubelet kubeadm kubectl

سرویس kubelet رو enable و استارت می‌کنیم:

systemctl enable kubelet systemctl start kubelet systemctl status kubelet

کانفیگ crictl رو هم انجام میدیم که بتونیم در صورت نیاز از کامندش استفاده کنیم:

cat << EOF > /etc/crictl.yaml runtime-endpoint: "unix:///run/containerd/containerd.sock" timeout: 0 debug: false EOF
# Check config file cat /etc/crictl.yaml
# check crictl command and mirror containerd registry crictl info

باید تو این قسمت میرور‌ها و کانفیگ‌هایی که قبلا برای کانتینردی انجام دادیم رو بتونیم ببینیم.

نیازمندی‌های پورت در Kubeadm

لطفاً به تصویر زیر مراجعه کنید و اطمینان حاصل کنید که همه این پورت‌ها برای کنترل‌پلین (مستر) و ورکرها باز هستند و اون‌ها رو در فایروال باز کنید. باید سرورهای شما دسترسی به این پورت‌ها روی هم‌دیگه داشته باشند.

k8s ports
k8s ports

یه کاری که میتونید بکنید این هست که نودهای کلاستر رو توی هم باز کنید! یعنی بر اساس ip توی فایروال دسترسی نودهای خود کلاستر رو به همدیگه اکسپت کنید به شکل زیر مثلا یه سری rule رو توی etc/iptables/rules.v4/ به صورت persist اضافه می‌کنیم. البته که با توجه به نکات امنیتی که رعایت می‌کنید ممکنه این کار برای شما مناسب نباشه. از این رو اگر فقط پورت‌ها رو هم باز کنید کافی هست. نکته‌ی دیگه این که این دسترسی‌ها رو تو تمام نودها باید ایجاد کنید.

iptables -A INPUT -s ${master1_ip} -j ACCEPT -m comment --comment "The Trusted ${master1_name}" iptables -A INPUT -s ${master2_ip} -j ACCEPT -m comment --comment "The Trusted ${master2_name}" iptables -A INPUT -s ${master3_ip} -j ACCEPT -m comment --comment "The Trusted ${master3_name}" iptables -A INPUT -s ${worker1_ip} -j ACCEPT -m comment --comment "The Trusted ${worker1_name}" iptables -A INPUT -s ${worker2_ip} -j ACCEPT -m comment --comment "The Trusted ${worker2_name}"

بالای سر api-server ها باید یه لودبالانسر بذاریم که تا زمان استفاده از کلاستر HA داشته باشیم، اینجا یه داکیومنت گذاشتم که میتونید با استفاده ازش این کار رو انجام بدید. چون می‌خواهیم کلاستر HA داشته باشیم و ۳ تا مستر داریم لازم داریم با استفاده از لودبالانسر همواره به مستر درست برسیم.

خب حالا دیگه آماده شدیم تا کانفیگ kubeadm رو انجام بدیم و کلاستر رو ایجاد کنیم، ابتدا وریبل های زیر رو طبق کلاستر خودتون اضافه کنید:

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

# set specific variables content vip_ip=192.168.200.10 master1_ip=192.168.200.11 master2_ip=192.168.200.12 master3_ip=192.168.200.13 domain_name=mecan.ir master1_name=master1 master2_name=master2 master3_name=master3 vip_api_name=vip.kubeadm

و در مرحله بعدی دستورات زیر رو بزنید تا فایل کانفیگ kubeadm ایجاد شود:

cat <<EOT >/opt/kubeadm_config.yml apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: ${master1_ip} bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock imagePullPolicy: IfNotPresent name: ${master1_name} taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s extraArgs: authorization-mode: "Node,RBAC" certSANs: - "${vip_ip}" - "${master1_ip}" - "${master2_ip}" - "${master3_ip}" - "${master1_name}" - "${master2_name}" - "${master3_name}" - "${vip_api_name}" - "${vip_api_name}.${domain_name}" - "${master1_name}.${domain_name}" - "${master2_name}.${domain_name}" - "${master3_name}.${domain_name}" apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes etcd: local: imageRepository: "quay.io/coreos" imageTag: "v3.5.9" dataDir: "/var/lib/etcd" serverCertSANs: - "${master1_ip}" - "${master2_ip}" - "${master3_ip}" - "${vip_ip}" - "${master1_name}" - "${master2_name}" - "${master3_name}" - "${vip_api_name}" - "${vip_api_name}.${domain_name}" - "${master1_name}.${domain_name}" - "${master2_name}.${domain_name}" - "${master3_name}.${domain_name}" peerCertSANs: - "${master1_ip}" - "${master2_ip}" - "${master3_ip}" - "${vip_ip}" - "${master1_name}" - "${master2_name}" - "${master3_name}" - "${vip_api_name}" - "${vip_api_name}.${domain_name}" - "${master1_name}.${domain_name}" - "${master2_name}.${domain_name}" - "${master3_name}.${domain_name}" imageRepository: registry.k8s.io kind: ClusterConfiguration kubernetesVersion: 1.30.5 controlPlaneEndpoint: "${vip_api_name}.${domain_name}:6443" networking: dnsDomain: cluster.local serviceSubnet: "10.233.0.0/18" podSubnet: "10.233.64.0/18" --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOT
# check kubeadm config file cat /opt/kubeadm_config.yml

فایل این کانفیگ رو می‌تونید از اینجا دانلود کنید.

قبل از اینکه کلاستر رو ایجاد کنید خوبه که ایمیج‌هایی که لازم هست رو اول دریافت کنید. مخصوصا اگه توی ایران هستید و دریافت ایمیج‌ها ممکن اذیت کننده بشه، به این صورت میتونید لیست ایمیج‌ها رو بگیرید و اونها رو pull کنید:

kubeadm config images list --config /opt/kubeadm_config.yml
kubeadm config images pull --config /opt/kubeadm_config.yml

نهایتا با زدن دستور زیر ایجاد اولیه کلاستر رو شروع می‌کنید:

kubeadm init --config /opt/kubeadm_config.yml

ابزار kubeadm ابتدا یه سری precheck هارو انجام میده تا مطمئن شه که سرور آماده ران کردن کوبرنتیز هست، این precheckها ممکنه یه سری وارنینگ بده و یا به یه سری ارور بخوره و exit کنه اما نهایتا اگه مشکلی نباشه کامپوننت‌های control plane رو نصب میکنه و نهایتا یه پیامی شبیه این رو بهمون نشون میده:

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

با استفاده از دستورات زیر میتونید کانفیگ kubectl که روی مستر اول تون ایجاد شده رو بردارید و بعدش برای استفاده راحت تر حتما بهتون توصیه می‌کنم که bash-completion رو اضافه کنید و همچنین میتونید اینجا و اینجا چیزای خیلی خوبی برای برای حرفه‌ای تر کردن کامندلاین تون برای کار با کوبرنتیز پیدا کنید.

calico
calico

الان کلاستر شما نصب شده و با استفاده از دستور kubectl می‌تونید وضعیت اون رو چک کنید. اگر لیست کل پادها رو بگیرید می‌بینید که پادهای coredns تو حالت pending مونده که به دلیل نبود CNI هست. یکی از کارهایی که CNI برای ما انجام می‌‌ده اینه که به پادهای ما IP می‌ده. پادهای Coredns منتظر گرفتن IP هستند. پس بریم سراغ نصب CNI روی کلاستر کوبرنتیز که آماده کردیم.

در ادامه میمونه نصب CNI و اضافه کردن باقی‌ نودها به کلاستر که به صورت زیر انجام‌شون میدیم:

# install calico CNI: kubectl create -f https://docs.tigera.io/calico/latest/manifests/calico.yaml
# check calico pods on kube-system namespace: kubectl -n kube-system get pod | grep calico

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

# copy certificate directory to localhost: scp -r adm-master1:/etc/kubernetes/pki .
# copy certificate directory to master2 and master3: scp -r pki adm-master2:/etc/kubernetes/ scp -r pki adm-master3:/etc/kubernetes/

دستور گرفتن کامند Join برای اضافه کردن نود بعدی به کلاستر رو هم در ادامه براتون میذارم، دقت کنید که اگر نود مستر میخواید اضافه کنید یه سوئیچ control-plane-- هم بهش اضافه کنید.

# create join command: kubeadm token create --print-join-command
# sample output: kubeadm join 37.32.9.196:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

دیگه تموم شد. می‌تونید از کلاستر کوبرنتیز که دارید استفاده کنید. تمام این مسیر رو هم می‌تونید اینجا بینید و داشته باشید.


kubeadm error
kubeadm error


اشکالات احتمالی در Kubeadm

در زیر، به برخی اشکالات رایجی که ممکن است حین راه‌اندازی با آن روبه‌رو شوید اشاره شده است:

  1. پادها با خطای کمبود رم و CPU مواجه می‌شوند: مطمئن شوید نود مستر حداقل ۲ vCPU و ۲ گیگابایت رم دارد.

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

  3. پادهای Calico مرتب ری‌استارت می‌شوند: معمولاً اگر آدرس IP نودها با رنج IP پادها همپوشانی داشته باشد، Calico به مشکل برمی‌خورد. مطمئن شوید رنج IP نود و پاد یکسان نیست.

  4. خطاهای دیگر پاد: برای خطاهای پاد می‌توانید راهنمای عیب‌یابی پادها را ببینید.

اگر CPU سرور مستر کمتر از ۲ هسته باشد، ممکن است خطای زیر را ببینید:

[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

اگر از پارامتر --apiserver-advertise-address با IP عمومی استفاده کنید، ممکن است کامپوننت‌های مستر با خطای زیر روبه‌رو شوند:

timed out waiting for the condition

برای رفع مشکل در IP عمومی، از پارامتر --control-plane-endpoint استفاده کنید.

در صورتی که پس از ریست‌کردن مستر با دستور kubeadm reset، با یک توکن جدید قصد دارید نود ورکر را Join کنید و خطای زیر را بگیرید، با دستور kubeadm reset روی ورکر مشکل را حل کنید:

[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists [ERROR Port-10250]: Port 10250 is in use [ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists

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

ابزار Kubeadm چگونه کار می‌کند؟

زمانی که با دستور kubeadm init یک کلاستر Kubernetes را راه‌اندازی می‌کنید، مراحل زیر رخ می‌دهد:

  1. مرحله‌ی Preflight Checks: ابتدا بررسی می‌کند که پیش‌نیازهای سیستمی مهیا هستند و ایمیج‌های مورد نیاز از registry.k8s.io دانلود می‌شود.

  2. مرحله‌ی TLS Certificates: گواهی‌های لازم ایجاد شده و در مسیر /etc/kubernetes/pki/ ذخیره می‌شوند.

  3. مرحله‌ی Kubeconfig Files: فایل‌های kubeconfig برای مؤلفه‌های مختلف در مسیر /etc/kubernetes/ تولید می‌شوند.

  4. راه‌اندازی Kubelet: سرویس Kubelet شروع به کار می‌کند و پادهای استاتیک (Static Pods) برای مؤلفه‌های کنترل‌پلین را در /etc/kubernetes/manifests/ می‌سازد.

  5. اجرای مؤلفه‌های مستر: پادهای مستر (api-server، controller-manager و scheduler) بالا می‌آیند.

  6. نصب CoreDNS و Kubeproxy.

  7. ایجاد توکن: توکن راه‌اندازی (Bootstrap Token) برای نودهای ورکر تولید می‌شود تا به کنترل‌پلین متصل شوند.

بدین ترتیب، همه پیکربندی‌های اصلی در مسیر /etc/kubernetes/ قرار می‌گیرد.

چند سوال متداول:

۱. چگونه از CA سفارشی در Kubeadm استفاده کنیم؟
به‌صورت پیش‌فرض، kubeadm گواهی‌های CA مخصوص خود را ایجاد می‌کند. اما اگر بخواهید از CA سفارشی استفاده کنید، فایل‌های گواهی‌تان باید در مسیر /etc/kubernetes/pki/ قرار داشته باشند. وقتی kubeadm فایل‌های گواهی را در آنجا بیابد، دیگر آن‌ها را بازنویسی نخواهد کرد.

۲. چگونه دستور Kubeadm Join را مجدداً تولید کنیم؟
کافی است از دستور زیر استفاده کنید:

kubeadm token create --print-join-command

در این مطلب، نحوه نصب Kubernetes را به‌صورت قدم‌به‌قدم با Kubeadm یاد گرفتیم.

برای یک مهندس DevOps، درک اجزای کلاستر Kubernetes اهمیت زیادی دارد. در حالی که بسیاری از شرکت‌ها از سرویس‌های مدیریت‌شده (Managed Kubernetes) استفاده می‌کنند، یادگیری مؤلفه‌های پایه‌ای و مبانی Kubernetes، ضروری است.

راه‌اندازی Kubeadm برای یادگیری و تمرین مناسب است. همچنین قابلیت آزمایش روی VMهای لوکال را فراهم می‌کند تا همه تنظیمات کلاستر را بررسی کرده و نحوه عیب‌یابی مؤلفه‌های مختلف را بیاموزید.

توی بلاگ پست‌های بعدی مطالب مربوط به کوبرنتیز رو ادامه میدیم و بیشتر با هم یاد می‌گیریم.

مراقب خودتون باشید. 🌹🐳🌹



با ما متخصص شوید.
با ما متخصص شوید.


خوبه که داکرمی رو تو جاهای مختلف فالو کنید. پذیرای نظرات شما هستیم.

🫀 Follow DockerMe 🫀

🔔 Follow YouTube 🔔

📣 Follow Instagram 📣

🖇 Follow LinkedIn DockerMe🖇

🔎 Follow Linkedin Ahmad Rafiee 🔎

🕊 Follow Twitter 🕊

kubernetesکوبرنتیز
۵
۰
احمد رفیعی
احمد رفیعی
مشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
شاید از این پست‌ها خوشتان بیاید