

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 استفاده کند.
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.
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
برای نصب 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 می کند.

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 روی سیستم عامل های ویندوز، لینوکس و مک قابلیت نصب شدن دارد. من در اینجا نحوه نصب آن روی نود لینوکس را شرح می دهم.
فضای swap بخشی از هارد دیسک است که در صورت نیاز بخشی از RAM می تواند در آن قرار گیرد. مثلا وقتی فضای RAM پر شود سیستم عامل بخشی از آن را روی فضای swap در هارددیسک کپی می کند تا فضای خالی روی RAM برای ادامه کار داشته باشد.
نسخه های قدیمی کوبرنتیز برای اینکه performance بهتری داشته باشند از swap پشتیبانی نمی کردند. نسخه های جدید کوبرنتیز هم به شرط تعریف swapBehavior از آن پشتیبانی می کنند. اما همچنان توصیه این است که این قابلیت غیرفعال شود.
swapoff -a top
خط اول swap را غیرفعال می کند.
با اجرای خط دوم می توانیم وضعیت حافظه swap را مشاهده کنیم.
بعد از ریستارت کردن سیستم وضعیت swap دوباره برمی گردد. برای اینکه تغییرات همیشگی باشد باید در فایل fstab خط مربوط به swap کامنت شود.
vim /etc/fstab
permissive modeSELinux (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 استفاده کنیم.
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) است.
با اجرای دستور زیر 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

در زمینه مدیریت منابع (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 استفاده شود.
در گام اول ما می خواهیم 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 تنظیم شد.
در گام بعد ما می خواهیم 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