در این مستند به روز رسانی کلاستر کوبرنتیز رو با استفاده از kubeadm بررسی میکنیم. قبلا در یه بلاگ پست اهمیت به روز رسانی کوبرنتیز رو بررسی کردیم و در اینجا نحوهی به روز رسانی رو با استفاده از 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 یک کلاستر کوبرنتیز راهاندازی کنیم.
. بررسی نسخه فعلی
قبل از شروع بهروزرسانی، لازم است که بدانید چه نسخهای از کوبرنتیز در حال حاضر در سیستم شما اجرا میشود. برای این کار از دستورات زیر استفاده کنید:
kubectl version
kubectl get node
این دستور نسخهی فعلی کوبرنتیز رو به شما نشان میدهد. نسخهای که روی کلایند و سرورها نصب شده است. با لیست گرفتن نودها هم میتونید نسخهی kubelet روی نودها رو بدست آورید.
۲. تعیین نسخه جدید:
برای بررسی اینکه چه نسخههایی از کوبرنتیز در دسترس و قابل بهروزرسانی هستند، میبایست به مستندات رسمی کوبرنتیز مراجعه کنید. اینکه چه نسخهای در دسترس است و کدام نسخه بهترین انتخاب برای بهروزرسانی میباشد رو با توجه به مستندات کوبرنتیز بدست بیاورید. با توجه به روش نصب ابزارهای کوبرنتیز که از apt دارید استفاده میکنید یا باینری آنها رو دانلود و نصب کردید میتونید لیست نسخههای در دسترس رو بدست بیاورید.
با دستور زیر با توجه به ریپوزیتوری که اضافه کردید میتونید نسخههای در دسترس رو بررسی کنید:
apt-cache policy kubeadm
. برنامهریزی بهروزرسانی:
برنامهریزی دقیق بهروزرسانی یکی از کلیدهای موفقیت است. موارد زیر را در نظر بگیرید:
- مطالعهی کامل و با دقت Release note: حتما به دقت و با صبر و حوصله ریلیز نوت رو بخونید و از تغییرات که اتفاق میافتد مطلع باشید.
- زمان مناسب: بهترین زمان برای بهروزرسانی، زمانی است که بار کاری کم است. یا اونقدر نود در دسترس دارید که با کم کردن یک یا چند تا نود اختلالی در فرآیند سرویسدهی شما پیش نمیآید.
- پشتیبانگیری: حتماً از دادهها و پیکربندیهای سیستم خود پشتیبان بگیرید. حتما از etcd بکاپ بگیرید.
- آزمون در محیطهای غیر از پروداکشن: اگر امکانش هست، بهروزرسانی را ابتدا در محیطهای غیر پروداکشن (Development/Staging) امتحان کنید. این خیلی میتونه کمک کنه که فرآیند رو بهینه و بدون ریسک پیش ببرید.
- بررسی وضعیت swap: حتما بررسی و چک کنید که swap غیر فعال باشد. گاهی پیش میآید بعد از ریبوت کردن مجدد swap فعال میشود و به خطا میخورید. حتما چک کنید که swap داخل fstab غیر فعال باشد.
- بررسی میزان منابع خالی کلاستر: همواره قبل از بهروز رسانی بررسی کنید که میزان مناسب منابع خالی داخل کلاستر وجود داشته باشد تا در حین به روز رسانی با مشکل مواجه نشویم.
. بهروزرسانی نود کنترل کننده (Control Plane)
معمولا به روزرسانی رو از یکی از مسترنودها شروع میکنیم. در این روش ابتدای یکی از مسترنودها رو به روز کرده و پس از اطمینان از صحت عملکرد آن به سراغ نودهای دیگه میرویم. پس ابتدا یکی از مستر نودها رو برای شروع بهروزرسانی انتخاب میکنیم.
خالی کردن نود مستر اول:
قبل از بهروزرسانی نود کنترل کننده، حتما آن را drain کنید تا پادها و ورکلودهایی که روی آن دیپلوی شده است خالی شود و جای دیگری دیپلوی شوند.
kubectl drain --ignore-daemonsets --delete-emptydir-data
این دستور به شما این امکان را میدهد که نود را خالی کنید و به سادگی کارهای ناخواسته را متوقف کنید.
به روز کردن kubeadm داخل نود مستر:
قبل از شروع باید نسخهی kubeadm نود مستر رو به نسخهای که داریم ارتقا دهیم. دقیقا همون نسخهای که میخواهیم به روز کنیم. برای این کار ابتدا kubeadm رو از hold خارج کنید و سپس آن را بهروز کنید. البته اینجا داریم روشی رو بررسی میکنیم که از apt شما استفاده میکنید در صورتی که باینری آن را نصب کردید از همون روش برای نصب نسخهی جدید ادغام کنید.
## replace x in 1.28.x-* with the latest patch version
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=’1.28.x-*’ && \
apt-mark hold kubeadm
قبلا کوبرنتیز یه ریپوزیتوری برای apt داشت که همهی نسخهها داخلش بود. این ریپو میتونست مشکلاتی ایجاد کنه مثلا اگر ابزارهای کوبرنتیز رو hold نکرده بودیم و سیستم عامل رو به روز میکردیم مجموعهی ابزارهای ما هم همگی به روز میشدند و این موضوع مخاطرات زیادی برای ما به همراه داشت. تو ریپوزیتوریهای جدید این طوری هست که هر کدوم فقط یک نسخهی mirror رو پوشش میدهد. تنها همون نسخه به همراه تمام patchهایی که دارد را پوشش میدهد.
پس از به روز کردن نسخهی جدید ابزار keubadm داخل نود مستر با استفاده از دستور زیر فرآیند آپگرید نود رو بررسی میکنیم.
kubeadm upgrade plan
این دستور جزئیات مربوط به نسخه جدید و نودها را نمایش میدهد.
بهروزرسانی نود کنترل کننده:
پس از بررسی بهروزرسانی حال از دستور زیر برای اعمال بهروزرسانی استفاده کنید:
kubeadm upgrade apply v1.28.x
حتما نسخهای که میخواهید سمت آن بروید رو انتخاب کنید.
بعد از به روز رسانی احتمالا همچنین خروجی رو خواهید دید.
[upgrade/successful] SUCCESS! Your cluster was upgraded to “v1.28.x”. Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven’t already done so.
به روز کردن مابقی ابزارهای داخل نود:
پس از اتمام به روز رسانی ابزارهای kubelet و kubectl رو به روز کنید. برای این کار همانند آپدیت kubeadm رفتار میکنیم.
# replace x in 1.28.x-* with the latest patch version
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet='1.28.x-*' kubectl='1.28.x-*' && \
apt-mark hold kubelet kubectl
بازنشانی نود کنترل کننده:
پس از بهروزرسانی موفق، kubelet را مجدداً راهاندازی کنید و با بررسی لاگ از صحت عملکرد آن اطمینان حاصل کنید.
systemctl restart kubelet
systemctl status kubelet
پس از این مرحله مجدد نود مستر را در مدار بیاورید و سعی کنید با تستهایی که دارید از صحت عملکرد نود و کامپوننتهای داخل آن اطمینان کسب کنید.
kubectl uncordon
. بهروزرسانی نودهای دیگر (Worker Nodes)
بعد از بهروزرسانی نود کنترل کنندهی اول سراغ نودهای مستر دیگه و پس از آن به سراغ نودهای ورکر بروید. ادامهی روند به این صورت است که ابتدا نود رو drain کرده و پس از آن kubeadm را به روز میکنید و پس از آن upgrade رو انجام بدید و پس از آن که همه چی به خوبی پیش رفت نود رو uncordon کرده و آن را تست کنید.
خالی کردن نود:
نود مورد نظر را ابتدا drain کنید.
kubectl drain --ignore-daemonsets --delete-emptydir-data
بهروزرسانی kubeadm نود:
از دستورات زیر برای بهروزرسانی kubeadm نود استفاده کنید.
## replace x in 1.28.x-* with the latest patch version
apt-mark unhold kubeadm && \
apt-get update && apt-get install -y kubeadm=’1.28.x-*’ && \
apt-mark hold kubeadm
و پس از آن نود رو با استفاده از دستور زیر به روز کنید:
kubeadm upgrade node
پس از نهایی شدن به روز رسانی مابقی ابزارها رو به روز کنید.
# replace x in 1.28.x-* with the latest patch version
apt-mark unhold kubelet kubectl && \
apt-get update && apt-get install -y kubelet='1.28.x-*' kubectl='1.28.x-*' && \
apt-mark hold kubelet kubectl
و پس از آن سرویس kubelet رو ریست کنید و از عملکرد آن اطمینان کسب کنید.
systemctl restart kubelet
systemctl status kubelet
بازنشانی نود:
پس از بهروزرسانی موفق، نودها را داخل کلاستر فعال کنید.
kubectl uncordon
۶. بررسی وضعیت پس از آپگرید
پس از اتمام بهروزرسانی، باید وضعیت سیستم را بررسی کنید:
kubectl get nodes
kubectl get pods --all-namespaces
اطمینان حاصل کنید که همه پادها در وضعیت Running هستند و نودها بهدرستی کار میکنند. بهتره که همواره اسکریپت و ابزارهای تست داشته باشید تا بتونید همه چیز رو باهاش تست کنید. بهتون توصیه میکنم که اگر end to end تست ندارید حتما smoke test داشته باشید که با طی کردن مراحلی از صحت عملکرد کلاستر و سرویسهای آن اطمینان کسب کنید. Smoke test فرآیندی است که موارد ضروری داخل کلاستر رو با استفاده از آن تست و بررسی میکنیم.
نکتهی مهم:
- این فرآیند تنها کوبرنتیز و ابزارهای آن را به روز میکند. همواره باید حواسمون به روزرسانی add-onsها همانند ingress و cert-manager و موارد دیگه باشیم.
- لازمه که دقت کنیم پلاگینهای کوبرنتیز همانند CNI, CRI و CSI رو نیز به روز کنیم. به روزرسانی آنها مستقل از به روز رسانی کوبرنتیز است.
- به روز رسانی سیستم عامل رو هم فراموش نکنید. زمانی که نود رو از دسترس خارج میکنید بهترین زمان است که سیستم عامل نودها رو هم به روز کنید. دقت کنید که حتما پکیجهای مهم hold شده باشد تا در زمان به روز رسانی با مشکل مواجه نشوید.
جمعبندی
بهروزرسانی کوبرنتیز یک فرآیند ضروری برای حفظ امنیت، به روز بودن و بهرهوری سیستم است. با استفاده از kubeadm، شما قادر خواهید بود نودهای خود را بهطور مؤثری بهروز کنید و از امکانات جدید بهرهمند شوید. با پیروی از مراحل ارائه شده در این مقاله، میتوانید فرایند بهروزرسانی را بهراحتی مدیریت کنید و با چالشهای احتمالی روبرو شوید.