Kubeadm: [خطأ مبادلة]: لا يتم دعم التشغيل مع التبديل. الرجاء تعطيل المبادلة

تم إنشاؤها على ٢١ ديسمبر ٢٠١٧  ·  11تعليقات  ·  مصدر: kubernetes/kubeadm

هل هذا تقرير خطأ أم طلب ميزة؟

تقرير الشوائب

إصدارات

إصدار kubeadm (استخدم kubeadm version ): 1.9.0

البيئة :

  • إصدار Kubernetes (استخدم kubectl version ): 1.9.0
  • مزود السحابة أو تكوين الأجهزة : Raspberry Pi
  • نظام التشغيل (على سبيل المثال من / etc / os-release): Raspbian GNU / Linux 8 (jessie)
  • Kernel (على سبيل المثال uname -a ): Linux 4.9.35-v7 +
  • آخرون :

ماذا حدث؟

عند تنفيذ kubeadm init يظهر الخطأ [ERROR Swap]: running with swap on is not supported. Please disable swap . الإصلاح المقترح هو استخدام علم kubelet بشكل أساسي:

kubeadm reset 
echo 'Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"' >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet

kubeadm init

لكن في النهاية ، الخطأ لا يزال قائما. ربما تكون هذه مشكلة في Kubelet بدلاً من ذلك أو ربما أخطأت في تكوين شيء ما ...

التعليق الأكثر فائدة

swapoff -a

ال 11 كومينتر

إذا قمت بتعيين علامة kubelet ، فأنت بأمان للقيام بذلك kubeadm init --ignore-preflight-errors Swap ، لكنني أوصيك بإيقاف تشغيل المبادلة بدلاً من ذلك ، حيث ستنتقل إلى منطقة غير مدعومة هنا.

لا حاجة لإعادة فتح هذا ولكن ما زلت أشعر أن هذا أمر بديهي بعض الشيء. إذا قمت بتعيين علامة kubelet ، فأنا أتوقع أنني لست بحاجة إلى تجاهل أخطاء الاختبار المبدئي. إذا لم يتم تمرير --ignore-preflight-errors ، تظل رسالة الخطأ كما هي سواء تم تمكين علامة kubelet أم لا ، وهذا أمر مضلل.

ما هو الأمر لإيقاف المبادلة؟

swapoff -a

صحيح أن swapoff -a هو حل سحري في معظم الحالات ، ومع ذلك ، قد تتطلب بعض إعدادات k8s مبادلة بالفعل. على سبيل المثال ، لدي جهاز افتراضي صغير جدًا ورخيص مع ذاكرة وصول عشوائي بسعة 1 جيجابايت فقط ، والتي أستخدمها في GitLab Runner الشخصي الذي نادرًا ما يتعامل مع مهام CI / CD القصيرة. إذا قمت بزيادة حجم الجهاز ، فسأدفع أكثر لمورد خاملاً بنسبة 99٪. إذا قمت بتعطيل المبادلة ، فقد يتعطل npm install والنصوص البرمجية الأخرى داخل البودات لأنها تتطلب قدرًا كبيرًا من الذاكرة ، على الرغم من فترات زمنية قصيرة. وبالتالي ، فإن الكتلة المكونة من عقدة واحدة kubeadm مع مخطط عداء gitlab والمبادلة هي أفضل ما يناسبني.

إليك كيف يمكنني تشغيل الكتلة الصغيرة الخاصة بي:

UPD: ينطبق الحل البديل أدناه على k8s 1.10- فقط - لـ 1.11+ راجع https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ (TLDR: يمكنك تحديد kubeletConfiguration:\n failSwapOn: false in kubeadm الخاص بك config.yaml ثم kubeadm init --config config.yaml --ignore-preflight-errors Swap ).

kubeadm reset 

## ↓ see explanation below
sed -i '9s/^/Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"\n/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet

echo "
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
api:
  bindPort: ${K8S_API_PORT}
apiServerCertSANs: ${K8S_API_EXTRA_HOSTS}
" > /tmp/config.yaml

kubeadm init --config /tmp/config.yaml --ignore-preflight-errors Swap

## make possible to run workload on master
kubectl taint nodes --all node-role.kubernetes.io/master-

تنطبق الفقرات أدناه على k8s 1.10- فقط
سبب استخدامي sed -i '9s/^/... بدلاً من echo 'Environment="..."' >> ... كما ذكر من قبل cjdcordeiro هو أنه في الحالة الأخيرة ، تم 10-kubeadm.conf بترتيب خاطئ:

...
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ$
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

نظرًا لأن KUBELET_EXTRA_ARGS ظهر بعد ExecStart ، بدا الأمر وكأنه لم يرتفع. مع sed -i '9s/^/... ، ينتهي الملف /etc/systemd/system/kubelet.service.d/10-kubeadm.conf هكذا ويعمل:

...
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ$

سيكون من الرائع أن يكون تمكين المبادلة في kubeadm أسهل من الآن - فهذا من شأنه أن يوفر على الأشخاص في جميع أنحاء العالم ساعات. كان عمل الكتلة المصغرة الخاصة بي بعد الترقية إلى 1.8 يمثل ألمًا حقيقيًا لأنني عديم الخبرة في إدارة Linux وأعتقد أنه سيكون أمرًا رائعًا إذا لم يضطر الآخرون إلى اتخاذ نفس المسار. سيبدو الحل المثالي مثل IMO:

echo "
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
kubeletConfiguration:
  allowSwap: true
" > /tmp/config.yaml

kubeadm init --config /tmp/config.yaml

بطبيعة الحال ، يجب أن يظل تمكين المقايضة حالة مميزة لأنه قد يؤدي إلى حدوث مشاكل في كثير من الظروف. ومع ذلك ، سيكون من الرائع أن يكون لدى مستخدمي kubeadm خيار. حتى ذلك الحين ، سيكون أمرًا رائعًا إذا كانت هناك مشكلة مفتوحة حول تمكين المبادلة.

+1 لوجود خيار لعلامة "ميزة" تجريبية / ألفا / إلخ لتمكين المبادلة التي تضيفها إلى قائمة kubeadm في kubelet.service.d وتعطيل فحص ما قبل الرحلة. بالتأكيد حالة استثنائية ، تمت الموافقة عليها ، لكن سيكون من الجيد لو كان الأمر أسهل.

(ومع ذلك ، فإن البحث في Google والقدرة على العثور بسرعة على هذه المشكلة يساعدان كثيرًا.)

لقد أوقفت المبادلة الخاصة بي ولكن ما زلت أتلقى هذا الخطأ.

فقط للتسجيل ، على الأقل في نظام قائم على ubuntu ، أعتقد أن المكان لإضافة علامة _-- fail-swap-on = false_ في _ / etc / default / kubelet_ file ؛ ليس في ملف أسيوط _systemd_ نفسه.

فقط للتسجيل ، على الأقل في نظام قائم على ubuntu ، أعتقد أن المكان لإضافة --fail-swap-on = false flag موجود في / etc / default / kubelet file ؛ ليس في ملف أسيوط systemd نفسه.

بالنسبة لـ 1.11+ هذا صحيح.

لتعطيله نهائيًا ، فقط أدخل <strong i="5">@reboot</strong> /sbin/swapoff -a مع فاصل أسطر في النهاية في sudo crontab -e .

تم الاختبار على Ubuntu 16.04 و 18.04.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات