Kubernetes: يؤدي مسار تحميل ملف configmap إلى خطأ لم يتم العثور على الأمر

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

هل هذا طلب مساعدة؟ (إذا كانت الإجابة بنعم ، فيجب عليك استخدام دليل استكشاف الأخطاء وإصلاحها وقنوات دعم المجتمع ، راجع http://kubernetes.io/docs/troubleshooting/.): لا

ما الكلمات الرئيسية التي بحثت عنها في مشكلات Kubernetes قبل حفظ هذه المشكلة؟ (إذا وجدت أي تكرارات ، فيجب عليك بدلاً من ذلك الرد هناك.): الأمر غير موجود configmap kubernetes


هل هذا تقرير خطأ أم طلب ميزة؟ (اختر واحدة): BUG

إصدار Kubernetes (استخدم kubectl version ):
إصدار العميل: v1.6.1 GitCommit: "b0b7a323cc5a4a2019b2e9520c21c7830b7f708e"
إصدار الخادم: v1.6.0 GitCommit: "fff5156092b56e6bd60fff75aad4dc9de6b6ef37

البيئة :

  • مزود السحابة أو تكوين الأجهزة :
  • نظام التشغيل (على سبيل المثال من / etc / os-release): المضيف هو ubuntu 16.04
  • Kernel (على سبيل المثال uname -a ): المضيف هو Linux dev1 4.4.0-72-generic # 93-Ubuntu SMP Fri 31 Mar 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux
  • أدوات التثبيت :
  • آخرون : يعمل من داخل إصدار minikube: v0.18.0

ماذا حدث :
عندما أحاول إنشاء نشر باستخدام ملف configmap الذي تم تحميله في نفس الدليل كنقطة الإدخال ، تفشل الحاوية في البدء بالخطأ التالي
"استجابة خطأ من البرنامج الخفي: أمر الحاوية '/app/app.sh' غير موجود أو غير موجود."
تشتمل مواصفات pod على configmap الذي يتم تثبيته في نفس الدليل مثل نقطة الدخول

يبدو أن البرنامج النصي لنقطة الدخول قد فقد بعد تحميل وحدة التخزين لخريطة التكوين في نفس الدليل
إذا قمت بتحميل ملف configmap في دليل فرعي ، فإن جميع الأعمال تعمل كما هو متوقع

ما توقعت حدوثه :
كنت أتوقع أن يتم إنشاء ملف خريطة التكوين في الدليل دون التأثير على محتوى الدليل الحالي والذي يحتوي في هذه الحالة على برنامج نصي لنقطة الإدخال

كيفية إعادة إنتاجه (بأقل قدر ممكن من الدقة والدقة):

ملف Docker - لاحظ نقطة الدخول

FROM busybox:latest

RUN        mkdir /app
COPY       app.sh /app

ENTRYPOINT ["/app/app.sh"]

برنامج نصي لنقطة الدخول - حلقة لا نهائية

#!/bin/sh
seq=1
while [[ true ]]; do
    echo "${seq} $(date) working"
    sleep .5s   
    let seq=$((seq + 1))
done

k8s configmap وملف النشر

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    product: k8s-demo
  name: demo
data:
  settings.json: |
    {
      "store": {
        "type": "InMemory",
    }

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    product: k8s-demo
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
        product: k8s-demo
    spec:
      containers:
      - name: demo
        image: pmcgrath/shellloop:1
        imagePullPolicy: Always
        volumeMounts:
          - name: demo-config
            mountPath: /app
      volumes:
        - name: demo-config
          configMap:
            name: demo
            items:
              - key: settings.json
                path: settings.json 

عندما أقوم بتشغيل kubectl application -d k8s.yaml وإلقاء نظرة على الجراب يمكنني رؤية الخطأ التالي

خطأ rpc: code = 2 desc = فشل في بدء الحاوية "f9e0112c80ebba568d4b508f99ffb053bf1ae5a4f095ce7f45bff5f38900b617": استجابة خطأ من البرنامج الخفي: أمر الحاوية '/app/app.sh' غير موجود أو غير موجود.

أي شيء آخر نحتاج إلى معرفته :
إذا قمت بتغيير mountPath لوحدة التخزين إلى أي دليل آخر فإنه يعمل كما هو متوقع

لقد اختبرت هذا مباشرة مع عامل إرساء على مضيفي (17.03.0-ce) وعمل كما هو متوقع

touch settings.json
docker container run -ti -v $(pwd)/settings.json:/app/settings.json pmcgrath/shellloop:1

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

تضمين التغريدة

الخروج من هنا .

يبدو أنني أفهم مشكلتك. لدي نفس السؤال من قبل ، ولكن هناك إجابة بالفعل في حالتك.

لإيجاز قضيتك ، لديك configmap ( settings.json: blahblah ) ، وتريد تحميلها في مجلد /app . ثم فيما يلي ما تحتاج إلى معرفته:

  1. بمجرد تحميل وحدة تخزين (بغض النظر عن أنها configmap أو غيرها) ، فإنها تتجاوز mountPath ، لذلك في حالتك ، سيحتوي المجلد /app فقط على settings.json .
  2. أعلم أن هذا ليس ما كنت تتوقعه ، لذلك عليك تحديد mountPath: /app/settings.json ، بهذه الطريقة فقط ، لن يتأثر المحتوى الأصلي في مجلدات /app .
  3. حسنًا ، عندما تقوم بالخطوة الثانية ، تتذكر أن configmap هي في الواقع قائمة من أزواج قيمة المفتاح ، فأنت تحتاج فقط إلى مفتاح واحد (على الرغم من أنك تمتلك واحدًا فقط أيضًا) ، لذلك عليك إخبار وحدات التخزين استخدام مسار فرعي منك configmap.

هذا شيء ستحصل عليه في النهاية:

containers:
- volumeMounts:
  - name: demo-config
    mountPath: /app/settings.json
    subPath: settings.json
volumes:
- name: demo-config
  configMap:
    name: demo

ال 10 كومينتر

تضمين التغريدة

الخروج من هنا .

يبدو أنني أفهم مشكلتك. لدي نفس السؤال من قبل ، ولكن هناك إجابة بالفعل في حالتك.

لإيجاز قضيتك ، لديك configmap ( settings.json: blahblah ) ، وتريد تحميلها في مجلد /app . ثم فيما يلي ما تحتاج إلى معرفته:

  1. بمجرد تحميل وحدة تخزين (بغض النظر عن أنها configmap أو غيرها) ، فإنها تتجاوز mountPath ، لذلك في حالتك ، سيحتوي المجلد /app فقط على settings.json .
  2. أعلم أن هذا ليس ما كنت تتوقعه ، لذلك عليك تحديد mountPath: /app/settings.json ، بهذه الطريقة فقط ، لن يتأثر المحتوى الأصلي في مجلدات /app .
  3. حسنًا ، عندما تقوم بالخطوة الثانية ، تتذكر أن configmap هي في الواقع قائمة من أزواج قيمة المفتاح ، فأنت تحتاج فقط إلى مفتاح واحد (على الرغم من أنك تمتلك واحدًا فقط أيضًا) ، لذلك عليك إخبار وحدات التخزين استخدام مسار فرعي منك configmap.

هذا شيء ستحصل عليه في النهاية:

containers:
- volumeMounts:
  - name: demo-config
    mountPath: /app/settings.json
    subPath: settings.json
volumes:
- name: demo-config
  configMap:
    name: demo

تضمين التغريدة
شكرا على الرد ، يعمل بناء على اقتراحك ، وأنا أقدر الشرح

أنا سعيد لإغلاق هذه القضية
تربيتة

كمرجع ، يبدو أن الإشارة الأصلية لهذا الحل موجودة هنا: https://github.com/kubernetes/kubernetes/issues/23748#issuecomment -230390309

يبدو أن الوثائق الخاصة بهذا مفقودة ، مما يجعل هذه الحالة مربكة / مضللة إلى حد ما ، ويبدو أن مستندات الإسقاط تجعلها مضللة أيضًا - لست متأكدًا مما إذا كانت مفقودة لأن التحديثات التلقائية على ما يبدو لا تعمل وفقًا لهذه المشكلة

شرط تحديد اسم الملف تحت كل من mountPath و subPath هو أمر غير متوقع.

الحل المقدم من @ zhouhaibing089 يعمل ولكن محتوى الملف المحمّل على subPath لا يتم تحديثه إذا قمنا بتحريره في ConfigMap المشابه.

IMO ، لم يتم حل هذا _really_. يجب أن يكون هناك خيار لإلحاق كل مفتاح بدلاً من الكتابة فوقه.

شيء مثل:

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-conf
data:
  example1.conf: |
    server {
      server_name example1.com;
      # config here...
    }
  example2.conf: |
    server {
      server_name example2.com;
      # config here...
    }

لهذا السبب...

- name: nginx-conf
  mountPath: /etc/nginx/conf.d
  append: true

... يحتفظ بـ default.conf وأية مصنوعات أخرى لصورة Docker ، لكن يزيد مع example*.conf

إن تكرار نفس المعلومات في المسار الفرعي هو فقط _icky_.

إجراء +1 على خيارleebenson append: true .

وفقًا لإجابة leebenson : هل يمكن لأي شخص أن يشرح من أين يأتي الخيار append: true ؟؟

إنه لا يعمل معي ، لقد حصلت على:

error: error validating "hdfs/21-namenode-statefulset.yaml": error validating data: ValidationError(StatefulSet.spec.template.spec.containers[1].volumeMounts[1]): unknown field "append" in io.k8s.api.core.v1.VolumeMount; if you choose to ignore these errors, turn validation off with --validate=false

أيضًا ، لا يوجد في مستندات api لتركيب وحدة التخزين:
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core

وفقًا لإجابة leebenson : هل يمكن لأي شخص أن يشرح من أين يأتي الخيار append: true ؟؟

إنه لا يعمل معي ، لقد حصلت على:

error: error validating "hdfs/21-namenode-statefulset.yaml": error validating data: ValidationError(StatefulSet.spec.template.spec.containers[1].volumeMounts[1]): unknown field "append" in io.k8s.api.core.v1.VolumeMount; if you choose to ignore these errors, turn validation off with --validate=false

أيضًا ، لا يوجد في مستندات api لتركيب وحدة التخزين:
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core

غير موجود ، إنه اقتراح. فكرة جيدة لحالة الاستخدام.

حاولت استخدام هذه الطريقة ، لكنني حصلت على خطأ في نظام الملفات للقراءة فقط ، عندما قمت بتطبيق مجموعة الحالة. هل يعلم احد كيف نصلح ذلك؟
(أنا أكتب فوق ملف موجود ، يحتوي على إعدادات elasticsearch ، رسالة خطأ فعلية -> /usr/share/elasticsearch/bin/run.sh: line 28: ./config/elasticsearch.yml: Read-only file system )

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