امیرحسین حاجی محمدی
امیرحسین حاجی محمدی
خواندن ۳ دقیقه·۲ ماه پیش

‏Kubelet: با طعم Best Practices!

Kubelet
Kubelet

اگه داری با Kubernetes حال می‌کنی (یا شاید هم داری زور می‌زنی که حال کنی 😅)، حتماً اسم Kubelet به گوشت خورده. ایشون در اصل مغز متفکر هر Node توی کلاسترته؛ یه جورایی کارگر وفاداریه که همیشه توی صحنه‌ست!

حالا بیایم ببینیم چطور می‌تونیم این موجود دوست‌داشتنی رو به بهترین شکل ممکن کانفیگ کنیم تا هم بهتر کار کنه و هم کمتر اذیت‌مون کنه.


‏🤖 Kubelet دقیقاً چیه؟

قبل از اینکه بریم سراغ کانفیگ حرفه‌ای، یه یادآوری کوچیک:
Kubelet یه agent روی هر نود توی Kubernetes هست که وظیفه‌ش اجرای پادها، بررسی سلامتی‌شون (health)، و گزارش دادن به کنترل پلینه.


‏🛠️ راه‌های کانفیگ Kubelet

‏Kubelet چند روش برای تنظیمات داره:

  1. Command-line flags (مثل --v=2)
  2. Configuration file (kubelet config YAML) از نسخه 1.10 به بعد توصیه‌شده
  3. ‏‏Environment variables (تو برخی سیستم‌ها)
‏🎯 Best Practice: به جای فلگ‌های خط فرمان، از فایل کانفیگ استفاده کن! هم خوندنش راحت‌تره، هم مانیتورش آسون‌تره.

‏🧾 ساختار فایل کانفیگ Kubelet (YAML)

یه نمونه از فایل کانفیگ:

apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration address: 0.0.0.0 authentication: anonymous: enabled: false webhook: enabled: true authorization: mode: Webhook readOnlyPort: 0 cgroupDriver: systemd failSwapOn: true maxPods: 110 rotateCertificates: true serverTLSBootstrap: true



‏💎 Best Practiceها برای کانفیگ Kubelet

‏1. 🔐 امنیت حرف اول رو می‌زنه

خاموش کردن پورت Read-Only:

readOnlyPort: 0

فعال کردن Webhook برای authn/authz:

authentication: webhook: enabled: true authorization: mode: Webhook



‏2. 🎯 مدیریت منابع در Kubelet: هنر تعادل!

مدیریت منابع توی Kubelet مثل هنر بالانس کردن بشقاب‌هاست!
اگه درست انجامش ندی، یا Kubelet له می‌شه زیر فشار، یا سیستم‌عامل هنگ می‌کنه، یا پادها شروع می‌کنن به مردن بی‌صدا. 😵

‏📌 منابع اصلی قابل تنظیم:

  1. systemReserved – برای سیستم‌عامل (مثل journald، systemd)
  2. kubeReserved – برای خود اجزای Kubernetes (مثل kubelet، kube-proxy)
  3. eviction thresholds – مدیریت بحران کمبود منابع
  4. QoS Classes و cgroupها – کنترل اولویت پادها

‏🧠 systemReserved و kubeReserved

برای اینکه سیستم‌عامل و Kubelet خودش زیر فشار پادها از پا درنیاد، منابع رزرو براشون بذار:

systemReserved: cpu: "200m" memory: "512Mi" ephemeral-storage: "1Gi" kubeReserved: cpu: "100m" memory: "256Mi" ephemeral-storage: "1Gi"
‏💡 سیستم‌های بزرگ‌تر = منابع بیشتر
مثال: برای نودهای با 8 CPU و 32GB RAM، شاید بد نباشه 500m CPU و 1GB RAM برای systemReserved در نظر بگیری.

‏💣 Eviction Thresholdها: فرار از بحران!

اگه منابع خیلی کم بشن، Kubelet پادها رو پاک می‌کنه تا خودش و نود زنده بمونن.

evictionHard: memory.available: "100Mi" nodefs.available: "10%" imagefs.available: "15%" evictionSoft: memory.available: "300Mi" nodefs.available: "15%" evictionSoftGracePeriod: memory.available: "1m" nodefs.available: "30s"
‏✅ با این تنظیمات، Kubelet اول هشدار می‌ده (soft)، اگه وضع وخیم‌تر شد می‌زنه پادهای سبک‌تر رو حذف می‌کنه.

‏🧠 QoS Classها و Cgroupها

بر اساس requests و limits، Kubelet پادها رو تو سه کلاس قرار می‌ده:




❗ پادهای BestEffort اولین قربانی‌های eviction هستن!


‏3. 📦 محدود کردن تعداد پادها در هر نود

maxPods: 110

بسته به حجم منابع نود، این عدد رو تنظیم کن. برای نودهای سبک، 60 تا 80 پاد منطقی‌تره.


‏4. 🧹 زباله‌جمع‌کنی حرفه‌ای با ImageGC و PodGC

imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 70

وقتی دیسک پر می‌شه، ایمیج‌هایی که مدت طولانی استفاده نشدن رو حذف می‌کنه.


‏5. 🔁 چرخش خودکار TLS Cert

rotateCertificates: true serverTLSBootstrap: true

حوصله نداری هر ۹۰ روز cert رو دستی عوض کنی؟ این گزینه رو روشن کن 😎


‏6. 🧪 Health Check داخلی Kubelet

healthzPort: 10248 healthzBindAddress: 127.0.0.1

❗ حواست باشه این پورت فقط روی localhost باز باشه، نه کل شبکه!


‏7. 🐧 تنظیم صحیح Cgroup Driver

cgroupDriver: systemd

اگه container runtime (مثل containerd) از systemd استفاده می‌کنه، Kubelet هم باید باهاش هماهنگ باشه.


‏8. 🧾 فعال‌سازی Static Pod Logging

staticPodPath: /etc/kubernetes/manifests

‏✅ نمونه کامل فایل KubeletConfiguration

apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration address: 0.0.0.0 readOnlyPort: 0 healthzBindAddress: 127.0.0.1 authentication: anonymous: enabled: false webhook: enabled: true authorization: mode: Webhook rotateCertificates: true serverTLSBootstrap: true cgroupDriver: systemd failSwapOn: true maxPods: 100 kubeReserved: cpu: "100m" memory: "256Mi" ephemeral-storage: "1Gi" systemReserved: cpu: "200m" memory: "512Mi" ephemeral-storage: "1Gi" evictionHard: memory.available: "100Mi" nodefs.available: "10%" imagefs.available: "15%" evictionSoft: memory.available: "300Mi" nodefs.available: "15%" evictionSoftGracePeriod: memory.available: "1m" nodefs.available: "30s" imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 70 staticPodPath: /etc/kubernetes/manifests

‏🧠 نتیجه‌گیری

‏Kubelet یه سرباز همیشه بیداره تو ارتش Kubernetes!
اگه خوب بهش منابع بدی، درست تنظیمش کنی، و گوش به حرفاش بدی (تو لاگ‌ها)، کلاسترت همیشه سالم و خوشحال می‌مونه.







devopssrekubernetesamp quot
یه دواپس سرسخت و عاشق تکنولوژی که بیشتر تو دنیای سرورهاست! همیشه دنبال یه بهینه‌سازی جدید ☕️
شاید از این پست‌ها خوشتان بیاید