Это просьба о помощи? (Если да, вам следует использовать наше руководство по устранению неполадок и каналы поддержки сообщества, см. Http://kubernetes.io/docs/troubleshooting/.): Нет
Какие ключевые слова вы искали в выпусках Kubernetes перед тем, как подать это? (Если вы нашли какие-либо дубликаты, вы должны вместо этого ответить там.): Команда не найдена configmap kubernetes
Это ОТЧЕТ ОБ ОШИБКЕ или ЗАПРОС О ФУНКЦИОНИРОВАНИИ? (выберите один): ОШИБКА
Версия 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 Пт 31 марта 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU / LinuxЧто случилось :
Когда я пытаюсь создать развертывание с файлом configmap, который смонтирован в том же каталоге, что и точка входа, контейнер не запускается из-за следующей ошибки
«Ответ об ошибке от демона: команда контейнера '/app/app.sh' не найдена или не существует».
Спецификация модуля включает конфигурационную карту, которая монтируется в тот же каталог, что и точка входа.
Похоже, сценарий точки входа теряется после монтирования тома для карты конфигурации в том же каталоге.
Если я монтирую файл 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 apply -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
@pmcgrath
Оформить заказ здесь .
Кажется, я понимаю вашу проблему. У меня раньше был тот же вопрос, но на самом деле ответ есть в вашей ситуации.
Вкратце, у вас есть 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
@ zhouhaibing089
Спасибо за ответ, работает на основе вашего предложения, я ценю объяснение
Я рад закрыть этот вопрос
Пэт
Для справки, первоначальное упоминание этого решения, похоже, находится здесь: https://github.com/kubernetes/kubernetes/issues/23748#issuecomment -230390309
Похоже, что документация по этому поводу отсутствует, что делает этот случай довольно запутанным / вводящим в заблуждение, а документы проекции, похоже, делают его еще более вводящим в заблуждение - не уверен, что он отсутствует, потому что автоматические обновления, по-видимому, не работают в соответствии с этой проблемой.
Требование указывать имя файла как в mountPath
и в subPath
противоречит здравому смыслу.
Решение, предоставленное @ zhouhaibing089, работает, но содержимое смонтированного файла по адресу subPath
не обновляется, если мы редактируем его в похожей ConfigMap.
ИМО, это действительно не решено. Должна быть возможность добавлять каждый ключ, а не перезаписывать.
Что-то вроде:
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
Повторять ту же информацию в subPath - это просто _icky_.
+1 к опции append: true
@leebenson .
Согласно ответу @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
)
Самый полезный комментарий
@pmcgrath
Оформить заказ здесь .
Кажется, я понимаю вашу проблему. У меня раньше был тот же вопрос, но на самом деле ответ есть в вашей ситуации.
Вкратце, у вас есть configmap (
settings.json: blahblah
), и вы хотите смонтировать его в папку/app
. Тогда ниже то, что вам нужно знать:mountPath
, поэтому в вашем случае папка/app
будет содержать толькоsettings.json
.mountPath: /app/settings.json
, только так исходное содержимое в папках/app
не будет затронуто.Это то, что вы в конечном итоге получите: