توی این قسمت میریم به سراغ اینکه بررسی کنیم چطوری میتونیم یه کلاستر کوبرنتیز رو با استفاده از rancher ستاپ کنیم و بیاریم بالا.
خب یه مروری کنیم پستهای قبلی رو:
- دواپس چیه و چرا لازمه؟ اینجا در مورد دواپس و ضرورت استفاده از آن صحبت کردم.
- مسیر شغلی دواپس اینجا در مورد مسیر شغلی دواپس و موارد پیرامون آن صحبت کردم.
- چطور اپلیکیشن مناسب کلاد آماده کنیم؟ و اینجا توضیح دادم که چطور میتونیم یه اپلیکیشن مناسب کلاد توسعه بدیم.
- چه عمقی از لینوکس برای دواپس لازمه؟ و اینجا توضیح دادم که کدوم موارد لینوکس برای دواپس الزامی هست که اول سراغ اون موارد بریم.
- خودکارش کن، مشکلاتت حل میشه 🙂 در اینجا در مورد اتومیشن و اینکه انسیبل چیه و چه کمکی به ما میکنه صحبت کردم.
- در مسیر دواپس اینبار اجزای اصلی انسیبل تو این پست اجزای انسیبل رو معرفی کردم و آنها را شرح دادم.
- در مسیر دواپس به داکر رسیدم. (قسمت اول) تو این پست داکر رو شروع کردیم و اونو معرفی کردیم.
- در مسیر دواپس اینبار: پشت داکر چه خبره؟ (قسمت دوم) توی این پست در مورد تکنولوژی هایی که داکر ازشون استفاده میکنه توضیح دادیم.
- در مسیر دواپس اینبار: والیوم و نتورک داکر (قسمت سوم) توی این پست در مورد شبکه توی داکر و اینکه چطوری دیتای کانتینر رو میتونیم نگه داریم توضیح دادیم.
- در مسیر دواپس اینبار: داکر فایل ( قسمت چهارم ) توی این پست در مورد اینکه چطور با استفاده از داکر اپلیکیشن مون رو بیلد کنیم و ایمیج بسازیم توضیح دادیم.
- در مسیر دواپس اینبار: کامپوز فایل و داکر کامپوز (قسمت پنجم) توی این پست در مورد اینکه چطور روند دیپلوی کردن سرویسهامون و کانفیگ اونها رو به صورت کد داشته باشیم توضیح دادیم.
- در مسیر دواپس: اینبار داکر سوآرم (قسمت ششم) توی این پست در مورد داکر سوآرم و اینکه چطوری به کمک داکر چنتا سرور رو کلاستر کنیم، توضیح دادیم.
- در مسیر دواپس اینبار: دور و بری های داکر (قسمت هفتم) توی این پست در مورد ابزارهای جانبی که بهمون توی کار با داکر کمک میکنن توضیح دادیم.
- در مسیر دواپس: جمع بندی داکر (قسمت هشتم) توی این پست در مورد امنیت داکر توضیح دادیم و در آخر هم یه سری از بست پرکتیسها و تجربیات خودم رو گفتم.
- تست نوشتن و شروع مسیر 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 رو بررسی کردیم و در موردش ویژگیها و کاربردهاش توضیح دادیم.
- سی آر دی و اُپراتور (قسمت شانزدهم) توی این قسمت در مورد اینکه چطوری یه ریسورس کاستوم شده به کلاستر اضافه کنیم توضیح دادیم و مفهوم اُپراتور رو توی کوبر بررسی کردیم.
- نصب کلاستر با kubeadm (قسمت هفدهم) توی این قسمت قدم به قدم نحوه نصب یک کلاستر کوبرنتیز رو با استفاده از ابزار kubeadm توضیح دادیم.
- نصب کلاستر با kubespray (قسمت هجدهم) توی این قسمت نحوه نصب کلاستر با یه پروژه خیلی خوب به نام کیوب اسپری که یه انسیبل خفن برای ستاپ کلاستر رائه میده رو توضیح دادیم.
توصیه میکنم که حتما این پستها رو هم مطالعه کنید. بریم که ادامه بدیم.
راهاندازی یک کلاستر Kubernetes با RKE:
ابزارRancher Kubernetes Engine (RKE) یک توزیع Kubernetes تایید شده از طرف CNCF است که کاملاً درون کانتینرهای Docker اجرا میشود. این توزیع روی سرورهای فیزیکی و مجازی کار میکند. RKE مشکل پیچیدگی نصب، که یک مشکل رایج در جامعه Kubernetes است، را حل میکند. با RKE، نصب و پیادهسازی Kubernetes هم سادهتر و هم به راحتی قابل اتوماسیون است و کاملاً مستقل از سیستمعامل و پلتفرمی است که شما استفاده میکنید. به شرطی که بتوانید یک نسخه پشتیبانیشده از Docker را اجرا کنید، میتوانید Kubernetes را با RKE راهاندازی و اجرا کنید. این روش خیلی برای جاهایی که میخواهیم تعداد زیادی کلاستر کوبرنتیز ایجاد و نگهداری کنیم مناسبه. خیلی میتونیم باهاش به راحتی چندین کلاستر رو به صورت توصیفی ایجاد کنیم.
پیشنیازها
ابزار RKE بر روی تقریباً هر سیستمعامل لینوکس با نصب Docker اجرا میشود.
کاربر SSH که برای دسترسی به نودها استفاده میشود باید عضو گروه docker
بر روی نود باشد:
usermod -aG docker
در نودهای ورکر، باید swap غیرفعال شود.
تنظیمات sysctl که باید اعمال شود:
net.bridge.bridge-nf-call-iptables=1
نرمافزارهای موردنیاز که باید نصب کنیم:
- ابزار OpenSSH: برای ورود به هر نود از طریق SSH، باید OpenSSH نسخه ۷.۰ یا بالاتر بر روی هر نود نصب باشد و باید AllowTcpForwarding داخل کانفیگ فعال باشه.
- ابزار Docker: تو RKE هر نسخه Kubernetes از نسخههای مختلف Docker پشتیبانی میکند. یادداشتهای انتشار Kubernetes شامل لیست فعلی نسخههای Docker معتبر است. البته خود رنچر بهتون اسکریپت میده که باهاش داکر رو همون نسخهای که لازم دارید رو نصب کنید.
# Get a script to install a specific Docker version, such as 27.5.1.
curl https://releases.rancher.com/install-docker/27.5.1.sh | sh
# Install a specific version of Docker
which docker || https://releases.rancher.com/install-docker/27.5.1.sh
الزامات سختافزاری برای نودها دارای نقش ورکر بیشتر بستگی به workload شما دارد. حداقل برای اجرای اجزای نود Kubernetes نیاز به ۱ CPU (هسته) و ۱ گیگابایت حافظه دارید. البته این مقدار حداقل است و بعد از نصب حتما به مشکل میخورید باهاش و برای تست نصب و کانفیگها مناسب است.
برای CPU و حافظه، توصیه میشود که کامپوننتهای مختلف کلاستر Kubernetes (etcd، controlplane و worker) بر روی نودها مختلف میزبانی شوند تا بتوانند بهطور جداگانه از یکدیگر مقیاسبندی شوند.
برای اطلاعات دقیقتر از پورتهایی که نیاز داریم روی هرکدام از نودها باز باشد، میتونید به اینجا مراجعه کنید همچنین میتونید به روش دو بلاگ پست قبلی سرورهای کلاستر رو توی فایروال همدیگه باز کنید.
ابتدا با کامند زیر RKE رو نصب میکنیم. معمولا ما یه ماشین داریم که با استفاده از آن کلاسترهای خودمون رو نصب و کانفیگ میکنیم. به هر حال باید جایی RKE رو نصب کنید که به سرورهای دیگهی شما دسترسی داشته باشد.
wget https://github.com/rancher/rke/releases/download/v1.7.3/rke_linux-amd64
chmod +x rke_linux-amd64
mv rke_linux-amd64 rke
sudo mv rke /usr/local/bin
در قدم بعدی میتونید با استفاده از اسکریپتهای زیر لیستی از ایمیجهای موردنیاز رو بگیرید اونها رو ذخیره و load کنید:
# download rancher-images.txt list:
wget https://github.com/rancher/rancher/releases/download/v2.10.3-alpha2/rancher-images.txt
# download rancher-save-images script:
wget https://github.com/rancher/rancher/releases/download/v2.10.3-alpha2/rancher-save-images.sh
# download rancher-load-images script:
wget https://github.com/rancher/rancher/releases/download/v2.10.3-alpha2/rancher-load-images.sh
با استفاده از کامند زیر میتونید لیستی از نسخههایی از کوبرنتیز که RKE پشتیبانی میکند و ایمیجهای اونها رو دریافت کنید:
# list all kubernetes version support
rke config --list-version --all
# Create a list of all images for one version
rke config --list-version --system-images > rancher-images.txt
# Create a list of all images for all version
rke config --list-version --all --system-images > rancher-images.txt
ایمیجها رو توی سرور خودتون ذخیره کنید، برای اینکار اسکریپت rancher-save-images.sh
را با دسترسی اجرا، ران کنید:
chmod +x rancher-save-images.sh
./rancher-save-images.sh --image-list ./rancher-images.txt
تو این مرحله نیازه که صبور باشید تا ایمیجها داکر دریافت بشه، تو ایران صبر ایوب هم جزو نیازمندیهای نصب هست. بعد از انجام این مرحله توی دایرکتوری شما فایل rancher-images.tar.gz
ایجاد میشود. این فایل حاوی تمام ایمیجهای مورد نیاز کلاستر کوبرنتیز میباشد.
اگه میخواید تمام ایمیجهای ورژنهای مختلف رو دریافت کنید میتونید از کامند زیر استفاده کنید:
# get and save image list
rke config --list-version --all --system-images > rancher-images.txt
# download all images
./rancher-save-images.sh --image-list ./rancher-images.txt
توی قدم بعدی ایمیجهایی که دریافت کردیم رو push میکنیم توی رجیستری private که داریم تا بتونیم از روی سرورها اونو دریافت کنیم و ایمیجها رو load کنیم. این کار تو ایران خیلی توصیه میشه. چون معمولا ما مشکل گرفتن ایمیجها رو داریم با این کار یه بار میگیرم و هر جایی که لازم داشته باشیم ازش استفاده میکنیم.
بعد از اینکه ایمیجها در سرور قرار گرفت به رجیستری خودتون لاگین کنید:
docker login https://registry.mecan.ir
این اسکریپت ایمیجها رو براتون تگ میزنه و پوش میکنه تو رجیستری که بهش دادید. واقعا کار رو با همین دو تا اسکریپت خیلی خیلی راحت کرده. اول دسترسی اجرایی بهش بدید و بعد اجراش کنید:
chmod +x rancher-load-images.sh
./rancher-load-images.sh --image-list ./rancher-images.txt --registry registry.mecan.ir
داکر رو هم روی تمام سرورها نصب داشته باشید، برای این کار میتونید از این داکیومنت استفاده کنید. فقط دقت کنید بهتره که از نسخههایی که گفته استفاده کنید تا مشکلی پیش نیاد و با ساختاری که داره کاملا کامپتیبل باشه.
بعد از اینکه داکر رو نصب و کانفیگ کردید با استفاده از کامندهای زیر گروه داکر رو ایجاد کنید و یوزرتون (همونی که باهاش ssh میخواهید بزنید) رو بهش اضافه کنید:
sudo groupadd docker
sudo usermod -aG docker $USER
یبار log-out و log-in کنید که عضویت یوزرتون در گروه re-evaluate بشه.
ایجاد کانفیگ RKE:
برای ایجاد کانفیگ RKE ما دو روش داریم. اول اینکه با دستور rke همانند زیر کانفیگ رو به صورت تعاملی باهاش بسازیم. که توصیه میکنم یه بار انجام بدید و بررسی کنید که باهاش آشنا بشید.
rke config --name cluster.yml
مسیر دوم اینکه خودمون کانفیگ فایل رو بسازیم که در ادامه نمونهی آن رو مشاهده میکنید. از اینجا هم میتونید اون رو دانلود کنید. فایلی با نام cluster.yml به شکل زیر ایجاد کنید:
cat <> cluster.yml
nodes:
- address: "192.168.200.11"
port: 8090
role:
- "etcd"
- "controlplane"
- "worker"
user: root
hostname_override: "master1"
docker_socket: /var/run/docker.sock
- address: "192.168.200.12"
port: 8090
role:
- "etcd"
- "controlplane"
- "worker"
user: root
hostname_override: "master3"
docker_socket: /var/run/docker.sock
- address: "192.168.200.14"
port: 8090
role:
- "worker"
user: root
hostname_override: "worker1"
docker_socket: /var/run/docker.sock
- address: "192.168.200.15"
port: 8090
role:
- "worker"
user: root
hostname_override: "worker2"
docker_socket: /var/run/docker.sock
- address: "192.168.200.16"
port: 8090
role:
- "worker"
user: root
hostname_override: "worker3"
docker_socket: /var/run/docker.sock
# If set to true, RKE will not fail when unsupported Docker version
ignore_docker_version: true
# The Kubernetes version used. The default versions of Kubernetes are tied to specific versions of the system images.
kubernetes_version: "v1.31.5-rancher1-1"
# Set the name of the Kubernetes cluster
cluster_name: "MeCan"
# List of registry credentials
private_registries:
- url: registry.mecan.ir
user: MeCan
password: XXXXXXXXXXX
is_default: true
services:
etcd:
snapshot: true
backup_config:
interval_hours: 4
retention: 10
kube-api:
audit_log:
enabled: true
configuration:
max_age: 6
max_backup: 6
max_size: 110
path: /var/log/kube-audit/audit-log.json
format: json
policy:
apiVersion: audit.k8s.io/v1 # This is required.
kind: Policy
omitStages:
- "RequestReceived"
rules:
- level: RequestResponse
resources:
- group: ""
resources: ["pods"]
service_cluster_ip_range: 10.43.0.0/16
service_node_port_range: 30000-32767
always_pull_images: true
kube-controller:
cluster_cidr: 10.42.0.0/16
kubelet:
cluster_domain: cluster.local
extra_args:
max-pods: 250
feature-gates: RotateKubeletServerCertificate=true
network:
strategy: x509
sans:
- "192.168.200.10"
- "192.168.200.11"
- "192.168.200.12"
- "192.168.200.13"
- "master.kube.mecan.ir"
- "vip.kube.mecan.ir"
- "master1.kube.mecan.ir"
- "master2.kube.mecan.ir"
- "master3.kube.mecan.ir"
- "master"
- "master1"
- "master2"
- "master3"
authorization:
mode: rbac
# Specify monitoring provider (metrics-server)
monitoring:
provider: metrics-server
provider: metrics-server
# Available as of v1.1.0
update_strategy:
strategy: RollingUpdate
rollingUpdate:
maxUnavailable: 8
EOF
نهایتا با استفاده از کامند RKE کلاستر رو بالا میاریم. فقط حتما قبلش از دسترسی ssh به سرورهایی که معرفی کردید اطمینان کسب کنید.
rke up --config ./cluster.yml
ذخیره فایلهای مهم:
فایلهای ذکر شده در زیر برای نگهداری، رفع اشکال و ارتقا کلاستر شما ضروری هستند.
یک نسخه از فایلهای زیر را در مکان امنی ذخیره کنید:
- فایل cluster.yml: فایل پیکربندی کلاستر RKE.
- فایل kube_config_rancher-cluster.yml: فایل Kubeconfig برای کلاستر، این فایل حاوی اطلاعات احراز هویت برای دسترسی کامل به کلاستر ایجاد شده است.
- فایل rancher-cluster.rkestate: فایل وضعیت کلاستر Kubernetes، این فایل حاوی وضعیت فعلی کلاستر است که شامل پیکربندی RKE و سرتیفیکیتها میباشد. این فایل در ادامهی مسیر که بخواهید کلاستر رو تغییر بدید ضروری است و از روی اون تشخیص میده که کلاستر در چه وضعیتی قرار دارد.
نکته: فایل وضعیت کلاستر Kubernetes فقط زمانی ایجاد میشود که از RKE نسخه v0.2.0 یا بالاتر استفاده کنید.
مشخصات کلاستر ایجاد شده:
خب دیگه یه کلاستر مالتی نود با استفاده از RKE ستاپ کردیم بد نیست یه مروری کنیم که این کلاستر ما چه مشخصاتی دارد:
- نسخهی کوبرنتیر ما v1.31.5-rancher1-1 است.
- از calico برای cni استفاده کردیم.
- برای authorization از rbac داریم استفاده میکنیم.
- از etcd به صورت روزانه بکاپ میگیرم.
- ۶ تا نود داریم که سه تا مستر و etcd و ورکر و سه تای دیگه تنها ورکر هستند.
- برای certificate آدرسهایی که داریم رو به عنوان SAN معرفی کردیم.
- برای IP پادها و سرویسها از رنجهای ۱۰.۴۲.۰.۰/۱۶ و ۱۰.۴۳.۰.۰/۱۶ استفاده کردیم.
- لاگ audit کوبرنتیز رو فعال کردیم.
- برای تمام ایمیجها از رجیستری خودمون استفاده کردیم که مشخصاتش رو تو کانفیگ گذاشتیم.
- اسم کلاستر رو MeCan گذاشتیم.
- برای اتصال به نودها از پورت ssh غیر پیشفرض استفاده کردیم.
- برای اتصال به نودها از کاربر root استفاده کردیم.
- هاست نیم نودها رو هم بهش دادیم.
تو این مستند هم به صورت کامل این مسیر به همراه اضافه و کم کردن نود و به روزرسانی کلاستر وجود داره که پیشنهاد میکنم حتما بهش سر بزنید.
توی بلاگ پستهای بعدی مطالب مربوط به کوبرنتیز رو ادامه میدیم و بیشتر با هم یاد میگیریم.
مراقب خودتون باشید. 🌹🐳🌹