Список контейнеров Kubernetes, которые используют локальные тома докеров

При развертывании рабочей нагрузки, имеющей VOLUME в файле Dockerfile, этот том не может быть сопоставлен с постоянным томом (PV / PVC) в Kubernetes.

Фактически, если к этой рабочей нагрузке не присоединен том Kubernetes, контейнер демона докеров временно создаст том докера при запуске контейнера (драйвер, введите: local). Kubernetes об этом не узнает. См .: являются ли VOLUME в Dockerfile постоянными в kubernetes. Этот том докера будет уничтожен при удалении или повторном развертывании модуля.

Безусловно, хорошая практика - использовать том kubernetes, даже временные тома ( или общие эфемерные тома ... все еще в альфа в 1.19)

Q: Как составить список модулей / контейнеров, использующих такие локальные тома?

Это действительно важно, поскольку перезапуск рабочей нагрузки / развертывания / набора с отслеживанием состояния приведет к сбою (потере эфемерного тома).


person Franklin Piat    schedule 30.11.2020    source источник
comment
Что вы развертываете, для чего требуются постоянные данные, которые не упоминаются в документации к образу? Можете ли вы использовать что-то вроде диаграммы Helm, которая сама управляет этими деталями?   -  person David Maze    schedule 30.11.2020
comment
@DavidMaze, Лучше всего использовать том kubernetes (постоянный или эфемерный). Этот вопрос здесь о том, как справиться с ситуацией, когда эта передовая практика не соблюдается.   -  person Franklin Piat    schedule 01.12.2020
comment
Сосредоточьтесь на последнем предложении возможных сбоев. Контейнеры должны быть временными. Перезапуск Pod (например, из-за перепланирования) не должен влиять на рабочую нагрузку. Если ваша рабочая нагрузка предполагает, что данные не будут потеряны, вам следует использовать ресурсы, о которых знает Kubernetes (PVC и PV). Есть ли какая-то конкретная причина, по которой вам нужно знать, какие Pods имеют тома, не известные Kubernetes. Что бы это изменило?   -  person Dawid Kruk    schedule 01.12.2020
comment
Отвечает ли это на ваш вопрос? являются ОБЪЕМОМ в Dockerfile, постоянным в кубернетах   -  person MWZ    schedule 02.12.2020


Ответы (1)


Вот небольшой скрипт, который вы можете запустить на узлах Kubernetes (для установки, использующей демон Docker).

for d in $(docker volume ls -q --filter driver=local ) ; do
  echo "=== volume $d "
  CID=$(docker ps -q -a --filter volume=$d)
  docker container inspect  -f '  Namespace : {{ index .Config.Labels "io.kubernetes.pod.namespace"}}{{ printf "\n" }}  contnr ID : {{.ID}}{{ printf "\n" }}  Name      : {{.Name}}{{ printf "\n" }}{{ range .Mounts }}{{if eq .Driver "local" }}  Mountpoint: {{ .Destination }}  (RW:{{.RW}}){{end}}{{ end }}'  $CID
  du -ms /var/lib/docker/volumes/$d/_data | sed -e 's/^\([0-9]\+\).*/  Size      : \1 MiB/';
  echo
  echo
done

пример:

=== volume c975149a17753393c543e25e4391af849d14d6d0cf2db4f4e873901ff05fea96
  Namespace :
  contnr ID : 01457a869b5a849952710a1bb023b10cf1f2dbf5779326d9c39a409b127a1437
  Name      : /nginx-proxy
  Mountpoint: /opt/rke-tools  (RW:true)
  Size      : 25 MiB


=== volume f8dbc7f9f06e82253ee882e19b72cbef5b30ba134230543aa34605cafcb6b082
  Namespace : foo
  contnr ID : 71758f3de8ab04b8547554eaf43e9ff54410feef597c55e628b8a3bb19c50e12
  Name      : /k8s_pgadmin4_foo-bar-001-pgadmin4-6d867f44d8-t566l_foo-bar_36715dd4-b858-4e8e-bc1c-c65cd7004e41_0
  Mountpoint: /var/lib/pgadmin  (RW:true)
  Size      : 1 MiB

Обратите внимание, что у некоторых системных модулей / контейнеров нет пространства имен.

Этот сценарий следует запускать на каждом узле, который вы хотите проверить.

Простым способом сканирования нескольких хостов с центрального сервера с помощью ssh было бы скопировать приведенный выше сценарий в файл local_volumes.sh, а затем выполнить команду типа cat local_volumes.sh | ssh node001 sudo bash -

Для пользователей ранчо этот фрагмент кода проверяет все охраняемые узлы: for s in $(rancher nodes ls | grep cordoned | cut -d " " -f 1 ); do cat local_volumes.sh | rancher ssh $s sudo bash - ;done

person Franklin Piat    schedule 30.11.2020
comment
Стоит отметить, что скрипты должны запускаться на каждом рабочем узле. - person rkosegi; 30.11.2020
comment
Это действительно бесполезно ни для чего, кроме «спальни». Как только вы достигнете более 3 узлов, это станет настоящей PITA (боль в ...). Лучше написать изменяющийся контроллер допуска, который проверяет, все ли тома в каждом развертывании имеют связанные PVC, и останавливает их, если их нет. Тогда вы вообще никогда не попадете в такую ​​ситуацию. Взгляните, например, на Portworx Essentials. - person Software Engineer; 01.12.2020