Как я могу сохранить любые изменения контейнеров? - PullRequest
1 голос
/ 03 июня 2019

Если у меня есть один контейнер Ubuntu, и я ssh к нему и создаю один файл после того, как контейнер уничтожен, или я перезагружаю контейнер, новый файл был уничтожен, потому что kubernetes загружает образ Ubuntu, который не содержит мои изменения. У меня вопрос, что я должен сделать, чтобы сохранить все изменения ? Я знаю, это можно сделать , потому что это делают некоторые облачные провайдеры.

Например:

ssh ubuntu@POD_IP
mkdir new_file
ls 
  new_file
reboot

после перезагрузки у меня

ssh ubuntu@POD_IP
ls 

ls ничего не показывает

Но я хочу, чтобы это сохранило мое текущее состояние. И я хочу сделать это автоматически .

Если я использую Docker commit, я не могу контролировать свои изображения, потому что он создает сотни изображений. потому что я должен делать изображения при каждом изменении.

Если Я хочу использовать хранилище Я должен mount / . но kubernetes не позволяет мне монтировать /. и это дает мне эту ошибку

Ошибка: ошибка ответа от демона: неверная спецификация тома: '/var/lib/kubelet/pods/26c39eeb-85d7-11e9-933c-7c8bca006fec/volumes/kubernetes.io~rbd/pvc-d66d9039-853d-11e9- 8aa3-7c8bca006fec: / ': неверная конфигурация монтирования для типа «bind»: неверная спецификация: назначение не может быть «/'

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Докер и Кубернетес не работают таким образом.Никогда не беги docker commit.Обычно у вас очень мало потребности в ssh-демоне в контейнере / модуле, и вам нужно выполнить специальную работу, чтобы запустить как sshd, так и основной процесс (и дополнительную работу для обеспечения безопасности sshd);ваши контейнеры будут проще и безопаснее, если вы просто удалите их.

Обычный процесс включает технику, известную как неизменная инфраструктура .Вы никогда не меняете код в существующем контейнере;вместо этого вы изменяете рецепт создания контейнера и сообщаете менеджеру кластера, что хотите обновить его, и он будет сносить и перестраивать все с нуля.Чтобы внести изменения в приложение, работающее в модуле Kubernetes, вы обычно:

  1. Вносите и проверяете изменение кода локально, без участия Docker или Kubernetes.
  2. docker build новое изображение, включающее изменение вашего кода.У него должен быть уникальный тег, часто отметка даты или идентификатор фиксации управления исходным кодом.
  3. (необязательно, но рекомендуется) docker run для локального изображения и запуска интеграционных тестов.
  4. docker push theизображение в реестр.
  5. Измените тег изображения в спецификации развертывания Kubernetes и kubectl apply (или helm upgrade) его.

Часто у вас будет автоматизированный непрерывная интеграция система выполняет шаги 2-4, а система непрерывного развертывания выполняет последний шаг;вам просто нужно зафиксировать и отправить проверенное изменение.

Обратите внимание, что при локальном docker run образе на шаге 3 вы запускаете точно такой же образ, как и ваша производственная система Kubernetes.Не поддавайтесь искушению смонтировать в него свое локальное исходное дерево и попытайтесь сделать разработку там!Если тест не пройден на этом этапе, сведите его к простейшему неудачному случаю, напишите для него модульный тест и исправьте его в своем локальном дереве.Восстановление изображения не должно быть особенно дорогим.

Ваш вопрос намекает на неизмененное ubuntu изображение.Помимо каких-то очень ранних экспериментов типа «здравствуй, мир», практически нет причин использовать это где-либо, кроме строки FROM в Dockerfile.Если вы еще этого не сделали, вам следует пройти официальное руководство по по созданию и запуску пользовательских образов , которое будет применимо к любой кластерной системе.(Пропустите все последующие уроки, которые охватывают Docker Swarm, если вы уже выбрали Kubernetes в качестве оркестратора.)

0 голосов
/ 03 июня 2019

Вы можете попытаться использовать docker commit, но вам нужно будет убедиться, что ваш кластер Kubernetes выбирает последнее загруженное вами изображение -

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Это будетсоздайте новое изображение из своего контейнера, которое вы можете передать Kubernetes.

Ref - https://docs.docker.com/engine/reference/commandline/commit/

Обновление 1 -

На случай, если выЕсли вы хотите сделать это автоматически, вам может потребоваться сохранить измененное состояние или файлы в централизованной файловой системе, такой как NFS и т. д., а затем при необходимости смонтировать ее во все работающие контейнеры с соответствующими разрешениями.

K8s ref - https://kubernetes.io/docs/concepts/storage/persistent-volumes/

...