این آموزش به شما نشان میدهد که چگونه یک نمونه مستقل از kubelet را اجرا کنید
شما ممکن است انگیزههای مختلفی برای اجرای یک kubelet مستقل داشته باشید این آموزش با هدف آشنایی شما با کوبرنتیز تهیه شده است، حتی اگر تجربه زیادی با آن نداشته باشید. میتوانید این آموزش را دنبال کنید و در مورد راهاندازی گره، پادهای پایه (ایستا) و نحوه مدیریت کانتینرها توسط کوبرنتیزاطلاعات کسب کنید
پس از دنبال کردن این آموزش، میتوانید از کلاستر ای که دارای control plane برای مدیریت پادها و گرهها و انواع دیگر اشیاء است، استفاده کنید. به عنوان مثال، Hello, minikube
همچنین میتوانید kubelet را در حالت مستقل اجرا کنید تا برای موارد استفاده در محیط عملیاتی مناسب باشد، مانند اجرای control plane برای یک کلاستر با قابلیت دسترسی بالا و استقرار انعطافپذیر. این آموزش جزئیات مورد نیاز برای اجرای یک control plane انعطافپذیر را پوشش نمیدهد
cri-o و kubelet را روی یک سیستم لینوکس نصب کنید و آنها را به عنوان سرویسهای systemd اجرا کنید.nginx راهاندازی کنید که به درخواستهای روی پورت TCP 80 روی نشانی IP پاد گوش دهد.root) به یک سیستم لینوکس که از systemd و iptables (یا nftables با شبیهسازی iptables) استفاده میکندcurl, tar, jq.به طور پیشفرض، اگر حافظه swap روی یک گره شناسایی شود، kubelet شروع به کار نمیکند. این بدان معناست که swap باید غیرفعال شود یا توسط kubelet تحمل شود.
اگر حافظه swap را فعال کردهاید، آن را غیرفعال کنید یا عبارت failSwapOn: false را به فایل پیکربندی kubelet اضافه کنید
برای بررسی فعال بودن swap:
sudo swapon --show
اگر هیچ خروجی از دستور وجود نداشته باشد، حافظه swap از قبل غیرفعال شده است
برای غیرفعال کردن موقت swap:
sudo swapoff -a
برای اینکه این تغییر در طول راهاندازیهای مجدد پایدار بماند:
مطمئن شوید که swap بسته به نحوه پیکربندی آن در سیستم شما، در /etc/fstab یا systemd.swap غیرفعال باشد
برای بررسی اینکه آیا ارسال بسته IPv4 فعال است:
cat /proc/sys/net/ipv4/ip_forward
اگر خروجی «۱» باشد، از قبل فعال شده است. اگر خروجی «۰» باشد، مراحل بعدی را دنبال کنید
برای فعال کردن ارسال بسته IPv4، یک فایل پیکربندی ایجاد کنید که پارامتر net.ipv4.ip_forward را روی 1 تنظیم کند:
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
EOF
اعمال تغییرات در سیستم:
sudo sysctl --system
خروجی مشابه این است:
...
* Applying /etc/sysctl.d/k8s.conf ...
net.ipv4.ip_forward = 1
* Applying /etc/sysctl.conf ...
آخرین نسخههای موجود از بستههای مورد نیاز را دانلود کنید (توصیه میشود).
این آموزش نصب CRI-O container runtime (لینک خارجی) را پیشنهاد میکند
بسته به توزیع لینوکس خاص شما، چندین [روش] برای نصب [https://github.com/cri o/cri o/blob/main/install.md] کانتینر CRI O در زمان اجرا وجود دارد. اگرچه CRI O استفاده از بستههای deb یا rpm را توصیه میکند، اما این آموزش از اسکریپت _static binary bundle_ پروژه CRI O Packaging (https://github.com/crio/packaging/blob/main/README.md) استفاده میکند، که هم برای سادهسازی فرآیند کلی و هم برای عدم وابستگی به توزیع مورد نظر است
این اسکریپت نرمافزارهای مورد نیاز اضافی، مانند cni-plugins برای شبکهسازی کانتینر، و crun و runc برای اجرای کانتینرها را نصب و پیکربندی میکند
این اسکریپت به طور خودکار معماری پردازنده سیستم شما (amd64 یا arm64) را تشخیص داده و آخرین نسخههای بستههای نرمافزاری را انتخاب و نصب میکند
از صفحه نسخهها (پیوند خارجی) دیدن کنید
اسکریپت بسته باینری ایستا را دانلود کنید:
curl https://raw.githubusercontent.com/cri-o/packaging/main/get > crio-install
اسکریپت نصب را اجرا کنید:
sudo bash crio-install
فعال کردن و شروع سرویس crio:
sudo systemctl daemon-reload
sudo systemctl enable --now crio.service
تست سریع:
sudo systemctl is-active crio.service
خروجی مشابه این است:
active
بررسی دقیق سرویس:
sudo journalctl -f -u crio.service
نصبکنندهی cri-o بستهی cni-plugins را نصب و پیکربندی میکند. میتوانید با اجرای دستور زیر، نصب را تأیید کنید:
/opt/cni/bin/bridge --version
خروجی مشابه این است:
CNI bridge plugin v1.5.1
CNI protocol versions supported: 0.1.0, 0.2.0, 0.3.0, 0.3.1, 0.4.0, 1.0.0
برای بررسی پیکربندی پیشفرض:
cat /etc/cni/net.d/11-crio-ipv4-bridge.conflist
خروجی مشابه این است:
{
"cniVersion": "1.0.0",
"name": "crio",
"plugins": [
{
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"routes": [
{ "dst": "0.0.0.0/0" }
],
"ranges": [
[{ "subnet": "10.85.0.0/16" }]
]
}
}
]
}
آخرین نسخه پایدار آخرین نسخه از kubelet را دریافت کنید
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubelet"
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubelet"
پیکربندی:
sudo mkdir -p /etc/kubernetes/manifests
sudo tee /etc/kubernetes/kubelet.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
webhook:
enabled: false # Do NOT use in production clusters!
authorization:
mode: AlwaysAllow # Do NOT use in production clusters!
enableServer: false
logging:
format: text
address: 127.0.0.1 # Restrict access to localhost
readOnlyPort: 10255 # Do NOT use in production clusters!
staticPodPath: /etc/kubernetes/manifests
containerRuntimeEndpoint: unix:///var/run/crio/crio.sock
EOF
از آنجا که شما در حال راهاندازی یک کلاستر عملیاتی نیستید، از HTTP ساده (readOnlyPort: 10255) برای کوئریهای احراز هویت نشده به API kubelet استفاده میکنید
برای اهداف این آموزش، وبهوک احراز هویت غیرفعال است و حالت مجوز روی «همیشه مجاز» تنظیم شده است. میتوانید برای پیکربندی صحیح kubelet در حالت مستقل در محیط خود، اطلاعات بیشتری در مورد حالتهای مجوز و احراز هویت وبهوک کسب کنید.
برای آشنایی با پورتهایی که اجزای کوبرنتیز از آنها استفاده میکنند، به درگاه ها و پروتکل ها مراجعه کنید.
نصب:
chmod +x kubelet
sudo cp kubelet /usr/bin/
یک فایل واحد سرویس systemd ایجاد کنید:
sudo tee /etc/systemd/system/kubelet.service <<EOF
[Unit]
Description=Kubelet
[Service]
ExecStart=/usr/bin/kubelet \
--config=/etc/kubernetes/kubelet.yaml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
پارامتر خط فرمان --kubeconfig عمداً در فایل پیکربندی سرویس حذف شده است. این پارامتر مسیر فایل [kubeconfig](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) را تعیین میکند که نحوه اتصال به سرور API را مشخص میکند و حالت سرور API را فعال میکند. حذف آن، حالت مستقل را فعال میکند.
سرویس kubelet را فعال و شروع کنید:
sudo systemctl daemon-reload
sudo systemctl enable --now kubelet.service
آزمایش سریع:
sudo systemctl is-active kubelet.service
خروجی مشابه زیر است:
active
بررسی دقیق سرویس:
sudo journalctl -u kubelet.service
نقطه پایانی API /healthz مربوط به kubelet را بررسی کنید:
curl http://localhost:10255/healthz?verbose
خروجی مشابه زیر است:
[+]ping ok
[+]log ok
[+]syncloop ok
healthz check passed
از نقطه پایانی API /pods مربوط به kubelet کوئری بگیرید:
curl http://localhost:10255/pods | jq '.'
خروجی مشابه زیر است:
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {},
"items": null
}
در حالت مستقل، میتوانید پادها را با استفاده از تنظیمات پاد اجرا کنید. تنظیمات میتوانند یا در سیستم فایل محلی باشند یا از طریق HTTP از یک منبع پیکربندی دریافت شوند.
ایجاد یک تنظیمات برای یک Pod:
cat <<EOF > static-web.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
EOF
فایل تنظیمات static-web.yaml را در پوشه /etc/kubernetes/manifests رونوشت کنید.
sudo cp static-web.yaml /etc/kubernetes/manifests/
افزونه شبکه Pod یک پل شبکه (cni0) و یک جفت رابط veth برای هر Pod ایجاد میکند (یکی از این جفتها درون Pod تازه ساخته شده و دیگری در سطح میزبان است).
نقطه پایانی API مربوط به kubelet را در نشانی http://localhost:10255/pods جستجو کنید:
curl http://localhost:10255/pods | jq '.'
برای به دست آوردن نشانی IP مربوط به پاد static-web:
curl http://localhost:10255/pods | jq '.items[].status.podIP'
خروجی مشابه زیر است:
"10.85.0.4"
به پاد سرور nginx روی http://<IP>:<Port> (پورت پیشفرض ۸۰ است) متصل شوید، در این مورد:
curl http://10.85.0.4
خروجی مشابه زیر است:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
اگر نیاز به تشخیص مشکلی در اجرای این آموزش دارید، میتوانید برای نظارت و عیبیابی به پوشههای زیر مراجعه کنید:
/var/lib/cni
/var/lib/containers
/var/lib/kubelet
/var/log/containers
/var/log/pods
sudo systemctl disable --now kubelet.service
sudo systemctl daemon-reload
sudo rm /etc/systemd/system/kubelet.service
sudo rm /usr/bin/kubelet
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/log/containers
sudo rm -rf /var/log/pods
sudo systemctl disable --now crio.service
sudo systemctl daemon-reload
sudo rm -rf /usr/local/bin
sudo rm -rf /usr/local/lib
sudo rm -rf /usr/local/share
sudo rm -rf /usr/libexec/crio
sudo rm -rf /etc/crio
sudo rm -rf /etc/containers
sudo rm -rf /opt/cni
sudo rm -rf /etc/cni
sudo rm -rf /var/lib/cni
این صفحه جنبههای اساسی استقرار یک kubelet در حالت مستقل را پوشش داد. اکنون آماده استقرار پادها و آزمایش قابلیتهای اضافی هستید.
توجه داشته باشید که در حالت مستقل، kubelet از دریافت پیکربندیهای پاد از control plane پشتیبانی نمیکند (زیرا هیچ اتصالی به control plane وجود ندارد).
همچنین نمیتوانید از ConfigMap یا Secret برای پیکربندی کانتینرها در یک پاد ایستا استفاده کنید.
موارد این صفحه به محصولات یا پروژههای شخص ثالث اشاره میکنند که قابلیتهای مورد نیاز کوبرنتیز را ارائه میدهند. نویسندگان پروژه کوبرنتیز مسئول آن محصولات یا پروژههای شخص ثالث نیستند. برای جزئیات بیشتر راهنمای وبسایت CNCF را ببینید.
قبل از پیشنهاد تغییری که لینک شخص ثالث اضافی اضافه میکند، باید راهنمای محتوا را بخوانید.