توی این قسمت میریم به سراغ اینکه بررسی کنیم چطوری میتونیم یه کلاستر کوبرنتیز رو با استفاده از kubeadm ستاپ کنیم و بیاریم بالا.
خب یه مروری کنیم پستهای قبلی رو:
- دواپس چیه و چرا لازمه؟ اینجا در مورد دواپس و ضرورت استفاده از آن صحبت کردم.
- مسیر شغلی دواپس اینجا در مورد مسیر شغلی دواپس و موارد پیرامون آن صحبت کردم.
- چطور اپلیکیشن مناسب کلاد آماده کنیم؟ و اینجا توضیح دادم که چطور میتونیم یه اپلیکیشن مناسب کلاد توسعه بدیم.
- چه عمقی از لینوکس برای دواپس لازمه؟ و اینجا توضیح دادم که کدوم موارد لینوکس برای دواپس الزامی هست که اول سراغ اون موارد بریم.
- خودکارش کن، مشکلاتت حل میشه 🙂 در اینجا در مورد اتومیشن و اینکه انسیبل چیه و چه کمکی به ما میکنه صحبت کردم.
- در مسیر دواپس اینبار اجزای اصلی انسیبل تو این پست اجزای انسیبل رو معرفی کردم و آنها را شرح دادم.
- در مسیر دواپس به داکر رسیدم. (قسمت اول) تو این پست داکر رو شروع کردیم و اونو معرفی کردیم.
- در مسیر دواپس اینبار: پشت داکر چه خبره؟ (قسمت دوم) توی این پست در مورد تکنولوژی هایی که داکر ازشون استفاده میکنه توضیح دادیم.
- در مسیر دواپس اینبار: والیوم و نتورک داکر (قسمت سوم) توی این پست در مورد شبکه توی داکر و اینکه چطوری دیتای کانتینر رو میتونیم نگه داریم توضیح دادیم.
- در مسیر دواپس اینبار: داکر فایل ( قسمت چهارم ) توی این پست در مورد اینکه چطور با استفاده از داکر اپلیکیشن مون رو بیلد کنیم و ایمیج بسازیم توضیح دادیم.
- در مسیر دواپس اینبار: کامپوز فایل و داکر کامپوز (قسمت پنجم) توی این پست در مورد اینکه چطور روند دیپلوی کردن سرویسهامون و کانفیگ اونها رو به صورت کد داشته باشیم توضیح دادیم.
- در مسیر دواپس: اینبار داکر سوآرم (قسمت ششم) توی این پست در مورد داکر سوآرم و اینکه چطوری به کمک داکر چنتا سرور رو کلاستر کنیم، توضیح دادیم.
- در مسیر دواپس اینبار: دور و بری های داکر (قسمت هفتم) توی این پست در مورد ابزارهای جانبی که بهمون توی کار با داکر کمک میکنن توضیح دادیم.
- در مسیر دواپس: جمع بندی داکر (قسمت هشتم) توی این پست در مورد امنیت داکر توضیح دادیم و در آخر هم یه سری از بست پرکتیسها و تجربیات خودم رو گفتم.
- تست نوشتن و شروع مسیر CI/CD (قسمت اول) توی این پست انواع تست رو بررسی کردیم و با ابزارهای CI/CD آشنا شدیم و یه مقایسه بین گیتلب و جنکینز داشتیم.
- در مسیر CI/CD گیت رو بررسی میکنیم (قسمت دوم) توی این پست قبل ورود به گیتلب نیاز بود که گیت و ورژن کنترل سیستم ها رو یه بررسی کنیم.
- در مسیر CI/CD شناخت گیتلب (قسمت سوم) توی این پست اجزای گیتلب رو بررسی کردیم و با کامپوننتهای مختلفی که داره بیشتر آشنا شدیم.
- در مسیر CI/CD پایپلاین و رانر گیتلب (قسمت چهارم) توی این پست پایپلاین و رانر گیتلب رو بررسی کردیم.
- در مسیر CI/CD وریبل، گیتآپس و جمعبندی (قسمت پنجم) توی این پست وریبلهای گیتلب رو بررسی کردیم و یه معرفی کوتاه از گیتآپس و آتودواپس کردیم و در انتها یه مقدار تجربههای خودم رو در گیتلب باهاتون به اشتراک گذاشتم.
- مسیر Observability (قسمت اول) توی این پست معرفی observability رو داشتیم و مقایسه اش با مانیتورینگ و یه توضیح مختصر هم در مورد اپنتلهمتری دادیم.
- در مسیر 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 رو بررسی کردیم و در موردش ویژگیها و کاربردهاش توضیح دادیم.
- سی آر دی و اُپراتور (قسمت شانزدهم) توی این قسمت در مورد اینکه چطوری یه ریسورس کاستوم شده به کلاستر اضافه کنیم توضیح دادیم و مفهوم اُپراتور رو توی کوبر بررسی کردیم.
در این بلاگ پست، راهنمای گامبهگام راهاندازی یک کلاستر Kubernetes با استفاده از 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 <${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<
# apply new sysctl config
sysctl --system >/dev/null 2>&۱
بعدش برای فعال کردن این فیچرهای ترافیک 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
لطفاً به تصویر زیر مراجعه کنید و اطمینان حاصل کنید که همه این پورتها برای کنترلپلین (مستر) و ورکرها باز هستند و اونها رو در فایروال باز کنید. باید سرورهای شما دسترسی به این پورتها روی همدیگه داشته باشند.
یه کاری که میتونید بکنید این هست که نودهای کلاستر رو توی هم باز کنید! یعنی بر اساس 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 </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 : --token --discovery-token-ca-cert-hash sha256:
الان کلاستر شما نصب شده و با استفاده از دستور 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 --discovery-token-ca-cert-hash sha256:
دیگه تموم شد. میتونید از کلاستر کوبرنتیز که دارید استفاده کنید. تمام این مسیر رو هم میتونید اینجا بینید و داشته باشید.
اشکالات احتمالی در Kubeadm
در زیر، به برخی اشکالات رایجی که ممکن است حین راهاندازی با آن روبهرو شوید اشاره شده است:
- پادها با خطای کمبود رم و CPU مواجه میشوند: مطمئن شوید نود مستر حداقل ۲ vCPU و ۲ گیگابایت رم دارد.
- نودها نمیتوانند به مستر متصل شوند: بررسی کنید در فایروال، همه پورتهای مورد نیاز باز باشند و نودها بتوانند از طریق شبکه، به یکدیگر متصل شوند.
- پادهای Calico مرتب ریاستارت میشوند: معمولاً اگر آدرس IP نودها با رنج IP پادها همپوشانی داشته باشد، Calico به مشکل برمیخورد. مطمئن شوید رنج IP نود و پاد یکسان نیست.
- خطاهای دیگر پاد: برای خطاهای پاد میتوانید راهنمای عیبیابی پادها را ببینید.
اگر 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 را راهاندازی میکنید، مراحل زیر رخ میدهد:
- مرحلهی Preflight Checks: ابتدا بررسی میکند که پیشنیازهای سیستمی مهیا هستند و ایمیجهای مورد نیاز از
registry.k8s.io
دانلود میشود. - مرحلهی TLS Certificates: گواهیهای لازم ایجاد شده و در مسیر
/etc/kubernetes/pki/
ذخیره میشوند. - مرحلهی Kubeconfig Files: فایلهای kubeconfig برای مؤلفههای مختلف در مسیر
/etc/kubernetes/
تولید میشوند. - راهاندازی Kubelet: سرویس Kubelet شروع به کار میکند و پادهای استاتیک (Static Pods) برای مؤلفههای کنترلپلین را در
/etc/kubernetes/manifests/
میسازد. - اجرای مؤلفههای مستر: پادهای مستر (api-server، controller-manager و scheduler) بالا میآیند.
- نصب CoreDNS و Kubeproxy.
- ایجاد توکن: توکن راهاندازی (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های لوکال را فراهم میکند تا همه تنظیمات کلاستر را بررسی کرده و نحوه عیبیابی مؤلفههای مختلف را بیاموزید.
توی بلاگ پستهای بعدی مطالب مربوط به کوبرنتیز رو ادامه میدیم و بیشتر با هم یاد میگیریم.
مراقب خودتون باشید. 🌹🐳🌹