اگه داری با Kubernetes حال میکنی (یا شاید هم داری زور میزنی که حال کنی 😅)، حتماً اسم Kubelet به گوشت خورده. ایشون در اصل مغز متفکر هر Node توی کلاسترته؛ یه جورایی کارگر وفاداریه که همیشه توی صحنهست!
حالا بیایم ببینیم چطور میتونیم این موجود دوستداشتنی رو به بهترین شکل ممکن کانفیگ کنیم تا هم بهتر کار کنه و هم کمتر اذیتمون کنه.
قبل از اینکه بریم سراغ کانفیگ حرفهای، یه یادآوری کوچیک:
Kubelet یه agent روی هر نود توی Kubernetes هست که وظیفهش اجرای پادها، بررسی سلامتیشون (health)، و گزارش دادن به کنترل پلینه.
Kubelet چند روش برای تنظیمات داره:
--v=2
)🎯 Best Practice: به جای فلگهای خط فرمان، از فایل کانفیگ استفاده کن! هم خوندنش راحتتره، هم مانیتورش آسونتره.
یه نمونه از فایل کانفیگ:
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
خاموش کردن پورت Read-Only:
readOnlyPort: 0
فعال کردن Webhook برای authn/authz:
authentication: webhook: enabled: true authorization: mode: Webhook
مدیریت منابع توی Kubelet مثل هنر بالانس کردن بشقابهاست!
اگه درست انجامش ندی، یا Kubelet له میشه زیر فشار، یا سیستمعامل هنگ میکنه، یا پادها شروع میکنن به مردن بیصدا. 😵
📌 منابع اصلی قابل تنظیم:
برای اینکه سیستمعامل و 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 در نظر بگیری.
اگه منابع خیلی کم بشن، 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)، اگه وضع وخیمتر شد میزنه پادهای سبکتر رو حذف میکنه.
بر اساس requests
و limits
، Kubelet پادها رو تو سه کلاس قرار میده:
❗ پادهای BestEffort اولین قربانیهای eviction هستن!
maxPods: 110
بسته به حجم منابع نود، این عدد رو تنظیم کن. برای نودهای سبک، 60
تا 80
پاد منطقیتره.
imageGCHighThresholdPercent: 85 imageGCLowThresholdPercent: 70
وقتی دیسک پر میشه، ایمیجهایی که مدت طولانی استفاده نشدن رو حذف میکنه.
rotateCertificates: true serverTLSBootstrap: true
حوصله نداری هر ۹۰ روز cert رو دستی عوض کنی؟ این گزینه رو روشن کن 😎
healthzPort: 10248 healthzBindAddress: 127.0.0.1
❗ حواست باشه این پورت فقط روی localhost باز باشه، نه کل شبکه!
cgroupDriver: systemd
اگه container runtime (مثل containerd) از systemd
استفاده میکنه، Kubelet هم باید باهاش هماهنگ باشه.
staticPodPath: /etc/kubernetes/manifests
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!
اگه خوب بهش منابع بدی، درست تنظیمش کنی، و گوش به حرفاش بدی (تو لاگها)، کلاسترت همیشه سالم و خوشحال میمونه.