Kubernetes — как загрузить содержимое PersistentVolume

У меня есть исполнитель теста Pod в кластере K8s, созданный через helm, который запрашивает динамически созданный PersistentVolume, где он сохраняет результаты теста.

Теперь я хотел бы получить содержимое этого тома. Это кажется вполне естественным. Я бы ожидал kubectl download pv <id>. Но ничего не могу нагуглить.

Как я могу получить содержимое PersistentVolume?

Я в AWS EKS; поэтому AWS API также является вариантом. Также я могу получить доступ к ECR, поэтому, возможно, я мог бы как-то сохранить его как изображение и загрузить?

Или вообще ищу способ перенести каталог, можно даже в архиве. Но это должно быть после завершения работы контейнера и его прекращения.


person Ondra Žižka    schedule 16.05.2018    source источник


Ответы (2)


Я могу подумать о двух вариантах для удовлетворения ваших потребностей:

  1. Создайте модуль с прикрепленным к нему PV и используйте kubectl cp, чтобы скопировать содержимое туда, куда вам нужно. Например, вы можете использовать PodSpec, как показано ниже:
apiVersion: v1
kind: Pod
metadata:
    name: dataaccess
spec:
    containers:
    - name: alpine
      image: alpine:latest
      command: ['sleep', 'infinity']
      volumeMounts:
      - name: mypvc
        mountPath: /data
    volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: mypvc

Обратите внимание, что mypvc должно быть именем PersistentVolumeClaim, привязанного к PV, из которого вы хотите скопировать данные.

После запуска модуля вы можете запустить что-то вроде ниже, чтобы скопировать данные с любого компьютера, который kubectl настроен для подключения к вашему кластеру:

kubectl cp dataaccess:/data data/
  1. Смонтируйте том EBS PV в экземпляре EC2 и скопируйте оттуда данные. Этот случай сложнее объяснить подробно, потому что он требует немного больше контекста того, чего вы пытаетесь достичь.
person whites11    schedule 16.05.2018
comment
Не могли бы вы немного уточнить? 1) kubectl cp работает только внутри кластера, верно? Мне нужно получить его вне кластера. 2) Могу ли я установить их на лету по желанию? Это будет автоматизировано. Подключение к некоторым EC2 может работать, но загрузка на S3 проще. Я имел в виду что-то, что загружало бы контент напрямую через kubectl. Как люди переносят свой контент, когда решают выйти из облака? - person Ondra Žižka; 17.05.2018
comment
Нет, kubectl cp работает всякий раз, когда работает kubectl, поэтому вы можете использовать его для копирования данных из вашего кластера на локальную рабочую станцию, если хотите. - person whites11; 17.05.2018
comment
Что касается другого вопроса, не уверен, что вы можете сделать с AWS EBS, но я почти уверен, что вы можете каким-то образом скопировать свои данные на S3. - person whites11; 17.05.2018
comment
Добавил пример моего первого предложения. - person whites11; 17.05.2018
comment
Я делаю helm test. Это создает контейнер, который запускает тесты для некоторых модулей. helm вызывается из Дженкинса в частном центре обработки данных. Мне нужно вернуть результаты теста (сотни файлов) этому Дженкинсу. Я бы провел тесты (Гатлинга) от этого Дженкинса, но некоторые более влиятельные люди повсюду продвигают Хелма. - person Ondra Žižka; 17.05.2018
comment
Да, я думаю, что первое решение просто выполнимо. Вы можете создать сценарий создания модуля и kubectl cp внутри Jenkins CI. - person whites11; 17.05.2018
comment
Будет ли первый пример работать достаточно долго, чтобы дать вам время для копирования? В моем случае он просто закончился и был в аварийном цикле. Однако этот пример хорошо сработал для меня: контейнер, работающий в kubernetes">stackoverflow.com/questions/31870222/ - person Saty; 07.11.2019
comment
Конечно нет, я забыл указать команду, а команда по умолчанию для alpine — это то, что возвращается немедленно (отсюда и отсрочка цикла сбоя). Обновлена ​​спецификация примера. - person whites11; 08.11.2019
comment
Просто примечание о команде, используемой для поддержания жизни модуля: вы также можете использовать tail -f /dev/null (вместо sleep 999999), если хотите, чтобы модуль жил неопределенно долго до явного удаления. - person Bluu; 26.05.2020

Вот правильно отформатированный пример от @whites11

apiVersion: v1
kind: Pod
metadata:
  name: dataaccess
spec:
  containers:
    - name: alpine
      image: alpine:latest
      command: ["sleep", "infinity"]
      volumeMounts:
        - name: mypvc
          mountPath: /inbound
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: mypvc
person Blink    schedule 15.09.2020