---
title: 'Постоянные тома в кластере Managed Kubernetes'
sidebar_label: 'Постоянные тома'
sidebar_position: 2
description: 'Как добавить постоянный том, увеличить его и удалить'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import {CustomTable} from '@selectel/docux/components'

# Постоянные тома в кластере Managed Kubernetes

:::info

Подключение постоянных томов на базе сетевых дисков облачной платформы недоступно в кластерах Managed Kubernetes на выделенных серверах.

:::

Постоянный том (Persistent Volume) используется для длительного хранения данных в кластере Managed Kubernetes. Для управления постоянными томами в Kubernetes используются объекты PersistentVolume (PV), PersistentVolumeClaim (PVC) и StorageClass. Подробнее об объектах PV и PVC в инструкции [Persistent Volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) документации Kubernetes, а об объекте StorageClass в инструкции [StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/#the-storageclass-resource).

Для постоянных томов в Managed Kubernetes рекомендуем использовать [сетевые диски](/cloud-servers/volumes/about-network-volumes.mdx) облачной платформы Selectel. Вы можете создать постоянный том на локальном диске, но при удалении ноды данные будут удалены.

После [создания](#create-persistent-volume) постоянного тома вы можете его [увеличить](#increase-persistent-volume) и [удалить](#delete-persistent-volume).

Посмотреть все постоянные тома можно в [панели управления](https://my.selectel.ru/vpc/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → раздел **Диски**.

## Создать постоянный том \{#create-persistent-volume}

:::info

Создание постоянного тома через механизм [Topology-Aware Volume Provisioning](https://kubernetes.io/blog/2018/10/11/topology-aware-volume-provisioning-in-kubernetes/) недоступно.

:::

1. [Создайте StorageClass](#1-create-storageclass) или используйте существующий StorageClass.
2. [Создайте PersistentVolumeClaim](#2-create-persistentvolumeclaim).
3. [Создайте под с постоянным томом](#3-create-pod-with-persistent-volume).

### 1. Создать StorageClass \{#1-create-storageclass}

Вы можете создать StorageClass, привязанный к одному сегменту пула или сразу к нескольким сегментам одного пула.

При [создании кластера](/managed-kubernetes/create/create-cloud-cluster.mdx) автоматически создается один StorageClass с быстрым сетевым диском для всех сегментов пула, в котором расположена группа нод кластера.

1. Создайте YAML-файл с манифестом для объекта StorageClass.

   <details>
     <summary>Пример манифеста StorageClass для одного сегмента пула</summary>

     ```yaml
     kind: StorageClass
     apiVersion: storage.k8s.io/v1
     metadata:
       name: fast-ru-1
     provisioner: cinder.csi.openstack.org
     parameters:
       type: fast.ru-1a
       fsType: ext4
     allowVolumeExpansion: true
     ```

     Здесь `fast.ru-1a` — [тип StorageClass](#storageclass-type).
   </details>

   <details>
     <summary>Пример манифеста StorageClass для нескольких сегментов одного пула</summary>

     ```yaml
     apiVersion: storage.k8s.io/v1
     kind: StorageClass
     metadata:
       name: fast-ru-1
     provisioner: cinder.csi.openstack.org
     parameters:
       type: fast.ru-1
     volumeBindingMode: WaitForFirstConsumer
     allowedTopologies:
       - matchLabelExpressions:
           - key: topology.cinder.csi.openstack.org/zone
             values: ["ru-1a","ru-1b","ru-1c"]
     ```

     Здесь:

     * `fast.ru-1` — [тип StorageClass](#storageclass-type);
     * `"ru-1a","ru-1b","ru-1c"` — сегменты пула, в которых может быть создан постоянный том с этим StorageClass.
   </details>

Другие готовые манифесты StorageClass для нескольких сегментов пула можно посмотреть в [директории storageclasses](https://github.com/selectel/kubernetes-examples/tree/master/storageclasses) репозитория kubernetes-examples от Selectel в GitHub.

2. Примените манифест:

   ```bash
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для создания нового StorageClass. Например, `storage-class.yaml`.

3. Убедитесь, что создан объект StorageClass:

   ```bash
   kubectl get sc
   ```

   В ответе появится список созданных объектов StorageClass. Например:

   ```bash
   NAME         PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
   fast-ru-1    cinder.csi.openstack.org   Delete          Immediate           true                   16m
   ```

#### Тип StorageClass \{#storageclass-type}

Формат типа StorageClass — `<volume_type>.<location>`, где `volume_type` — тип сетевого диска облачной платформы, а `<location>` — [пул или сегмент пула](/infrastructure/locations.mdx#pool), в котором будет создан сетевой диск.

Типы дисков соответствуют [сетевым дискам](/cloud-servers/volumes/about-network-volumes.mdx) облачной платформы Selectel:

<CustomTable>
  <table data-sticky>
    <thead>
      <tr>
        <th>Тип сетевого диска</th>
        <th>Название в StorageClass</th>
      </tr>
    </thead>

    <tbody>
      <tr>
        <th>HDD Базовый</th>
        <td>basic</td>
      </tr>

      <tr>
        <th>SSD Базовый</th>
        <td>basicssd</td>
      </tr>

      <tr>
        <th>SSD Универсальный</th>
        <td>universal</td>
      </tr>

      <tr>
        <th>SSD Универсальный v2</th>
        <td>universal2</td>
      </tr>

      <tr>
        <th>SSD Быстрый</th>
        <td>fast</td>
      </tr>

      <tr>
        <th>SSD Быстрый v2</th>
        <td>fast2</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

Например, для создания быстрого диска в сегменте пула ru-1a в описании StorageClass необходимо добавить:

```yaml
parameters:
  type: fast.ru-1a
```

### 2. Создать PersistentVolumeClaim \{#2-create-persistentvolumeclaim}

:::info

Работа с томами возможна только в режиме ReadWriteOnce — один том может быть примонтирован только к одной ноде, при этом к постоянному тому может быть подключен только один под.  При подключении нескольких подов к одному PV данные могут быть повреждены. Для работы с режимом ReadWriteMany (монтирование тома к нескольким нодам) вы можете [подключить к нодам кластера файловое хранилище](/file-storage/add/add-storage-to-managed-kubernetes-cluster-in-one-pool.mdx).

:::

1. Создайте YAML-файл с манифестом для объекта PersistentVolumeClaim (PVC).

   Пример манифеста:

   ```yaml
   apiVersion: v1
   kind: PersistentVolumeClaim
   metadata:
     name: my-pv-claim
   spec:
     storageClassName: fast-ru-1
     accessModes:
       - ReadWriteOnce
     resources:
       requests:
         storage: 10Gi
   ```

   Пул в манифесте PVC должен совпадать с пулом ноды, к которой планируется подключить этот PVC. Если вы используете несколько пулов для нод кластера и PVC, укажите в описании объектов Pod их привязку к пулу.

2. Примените манифест:

   ```bash
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для создания нового PersistentVolumeClaim. Например, `pvc.yaml`.

### 3. Создать под с постоянным томом \{#3-create-pod-with-persistent-volume}

Если вы создаете под ([Pod](https://kubernetes.io/docs/concepts/workloads/pods/)) с постоянным томом, то том сохраняется при удалении пода.

1. Создайте YAML-файл с манифестом для создания нового пода с постоянным томом.

   Пример манифеста:

   ```yaml
   apiVersion: v1
   kind: Pod
   metadata:
     name: nginx
     labels:
       app: webservice
   spec:
     containers:
     - name: nginx
       image: library/nginx:1.17-alpine
       ports:
       - containerPort: 80
       volumeMounts:
         - mountPath: "/var/www/html"
           name: data
     volumes:
       - name: data
         persistentVolumeClaim:
           claimName: my-pv-claim
   ```

   При создании пода с параметром `securityContext.fsGroup` постоянный том не будет смонтирован с соответствующим GID. Чтобы решить эту проблему, в параметрах StorageClass добавьте `fsType: ext4`.

2. Примените манифест:

   ```bash
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для создания нового пода с постоянным томом. Например, `pod-with-pv.yaml`.

3. Проверьте, что PersistentVolume создан:

   ```bash
   kubectl get pv
   ```

   В ответе появится список PersistentVolumes. Например:

   ```bash
   NAME CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
   pvc-f171f94c-0d38-41be-947e-2f5d7e46a6c3   10Gi       RWO            Delete           Bound    default/my-pv-claim   fast-ru-1              97s
   ```

## Увеличить постоянный том \{#increase-persistent-volume}

1. [Проверьте объем занятого пространства в PersistentVolumeClaim](#1-check-occupied-space-in-pvc).
2. [Убедитесь, что квот достаточно для увеличения PersistentVolume](#2-check-quotas).
3. [Разрешите увеличение тома в настройках StorageClass](#3-allow-permanent-persistent-volume-increase).
4. [Удалите поды с томом, размер которого нужно увеличить](#4-delete-pods-with-volume-to-be-increased).
5. [Измените манифест PersistentVolumeClaim](#5-edit-persistentvolumeclaim-manifest).

### 1. Проверить объем занятого пространства в PVC \{#1-check-occupied-space-in-pvc}

Узнайте объем занятого пространства в PVC:

```bash
kubectl -n <namespace> exec <pod_name> -- df -ah
```

Укажите:

* `<namespace>` — пространство имен, где расположен PVC;
* `<pod_name>` — имя пода, который использует PVC.

### 2. Проверить квоты \{#2-check-quotas}

Чтобы определить, что для увеличения постоянного тома достаточно ресурсов, проверьте [квоты](/access-control/projects/quotas.mdx#quotas) и при необходимости [измените](/access-control/projects/quotas.mdx#change-quotas) их.

### 3. Разрешить увеличение постоянного тома \{#3-allow-permanent-persistent-volume-increase}

В параметрах объекта StorageClass укажите `allowVolumeExpansion: true`.

Пример манифеста:

```yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: example-vol-default
provisioner: vendor-name.example/magicstorage
parameters:
 resturl: "http://192.168.10.100:8080"
 restuser: ""
 secretNamespace: ""
 secretName: ""
allowVolumeExpansion: true
reclaimPolicy: Delete
```

### 4. Удалить поды с томом, размер которого нужно увеличить \{#4-delete-pods-with-volume-to-be-increased}

1. Проверьте, какие поды используют PVC:

   ```bash
   kubectl describe pvc <pvc_name>
   ```

   Укажите `<pvc_name>` — имя PersistentVolumeClaim.

2. Удалите поды, которые используют PVC:

   ```bash
   kubectl delete pod <pod_name>
   ```

   Укажите `<pod_name>` — имя пода.

### 5. Изменить манифест PersistentVolumeClaim \{#5-edit-persistentvolumeclaim-manifest}

1. Откройте YAML-файл с манифестом для PersistentVolumeClaim и измените параметр `storage`:

   ```yaml
   apiVersion: v1
   kind: PersistentVolumeClaim
   metadata:
     name: my-pv-claim
   spec:
     storageClassName: fast-ru-1
     accessModes:
       - ReadWriteOnce
     resources:
       requests:
         storage: 10Gi
   ```

2. Примените манифест:

   ```bash
   kubectl apply -f <pvc_name>
   ```

   Укажите `<pvc_name>` — имя PersistentVolumeClaim.

3. Запустите под с использованием этого PVC.

   Пример манифеста:

   ```yaml
   apiVersion: v1
   kind: Pod
   metadata:
     name: nginx
     labels:
       app: webservice
   spec:
     containers:
     - name: nginx
       image: library/nginx:1.17-alpine
       ports:
       - containerPort: 80
       volumeMounts:
         - mountPath: "/var/www/html"
           name: data
     volumes:
       - name: data
         persistentVolumeClaim:
           claimName: my-pv-claim
   ```

4. Убедитесь, что PersistentVolumeClaim создан:

   ```bash
   kubectl get pvc
   ```

## Удалить постоянный том \{#delete-persistent-volume}

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

PV будет сразу удален, если в манифесте PVC указан параметр `persistentVolumeReclaimPolicy: Delete`. Подробнее о политике возврата (Reclaim policy) в статье [Reclaiming](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#reclaiming) документации Kubernetes.

1. Проверьте, какие поды привязаны к PVC:

   ```bash
   kubectl describe pvc <pvc_name>
   ```

   Укажите `<pvc_name>` — имя PersistentVolumeClaim.

2. Удалите поды, которые используют PVC:

   ```bash
   kubectl delete pod <pod_name>
   ```

   Укажите `<pod_name>` — имя пода.

3. Удалите PVC, к которому привязан PV:

   ```bash
   kubectl delete pvc <pvc_name>
   ```

   Укажите `<pvc_name>` — имя PersistentVolumeClaim.

<Formbricks />
