Наповнювачі томів та джерела даних
У цьому документі описано наповнювачі томів (volume populators) та джерела даних (data sources) в Kubernetes. Рекомендується вже мати уявлення про постійні томи.
Коли ви створюєте PersistentVolumeClaim, том, який Kubernetes виділяє для нього, зазвичай спочатку є порожнім. Джерело даних дозволяє замість цього запитувати, щоб новий том був попередньо заповнений наявними даними. Наповнювачі томів — це контролери, які виконують це заповнення на основі джерела даних, на яке посилається PersistentVolumeClaim.
Kubernetes має вбудовану підтримку джерел даних, які клонують наявний том або відновлюють знімок тому. Користувацькі наповнювачі томів розширюють цей механізм. Джерело даних — це користувацький ресурс, тобто обʼєкт, тип якого визначено за допомогою CustomResourceDefinition. Контролер-наповнювач відстежує PersistentVolumeClaims, які посилаються на такий ресурс, і заповнює новий том даними з нього.
Наповнювачі томів та джерела даних
Kubernetes v1.24 [beta]Kubernetes підтримує користувацькі наповнювачі томів. Щоб використовувати користувацькі наповнювачі томів, ви повинні увімкнути функціональну можливість AnyVolumeDataSource для kube-apiserver та kube-controller-manager.
Наповнювачі томів використовують поле специфікації PVC з назвою dataSourceRef. На відміну від поля dataSource, яке може містити лише посилання на інший PersistentVolumeClaim або на VolumeSnapshot, поле dataSourceRef може містити посилання на будь-який обʼєкт у тому самому просторі імен, за винятком основних обʼєктів, відмінних від PVC. Для кластерів, у яких увімкнено цю функціональну можливість, використання dataSourceRef є кращим, ніж dataSource.
Посилання на джерела даних
Поле dataSourceRef поводиться майже так само, як поле dataSource. Якщо одне з них вказано, а інше — ні, сервер API надасть обом полям однакове значення. Жодне поле не може бути змінено після створення, а спроба вказати різні значення для цих двох полів призведе до помилки валідації. Тому обидва поля завжди матимуть однаковий вміст.
Існують дві відмінності між полями dataSourceRef та dataSource, про які користувачі повинні знати:
- Поле
dataSourceігнорує недійсні значення (ніби поле було порожнім), тоді якdataSourceRefніколи не ігнорує значення і спричинить помилку, якщо використано недійсне значення. Недійсними значеннями є будь-які основні обʼєкти (обʼєкти без apiGroup), крім PVC. - Поле
dataSourceRefможе містити різні типи обʼєктів, тоді як полеdataSourceдозволяє лише PVC та VolumeSnapshots.
Коли увімкнено функцію CrossNamespaceVolumeDataSource, зʼявляються додаткові відмінності:
- Поле
dataSourceдозволяє лише локальні обʼєкти, тоді як полеdataSourceRefдозволяє обʼєкти в будь-яких просторах імен. - Коли вказано простір імен,
dataSourceтаdataSourceRefне синхронізуються.
Користувачі завжди повинні використовувати dataSourceRef у кластерах, де увімкнено цю функціональну можливість, і повертатися до dataSource у кластерах, де її немає. Немає необхідності переглядати обидва поля за жодних обставин. Дубльовані значення з дещо різною семантикою існують лише для зворотної сумісності. Зокрема, суміш старих і нових контролерів може взаємодіяти, оскільки поля однакові.
Використання наповнювачів томів
Наповнювачі томів — це контролери, які можуть створювати непорожні томи, де вміст тому визначається користувацьким ресурсом. Користувачі створюють заповнений том, посилаючись на користувацький ресурс за допомогою поля dataSourceRef:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: populated-pvc
spec:
dataSourceRef:
name: example-name
kind: ExampleDataSource
apiGroup: example.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Оскільки наповнювачі томів є зовнішніми компонентами, спроби створити PVC, який їх використовує, можуть зазнати невдачі, якщо не встановлено всі необхідні компоненти. Зовнішні контролери повинні генерувати події на PVC для надання зворотного звʼязку щодо статусу створення, включаючи попередження, якщо PVC не може бути створено через відсутність певного компонента.
Ви можете встановити alpha-контролер volume data source validator у свій кластер. Цей контролер генерує попереджувальні події (Events) на PVC у випадку, якщо жоден наповнювач не зареєстровано для обробки такого типу джерела даних. Коли відповідний наповнювач встановлено для PVC, саме цей контролер-наповнювач відповідає за створення подій, повʼязаних зі створенням тому та проблемами під час цього процесу.
Джерела даних між просторами імен
Kubernetes v1.26 [alpha]Kubernetes підтримує джерела даних томів між просторами імен. Щоб використовувати джерела даних томів між просторами імен, ви повинні увімкнути функціональні можливості AnyVolumeDataSource та CrossNamespaceVolumeDataSource для kube-apiserver та kube-controller-manager. Крім того, ви повинні увімкнути функціональну можливість CrossNamespaceVolumeDataSource для csi-provisioner.
Увімкнення функціональної можливості CrossNamespaceVolumeDataSource дозволяє вам вказати простір імен у полі dataSourceRef.
Примітка:
Коли ви вказуєте простір імен для джерела даних тому, Kubernetes перевіряє наявність ReferenceGrant в іншому просторі імен перед прийняттям посилання. ReferenceGrant є частиною розширених APIgateway.networking.k8s.io. Перегляньте ReferenceGrant в документації Gateway API для отримання деталей. Це означає, що ви повинні розширити свій кластер Kubernetes принаймні ReferenceGrant з Gateway API, перш ніж ви зможете використовувати цей механізм.Використання джерела даних тому між просторами імен
Kubernetes v1.26 [alpha]Створіть ReferenceGrant, щоб дозволити власнику простору імен прийняти посилання. Ви визначаєте заповнений том, вказуючи джерело даних тому між просторами імен за допомогою поля dataSourceRef. У вихідному просторі імен уже повинен існувати дійсний ReferenceGrant:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-ns1-pvc
namespace: default
spec:
from:
- group: ""
kind: PersistentVolumeClaim
namespace: ns1
to:
- group: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: new-snapshot-demo
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: foo-pvc
namespace: ns1
spec:
storageClassName: example
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
dataSourceRef:
apiGroup: snapshot.storage.k8s.io
kind: VolumeSnapshot
name: new-snapshot-demo
namespace: default
volumeMode: Filesystem
Що далі
- Дізнайтеся про постійні томи.
- Дізнайтеся про клонування CSI-томів.
- Дізнайтеся про знімки томів.
- Прочитайте про функціональні можливості, згадані на цій сторінці.