هل هذا طلب مساعدة؟ (إذا كانت الإجابة بنعم ، فيجب عليك استخدام دليل استكشاف الأخطاء وإصلاحها وقنوات دعم المجتمع ، راجع http://kubernetes.io/docs/troubleshooting/.): لا
ما الكلمات الرئيسية التي بحثت عنها في مشكلات Kubernetes قبل حفظ هذه المشكلة؟ (إذا وجدت أي تكرارات ، فيجب عليك بدلاً من ذلك الرد هناك.): الأمر غير موجود configmap kubernetes
هل هذا تقرير خطأ أم طلب ميزة؟ (اختر واحدة): BUG
إصدار Kubernetes (استخدم kubectl version
):
إصدار العميل: v1.6.1 GitCommit: "b0b7a323cc5a4a2019b2e9520c21c7830b7f708e"
إصدار الخادم: v1.6.0 GitCommit: "fff5156092b56e6bd60fff75aad4dc9de6b6ef37
البيئة :
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ماذا حدث :
عندما أحاول إنشاء نشر باستخدام ملف 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
. ثم فيما يلي ما تحتاج إلى معرفته:
mountPath
، لذلك في حالتك ، سيحتوي المجلد /app
فقط على settings.json
.mountPath: /app/settings.json
، بهذه الطريقة فقط ، لن يتأثر المحتوى الأصلي في مجلدات /app
.هذا شيء ستحصل عليه في النهاية:
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
)
التعليق الأكثر فائدة
تضمين التغريدة
الخروج من هنا .
يبدو أنني أفهم مشكلتك. لدي نفس السؤال من قبل ، ولكن هناك إجابة بالفعل في حالتك.
لإيجاز قضيتك ، لديك configmap (
settings.json: blahblah
) ، وتريد تحميلها في مجلد/app
. ثم فيما يلي ما تحتاج إلى معرفته:mountPath
، لذلك في حالتك ، سيحتوي المجلد/app
فقط علىsettings.json
.mountPath: /app/settings.json
، بهذه الطريقة فقط ، لن يتأثر المحتوى الأصلي في مجلدات/app
.هذا شيء ستحصل عليه في النهاية: