HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-19
1 Настроить хранение данных приложений, запущенных в кластере Kubernetes, можно несколькими способами. Одни из них уже устарели, другие появились совсем недавно. В этой статье рассмотрим концепцию трёх вариантов подключения СХД, в том числе самый последний - подключение через Container Storage Interface.<h2>Способ 1. Указание PV в манифесте пода</h2>
1 Настроить хранение данных приложений, запущенных в кластере Kubernetes, можно несколькими способами. Одни из них уже устарели, другие появились совсем недавно. В этой статье рассмотрим концепцию трёх вариантов подключения СХД, в том числе самый последний - подключение через Container Storage Interface.<h2>Способ 1. Указание PV в манифесте пода</h2>
2 Типичный манифест, описывающий под в кластере Kubernetes:Цветом выделены части манифеста, где описано, какой том подключается и куда.<p>В разделе <strong>volumeMounts</strong> указывают точки монтирования (mountPath) - в какой каталог внутри контейнера будет монтироваться постоянный том, а также имя тома.</p>
2 Типичный манифест, описывающий под в кластере Kubernetes:Цветом выделены части манифеста, где описано, какой том подключается и куда.<p>В разделе <strong>volumeMounts</strong> указывают точки монтирования (mountPath) - в какой каталог внутри контейнера будет монтироваться постоянный том, а также имя тома.</p>
3 <p>В разделе <strong>volumes</strong> перечисляют все тома, которые используются в поде. Указывают имя каждого тома, а также тип (в нашем случае: awsElasticBlockStore) и параметры подключения. Какие именно параметры перечисляются в манифесте, зависит от типа тома.</p>
3 <p>В разделе <strong>volumes</strong> перечисляют все тома, которые используются в поде. Указывают имя каждого тома, а также тип (в нашем случае: awsElasticBlockStore) и параметры подключения. Какие именно параметры перечисляются в манифесте, зависит от типа тома.</p>
4 <p>Один и тот же том может быть смонтирован одновременно в несколько контейнеров пода. Таким образом разные процессы приложения могут иметь доступ к одним и тем же данным.</p>
4 <p>Один и тот же том может быть смонтирован одновременно в несколько контейнеров пода. Таким образом разные процессы приложения могут иметь доступ к одним и тем же данным.</p>
5 <p>Этот способ подключения придумали в самом начале, когда Kubernetes только зарождался, и на сегодня способ устарел.</p>
5 <p>Этот способ подключения придумали в самом начале, когда Kubernetes только зарождался, и на сегодня способ устарел.</p>
6 <p>При его использовании возникает несколько проблем:</p>
6 <p>При его использовании возникает несколько проблем:</p>
7 <ol><li>все тома надо создавать вручную, Kubernetes не сможет создать ничего за нас;</li>
7 <ol><li>все тома надо создавать вручную, Kubernetes не сможет создать ничего за нас;</li>
8 <li>параметры доступа к каждому из томов уникальные, и их надо указывать в манифестах всех подов, которые используют том;</li>
8 <li>параметры доступа к каждому из томов уникальные, и их надо указывать в манифестах всех подов, которые используют том;</li>
9 <li>чтобы поменять систему хранения (например, переехать из AWS в Google Cloud), надо менять настройки и тип подключённых томов во всех манифестах.</li>
9 <li>чтобы поменять систему хранения (например, переехать из AWS в Google Cloud), надо менять настройки и тип подключённых томов во всех манифестах.</li>
10 </ol>Всё это очень неудобно, поэтому в реальности подобным способом пользуются для подключения только некоторых специальных типов томов: configMap, secret, emptyDir, hostPath:<ul><li>configMap и secret - служебные тома, позволяют создать в контейнере том с файлами из манифестов Kubernetes.</li>
10 </ol>Всё это очень неудобно, поэтому в реальности подобным способом пользуются для подключения только некоторых специальных типов томов: configMap, secret, emptyDir, hostPath:<ul><li>configMap и secret - служебные тома, позволяют создать в контейнере том с файлами из манифестов Kubernetes.</li>
11 <li>emptyDir - временный том, создаётся только на время жизни пода. Удобно использовать для тестирования или хранения временных данных. Когда pod удаляется, том типа emptyDir тоже удаляется и все данные пропадают.</li>
11 <li>emptyDir - временный том, создаётся только на время жизни пода. Удобно использовать для тестирования или хранения временных данных. Когда pod удаляется, том типа emptyDir тоже удаляется и все данные пропадают.</li>
12 <li>hostPath - позволяет смонтировать внутрь контейнера с приложением любой каталог локального диска сервера, на котором работает приложение, - в том числе /etc/kubernetes. Это небезопасная возможность, поэтому обычно политики безопасности запрещают использовать тома этого типа. Иначе приложение злоумышленника сможет замонтировать внутрь своего контейнера каталог HTC Kubernetes и украсть все сертификаты кластера. Как правило, тома hostPath разрешают использовать только системным приложениям, которые запускаются в namespace kube-system.</li>
12 <li>hostPath - позволяет смонтировать внутрь контейнера с приложением любой каталог локального диска сервера, на котором работает приложение, - в том числе /etc/kubernetes. Это небезопасная возможность, поэтому обычно политики безопасности запрещают использовать тома этого типа. Иначе приложение злоумышленника сможет замонтировать внутрь своего контейнера каталог HTC Kubernetes и украсть все сертификаты кластера. Как правило, тома hostPath разрешают использовать только системным приложениям, которые запускаются в namespace kube-system.</li>
13 </ul><a>Cистемы хранения данных, с которыми Kubernetes работает из коробки</a> приведены в документации.<h2>Способ 2. Подключение к подам SC/PVC/PV</h2>
13 </ul><a>Cистемы хранения данных, с которыми Kubernetes работает из коробки</a> приведены в документации.<h2>Способ 2. Подключение к подам SC/PVC/PV</h2>
14 Альтернативный способ подключения - концепция Storage class, PersistentVolumeClaim, PersistentVolume.Storage class хранит параметры подключения к системе хранения данных.PersistentVolumeClaim описывает требования к тому, который нужен приложению.PersistentVolume хранит параметры доступа и статус тома.<p>Суть идеи: в манифесте пода указывают volume типа PersistentVolumeClaim и указывают название этой сущности в параметре claimName.</p>
14 Альтернативный способ подключения - концепция Storage class, PersistentVolumeClaim, PersistentVolume.Storage class хранит параметры подключения к системе хранения данных.PersistentVolumeClaim описывает требования к тому, который нужен приложению.PersistentVolume хранит параметры доступа и статус тома.<p>Суть идеи: в манифесте пода указывают volume типа PersistentVolumeClaim и указывают название этой сущности в параметре claimName.</p>
15 В манифесте PersistentVolumeClaim описывают требования к тому данных, который необходим приложению. В том числе:<ul><li>размер диска;</li>
15 В манифесте PersistentVolumeClaim описывают требования к тому данных, который необходим приложению. В том числе:<ul><li>размер диска;</li>
16 <li>способ доступа: ReadWriteOnce или ReadWriteMany;</li>
16 <li>способ доступа: ReadWriteOnce или ReadWriteMany;</li>
17 <li>ссылка на Storage class - в какой системе хранения данных мы хотим создавать том.</li>
17 <li>ссылка на Storage class - в какой системе хранения данных мы хотим создавать том.</li>
18 </ul>В манифесте Storage class хранятся тип и параметры подключения к системе хранения данных. Они нужны кублету, чтобы смонтировать том к себе на узел.<p>В манифестах PersistentVolume указывается Storage class и параметры доступа к конкретному тому (ID тома, путь, и т. д.).</p>
18 </ul>В манифесте Storage class хранятся тип и параметры подключения к системе хранения данных. Они нужны кублету, чтобы смонтировать том к себе на узел.<p>В манифестах PersistentVolume указывается Storage class и параметры доступа к конкретному тому (ID тома, путь, и т. д.).</p>
19 <p>Создавая PVC, Kubernetes смотрит, том какого размера и из какого Storage class потребуется, и подбирает свободный PersistentVolume.</p>
19 <p>Создавая PVC, Kubernetes смотрит, том какого размера и из какого Storage class потребуется, и подбирает свободный PersistentVolume.</p>
20 <p>Если таких PV нет в наличии, Kubernetes может запустить специальную программу - Provisioner (её название указывают в Storage class). Эта программа подключается к СХД, создаёт том нужного размера, получает идентификатор и создает в кластере Kubernetes манифест PersistentVolume, который связывается с PersistentVolumeClaim.</p>
20 <p>Если таких PV нет в наличии, Kubernetes может запустить специальную программу - Provisioner (её название указывают в Storage class). Эта программа подключается к СХД, создаёт том нужного размера, получает идентификатор и создает в кластере Kubernetes манифест PersistentVolume, который связывается с PersistentVolumeClaim.</p>
21 <p>Всё это множество абстракций позволяет убрать информацию о том, с какой СХД работает приложение, с уровня манифеста приложений на уровень администрирования.</p>
21 <p>Всё это множество абстракций позволяет убрать информацию о том, с какой СХД работает приложение, с уровня манифеста приложений на уровень администрирования.</p>
22 <p>Все параметры подключения к системе хранения данных находятся в Storage class, за который отвечают администраторы кластера. Всё, что надо сделать при переезде из AWS в Google Cloud, - это в манифестах приложения изменить название Storage class в PVC. Persistance Volume для хранения данных будут созданы в кластере автоматически, с помощью программы Provisioner.</p>
22 <p>Все параметры подключения к системе хранения данных находятся в Storage class, за который отвечают администраторы кластера. Всё, что надо сделать при переезде из AWS в Google Cloud, - это в манифестах приложения изменить название Storage class в PVC. Persistance Volume для хранения данных будут созданы в кластере автоматически, с помощью программы Provisioner.</p>
23 <h2>Способ 3. Container Storage Interface</h2>
23 <h2>Способ 3. Container Storage Interface</h2>
24 Весь код, который взаимодействует с различными системами хранения данных, является частью ядра Kubernetes. Выпуск исправлений ошибок или нового функционала привязан к новым релизам, код приходится изменять для всех поддерживаемых версий Kubernetes. Всё это тяжело поддерживать и добавлять новый функционал.<p>Чтобы решить проблему, разработчики из Cloud Foundry, Kubernetes, Mesos и Docker создали Container Storage Interface (CSI) - простой унифицированный интерфейс, который описывает взаимодействие системы управления контейнерами и специального драйвера (CSI Driver), работающего с конкретной СХД. Весь код по взаимодействию с СХД вынесли из ядра Kubernetes в отдельную систему.</p>
24 Весь код, который взаимодействует с различными системами хранения данных, является частью ядра Kubernetes. Выпуск исправлений ошибок или нового функционала привязан к новым релизам, код приходится изменять для всех поддерживаемых версий Kubernetes. Всё это тяжело поддерживать и добавлять новый функционал.<p>Чтобы решить проблему, разработчики из Cloud Foundry, Kubernetes, Mesos и Docker создали Container Storage Interface (CSI) - простой унифицированный интерфейс, который описывает взаимодействие системы управления контейнерами и специального драйвера (CSI Driver), работающего с конкретной СХД. Весь код по взаимодействию с СХД вынесли из ядра Kubernetes в отдельную систему.</p>
25 <p><a>Документация по Container Storage Interface</a>.</p>
25 <p><a>Документация по Container Storage Interface</a>.</p>
26 <p>Как правило, CSI Driver состоит из двух компонентов: Node Plugin и Controller plugin.</p>
26 <p>Как правило, CSI Driver состоит из двух компонентов: Node Plugin и Controller plugin.</p>
27 <p>Node Plugin запускается на каждом узле и отвечает за монтирование томов и за операции на них. Controller plugin взаимодействует с СХД: создает или удаляет тома, назначает права доступа и т. д.</p>
27 <p>Node Plugin запускается на каждом узле и отвечает за монтирование томов и за операции на них. Controller plugin взаимодействует с СХД: создает или удаляет тома, назначает права доступа и т. д.</p>
28 <p>Пока в ядре Kubernetes остаются старые драйверы, но пользоваться ими уже не рекомендуют и всем советуют устанавливать CSI Driver конкретно для той системы, с которой предстоит работать.</p>
28 <p>Пока в ядре Kubernetes остаются старые драйверы, но пользоваться ими уже не рекомендуют и всем советуют устанавливать CSI Driver конкретно для той системы, с которой предстоит работать.</p>
29 <p>Нововведение может напугать тех, кто уже привык настраивать хранение данных через Storage class, но на самом деле ничего страшного не случилось. Для программистов точно ничего не меняется - они как работали только с именем Storage class, так и продолжат. Для администраторов добавилась установка helm chart и поменялась структура настроек. Если раньше настройки вводились в Storage class напрямую, то теперь их сначала надо задать в helm chart, а потом уже в Storage class. Если разобраться, ничего страшного не произошло.</p>
29 <p>Нововведение может напугать тех, кто уже привык настраивать хранение данных через Storage class, но на самом деле ничего страшного не случилось. Для программистов точно ничего не меняется - они как работали только с именем Storage class, так и продолжат. Для администраторов добавилась установка helm chart и поменялась структура настроек. Если раньше настройки вводились в Storage class напрямую, то теперь их сначала надо задать в helm chart, а потом уже в Storage class. Если разобраться, ничего страшного не произошло.</p>
30 <p>Давайте, на примере, рассмотрим какие преимущества можно получить, перейдя на подключение СХД Ceph с помощью CSI драйвера.</p>
30 <p>Давайте, на примере, рассмотрим какие преимущества можно получить, перейдя на подключение СХД Ceph с помощью CSI драйвера.</p>
31 <p>При работе с Ceph плагин CSI даёт больше возможностей для работы с СХД, чем встроенные драйверы.</p>
31 <p>При работе с Ceph плагин CSI даёт больше возможностей для работы с СХД, чем встроенные драйверы.</p>
32 <ol><li><strong>Динамическое создание дисков.</strong> Обычно диски RBD используются только в режиме RWO, а CSI для Ceph позволяет использовать их в режиме RWX. Несколько pod'ов на разных узлах могут смонтировать один и тот же RDB-диск к себе на узлы и работать с ними параллельно. Справедливости ради, не всё так лучезарно - этот диск можно подключить только как блочное устройство, то есть придётся адаптировать приложение под работу с ним в режиме множественного доступа.</li>
32 <ol><li><strong>Динамическое создание дисков.</strong> Обычно диски RBD используются только в режиме RWO, а CSI для Ceph позволяет использовать их в режиме RWX. Несколько pod'ов на разных узлах могут смонтировать один и тот же RDB-диск к себе на узлы и работать с ними параллельно. Справедливости ради, не всё так лучезарно - этот диск можно подключить только как блочное устройство, то есть придётся адаптировать приложение под работу с ним в режиме множественного доступа.</li>
33 <li><strong>Создание снапшотов.</strong> В кластере Kubernetes можно создать манифест с требованием создать снапшот. Плагин CSI его увидит и сделает снапшот с диска. На его основании можно будет сделать либо бэкап, либо копию PersistentVolume.</li>
33 <li><strong>Создание снапшотов.</strong> В кластере Kubernetes можно создать манифест с требованием создать снапшот. Плагин CSI его увидит и сделает снапшот с диска. На его основании можно будет сделать либо бэкап, либо копию PersistentVolume.</li>
34 <li><strong>Увеличение размера диска</strong> на СХД и PersistentVolume в кластере Kubernetes.</li>
34 <li><strong>Увеличение размера диска</strong> на СХД и PersistentVolume в кластере Kubernetes.</li>
35 <li><strong>Квоты.</strong> Встроенные в Kubernetes драйверы CephFS не поддерживают квоты, а свежие CSI-плагины со свежим Ceph Nautilus умеют включать квоты на CephFS-разделы.</li>
35 <li><strong>Квоты.</strong> Встроенные в Kubernetes драйверы CephFS не поддерживают квоты, а свежие CSI-плагины со свежим Ceph Nautilus умеют включать квоты на CephFS-разделы.</li>
36 <li><strong>Метрики.</strong> CSI-плагин может отдавать в Prometheus множество метрик о том, какие тома подключены, какие идут взаимодействия и т. д.</li>
36 <li><strong>Метрики.</strong> CSI-плагин может отдавать в Prometheus множество метрик о том, какие тома подключены, какие идут взаимодействия и т. д.</li>
37 <li><strong>Topology aware.</strong> Позволяет указать в манифестах, как географически распределён кластер, и избежать подключения к подам, запущенным в Лондоне системы хранения данных, расположенной в Амстердаме.</li>
37 <li><strong>Topology aware.</strong> Позволяет указать в манифестах, как географически распределён кластер, и избежать подключения к подам, запущенным в Лондоне системы хранения данных, расположенной в Амстердаме.</li>
38 </ol>Как подключить Ceph к кластеру Kubernetes через CSI, смотрите <a>в практической части лекции вечерней школы Слёрм</a>. Так же можно подписаться на <a>видео-курс Ceph</a>, который будет запущен 15 октября.
38 </ol>Как подключить Ceph к кластеру Kubernetes через CSI, смотрите <a>в практической части лекции вечерней школы Слёрм</a>. Так же можно подписаться на <a>видео-курс Ceph</a>, который будет запущен 15 октября.