ویرگول
ورودثبت نام
فرهاد صادقی
فرهاد صادقیمهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
فرهاد صادقی
فرهاد صادقی
خواندن ۹ دقیقه·۲ روز پیش

آموزش Kubernetes - قسمت سوم

مراحل نصب Kubernetes

1. Install Container Runtime

You need to install a container runtime into each node in the cluster so that Pods can run there.

Kubernetes 1.35 requires that you use a runtime that conforms with the Container Runtime Interface (CRI).

Container runtime های عمومی مختلفی قابلیت استفاده در Kubernetes دارند:

  • containerd

  • CRI-O

  • Docker Engine

  • Mirantis Container Runtime

توجه:

نسخه‌های Kubernetes قبل از v1.24 شامل یک یکپارچگی مستقیم با Docker Engine بودند، این کار با استفاده از کامپوننتی به نام dockershim انجام می شد. این یکپارچگی مستقیمِ ویژه دیگر بخشی از Kubernetes نیست (حذف آن به‌عنوان بخشی از انتشار نسخه v1.20 اعلام شد).

Docker Engine در دل خود از containerd استفاده می کند. به همین خاطر، کوبرنتیز در نسخه های جدید تصمیم گرفت خودش به صورت مستقیم از containerd به عنوان container runtime استفاده کند.

1.1 Install and configure prerequisites

By default, the Linux kernel does not allow IPv4 packets to be routed between interfaces. Most Kubernetes cluster networking implementations will change this setting (if needed), but some might expect the administrator to do it for them.

Enable IPv4 packet forwarding

To manually enable IPv4 packet forwarding:

# sysctl params required by setup, params persist across reboots cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 EOF # Apply sysctl params without reboot sudo sysctl --system

Verify that net.ipv4.ip_forward is set to 1 with:

sysctl net.ipv4.ip_forward

1.2 Install containerd

برای نصب containerd سه روش وجود دارد:

  • download and install binary files

  • using yum

  • compile from source code

ما روش اول یعنی دانلود و نصب فایل binary را در پیش خواهیم گرفت که خود شامل مراحل زیر است:

1- download and install containerd and write linux service

tar Cxzvf /usr/local/ containerd-2.2.1-linux-amd64.tar.gz cp containerd.service /usr/lib/systemd/system/ systemctl daemon-reload systemctl enable --now containerd

خط اول فایل containerd-2.2.1-linux-arm64.tar.gz را extract کرده و محتویات آن را در پوشه usr/local قرار می دهد. چرا که مسیر پوشه usr/local در PATH$ (مسیر فایلهای اجرایی) وجود دارد و با قرار دادن فایلها داخل آن، در واقع فایلهای باینری containerd نصب می شوند.

خط دوم فایل containerd.service را در مسیر usr/lib/systemd/system کپی می کند. داخل فایل containerd.service فایل اجرایی containerd بصورت یک سرویس لینوکسی توصیف شده است. وقتی این فایل در پوشه systemd/system کپی می شود، سرویس توصیف شده نصب شده و در لیست سرویس های لینوکس قرار می گیرد.

در لینوکس ما وقتی یک برنامه را تبدیل به سرویس می کنیم مانند windows service ها در ویندوز امکان شروع، پایان و یا راه اندازی خودکار آن سرویس وجود دارد و ما می توانیم با کامند systemctl آن را کنترل کنیم.

خط سوم لیست سرویس ها را reload می کند تا سرویس containerd که جدیدا نصب شده است، در لیست سرویس ها قرار گیرد.

خط چهارم سرویس containerd را auto start می کند.

2- download and install runc

install -m 755 runc.amd64 /usr/local/sbin/runc

این خط فایل run.amd64 را در مسیر usr/local/sbin/runc کپی می کند و دسترسی سطح 755 را هم برای آن تنظیم می کند تا برای کاربر root قابل اجرا باشد.

کامند install فایل را کپی می کند و permission های آن را نیز تنظیم می کند. هر جا ما نیاز داشته باشیم این دو کار را باهم انجام دهیم می توانیم از کامند install استفاده کنیم.

3- download and install cni-plugin

(cni: container network interface)

mkdir -p /opt/cni/bin tar Cxzvf /opt/cni/bin/ cni-plugins-linux-amd64-v1.9.0.tgz

خط اول مسیر opt/cni/bin را ایجاد می کند. پارامتر p امکان ایجاد هر پوشه و پوشه های داخل آن را در صورتی که وجود نداشته باشند فراهم می کند. با اجرای این خط پوشه cni داخل پوشه opt ایجاد می شود و پوشه bin نیز داخل پوشه cni ایجاد می شود.

خط دوم فایل cni-plugins-linux-amd64-v1.9.0.tgz را در مسیر opt/cni/bin که در خط اول ایجاد شد extract می کند.


2. Install Kubeadm, Kubectl, Kubelet

kubeadm: the command to bootstrap the cluster.

kubectl: the command line util to talk to your cluster.

kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.

برای راه اندازی کلاستر کوبرنتیز باید kubeadm را نصب کنیم. یعنی اگر ما بخواهیم یک کلاستر کوبرنتیز بالا بیاوریم باید با کامند لاین kubeadm این کار را انجام دهیم.

Kubectl (The Kubernetes command-line tool) کامند لاین کوبرنتیز است. یعنی ما command را به آن می دهیم و این پکیج آن را به Kubernetes Api منتقل می کند. این ابزار امکان ارتباط با کلاستر کوبرنتیز و اجرای دستورات روی آن را فراهم می کند.

با استفاده از kubectl شما می توانید برنامه ها را deploy کنید، منابع کلاستر کوبرنتیز را بازرسی و مدیریت کنید و لاگ ها را مشاهده نمایید.

kubectl روی سیستم عامل های ویندوز، لینوکس و مک قابلیت نصب شدن دارد. من در اینجا نحوه نصب آن روی نود لینوکس را شرح می دهم.

2.1 Swap configuration

فضای swap بخشی از هارد دیسک است که در صورت نیاز بخشی از RAM می تواند در آن قرار گیرد. مثلا وقتی فضای RAM پر شود سیستم عامل بخشی از آن را روی فضای swap در هارددیسک کپی می کند تا فضای خالی روی RAM برای ادامه کار داشته باشد.

نسخه های قدیمی کوبرنتیز برای اینکه performance بهتری داشته باشند از swap پشتیبانی نمی کردند. نسخه های جدید کوبرنتیز هم به شرط تعریف swapBehavior از آن پشتیبانی می کنند. اما همچنان توصیه این است که این قابلیت غیرفعال شود.

swapoff -a top

خط اول swap را غیرفعال می کند.

با اجرای خط دوم می توانیم وضعیت حافظه swap را مشاهده کنیم.

بعد از ریستارت کردن سیستم وضعیت swap دوباره برمی گردد. برای اینکه تغییرات همیشگی باشد باید در فایل fstab خط مربوط به swap کامنت شود.

vim /etc/fstab

2.2 Set SELinux to permissive mode

SELinux (Security-Enhanced Linux) اجازه نمی دهد که هر پورتی به هر پروسسی bind شود. kubernetes با SELinux یکپارچگی ندارد. به همین منظور توصیه می کند آن را غیرفعال کنیم و فقط در صورتی آن را فعال نگه داریم که به نحوه کانفیگ کردن آن تسلط کافی داشته باشیم.

These instructions are for Kubernetes 1.35.

# Set SELinux in permissive mode (effectively disabling it) sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

setenforce 1 وضعیت را به Enforcing تغییر می دهد و setenforce 0 وضعیت را به Premissive تغییر می دهد. SELinux در حالت premissive فقط پروسس ها و پورت ها را مانیتور می کند ولی مانع اجرای آنها نمی شود.

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

2.3 Add the Kubernetes yum repository

آدرس repository کوبرنتیز https://pkgs.k8s.io/core:/stable:/v1.35/rpm می باشد یعنی همه rpm های کوبرنتیز در این آدرس است. با دستور زیر، این آدرس به لیست ریپوزیتوری ها اضافه می شود. (توجه داشته باشید که این آدرس بخاطر تحریم ها از ایران قابل دسترس نیست)

# This overwrites any existing configuration in /etc/yum.repos.d/kubernetes.repo cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF

بعد از اجرای دستور بالا باید kubernetes.repo به آدرس etc/yum.repos.d اضافه شده باشد.

خط شماره دو:

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo

🔹 cat <<EOF

این ساختار به آن Here Document می‌گویند.
یعنی هر متنی که تا رسیدن به EOF نوشته شود، به عنوان ورودی به دستور cat داده می‌شود.

🔹 |

خروجی cat را به دستور بعدی می‌فرستد (pipe).

🔹 sudo tee /etc/yum.repos.d/kubernetes.repo

دستور tee متن دریافتی را داخل فایل مشخص‌شده می‌نویسد.
چون مسیر /etc/yum.repos.d/ نیاز به دسترسی روت دارد، از sudo استفاده شده است.

📌 نتیجه: یک فایل به نام

/etc/yum.repos.d/kubernetes.repo

ساخته یا بازنویسی می‌شود.

بخش دوم: محتوای فایل ریپو

[kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni

این تنظیمات مربوط به مخزن رسمی Kubernetes برای سیستم‌های مبتنی بر yum/dnf (مثل CentOS، Red Hat Enterprise Linux و Fedora) است.

2.4 Install Kubeadm, Kubectl, Kubelet

با اجرای دستور زیر kubeadm, kubectl و kubelet از ریپوزیتوری کوبرنیتز دریافت و نصب می شوند.

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

توجه داشته باشید که ریپوزیتوری های kubernetes برای کشور ما بسته است. شما می توانید با ویرایش فایل resolve.conf و تنظیم DNS Server شکن این تحریم را دور بزنید.

vi /etc/resolv.conf #change resolv.conf file nameserver 178.22.122.100 nameserver 185.51.200.2

اگر نیاز داشته باشید که پکیج های rpm نصب را دانلود کنید و بعدا بصورت آفلاین روی سرورهای دیگر خود نصب کنید، می توانید با دستور زیر آنها را در مسیر دلخواه خود دانلود کنید:

sudo yum install --downloadonly --downloaddir=/mysources/ -y kubelet kubeadm kubectl --disableexcludes=kubernetes

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

sudo yum install -y kubeadm-1.35.0-0x86-64.rpm kubectl-1.35.0-0x86-64.rpm


3. Configuring cgroup driver

در زمینه مدیریت منابع (Resource management) کانتینرها، دو مفهوم وجود دارد:

namespace: اجازه نمی دهد IPها، MountPoint ها، Porccess Id های یکسان داشته باشیم.

Cgroup: منابع را از لحاظ CPU، رم و ... مدیریت و محدود می کند.

وقتی می گوییم Pod شماره یک باید 2 گیگ رم داشته باشد، این مطلب را هم باید containerd متوجه باشد و هم kubelet. بنابراین هر دوی آنها باید با یک زبان مشترک صحبت بکنند. cgroup driver این کار را انجام می دهد. در واقع هر دوی آنها از یک درایور برای مدیریت منابع استفاده می کنند و آن cgroup driver است.

در Kubernetes برای cgroup driver دو گزینه وجود دارد:

  • cgroupfs

  • systemd

در لینوکس systemd اولین سرویسی است که بالا می آید و فرآیند بوت کرنل (init system) و بالا آمدن سرویس های دیگر را systemd انجام می دهد.

طبق پیشنهاد Kubernetes، در سیستم هایی که systemd بعنوان init system بکار می رود، توصیه نمی شود از cgroupfs بعنوان cgroup driver استفاده شود و بهتر است بجای آن از systemd cgroup driver استفاده شود.

3.1 Configuring containerd's cgroup driver

در گام اول ما می خواهیم systemd را بعنوان cgroup driver سرویس containerd تنظیم کنیم:

#How to change containerd cgroup driver: -------------------------------------------- mkdir /etc/containerd containerd config default | tee /etc/containerd/config.toml vi /etc/containerd/config.toml #change SystemdCgroup = true systemctl restart containerd

در خط چهارم یک پوشه برای تنظیمات containerd ساخته می شود.

در خط پنجم کانفیگ فعلی (پیش فرض) containerd گرفته شده و در فایل etc/containerd/config.toml نوشته می شود.

خط ششم فایل config.toml را باز می کند.

در این فایل با مقدار پارامتر SystemCgroup را از false به true تغییر داده و فایل را ذخیره می کنیم.

برای اینکه تغییرات در containerd اعمال شود، در خط 8 سرویس containerd را یک بار ریستارت می کنیم.

تا اینجای کار systemd بعنوان cgroup برای containerd تنظیم شد.

3.2 Configuring kubelet's cgroup driver

در گام بعد ما می خواهیم systemd را بعنوان cgroup driver سرویس kubelet تنظیم کنیم:

#How to change kubelet cgroup driver: -------------------------------------------- vim /etc/kubernetes/kubelet-systemd.conf

ابتدا فایل kubelet-systemd.conf را در مسیر etc/kubernetes ایجاد می کنیم و سپس محتوای زیر را در آن می نویسیم و ذخیره می کنیم:

apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd

حالا باید فایل سرویس kubelet را باز می کنیم و به آن بفهمانیم که از این به بعد فایل کانفیگی که ساختیم را هم لود کن.

vim /usr/lib/systemd/system/kubelet.service

توجه: برای اینکه بدانیم فایل kubelete.service در چه مسیری قرار دارد می توانیم از دستور زیر استفاده کنیم.

systemctl status kubelet

در فایل kubelet.service به انتهای خط ExecStart عبارت زیر را اضافه می کنیم و به این ترتیب سرویس kubelet موقع اجرا شدن، فایل کانفیگی که ما ایجاد کردیم را اعمال می کند.

--config /etc/kubernetes/kubelet-systemd.conf

به این ترتیب سکشن Service در فایل kubelet.service به شکل زیر خواهد بود:

[Service] ExecStart=/usr/bin/kubelet --config /etc/kubernetes/kubelet-systemd.conf Restart=always StartLimitInterval=0 RestartSec=10

در انتها یکبار سرویس kubelet را ریستارت می کنیم.

systemctl restart kubelet

منابع:

  • https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

  • http://kernel.org/

  • https://kubernetes.io/docs/reference/node/kernel-version-requirements/

  • https://kubernetes.io/docs/setup/production-environment/container-runtimes

  • https://github.com/containerd/containerd/blob/main/docs/getting-started.md

kubernetes
۳
۰
فرهاد صادقی
فرهاد صادقی
مهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
شاید از این پست‌ها خوشتان بیاید