# Наповнювачі томів та джерела даних

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

У цьому документі описано _наповнювачі томів_ (volume populators) та _джерела даних_ (data sources) в Kubernetes. Рекомендується вже мати уявлення про [постійні томи](/docs/concepts/storage/persistent-volumes/).

<!-- body -->

Коли ви створюєте <a class='glossary-tooltip' title='Запит на використання ресурсів зберігання, визначених у PersistentVolume, для їх монтування як томів в контейнері.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims' target='_blank' aria-label='PersistentVolumeClaim'>PersistentVolumeClaim</a>, том, який Kubernetes виділяє для нього, зазвичай спочатку є порожнім. _Джерело даних_ дозволяє замість цього запитувати, щоб новий том був попередньо заповнений наявними даними. _Наповнювачі томів_ — це контролери, які виконують це заповнення на основі джерела даних, на яке посилається PersistentVolumeClaim.

Kubernetes має вбудовану підтримку джерел даних, які [клонують наявний том](/docs/concepts/storage/volume-pvc-datasource/) або [відновлюють знімок тому](/docs/concepts/storage/volume-snapshots/). Користувацькі наповнювачі томів розширюють цей механізм. Джерело даних — це користувацький ресурс, тобто обʼєкт, тип якого визначено за допомогою <a class='glossary-tooltip' title='Власний код, який визначає ресурс для додавання до сервера API вашого кластера Kubernetes без створення власного сервера.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/' target='_blank' aria-label='CustomResourceDefinition'>CustomResourceDefinition</a>. Контролер-наповнювач відстежує PersistentVolumeClaims, які посилаються на такий ресурс, і заповнює новий том даними з нього.

## Наповнювачі томів та джерела даних {#volume-populators-and-data-sources}








  <div class="feature-state-notice feature-beta">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.24 [beta]</code>
    </div>
  



Kubernetes підтримує користувацькі наповнювачі томів. Щоб використовувати користувацькі наповнювачі томів, ви повинні увімкнути функціональну можливість [`AnyVolumeDataSource`](/docs/reference/command-line-tools-reference/feature-gates/#AnyVolumeDataSource) для kube-apiserver та kube-controller-manager.

Наповнювачі томів використовують поле специфікації PVC з назвою `dataSourceRef`. На відміну від поля `dataSource`, яке може містити лише посилання на інший PersistentVolumeClaim або на VolumeSnapshot, поле `dataSourceRef` може містити посилання на будь-який обʼєкт у тому самому просторі імен, за винятком основних обʼєктів, відмінних від PVC. Для кластерів, у яких увімкнено цю функціональну можливість, використання `dataSourceRef` є кращим, ніж `dataSource`.

## Посилання на джерела даних {#data-source-references}

Поле `dataSourceRef` поводиться майже так само, як поле `dataSource`. Якщо одне з них вказано, а інше — ні, сервер API надасть обом полям однакове значення. Жодне поле не може бути змінено після створення, а спроба вказати різні значення для цих двох полів призведе до помилки валідації. Тому обидва поля завжди матимуть однаковий вміст.

Існують дві відмінності між полями `dataSourceRef` та `dataSource`, про які користувачі повинні знати:

* Поле `dataSource` ігнорує недійсні значення (ніби поле було порожнім), тоді як `dataSourceRef` ніколи не ігнорує значення і спричинить помилку, якщо використано недійсне значення. Недійсними значеннями є будь-які основні обʼєкти (обʼєкти без apiGroup), крім PVC.
* Поле `dataSourceRef` може містити різні типи обʼєктів, тоді як поле `dataSource` дозволяє лише PVC та VolumeSnapshots.

Коли увімкнено функцію `CrossNamespaceVolumeDataSource`, зʼявляються додаткові відмінності:

* Поле `dataSource` дозволяє лише локальні обʼєкти, тоді як поле `dataSourceRef` дозволяє   обʼєкти в будь-яких просторах імен.
* Коли вказано простір імен, `dataSource` та `dataSourceRef` не синхронізуються.

Користувачі завжди повинні використовувати `dataSourceRef` у кластерах, де увімкнено цю функціональну можливість, і повертатися до `dataSource` у кластерах, де її немає. Немає необхідності переглядати обидва поля за жодних обставин. Дубльовані значення з дещо різною семантикою існують лише для зворотної сумісності. Зокрема, суміш старих і нових контролерів може взаємодіяти, оскільки поля однакові.

### Використання наповнювачів томів {#using-volume-populators}

Наповнювачі томів — це <a class='glossary-tooltip' title='Контролер — цикл управління, що спостерігає за загальним станом кластера через apiserver і вносить зміни в намаганні наблизити поточний стан до бажаного.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/architecture/controller/' target='_blank' aria-label='контролери'>контролери</a>, які можуть створювати непорожні томи, де вміст тому визначається користувацьким ресурсом. Користувачі створюють заповнений том, посилаючись на користувацький ресурс за допомогою поля `dataSourceRef`:

```yaml
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](https://github.com/kubernetes-csi/volume-data-source-validator) у свій кластер. Цей контролер генерує попереджувальні події (Events) на PVC у випадку, якщо жоден наповнювач не зареєстровано для обробки такого типу джерела даних. Коли відповідний наповнювач встановлено для PVC, саме цей контролер-наповнювач відповідає за створення подій, повʼязаних зі створенням тому та проблемами під час цього процесу.

## Джерела даних між просторами імен {#cross-namespace-data-sources}








  <div class="feature-state-notice feature-alpha">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.26 [alpha]</code>
    </div>
  



Kubernetes підтримує джерела даних томів між просторами імен. Щоб використовувати джерела даних томів між просторами імен, ви повинні увімкнути функціональні можливості [`AnyVolumeDataSource`](https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/#AnyVolumeDataSource) та [`CrossNamespaceVolumeDataSource`](https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/#CrossNamespaceVolumeDataSource) для kube-apiserver та kube-controller-manager. Крім того, ви повинні увімкнути функціональну можливість `CrossNamespaceVolumeDataSource` для csi-provisioner.

Увімкнення функціональної можливості `CrossNamespaceVolumeDataSource` дозволяє вам вказати простір імен у полі dataSourceRef.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Коли ви вказуєте простір імен для джерела даних тому, Kubernetes перевіряє наявність ReferenceGrant в іншому просторі імен перед прийняттям посилання. ReferenceGrant є частиною розширених API <code>gateway.networking.k8s.io</code>. Перегляньте <a href="https://gateway-api.sigs.k8s.io/api-types/referencegrant/">ReferenceGrant</a> в документації Gateway API для отримання деталей. Це означає, що ви повинні розширити свій кластер Kubernetes принаймні ReferenceGrant з Gateway API, перш ніж ви зможете використовувати цей механізм.</div>


### Використання джерела даних тому між просторами імен {#using-a-cross-namespace-volume-data-source}








  <div class="feature-state-notice feature-alpha">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.26 [alpha]</code>
    </div>
  



Створіть ReferenceGrant, щоб дозволити власнику простору імен прийняти посилання. Ви визначаєте заповнений том, вказуючи джерело даних тому між просторами імен за допомогою поля `dataSourceRef`. У вихідному просторі імен уже повинен існувати дійсний ReferenceGrant:

   ```yaml
   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
   ```

   ```yaml
   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
   ```

## Що далі

* Дізнайтеся про [постійні томи](/docs/concepts/storage/persistent-volumes/).
* Дізнайтеся про [клонування CSI-томів](/docs/concepts/storage/volume-pvc-datasource/).
* Дізнайтеся про [знімки томів](/docs/concepts/storage/volume-snapshots/).
* Прочитайте про [функціональні можливості](/docs/reference/command-line-tools-reference/feature-gates/), згадані на цій сторінці.
